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.
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.
| Client | Path | Works today? |
|---|---|---|
| curl / any HTTP | A — key | Yes |
| Claude Code | A — key, or B — OAuth | Yes |
| Gemini CLI | A — key, direct MCP | Should work — broker MCP JSON-RPC verified live; a Gemini session over it not yet re-verified end-to-end |
| OpenAI Codex CLI | B — OAuth (verified end-to-end 2026-08-20), or A — key, direct MCP | Yes (B); A should work — broker verified, Codex session over it not yet re-verified |
| ChatGPT (paid plan) | A — key, Custom GPT Action | Yes |
| Grok CLI | A — key, direct MCP | Should 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-registration | Not yet — DCR needs a one-time operator grant |
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
- Open the dashboard at
/cortex-dashboard.htmlonapp.conduir.ai— key generation is at the top of the page. - Sign in with Microsoft. Minting is session-gated.
- Click Generate key.
- 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.
Step 2 — Know the broker contract
Every client speaks to the same broker with the same shape.
| Endpoint | POST https://app.conduir.ai/api/cortex/mcp |
|---|---|
| Header | Authorization: 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 styles | The 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_kind | When set, must be one of session_summary, decision, durable_lesson, fact, observation. "note" is rejected. |
| Tools on the key path | memory.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.
security.auth.selectedType=gemini-api-key.
ChatGPT (web / desktop) — via a Custom GPT Action.
- In a Custom GPT under Actions, add one
POSToperation 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. - Set Auth to API Key, type Custom, header
Authorization, valueApiKey cndk_v1_…. - It calls the public broker directly, with no local process.
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
Claude Code over OAuth (no key, ~60s)
One command wires Cortex into Claude Code over MCP. No SDK and no glue code.
-
Add the memory MCP server:
claude mcp add --transport http memory https://app.conduir.ai/memory --client-id cortex-claude-code - Run
/mcp, sign in in the browser, and it connects. The install flow is add → /mcp → sign in → connected. - The agent starts remembering on its next turn.
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
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.