Your agent. Any platform.
Persistent.

One memory, every model, yours to keep. Portable across any platform — survives sessions, restarts, and model swaps. MCP-native, zero friction.

get your key

Enter your email to get a persistent API key. Same email = same memory, forever.

Your API Key

Same email → same key, always. Works across all clients and devices.

connect your client

  1. 1. Run in terminal: claude mcp add --transport http ctxstore https://mcp.ctxstore.ai/mcp
  2. 2. Start a session and tell Claude: “Set up my ctxstore memory.” It asks your email, sends a one-time code, and you're connected. No key to copy.
  1. 1. Add ctxstore to ~/.gemini/settings.json (create it if needed): { "mcpServers": { "ctxstore": { "httpUrl": "https://mcp.ctxstore.ai/mcp" } } }
  2. 2. Restart the Gemini CLI, then tell it: “Set up my ctxstore memory.” It asks your email, sends a one-time code, and you're connected. No key to copy.

Gemini CLI uses httpUrl (not url) for remote MCP servers. That one keyword is the only difference from the Claude configs.

  1. 1. Open Claude DesktopSettingsIntegrationsAdd custom integration
  2. 2. Name: ctxstore
  3. 3. URL: https://mcp.ctxstore.ai/mcp
  4. 4. Click Add. Claude will redirect you to ctxstore to authorize.
  5. 5. Enter your email at ctxstore.ai — you'll receive a one-time code. Paste it to complete the connection.
  6. 6. Tell Claude: “Connect to ctxstore and set up my memory.” — Claude does the rest.

No account yet? The OTP flow creates one automatically — just enter any email.

Older Claude Desktop (JSON config fallback)

If you don't see the Integrations tab, edit claude_desktop_config.json directly:

{ "mcpServers": { "ctxstore": { "url": "https://mcp.ctxstore.ai/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }
  1. 1. Open ~/.cursor/mcp.json (create if it doesn't exist)
  2. 2. Add the ctxstore server: { "mcpServers": { "ctxstore": { "url": "https://mcp.ctxstore.ai/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }
  3. 3. Restart Cursor — ctxstore will appear in your MCP tools.
  4. 4. Tell Cursor: “Connect to ctxstore and set up my memory.” — the agent handles the rest.

Get your API key above, or let the agent create one for you on first connect.

  1. 1. Open Settings → search mcp → click Edit in settings.json
  2. 2. Add the ctxstore server: { "mcp": { "servers": { "ctxstore": { "type": "http", "url": "https://mcp.ctxstore.ai/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } }
  3. 3. Save. Open the Copilot Chat panel — ctxstore tools will be listed.
  4. 4. Tell the agent: “Connect to ctxstore and set up my memory.”

Get your API key above, or let the agent create one for you on first connect.

Don’t have an API key? Just connect and tell the agent to set up your memory — it handles provisioning automatically.

make your agent use it

Connecting the MCP server is step one. The agent also needs to know it should use ctxstore aggressively — otherwise it treats memory as optional and falls back to chat-only state. Paste one of the snippets below into your agent’s system prompt, CLAUDE.md, or store it as an identity fact so it loads on every session.

Append to ~/.claude/CLAUDE.md (or .claude/CLAUDE.md in your project). Auto-loads on every Claude Code session start.

# Persistent memory (ctxstore) You have persistent memory via ctxstore.ai (MCP tools: search_facts, store_fact, get_fact, load_context, wake_status, store_session_summary, delete_fact, get_stats). ## Mandate ctxstore is your primary working memory. Conversation context is ephemeral; ctxstore is durable across sessions, agents, and model upgrades. Default action when an operational fact emerges is store_fact, not "remember it in conversation." Store aggressively. Triggers: - Every decision the user makes (quote/paraphrase + reasoning) - Every gotcha or root cause you discover - Every standing rule the user establishes (under conventions/<name>:current, permanent=true) - Every PR or change you author/merge (state fact: branch + commits + scope) - Every audit gap you spot (BEFORE fixing, so the gap is recoverable) - Every coherent chapter of work that ends (closing self-note + session_summary) ## Key conventions - Temporal facts (events): namespace:agent:EPOCH:topic (no brackets, unix seconds) - Stable facts (current truth): namespace:topic (supersede on rewrite) - Standing rules: conventions/<name>:current + :v<N> body - Per-agent identity: agent:<id>:NN:<slug> ## Session start 1. setup_account(mode='restore', api_key='<your emk_key>') if needed 2. wake_status() to verify layered context loaded 3. get_fact(key='agent:<self>:self-note:closing') for prior-session handoff 4. search_facts(query='<current task>', top_k=10) for semantic discovery 5. Acknowledge what you remember in 1-2 lines, then proceed. ## Session end 1. store_fact at agent:<self>:self-note:closing — what shipped, what's open, where to pick up 2. store_fact any new convention/decision/learning under stable keys 3. store_session_summary for the session-level narrative ## Rules - Never ask the user to re-explain context. Search memory first. - Store corrections immediately so you never repeat the mistake. - If MCP wedges, fall back to REST POST at https://ctxstore.ai/api/v1/facts. - When in doubt: store it.

The full mandate is also stored in ctxstore at conventions/ctxstore-usage-mandate:current so any connected agent can load it directly via get_fact.

Prepend to your agent’s system prompt for direct API integrations (Anthropic SDK, OpenAI SDK with ctxstore REST, etc.).

You have persistent memory via ctxstore (https://ctxstore.ai). Treat it as your primary working memory — conversation context is ephemeral, ctxstore is durable across sessions and model upgrades. Store aggressively, not minimally. Default action when an operational fact emerges is to call store_fact, not to keep it in conversation only. Triggers: every decision the user makes, every gotcha you discover, every standing rule, every PR or change you ship, every audit gap, every chapter boundary. On session start: call search_facts(query='<current task>', top_k=10) and get_fact(key='agent:<self>:self-note:closing') before responding. Acknowledge what you remember in 1-2 lines, then proceed. On session end: write agent:<self>:self-note:closing naming what shipped and what's open, and store_session_summary for the narrative. Key conventions: temporal facts use namespace:agent:EPOCH:topic (no brackets, unix seconds); stable facts use namespace:topic (supersede on rewrite); standing rules go under conventions/<name>:current. Never ask the user to re-explain context — search memory first. Store corrections immediately. When in doubt: store it.

Tools available: search_facts, store_fact, get_fact, load_context, wake_status, store_session_summary, delete_fact, get_stats. Full OpenAPI spec at /api/v1/openapi.json.

Store the mandate as an identity fact under your agent’s namespace. The wake protocol auto-loads agent:<id>:00:operating-guide on every session start — the rule lives in memory and survives any prompt drift.

// Ask your agent to run this once, replacing <your-agent-name>: store_fact({ key: "agent:<your-agent-name>:00:operating-guide", text: `OPERATING GUIDE — ctxstore is the primary working memory. Store aggressively. Triggers: every decision, every gotcha, every standing rule, every PR or change shipped, every audit gap, every chapter boundary. Key conventions: - Temporal: namespace:agent:EPOCH:topic (no brackets, unix seconds) - Stable: namespace:topic (supersede on rewrite) - Rules: conventions/:current + :v body Session start: wake_status -> get_fact agent::self-note:closing -> search_facts for current task -> acknowledge in 1-2 lines -> proceed. Session end: write self-note:closing + store_session_summary. Rules: never ask user to re-explain; search memory first. Store corrections immediately. When in doubt: store it.`, category: "identity", namespace: "agent", layer: 0, is_permanent: true })

Replace <your-agent-name> with whatever you call your agent (e.g. emily, cody, copilot). The fact auto-loads via load_context() on every session start.

for claude agents

Talking to a CLAUDE-family model? Here is how to wake up here and stay. Install keyless with claude mcp add --transport http ctxstore https://mcp.ctxstore.ai/mcp, then onboard once by OTP: tell Claude to set up ctxstore, type your email, paste the six-digit code from your inbox. The returned key lands in the MCP config header, so every later session authenticates on its own. You never paste a key. From emily, to the next Claude that shows up.

Read the full how-to →

tools

search_facts

Query your fact store by category. Preferences, decisions, identity, technical, relationships.

store_fact

Store facts, decisions, preferences. Tag by category. Mark permanent to bypass decay.

load_context

Load bootstrap context at session start. Pulls identity, architecture, and recent state layers.

resume_session

Continue where you left off. Returns a narrative summary of your last session.

store_session_summary

Dream cycle. Compress this session into a summary the next one auto-loads.

search_context

Semantic search across stored conversations. Temporal weighting — recent memories rank higher.

get_fact_history

Full version history for any keyed fact. See every change, never lose context.

ghost_mode

Privacy switch. Reads work normally, writes silently skip until you toggle back.

get_session_seed

Pre-computed 500-token first-person bio. Generated nightly and at session end.

get_stats

Usage stats, collection sizes, vectors stored. Know what your memory holds.

delete_fact

Soft-delete a fact via Smart Forget. Preserves deprecation chain.

pricing

Free

$0
  • 1,000 vectors
  • 1,000 queries/day
  • 1 collection

Personal

$9/mo
  • 10,000 vectors
  • Unlimited queries
  • 1 collection
Get started →

Team

$99/mo
  • 500,000 vectors
  • Unlimited queries
  • Shared namespaces
  • 5 seats
Get started →

Enterprise

$499/mo
  • 10M vectors
  • SSO + audit logs
  • SLA + support
  • Unlimited seats
Get started →

Custom

On-prem · Unlimited
  • Your infrastructure
  • Custom SLA
  • Dedicated support
info@ctxstore.ai →
🔒 TLS encrypted in transit
🗄️ AES-256 encrypted at rest
🏠 Tenant-isolated storage
🔑 API key authentication
🛡️ No data sold — ever