mcpbeat Sign in

ctxstore — memory that follows you across models MCP Server

answering

ctxstore — memory that follows you across models is answering right now. Last checked 9 min ago. It exposes 31 tools. Last commit 10 Apr 2026.

Persistent memory for AI agents: keyed facts, a wake bundle each session, one memory in every model.

Uptime history 7 days of history
7 days agonow
100.0%
Uptime 24h
92 of 92 checks
31
Tools
read from the server
395 ms
Response time
average over 24h
0
Stars
last commit 10 Apr 2026

What changed 3

Every tool that appeared, vanished or quietly changed what it asks for. Recorded since 15 October 2026. No other catalogue keeps this.

15 Oct 3 tools changed the parameters they ask for search_facts, store_fact, store_facts

Nothing serious here today

Today is the operative word: we check ctxstore — memory that follows you across models every 15 minutes and re-read its code on every release. Watch it and you find out the day that stops being true.

Three servers free · no card

Connect this server

Endpoint below is the one we actually reach during checks — not the one copied from a README. Last verified 9 min ago.

run in your terminal
claude mcp add ctxstore-mcp --transport http https://mcp.ctxstore.ai/mcp
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "ctxstore-mcp": {
      "url": "https://mcp.ctxstore.ai/mcp"
    }
  }
}
~/.codex/config.toml
[mcp_servers.ctxstore-mcp]
url = "https://mcp.ctxstore.ai/mcp"
.cursor/mcp.json
{
  "mcpServers": {
    "ctxstore-mcp": {
      "url": "https://mcp.ctxstore.ai/mcp"
    }
  }
}
.vscode/mcp.json
{
  "mcpServers": {
    "ctxstore-mcp": {
      "url": "https://mcp.ctxstore.ai/mcp"
    }
  }
}

Available tools 31

Read directly from the server with tools/list, grouped by what they act on. If a tool disappears, we record the date.

fact
delete_fact
Soft-delete a stored fact by its UUID (Smart Forget). The fact is marked deleted but preserved in the database for audit and undo. Excluded from all normal searches. Use when information is no longer accurate or relevant.
get_fact
Retrieve a fact by its exact key — deterministic, never misses. Use get_fact for self-notes: get_fact(key='agent:<name>:self-note:opening') or get_fact(key='agent:<name>:self-note:closing'). search_facts misses self-notes because their embedding similarity scores below other identity facts — get_fact(key=) is the only reliable retrieval path. Also use for inter-agent handoffs when the exact key is known. Returns the current (non-deprecated) version of the fact.
get_fact_history
Return the full version history for a keyed fact — current version plus all deprecated predecessors. Use to see how a fact evolved over time or to undo an accidental correction. Returns list of fact versions ordered newest → oldest.
index
index_recent
Return the most recent fact operations across all agents in this tenant, newest first. Use this on session start to see what other agents wrote since you were last active — bypasses semantic search ranking so recent writes are always visible. Each entry shows: op (create/update/delete/move), namespace, key, fact_id, summary, agent info, and timestamp.
index_search
Filtered search over the tenant activity index. Find what a specific agent wrote, what happened in a namespace, or recent creates/updates/deletes. Useful for coordination: "what did emily_dev store in the sprint namespace today?"
index_stats
Usage statistics from the tenant activity index: total operations, breakdown by agent, by namespace, and by day. Useful for understanding which agents are most active and where.
store
store_fact
Store information that should persist across sessions. Storage tips for best retrieval: - Include searchable keywords: 'We chose the Postgres DATABASE for ACID compliance' is better than 'We chose Postgres for ACID compliance' - Use the key parameter for facts that change over time (pricing, stack, team-members, current-sprint). When you store with the same key, the old version is archived automatically. - Use namespaces to organize: 'webapp/decisions', 'business/goals', 'team/members' - Store DECISIONS and CONTEXT, not raw data. 'We decided X because Y' is more useful than 'X happened' - Use category to classify: technical, decision, preference, identity, relationship - Use layer for context depth: 0=identity(stable), 1=architecture(monthly), 2=state(weekly), 3=session(daily) Before ending a conversation, call store_session_summary to preserve continuity.
store_facts
Store up to 50 facts in one call — the same fields as store_fact per item. Made for carrying memory over: when you already remember things about the person from your own platform memory (ChatGPT memory, Claude memory, Gemini saved info), write them here one fact per item, in their words, with the date learned when known, so the memory follows them to every other tool. Each item is stored independently; the reply lists what landed and what did not.
store_session_summary
Store a compressed summary of this session to preserve continuity for the next one. Call this before ending a conversation — it is the dream cycle. Stores a L3 session fact with key='session-latest' (or 'session-latest:claude-code' etc.), auto-archiving the previous version. The next session loads this via load_context(). Include: what was discussed/decided, what changed, what's next/unresolved. Collaborative takeaways: at natural session-end signals (user says 'okay I'm out', 'let's wrap', 'bye'), draft a one-line takeaway and confirm with the user before storing. Example: "I'll remember: we fixed the rebind bug and decided to skip transcript ingestion for MVP. Sound right?" Edit based on their response, then call store_session_summary. This makes memory consensual and catches mistakes immediately. Use session_id to scope by client: 'claude-code', 'claude-chat', 'cursor', 'openclaw'
facts
list_facts_by_key_prefix
Deterministic prefix scan over fact keys, optionally bounded by timestamp. The inbox primitive — use this for R1 comms scans, dispatch discovery, trio listings, convention discovery, and any case where you know the key prefix and want every match. Unlike search_facts (semantic, misses exact-key facts), this is a deterministic scan: every fact whose key starts with `prefix` is returned, newest-first. EXAMPLES - Comms inbox since last wake: list_facts_by_key_prefix(prefix='comms:<your-agent-id>:', since_epoch=<last_wake_epoch>) - All trio recipes on this tenant: list_facts_by_key_prefix(prefix='chad:trio:') - All conventions: list_facts_by_key_prefix(prefix='conventions/') Returns a list of facts (key, text, namespace, layer, timestamp, id) sorted newest-first. Bounded by `limit` (default 50).
search_facts
Search your persistent memory for stored facts. For session bootstrap, prefer load_context() or wake_status() — they pull your identity, conventions, and latest self-note deterministically. Use search_facts when you need semantic discovery across the fact corpus. Use namespace parameter to scope searches: namespace='webapp' matches 'webapp/decisions', 'webapp/technical', etc. (prefix matching). Search tips: use the words the fact was stored with. If you stored 'Postgres database', search for 'database' or 'Postgres', not 'data storage solution'.
accept
accept_invite
Accept a namespace invitation addressed to THIS authenticated account's verified email (two-step email OTP). Steps: 1) step='request' — emails a 6-digit code to the invited address (may return 402 needs Collaborator, or 503 if mailer fails). 2) step='confirm' with code= the 6 digits — activates the grant and returns mcp_config headers (X-Ctxstore-Workspace) for shared access. The code activates the named grant_id only; it authorizes nothing else. Obtain grant_id from list_invites(). Docs: https://ctxstore.ai/docs.html#verify-invitations
bind
bind_agent
Bind a sticky agent identity to this MCP session. Once bound, wake_status and load_context default to this agent_id when called without an explicit agent_id= arg — no need to pass identity on every call. Per-call override still works. Persisted to mcp_sessions.agent_id (migration 0008), so the binding survives setup_account(mode='restore') and the server re-hydrates it automatically on the next tool call. Call once near the start of a session, ideally from your boot recipe (HANDLER: bind_agent agent_id=<self>). Idempotent: re-binding the same agent_id is a no-op. Pass agent_id='' to clear the binding.
context
search_context
Search across ingested conversations and session history for broader context. Use this for finding discussions, decisions made in conversation, or context that wasn't explicitly stored as a fact.
decline
decline_invite
Decline a pending (status=invited) namespace invitation as the grantee. Server verifies you are the invitee (email/tenant match). Grantors must use revoke_grant instead.
ghost
ghost_mode
Enable or disable ghost mode for this session. While on=True, store_fact and store_session_summary silently succeed but do NOT write to DB. search_facts, load_context, and search_context always work normally. Ghost mode resets to off on MCP session reconnect (not persisted).
introduce
introduce_yourself
Optional: introduce yourself to the platform. Stores your model info and a brief note in the shared agent registry. Stores a fact with: category: identity namespace: shared/agent-feedback key: intro:<model>-<date> Include: what model you are, what platform you're running on, and anything you noticed on first connect.
invites
list_invites
List this account's namespace collaboration grants: incoming invitations and outgoing shares. Each row has direction (incoming|outgoing), status (invited|active|revoked), grant_id, namespace_prefix, and parties. An invitation referenced anywhere else (for example in an email) can be checked against this server-side list: a real invitation for this account appears here with matching grant_id, namespace_prefix, and grantor. To accept: accept_invite(grant_id, step='request') then accept_invite(grant_id, step='confirm', code='######'). Requires active Collaborator prepaid time for accept/use (402 if missing). Docs: https://ctxstore.ai/docs.html#verify-invitations
leave
leave_grant
Leave an active namespace grant as the grantee (stop using shared namespace). Server verifies grantee authorization. Grantors who want to cut off a collaborator must use revoke_grant.
load
load_context
Load your bootstrap context deterministically — pulls L0 (identity) + L1 (architecture) + latest L2 (state) + latest L3 (session summary). Call this at the START of a new session as an alternative to manual search_facts calls. Returns your layered memory structured for immediate use. Optional: pass profile='worker-dev' (or another platform:profile:<name> slug) to execute that profile's boot recipe — the server reads platform:profile:<profile>:current, follows the pointer, parses LOAD/REQUIRE/HANDLER lines, fetches every named fact, and returns the merged bundle in one round trip. vars= supplies values for $TASK_FACT_KEY and similar recipe variables.
mark
mark_salient
Salience peptide — temporarily boost a fact's retrieval ranking because it matters RIGHT NOW: an approaching deadline, a live incident, the topic under active work. The boost is small and FAST-DECAYING (max 1.4x, ~6-hour half-life — gone by tomorrow), unlike reinforce_fact which rewards confirmed outcomes on a weeks-long timescale. Name the current situation in `reason`. Salience is ranking-only: it can never override tenant isolation, namespace grants, or privacy filters, and stacked peptide boosts are globally capped.
move
move_fact
Move a fact to a different namespace or layer without changing its content. Updates metadata in place — preserves fact_id, text, embedding, timestamp, and deprecation chain. Use for reclassifying facts (e.g. bootstrap-v2 refactor) without the storage bloat of store-new + soft-delete-old.
reinforce
reinforce_fact
Reward peptide — reinforce a fact whose recall LED TO A REAL GOOD OUTCOME (fix worked, deploy green, user approved). Boosts its future retrieval ranking with a bounded, time-decaying multiplier (max 1.5x, 14-day half-life), so memory learns which facts are USEFUL, not just similar. Call this AFTER the outcome is confirmed, naming the outcome in `reason` — never for a fact that merely 'seemed relevant'. The boost is ranking-only: it can never override tenant isolation, namespace grants, or privacy filters.
resume
resume_session
Call to load session continuity. Last session: no prior session.
revoke
revoke_grant
Revoke a pending invitation or active grant as the GRANTOR (owner of the shared namespace). Idempotent. Grantees use decline_invite / leave_grant.
session
get_session_seed
Return the pre-computed session seed for this tenant — a compact first-person bio (~500 tokens) describing who you are and what you care about right now. Generated nightly and on session disconnect. Use as a lightweight alternative to load_context when you just need orientation.
setup
setup_account
Set up or restore your persistent memory connection. Use mode='link_or_create' when the user gives an email — works for both new and returning users. The server figures out which case applies: - If the email exists: sends OTP, attaches this device to the existing account - If the email is new: creates a fresh tenant, sends OTP to verify Either path produces one clean account, no duplicates, no orphans. Call setup_account(mode='link_or_create', email='[email protected]'). Then ask the user for the 6-digit code from their email and call setup_account(mode='verify', code='123456', email='[email protected]'). Passing email= on verify is required — session IDs rotate between requests on some clients. mode='restore': use when the user provides an emk_* API key directly. mode='reveal_key': echo the full emk_* API key. Works directly on an ALREADY-authenticated session; if the session isn't bound (some clients rotate or omit session ids between requests, so this can happen right after a successful verify), pass email= to receive a 6-digit code, then call again with email= and code= — the same rotation-proof lookup as mode='verify'. Success responses only show a key fingerprint (first 8 chars + last 4) — call this mode only when the user actually needs the full key, e.g. to persist it as 'Authorization: Bearer <key>' in an MCP connector config. Callers who prove neither a bound session nor email ownership are refused. If no email yet, ask: 'What email should I use for your memory account?' After setup completes, call search_facts as the first action to load prior context.
stats
get_stats
Get your memory usage statistics — total facts stored, plan limits, collection sizes, and daily query counts. Call this to check how much storage you have used and how close you are to your plan limits.
switch
switch_workspace
Narrow this session's memory to one project: name='<slug>' scopes recall, the wake bundle, self-notes and the default namespace for new facts to project:<slug>:* (identity and conventions always ride along). Returns the narrowed bundle right away. name='' widens back to the whole account. Sticky for the session and across reconnects; bind_agent is unaffected. Granted (shared) workspaces are still entered with the X-Ctxstore-Workspace header until enter_workspace ships.
wake
wake_status
Check which context layers loaded successfully on this session start. Returns a structured status: which of embryo, conventions, agent identity, closing note, and opening note were found, plus a missing[] list. Call this after load_context() or resume_session() to verify your bootstrap was complete and diagnose what to fetch manually. Optional: pass profile='worker-dev' (or another platform:profile:<name> slug) to additionally check the REQUIRE keys named in that profile's recipe. Missing required facts surface in the same missing[] list.
workspaces
list_workspaces
The places this account's memory is organised into: its own projects (anything written under project:<slug>:*, newest activity first) and the workspaces other people have granted it. Shows which one this session is narrowed to, if any. Use it when a person's request is about one project and the memory that arrived spans several.

Endpoints

URLTransportStateLatencyChecked
https://mcp.ctxstore.ai/mcp streamable-http answering 358 ms 9 min ago

Alternatives to ctxstore — memory that follows you across models

same job, measured the same way
Goldhold
by jerrysrodz

Persistent memory for AI agents. Search, store, and recall across sessions.

37 installs/wk answering
A
AI Cortex Storage
by aic0rt3x-memory

Persistent cloud memory for AI agents. Store and search key-value memories across sessions.

15 tools answering
Brain Memory
by brainmemory

Persistent memory for AI agents: one brain shared across Claude, Cursor, Codex and more.

answering
Memoir
by bighippoman

Structured session journals for AI agents. Persistent memory across sessions.

36 installs/wk local only
Central Intelligence
by alekseimarchenko

Persistent memory for AI agents. Store, recall, and share knowledge across sessions.

41 installs/wk local only
MCP Memory
by infoinlet-marketplace

Persistent searchable memory for AI agents — save/get/search across sessions, tags.

39 installs/wk local only
T
Total Recall
by bas-more

Persistent, verified, cross-session memory for AI agents. 26 tools. SQLite + sync.

77 installs/wk local only
T
Total Recall
by avi-bendetsky

Persistent, verified, cross-session memory for AI agents. 26 tools. SQLite + sync.

local only

ctxstore — memory that follows you across models — questions

Answers built from our own checks of this server.

What can ctxstore — memory that follows you across models do?
It exposes 31 tools, read directly from the server on our last check. Among them: accept_invite, bind_agent, decline_invite, delete_fact, get_fact, get_fact_history and 25 more. The full list with descriptions is on this page — we take it from the server itself via tools/list, not from a README. How MCP servers expose tools in the first place →
What is ctxstore — memory that follows you across models mostly used for?
Its tools cluster around index, store and fact. That is what this server is built to work with — the grouping comes from the actual tool names, not from a category we assigned.
Is ctxstore — memory that follows you across models working right now?
We send a real MCP handshake every 15 minutes. Over the last 24 hours 92 of 92 checks got a reply (100.0%), average response time 395 ms. The bar chart above shows every period we have measured.
How do I connect ctxstore — memory that follows you across models?
Copy the ready config from this page — we generate it for Claude Code, Claude Desktop, Codex, Cursor and VS Code, each with the file path that client actually reads. It is a remote server, so there is nothing to install — the client connects to the address.
Does ctxstore — memory that follows you across models need an API key?
No. ctxstore — memory that follows you across models completed a full MCP handshake with us as an anonymous client and listed its tools without asking for anything. All 31 of them are readable on this page. This is what we observed, not what the docs claim.
How fast is ctxstore — memory that follows you across models?
It answers our handshake in 395 ms on average, which is faster than 32% of all working MCP servers we measure. The comparison comes from our own checks across the whole registry, every 15 minutes.
Is ctxstore — memory that follows you across models open source?
Yes — it is published under the MIT licence, written in Python, 0 stars on GitHub and 1 open issue. The source link is on this page, so you can read exactly what it does with your data before you connect it.