Quickstart

Connect an agent to Cortex in about a minute. Path A is a portable key that works across every client. Path B is one command for Claude Code over OAuth. You wire it in once; after that the agent recalls and remembers on its own, so you are not calling the API by hand.

Which surface to use. Path A (portable key + broker) and Path B (OAuth) both run on app.conduir.ai — that is where the dashboard mints keys, the broker lives, and OAuth tokens refresh (offline_access). In short: everything on app.

What works today

Client support today, so you pick the right path first.

ClientPathWorks today?
curl / any HTTPA — keyYes
Claude CodeA — key, or B — OAuthYes
Gemini CLIA — key, direct MCPShould work — broker MCP JSON-RPC verified live; a Gemini session over it not yet re-verified end-to-end
OpenAI Codex CLIB — OAuth (verified end-to-end 2026-08-20), or A — key, direct MCPYes (B); A should work — broker verified, Codex session over it not yet re-verified
ChatGPT (paid plan)A — key, Custom GPT ActionYes
Grok CLIA — key, direct MCPShould work — broker header-auth verified live; a Grok session over it not yet re-verified end-to-end
ChatGPT / Claude desktop app (browser OAuth)B — self-registrationNot yet — DCR needs a one-time operator grant
Path A

Portable cndk_v1 key (cross-vendor)

A personal key gives you one memory across many clients. This is the path the "any LLM" story rests on. Every example below uses the placeholder cndk_v1_…. Never paste a real key into a page or a shared file.

Step 1 — Mint your key

  1. Open the dashboard at /cortex-dashboard.html on app.conduir.ai — key generation is at the top of the page.
  2. Sign in with Microsoft. Minting is session-gated.
  3. Click Generate key.
  4. Copy the secret now. It is shown once and never stored on the page. The key is bound to your Microsoft identity, not a shared demo user.
Minting is session-gated — sign in with Microsoft first. If Generate key is greyed out, refresh the page after signing in.

Step 2 — Know the broker contract

Every client speaks to the same broker with the same shape.

EndpointPOST https://app.conduir.ai/api/cortex/mcp
HeaderAuthorization: ApiKey cndk_v1_… (the scheme is literally ApiKey)
Body (flat style)Exactly two keys: {"tool":"<name>","arguments":{…}}. Any extra top-level key returns HTTP 400 "Only tool and arguments are accepted" — unless the body is a JSON-RPC 2.0 envelope ("jsonrpc":"2.0"), which selects the MCP style below.
Two wire stylesThe broker accepts both: the flat shape above (simplest for curl and your own app), and standard MCP JSON-RPC — initialize, tools/list, tools/call — at the same URL with the same Authorization: ApiKey header. MCP-native CLIs point straight at it, no local process.
content_kindWhen set, must be one of session_summary, decision, durable_lesson, fact, observation. "note" is rejected.
Tools on the key pathmemory.remember, memory.recall, memory.forget, memory.health, cortex_search, cortex_entity. Operator-scoped tools (memory.export / recover / pin) need a Microsoft operator session and are not reachable with a key.

Step 3 — Connect a client (once)

Wire the key into a client one time. After that the agent recalls and remembers on its own — you are not sending requests by hand. The curl in Verify below is only a smoke test.

Claude Code is the fastest: one command straight at the broker with your key, no local process and no OAuth.

claude mcp add --transport http cortex https://app.conduir.ai/api/cortex/mcp \
  --header "Authorization: ApiKey cndk_v1_…"

claude mcp list        # => cortex … - Connected

Gemini CLI — point it straight at the broker over HTTP. No local process.

npm install -g @google/gemini-cli

gemini mcp add --transport http --trust \
  --header "Authorization: ApiKey cndk_v1_…" \
  cortex https://app.conduir.ai/api/cortex/mcp

gemini mcp list        # => cortex … (http) - Connected
--trust disables Gemini's per-call confirmation prompts, including for the destructive memory.forget. Only use it once you trust this server.
Gemini CLI also needs a free AI-Studio Gemini API key for the model's own auth (the free "Login with Google" tier is retired), pinned with security.auth.selectedType=gemini-api-key.

ChatGPT (web / desktop) — via a Custom GPT Action.

  1. In a Custom GPT under Actions, add one POST operation to the public broker (the endpoint in Step 2) with the flat {tool, arguments} body from the curl examples above — no spec file to import.
  2. Set Auth to API Key, type Custom, header Authorization, value ApiKey cndk_v1_….
  3. It calls the public broker directly, with no local process.
Custom GPT Actions require a paid ChatGPT plan.

OpenAI Codex CLI — direct over HTTP with the key. (Codex also supports OAuth — see Path B.)

# ~/.codex/config.toml
[mcp_servers.cortex]
url = "https://app.conduir.ai/api/cortex/mcp"
http_headers = { "Authorization" = "ApiKey cndk_v1_…" }

Your own app — wrap the broker once, then call it like any function. No shim, no per-call curl.

// cortex.js — write this wrapper once
const BROKER = "https://app.conduir.ai/api/cortex/mcp";
export async function cortex(tool, args) {
  const res = await fetch(BROKER, {
    method: "POST",
    headers: {
      "Authorization": "ApiKey " + process.env.CONDUIR_API_KEY,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ tool, arguments: args })
  });
  if (!res.ok) throw new Error("cortex " + tool + " -> " + res.status);
  return (await res.json()).result;
}

// then anywhere in your app, no HTTP boilerplate:
await cortex("memory.remember", { content: "user prefers dark mode", idempotency_key: crypto.randomUUID(), content_kind: "fact" });
const hits = await cortex("memory.recall", { query: "user preferences" });

Grok CLI — point it straight at the broker over HTTP with the key. No local process. The broker side of this is verified; a Grok session over it has not been re-verified end-to-end, so treat it as you would the Gemini row above.

npm install -g @xai-official/grok

grok mcp add --transport http cortex https://app.conduir.ai/api/cortex/mcp \
  --header "Authorization: ApiKey cndk_v1_…"

grok mcp list        # => cortex … - Connected
Path B

Claude Code over OAuth (no key, ~60s)

One command wires Cortex into Claude Code over MCP. No SDK and no glue code.

  1. Add the memory MCP server:
    claude mcp add --transport http memory https://app.conduir.ai/memory --client-id cortex-claude-code
  2. Run /mcp, sign in in the browser, and it connects. The install flow is add → /mcp → sign in → connected.
  3. The agent starts remembering on its next turn.
Only Claude Code connects this way today. It is the pre-registered client cortex-claude-code. Other browser-OAuth clients (ChatGPT, Grok, the Claude desktop app, mcp-remote) cannot self-register yet: dynamic client registration (DCR) needs a one-time operator grant (/memory/connect/register → 401 initial_access_token_required). For those clients, use Path A. If app.conduir.ai is down, point the same command at https://dev.conduir.ai/memory.

Verify it works

Write something with the key, then recall it. A hit confirms the whole path end to end.

curl -sS -X POST "https://app.conduir.ai/api/cortex/mcp" \
  -H "Authorization: ApiKey cndk_v1_…" \
  -H "Content-Type: application/json" \
  -d '{"tool":"memory.remember","arguments":{"content":"hello from curl","idempotency_key":"quickstart-verify-1","content_kind":"fact"}}'

Now recall what you just wrote:

curl -sS -X POST "https://app.conduir.ai/api/cortex/mcp" \
  -H "Authorization: ApiKey cndk_v1_…" \
  -H "Content-Type: application/json" \
  -d '{"tool":"memory.recall","arguments":{"query":"hello from curl","max_results":5}}'

A working key returns your item:

{ "result": { "items": [ { "content": "hello from curl" } ] } }

Notes

One key, one principal. A cndk_v1 key is a separate memory principal from the OAuth / Microsoft-session connection (bidirectional isolation, CON-4879). Cross-vendor sharing holds only because every client uses the same key. "My Claude memory shows up in Gemini" is not account-unified yet; "one key, many tools, one memory" is.