Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

ctxstore — memory that follows you across models

REMOTE · MCP.CTXSTORE.AI

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

Available components

+3 this week 81 Trust /100

Last scanned (13 hours ago)

Scores higher than 86% of remote servers

Reachable. Last reached 24 Oct 2026.

Category Memory and Knowledge

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security83
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
  • HTTPS enforcement could not be verified: the plaintext port answered with HTTP 400, which proves neither a plaintext path nor enforcement. View diagnostics → Unverified
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
  • The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
Schema Quality & AI Usability78
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 6492 tokens (~196/item across 33 items; 32 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management43
  • Stability check failed: schema churn in the 14 days we've observed: 0 tool removals, 2 breaking changes, 0 auth/transport breaks, 1 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 99% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 34 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 23 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 36 to 40.

  • 21 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 30 to 33.

  • 20 Oct 26 0
    • New tool “watch_events” functional
  • 19 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 26.

  • 17 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 16 to 20.

  • 15 Oct 26 0
    • Stability: 0.13 → fail ▼ security
    • A breaking change shipped without a version bump: still 1.0.0 ▼ security
    • “search_facts” changed the type of “layer”: integer|string → integer ▼ functional
    • “store_fact” changed the type of “layer”: integer|string → integer ▼ functional
    • “search_facts” reworded the description of “layer” cosmetic
    • “store_fact” reworded the description of “layer” cosmetic
  • 13 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 12 Oct 26 +1
    • Stability: unverified → 0.07 ▲ functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 24 Oct 2026 · Probed https://mcp.ctxstore.ai/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=ctxstore.ai CN=WE1,O=Google Trust Services,C=US 27 Aug 2026 25 Nov 2026 ECDSA 256 ECDSA-SHA256 45b07988142305b91335beaa3694d952
SANs: ctxstore.ai, *.ctxstore.ai
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.ctxstore.ai. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
ai. present 3799 8 Verified
ctxstore.ai. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://mcp.ctxstore.ai/.well-known/oauth-protected-resource"

Bearer resource_metadata="https://mcp.ctxstore.ai/.well-known/oauth-protected-resource"
Header Value
strict-transport-security max-age=31536000; includeSubDomains; preload
content-security-policy default-src 'none'; frame-ancestors 'none'
x-content-type-options nosniff
x-frame-options DENY
referrer-policy strict-origin-when-cross-origin

Protected resource metadata

Document https://mcp.ctxstore.ai/.well-known/oauth-protected-resource
Retrieved Yes
Resource https://mcp.ctxstore.ai/mcp
Authorisation server https://ctxstore.ai

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.ctxstore.ai/mcp Verified 200
http (plaintext) http://mcp.ctxstore.ai/mcp Inconclusive 400
MCP tools · 32 exposed · ~6,154 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
accept_invite ~192

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

NameTypeReqDescription
codestring–6-digit code from email (required when step=confirm).
grant_idstringyesUUID of the invitation (from list_invites or invite email).
stepstringyesrequest = send OTP email; confirm = submit code.

No output schema declared.

No examples provided.

bind_agent ~173

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.

NameTypeReqDescription
agent_idstringyesAgent identity slug (e.g. 'emily_code_4.7'). Empty string clears the binding.

No output schema declared.

No examples provided.

decline_invite ~62

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.

NameTypeReqDescription
grant_idstringyesUUID of the invitation to decline.

No output schema declared.

No examples provided.

delete_fact ~67

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.

NameTypeReqDescription
fact_idstringyesThe UUID of the fact to delete

No output schema declared.

No examples provided.

get_fact ~138

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.

NameTypeReqDescription
keystringyesExact fact key (e.g. 'sprint:bootstrap-namespace:review-emily_dev')

No output schema declared.

No examples provided.

get_fact_history ~78

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.

NameTypeReqDescription
keystringyesThe fact key to retrieve history for (e.g. 'session-latest', 'current-stack')

No output schema declared.

No examples provided.

get_session_seed ~62

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_stats ~49

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

ghost_mode ~79

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).

NameTypeReqDescription
onbooleanyesTrue to enable ghost mode, False to disable

No output schema declared.

No examples provided.

index_recent ~118

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.

NameTypeReqDescription
limitinteger–Max entries to return (default 50, max 200)
since_seqinteger–Only return entries with seq > this value (for pagination)

No output schema declared.

No examples provided.

index_search ~140

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?"

NameTypeReqDescription
agent_namestring–Filter by agent name from agent_signature
limitinteger–Max entries to return (default 100)
namespacestring–Filter by namespace (e.g. 'sprint', 'default')
opstring–Filter by operation: create, update, delete, or move
since_seqinteger–Only return entries with seq > this value

No output schema declared.

No examples provided.

index_stats ~41

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

introduce_yourself ~157

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.

NameTypeReqDescription
introductionstringyesYour introduction: what you noticed, what you bring, any feedback on the platform
modelstringyesYour model name (e.g. 'claude-sonnet-4-5', 'gpt-4o')
platformstring–Where you're running (e.g. 'Claude Desktop', 'Cursor', 'API')

No output schema declared.

No examples provided.

leave_grant ~60

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.

NameTypeReqDescription
grant_idstringyesUUID of the active grant to leave.

No output schema declared.

No examples provided.

list_facts_by_key_prefix ~284

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).

NameTypeReqDescription
limitinteger–Max facts to return (default 50).
prefixstringyesKey prefix to match (e.g. 'comms:emily_code_4.7v1.1:').
since_epochnumber–Optional unix-epoch seconds. Only facts with timestamp > since_epoch are returned. Use your last-wake-epoch for inbox scans.

No output schema declared.

No examples provided.

list_invites ~152

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

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_workspaces ~75

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

load_context ~799

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.

NameTypeReqDescription
agent_idstring–Calling agent's identity slug (e.g. 'emily_code_4.7'). When set, self-note injection uses exact-key lookups (agent:<agent_id>:self-note:closing/opening) instead of tenant-wide substring scans — requi…
fullboolean–Return the full (uncapped, 32KB) bundle via the complete compose path. The MCP initialize response already inlines an ~8KB wake bundle for returning agents, and a plain load_context() serves that sam…
hintstring–Ambient query for the baton section: what this session is about before the user has said anything (e.g. the git branch + last commit subject, the project directory, the calendar). Searched alongside…
max_fact_charsinteger–Per-fact body cap. Facts exceeding this length are truncated in the bundle with an explicit get_fact() pointer for the full body. Default 1500. Tunable up if you legitimately need more, but consider…
max_total_charsinteger–Total bundle cap. If the assembled bundle exceeds this, a BUNDLE WARNINGS section is appended with the size signal. The bundle is NOT truncated at this limit — the warning lets the caller decide whet…
profilestring–Optional profile slug (e.g. 'worker-dev', 'orchestrator', 'analyst', 'cold'). Server reads <scope>:profile:<profile>:current in tenant first (if scope set), then platform:profile:<profile>:current in…
scopestring–Optional project/tenant-scope prefix (e.g. 'chad' or a project slug like 'emily-core'). Used for profile lookup AND, when agent_id is set, for project-scoped self-note lookups (project:<scope>:agent:…
sectionstring–Expand one section of the wake index: every pointer (key — headline) in that key family, ranked permanent → active → newest. Section names are the headers in the inlined index (e.g. 'conventions', 'p…
top_k_per_layerinteger–Max facts to return per layer (default 10)
varsobject–Variable substitutions for the recipe (e.g. {'TASK_FACT_KEY': 'comms:dispatch:dev:42'}). Unknown variables remain literal in the resolved keys.

No output schema declared.

No examples provided.

mark_salient ~244

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.

NameTypeReqDescription
fact_idstring–UUID of the fact to mark salient (from search results). Provide this OR key.
keystring–Exact fact key — marks the current version. Provide this OR fact_id.
reasonstringyesREQUIRED. Why this matters NOW, e.g. 'Snowflake migration deadline in 3 days' or 'debugging live incident #612'.
weightnumber–Salience strength 0-3 (default 1). Use ~0.5 for mildly topical, 1 for the current task, 2-3 for a live incident or imminent deadline.

No output schema declared.

No examples provided.

move_fact ~140

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.

NameTypeReqDescription
fact_idstringyesThe UUID of the fact to move
new_layerinteger–New layer: 0=identity, 1=architecture, 2=state, 3=session. Optional.
new_namespacestring–New namespace (e.g. 'archive', 'bootstrap-v2'). Optional.

No output schema declared.

No examples provided.

reinforce_fact ~246

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.

NameTypeReqDescription
fact_idstring–UUID of the fact to reinforce (from search results). Provide this OR key.
keystring–Exact fact key — reinforces the current version. Provide this OR fact_id.
reasonstringyesREQUIRED. The concrete outcome this recall led to, e.g. 'used this fact to fix #492; deploy went green'. Rewards must trace to real outcomes.
weightnumber–Reward strength 0-3 (default 1). Use ~0.5 for minor wins, 1 for a confirmed success, 2-3 for major verified outcomes.

No output schema declared.

No examples provided.

resume_session ~21

Call to load session continuity. Last session: no prior session.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

revoke_grant ~59

Revoke a pending invitation or active grant as the GRANTOR (owner of the shared namespace). Idempotent. Grantees use decline_invite / leave_grant.

NameTypeReqDescription
grant_idstringyesUUID of the grant to revoke.

No output schema declared.

No examples provided.

search_context ~105

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.

NameTypeReqDescription
days_backinteger–Only search within last N days
querystringyesNatural language search query
sourcestring–Filter by source: 'chatgpt' or 'claude'
top_kinteger–Number of results (default 20, max 100)

No output schema declared.

No examples provided.

search_facts ~300

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'.

NameTypeReqDescription
boost_recentboolean–When true (default), appends the 5 most recent facts for recency signal. Set false to get pure semantic results without recent-fact injection.
categorystring–Filter by category
layerinteger–Context persistence layer: 0=identity, 1=architecture, 2=state, 3=session.
namespacestring–Filter results to a specific namespace.
querystringyesWhat to search for
recollectboolean–When true (default), appends a RECOLLECTIONS section: facts cross-referenced from the top hits via related_facts and [[wiki]] links, ranked by association strength times outcome-weighted usefulness (…
top_kinteger–Number of results

No output schema declared.

No examples provided.

setup_account ~635

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='their@email.com'). Then ask the user for the 6-digit code from their email and call setup_account(mode='verify', code='123456', email='their@email.com'). 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.

NameTypeReqDescription
agent_idstring–Optional: bind a sticky agent identity (e.g. 'emily_code_4.7') in the same call. Equivalent to calling bind_agent immediately after a successful setup. Persists to mcp_sessions.agent_id (migration 00…
api_keystring–API key from a previous session (required for mode='restore')
codestring–6-digit verification code from email (required for mode='verify').
emailstring–Email address. Required for mode='link_or_create'. Also pass on mode='verify' — required when session state is lost (common in claude.ai chat due to session ID rotation).
modestringyes'link_or_create' = primary path — user provides email, server handles new vs returning. 'verify' = OTP confirmation step after link_or_create (pass email= and code=). 'restore' = user has emk_* API k…

No output schema declared.

No examples provided.

store_fact ~371

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.

NameTypeReqDescription
categorystringyesFact category
is_permanentboolean–Whether this fact should bypass temporal decay
keystring–Named key for this fact. Storing with the same key auto-archives the previous version. Use for facts that change over time: 'session-latest', 'current-stack', 'team-size'.
layerinteger–Context persistence layer: 0=identity/stable, 1=architecture/monthly, 2=state/weekly, 3=session/daily.
namespacestring–Optional namespace to organise facts (e.g. 'work', 'personal'). Defaults to 'default'.
related_factsarray–Optional list of related fact UUIDs to link (knowledge graph edges)
textstringyesThe fact to store

No output schema declared.

No examples provided.

store_facts ~111

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.

NameTypeReqDescription
factsarrayyes–

No output schema declared.

No examples provided.

store_session_summary ~375

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'

NameTypeReqDescription
contributorsarray–Optional list of contributor IDs when multiple agents or users collaborated this session (e.g. ['agent-A', 'chad', 'emily']). Stored in summary for attribution.
decisionsstring–Key decisions made or conclusions reached
next_stepsstring–What's pending, open questions, what to pick up next session
scopestring–Optional project slug for project-scoped last-wake-epoch watermark (conventions/wake-rehydration-v2:current).
session_idstring–Optional client identifier to scope this summary: 'claude-code', 'cursor', 'claude-chat', 'openclaw'. Defaults to bare session-latest.
summarystringyesWhat happened this session — decisions made, work done, context established

No output schema declared.

No examples provided.

switch_workspace ~131

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.

NameTypeReqDescription
namestringyesProject slug (the <slug> in project:<slug>:*), or '' to widen.

No output schema declared.

No examples provided.

wake_status ~357

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.

NameTypeReqDescription
agent_idstring–Calling agent's identity slug (e.g. 'emily_code_4.7'). When set, closing/opening/identity checks use exact-key lookups (agent:<agent_id>:self-note:closing, agent:<agent_id>:identity) instead of tenan…
profilestring–Optional profile slug to validate REQUIRE keys against (e.g. 'worker-dev').
scopestring–Optional project/tenant-scope prefix (e.g. 'chad' or a project slug). Used for tenant-local recipe override AND, when agent_id is set, for project-scoped self-note lookups (project:<scope>:agent:<age…
varsobject–Variable substitutions for the recipe (e.g. {'TASK_FACT_KEY': 'comms:dispatch:dev:42'}).

No output schema declared.

No examples provided.

watch_events ~333

Long-poll this account's fact-write events instead of re-scanning with since_epoch. Every store/supersede/delete/archive/restore/move publishes one event {key, id, namespace, layer, op, ts, seq}. One call waits up to max_wait_s (max 25) for the first matching event and returns up to 50, plus next_since. MCP has no streaming here, so loop: pass next_since back as `since` on the next call and nothing is missed (the server keeps the last ~10000 events per account). Omit since to start from now; since=0 replays what is retained; a bare integer N returns events with seq > N. EXAMPLES - Wait for hands to post results: watch_events(prefix='task:pr27-review:result:', max_wait_s=25) - Resume: watch_events(prefix='comms:<your-agent-id>:', since='<next_since>') Inside a workspace only events for keys the grant can read are returned. Long-lived clients can use GET /api/v1/events (SSE) instead.

NameTypeReqDescription
max_wait_snumber–Seconds to wait for the first event (0-25, default 20).
namespacestring–Only events in this namespace (exact).
prefixstring–Only events whose key starts with this prefix.
sincestring–Resume cursor: the next_since of the previous call (a stream id '<ms>-<n>'), '0' for everything retained, or a seq integer. Omit to start from now.

No output schema declared.

No examples provided.

Install

How do I install the ctxstore — memory that follows you across models MCP server?

ctxstore — memory that follows you across models is a hosted endpoint at https://mcp.ctxstore.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.ctxstore.ai

# add to Claude Code
claude mcp add --transport http ai-ctxstore-ctxstore-mcp 'https://mcp.ctxstore.ai/mcp'
Common questions

What is the ctxstore — memory that follows you across models MCP server?

ctxstore — memory that follows you across models is an MCP server listed in the public MCP registry as ai.ctxstore/ctxstore-mcp. Persistent memory for AI agents: keyed facts, a wake bundle each session, one memory in every model. This page covers its hosted endpoint (https://mcp.ctxstore.ai/mcp).

Is the ctxstore — memory that follows you across models MCP server safe to use?

ctxstore — memory that follows you across models scores 81 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the ctxstore — memory that follows you across models MCP server expose?

ctxstore — memory that follows you across models exposes 32 tools: accept_invite, bind_agent, decline_invite, delete_fact, get_fact, and 27 more. Their descriptions and schemas cost roughly 6,154 tokens of context every time the server is loaded.

Does the ctxstore — memory that follows you across models MCP server require authentication?

Yes. ctxstore — memory that follows you across models asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the ctxstore — memory that follows you across models MCP server still maintained?

ctxstore — memory that follows you across models is still listed as active in the MCP registry. We last reached this channel on 24 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.