https://api.get-exo.com/mcp/, authenticated with a static Exo API key. After this page, Claude Code will call exo_context before answering questions about your own history, and exo_capture after substantive exchanges.
Before you start
- An Exo account. Exo is invite only during the private preview, so sign-in fails with a waitlist message if your account is not allowlisted yet.
- An Exo API key. Mint one on the dashboard, or with
POST /v1/keysif you already have a key with theadminscope. See Authentication. - Claude Code installed and able to reach the public internet.
The short version
claude mcp list and confirm the exo entry shows a check mark.
Set it up
1
Mint a connection key
Sign in to the Exo dashboard and open Import then Connect Claude Code. Click Generate connection key and copy the key. The plaintext is shown once and is never retrievable again, because Exo stores only its SHA-256 hash.If you would rather do it over the API, mint a narrowed key so a coding agent cannot erase content:
id is the key hash. It is what GET /v1/keys lists and what DELETE /v1/keys/{id} revokes. apiKey is the only thing you can paste into a client, and this response is the only place it appears.2
Register the server
Either install the plugin:Paste your key when prompted. Or register the endpoint directly, which is one command and no plugin system:Use one or the other, not both. They do not hard collide, because a plugin’s MCP server is namespaced
plugin:exo:exo and coexists with a standalone exo, but you end up with two copies of every tool. To switch, remove the other first with claude mcp remove exo.3
Restart Claude Code
Claude Code reads MCP configuration at startup only. A server added mid-session does not appear until you restart.
4
Verify from both sides
Client side:
claude mcp list shows exo with a check mark.Server side, which cannot lie: the connect panel flips to Connected the moment Exo receives the first authenticated request from your key, and the key list shows a Last used time per key. A key that still reads Never used after a restart was never saved or never sent. Generate a fresh one and configure it again.Then ask Claude Code something that references your own history, such as “what did we decide about the pricing model?”, and watch it call exo_context.How the auth works
The key you paste is a long-lived, revocable Exo API key scoped to your user and organization, the same identity the dashboard uses. Claude Code sends it asAuthorization: Bearer <key> on every MCP call. The /mcp endpoint validates it with the same check the REST API uses and rejects a missing, invalid or revoked key with 401.
Every validated request stamps the key’s last-used time. That is the server-truth liveness signal, and it is worth more than anything your local config claims.
To rotate a key, mint the new one first, reconfigure the client, confirm the new key shows a last-used time, then revoke the old one.
When it goes wrong
TreatFailed to connect as an auth failure until proven otherwise. Claude Code collapses a 401 into the same message it shows for an unreachable server, and the server is almost never the problem.
Scripting against the endpoint directly
Two behaviors bite raw-HTTP integrators.A bare POST returns 400 until you handshake
A bare POST returns 400 until you handshake
/mcp speaks MCP Streamable HTTP. Send initialize first, capture the Mcp-Session-Id response header, and send it back on every subsequent request. A POST without the session id returns 400. That is the protocol, not an outage.Ingestion acknowledges before it finishes
Ingestion acknowledges before it finishes
exo_ingest reports success as soon as the job is durably queued. Graph counts change after the worker processes it. An unchanged count immediately after an ingest is not a failure. Poll GET /v1/ingest/session-status, which reports building: true while jobs are active, before concluding anything.Disconnecting
Next
Coding session history
Backfill the Claude Code transcripts already on your disk, so the graph starts warm.
MCP tool reference
What each tool does and the REST route behind it.