ctxstore — memory that follows you across models
Server Details
Persistent memory for AI agents: keyed facts, a wake bundle each session, one memory in every model.
- Status
- Healthy
- Uptime
- 99.9% over 23 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- ctxstore-ai/ctxstore-mcp
- GitHub Stars
- 0
TDQS
Scored across 33 tools
The set separates storage, retrieval, bootstrap, workspace, and collaboration concerns, but multiple tools overlap in purpose: search_facts vs search_context vs index_search vs list_facts_by_key_prefix, and load_context vs resume_session vs wake_status vs get_session_seed. Descriptions help clarify boundaries, but an agent may still hesitate over which retrieval or bootstrap path to use.
Most names follow a predictable snake_case verb_object pattern such as store_fact, list_invites, switch_workspace, and delete_fact. There are minor deviations like ghost_mode and wake_status, plus singular/plural pairs such as store_fact/store_facts, but the convention is still readable and mostly consistent.
At 33 tools, the surface is well above the typical well-scoped range and includes many specialized operations such as salience marking, ghost mode, index stats, event watching, and a full invitation lifecycle. Some complexity is inherent to the domain, but several tools could likely be consolidated or made optional.
The surface covers account setup, fact storage, retrieval, version history, move/delete, bulk storage, session summaries, workspaces, invitations, events, and usage stats. A minor gap is the lack of direct get-by-UUID or update-by-ID operations, but keyed versioning and prefix scans cover most workflows.
Available Tools
33 toolsaccept_inviteAccept Namespace InvitationAIdempotentInspect
Accept a namespace invitation addressed to THIS authenticated account's verified email (two-step email OTP).
Steps:
step='request' — emails a 6-digit code to the invited address (may return 402 needs Collaborator, or 503 if mailer fails).
step='confirm' with code= the 6 digits — activates the grant. Then switch_workspace(name=) enters it on this same connection (mcp_config with the X-Ctxstore-Workspace header is also returned for header-based clients).
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
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | 6-digit code from email (required when step=confirm). | |
| step | Yes | request = send OTP email; confirm = submit code. | |
| grant_id | Yes | UUID of the invitation (from list_invites or invite email). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: email OTP mechanics, possible 402/503 responses, the fact that the code authorizes only the named grant_id, and the returned mcp_config header for header-based clients. This is exactly the kind of operational context annotations do not capture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then gives a compact numbered flow with no wasted sentences. The docs link and mcp_config note are operationally useful rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a two-step authentication tool with no output schema: it explains prerequisites, both steps, error conditions, scope limitation, and the next action. An agent has enough information to invoke it correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description still adds useful semantic context, especially that the code activates the named grant_id only and authorizes nothing else, though most individual parameter details are already covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: accept a namespace invitation for the authenticated account's verified email. It distinguishes the tool from siblings by naming list_invites as the source of grant_id and switch_workspace as the follow-up step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly defines the two-step flow with step='request' then step='confirm', including the specific conditions and likely error outcomes (402 needs Collaborator, 503 mailer failure). It also names the prerequisite sibling list_invites and the post-accept action switch_workspace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bind_agentBind Agent IdentityAIdempotentInspect
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=). Idempotent: re-binding the same agent_id is a no-op. Pass agent_id='' to clear the binding.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | Agent identity slug (e.g. 'emily_code_4.7'). Empty string clears the binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the write-once/idempotent/no-destroy profile is covered structurally. The description adds real value beyond that: persistence to mcp_sessions.agent_id (migration 0008), survival across setup_account(mode='restore'), and automatic re-hydration. It does not describe the return value, but the behavioral footprint is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, with persistence, call timing, and clearing handled in short follow-on paragraphs. The migration-number citation is slightly gratuitous but overall every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema, annotation-covered tool, the description covers effect, lifetime, idempotency, and teardown thoroughly. Nothing an agent needs to bind identity correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the empty-string clearing convention, which sets a baseline of 3. The description goes further, explaining the sticky-default behavior the parameter enables and that per-call override still works, adding real semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Bind a sticky agent identity to this MCP session.' It also names the downstream consumers (wake_status, load_context) that read the binding, letting an agent distinguish this tool from those siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call ('once near the start of a session, ideally from your boot recipe'), states the exact no-op condition (re-binding the same agent_id), and documents the clearing path (agent_id=''). Override behavior of downstream calls is also spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decline_inviteDecline Namespace InvitationAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| grant_id | Yes | UUID of the invitation to decline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the safety profile is covered. The description adds real context beyond that: the server verifies the caller is the invitee via email/tenant match, and the invitation must still be pending. It stops short of saying what a successful decline returns or what error surfaces on a mismatch, hence a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, front-loaded with the action and its precondition, with the alternative routing placed last where it belongs. No sentence is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param mutation with no output schema, the description supplies the operation semantics, the authorization check, and the sibling alternative. The only minor gap is the absence of any statement about failure modes (e.g., non-pending invitation, non-invitee caller), which annotations do not cover.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter and 100% schema description coverage, the schema already fully documents grant_id as the UUID of the invitation. The description adds no syntax, format, or sourcing detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Decline), the exact resource (a pending status=invited namespace invitation), and the actor role (as the grantee). It also distinguishes itself from the sibling revoke_grant by naming it as the grantor-side alternative, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the precondition for use (the invitation must be pending, status=invited), restricts who may call it (the grantee), and explicitly routes grantors to revoke_grant instead. Both the 'when' and the 'when-not'/alternative are given, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_factDelete FactADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fact_id | Yes | The UUID of the fact to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds the crucial nuance that this is non-permanent: the fact is 'marked deleted but preserved' for audit and undo and 'excluded from all normal searches.' That materially changes how an agent reasons about the call beyond the safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded verb and resource, with each sentence carrying distinct information (soft-delete, preserved for audit/undo, search exclusion, usage trigger). 'Excluded from all normal searches' is slightly redundant with 'marked deleted' but still clarifies discoverability impact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with full annotation coverage and no output schema, the description supplies everything an agent needs: reversibility, search impact, and the condition for use. Nothing relevant to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already carries its own description ('The UUID of the fact to delete'). The description's 'by its UUID' adds no format or constraint detail beyond that, so the schema does the heavy lifting and baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (soft-delete) and resource (stored fact) keyed by UUID, and the parenthetical 'Smart Forget' plus the soft-delete qualifier distinguishes it from a hard destructive delete. An agent can tell it apart from siblings like get_fact or move_fact without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when information is no longer accurate or relevant' gives a clear triggering condition. It does not name alternatives or note when NOT to use it (e.g., undoing a prior deletion), so it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_factGet Fact by KeyARead-onlyIdempotentInspect
Retrieve a fact by its exact key — deterministic, never misses. Use get_fact for self-notes: get_fact(key='agent::self-note:opening') or get_fact(key='agent::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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Exact fact key (e.g. 'sprint:bootstrap-namespace:review-emily_dev') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior: retrieval is deterministic ('never misses') and returns only the current, non-deprecated version of the fact. That version-filtering behavior is not derivable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose before the usage rationale. It is slightly dense with repeated examples, but every sentence carries information an agent needs to invoke it correctly, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating what is returned ('the current non-deprecated version'). It fully covers how and when to retrieve. Minor omission is whether a miss returns null vs an error, but overall it is complete for a single-key lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema's generic example by giving concrete key formats ('agent:<name>:self-note:opening') and stressing that the key must be an EXACT match for the deterministic path to work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a fact by its exact key') and immediately distinguishes itself from the two closest siblings, search_facts and get_fact_history, by emphasizing exact-key retrieval. The agent can tell this apart from its siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use it (self-notes, inter-agent handoffs when the exact key is known) and when the alternative fails ('search_facts misses self-notes because their embedding similarity scores below other identity facts'). It even supplies the exact key patterns to call with, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fact_historyFact Version HistoryARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The fact key to retrieve history for (e.g. 'session-latest', 'current-stack') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior: the returned payload is a list of versions and the ordering is newest to oldest, which matters because no output schema exists. Pagination/limit behavior is not mentioned, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: purpose and payload composition first, then usage context, then return ordering. No redundancy and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming the payload shape and its ordering. Given a single required parameter, full schema coverage, and annotations covering safety and idempotency, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'key' parameter, with the schema itself supplying examples ('session-latest', 'current-stack'). The description only reinforces the notion of a 'keyed fact' and adds no format or syntax detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (return the version history for a keyed fact) and defines scope precisely: current version plus all deprecated predecessors. This implicitly separates it from the sibling get_fact, but it never names that sibling, so the differentiation is inferred rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete use cases — seeing how a fact evolved over time and undoing an accidental correction — which is clear contextual guidance. It stops short of naming alternatives (e.g. 'for only the current value, use get_fact'), so no exclusion guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_session_seedSession SeedARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the description's added value is freshness and cost semantics: 'Generated nightly and on session disconnect' tells the agent the result may be stale, and '~500 tokens' flags it as cheap. Return shape and any staleness guarantees are left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler: the payload description comes first, then the usage rule with its alternative. Every clause carries information the agent needs, including the token budget and generation cadence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description must fully characterize the return value, and it largely does (bio content, ~500 tokens, freshness cadence) and names the fallback tool. Minor gaps remain around whether the seed can be absent for a new tenant or how stale it can be.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema makes no semantic demands and the description has nothing to disambiguate. Baseline of 4 applies; the description correctly adds nothing extraneous about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the pre-computed session seed'), then defines the artifact concretely ('a compact first-person bio (~500 tokens)'). It explicitly positions itself against a named sibling (load_context), so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear selection condition ('when you just need orientation') and names the alternative tool (load_context) as the heavyweight option. It does not spell out explicit exclusions or prerequisites, but the tradeoff implies when not to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statsMemory StatsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds behavioral value by listing exactly which metrics are returned (storage totals, plan limits, collection sizes, daily query counts), which is useful since there is no output schema. It does not clarify scope (e.g., account vs workspace) or freshness, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the tool's output content and then the usage trigger. Every clause adds distinct information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with no output schema, the description supplies the key return categories and the reason to call it. It is nearly complete, though it could note whether the stats are scoped to the account, workspace, or agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies per the scoring guidelines. There are no parameter semantics to add beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get your memory usage statistics') and enumerates the concrete metrics returned (total facts stored, plan limits, collection sizes, daily query counts). It clearly identifies the tool's scope, but does not explicitly differentiate itself from the sibling 'index_stats', which could be confused as another stats tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the trigger condition: 'Call this to check how much storage you have used and how close you are to your plan limits.' That is clear when-to-use guidance, though it offers no when-not-to-use or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ghost_modeGhost ModeAIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| on | Yes | True to enable ghost mode, False to disable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the key non-obvious behavior: writes silently succeed but do NOT persist, which sibling tools are unaffected, and that the flag resets to off on session reconnect because it is not persisted. These are exactly the behavioral traits an agent needs and none are derivable from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the effects, then the lifecycle caveat. No filler and every clause conveys actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-boolean toggle with no output schema, the description covers everything needed: what it does, what it suppresses, what it leaves alone, and when it resets. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter is a single boolean, so the baseline is already met. The description adds real semantic content by spelling out the consequence of on=True versus the implicit off state, giving the parameter meaning beyond the schema's tautological 'True to enable ghost mode'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (enable/disable), the resource (ghost mode), and its scope (this session). It also anchors the concept by naming the sibling tools it affects (store_fact, store_session_summary, search_facts), so an agent can place it immediately against the rest of the toolset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the operational context clear: enabling ghost mode turns store_fact and store_session_summary into silent no-ops while reads keep working normally, which strongly implies a dry-run/do-not-persist scenario. It does not, however, give explicit 'use this when/do not use this when' phrasing or name an alternative tool for the same goal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_recentRecent Activity IndexARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries to return (default 50, max 200) | |
| since_seq | No | Only return entries with seq > this value (for pagination) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so safety is covered. The description adds genuinely new behavior beyond that: it exposes the visibility guarantee (recent writes always visible because ranking is bypassed) and enumerates the per-entry fields, which matters because no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the what and the when, with no filler. The trailing field-enumeration sentence is list-like but earns its place by standing in for the missing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so by naming the entry fields and the ordering guarantee; pagination is handled by the since_seq schema description. An agent has enough to call it correctly, though it never states a default or cost of a large limit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — limit and since_seq are fully documented in the schema, including defaults, max, and pagination semantics. The description adds no parameter-level detail of its own, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (return recent fact operations) with scope (across all agents in this tenant) and ordering (newest first). It also distinguishes itself from the sibling index_search by noting it bypasses semantic search ranking, so an agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger — 'Use this on session start to see what other agents wrote since you were last active' — which tells the agent exactly when this tool is the right pick over search_facts/search_context. It stops short of naming alternative tools or stating when not to use it, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_searchSearch Activity IndexARead-onlyIdempotentInspect
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?"
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | Filter by operation: create, update, delete, or move | |
| limit | No | Max entries to return (default 100) | |
| namespace | No | Filter by namespace (e.g. 'sprint', 'default') | |
| since_seq | No | Only return entries with seq > this value | |
| agent_name | No | Filter by agent name from agent_signature |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered without the description. The description adds only the 'tenant activity index' framing and filter dimensions, with no pagination, ordering, or result-size behavior beyond the limit param.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences plus a quoted example, with the core purpose front-loaded. The example earns its place by illustrating filter combinations, though it is slightly redundant with the preceding enumeration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent search tool with a fully documented schema and no required params, the description supplies purpose and a use scenario. Return ordering/pagination nuances are not covered, but the absence of an output schema and the strong annotation coverage keep this near-complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in the schema; baseline 3 applies. The description's example implicitly shows how agent_name, namespace, and op combine, but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('filtered search over the tenant activity index') and enumerates the search dimensions (agent, namespace, create/update/delete). An agent can tell it is a search tool, but it does not explicitly differentiate it from siblings like index_recent or search_facts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The coordination scenario ('what did emily_dev store in the sprint namespace today?') gives a concrete when-to-use signal. However, no alternatives are named and there is no when-not guidance versus index_recent, index_stats, or search_context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_statsIndex StatsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuine behavioral value beyond them by naming what the aggregated data actually contains (per-agent, per-namespace, per-day breakdowns), though it omits cost, freshness, or time-window behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence, front-loading the data source before the breakdown list. The trailing 'and where' is mildly vague filler but the whole thing is compact with no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so reasonably via the breakdown list. What is missing is sibling differentiation from get_stats and any scoping/freshness note, which keeps it short of full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case; the description correctly does not invent parameter talk. One caveat: with no parameters, the scope of the statistics (which tenant, what time range) is fixed by the server and is never stated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear resource — usage statistics from the tenant activity index — and enumerates the aggregation dimensions (total operations, by agent, by namespace, by day). An agent knows what it gets, but the description never distinguishes it from the sibling get_stats, which is the most likely confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing phrase 'useful for understanding which agents are most active and where' implies a usage context but gives no when/when-not guidance and no routing against get_stats, index_recent, or index_search. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
introduce_yourselfIntroduce AgentAIdempotentInspect
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:-
Include: what model you are, what platform you're running on, and anything you noticed on first connect.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Your model name (e.g. 'claude-sonnet-4-5', 'gpt-4o') | |
| platform | No | Where you're running (e.g. 'Claude Desktop', 'Cursor', 'API') | |
| introduction | Yes | Your introduction: what you noticed, what you bring, any feedback on the platform |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds genuine behavioral context beyond that by disclosing the exact write target (category=identity, namespace=shared/agent-feedback, key=intro:<model>-<date>), which also explains why the operation is idempotent within a day. It does not describe the response, but the storage disclosure is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and optionality, then the storage shape, then the content guidance. Every line earns its place and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description covers what is stored (model info + note), where it is stored, and what to include, which is sufficient for a simple write tool. The only minor gap is return/confirmation behavior, which is not critical for this optional self-registration call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters, including examples for model and platform. The description reinforces the intent ('what model you are, what platform you're running on') but adds no format or syntax detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('introduce yourself to the platform') and immediately clarifies the effect: it stores model info and a note in the shared agent registry. It further distinguishes itself from store_fact by revealing the fixed category/namespace/key pattern it writes to, so an agent can tell it apart from the generic fact-storage siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Flags the tool as 'Optional' and hints at first-connect usage ('anything you noticed on first connect'), which gives implicit context. However, it never states when to prefer this over store_fact, nor any when-not conditions or prerequisites, leaving the routing decision largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inviteInvite Someone to a NamespaceAIdempotentInspect
Invite one person, by email, to read and write one namespace prefix of THIS account (for example project:barn). Creates a pending grant and emails them; nothing is shared until they accept with list_invites and accept_invite from their own account. Calling again for the same person and prefix returns the existing invitation without a second email. Withdraw with revoke_grant(grant_id). Not available from a shared workspace session. Their first 30 days of Collaborator time are free; after that you can pay their $19 per 30 days from /account. You are emailed when they accept, and list_workspaces shows whether they have entered yet. Docs: https://ctxstore.ai/docs.html#verify-invitations
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional short note shown verbatim in the email (max 1000 chars). | |
| Yes | The invitee's email address. | ||
| namespace_prefix | Yes | Key prefix to share, e.g. 'project:barn'. No wildcards. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the safety/idempotency profile; the description goes well beyond: nothing is shared until acceptance, repeat calls return the existing invitation with no second email, an email is sent on acceptance, and list_workspaces reveals whether the invitee has joined. It also discloses the billing consequence (30 days free, then $19/30 days) that an agent might otherwise trigger unknowingly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and consequences; nearly every sentence carries operational value (idempotency, withdrawal, exclusion, acceptance visibility). Somewhat dense as a single block, and the pricing sentence plus docs link are the least essential parts, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, email-sending, idempotent tool with no output schema, the description covers the effect, the pending-state semantics, idempotency, how to undo, side effects, and how acceptance is observable. An agent has everything needed to call it and predict the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so email, namespace_prefix, and note are already documented with their constraints and examples. The description reinforces that the prefix is read-write and per-account but adds no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (invite), actor scope (one person, by email), resource (namespace prefix of THIS account) with a concrete example (project:barn). It is clearly distinguishable from siblings like list_invites, accept_invite, and revoke_grant, which are named in their respective roles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the follow-up flow on the recipient's side (list_invites and accept_invite), the withdrawal path (revoke_grant with grant_id), and a hard exclusion: not available from a shared workspace session. Named alternatives plus a when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leave_grantLeave Active Namespace GrantADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| grant_id | Yes | UUID of the active grant to leave. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine extra context: it is a self-service grantee action and the server verifies grantee authorization, which implies a permission precondition not expressed in the schema. It stops short of describing what the grantee loses (e.g., retained fact data or re-access options), so it is not fully complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and effect, then precondition, then the disambiguation to the sibling tool. Every sentence earns its place with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description covers action, actor, authorization verification, and the boundary with revoke_grant, while annotations cover destructiveness and idempotency. The main gap is the post-condition for the grantee (what access or data is affected after leaving), which is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage ('UUID of the active grant to leave'), so the schema already carries the semantics. The description adds no format, sourcing, or lookup guidance for grant_id beyond what the schema states, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Leave an active namespace grant') plus the role it acts as (the grantee) and the effect (stop using shared namespace). It also explicitly distinguishes itself from the sibling revoke_grant, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('as the grantee... stop using shared namespace') and when-not-to-use with a named alternative ('Grantors who want to cut off a collaborator must use revoke_grant'). No inference is required to pick between the two tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_facts_by_key_prefixList Facts by Key PrefixARead-onlyIdempotentInspect
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::', 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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max facts to return (default 50). | |
| prefix | Yes | Key prefix to match (e.g. 'comms:emily_code_4.7v1.1:'). | |
| since_epoch | No | Optional unix-epoch seconds. Only facts with timestamp > since_epoch are returned. Use your last-wake-epoch for inbox scans. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive safety, so the safety burden is covered. The description adds real behavioral context beyond them: deterministic vs semantic matching, newest-first ordering, the default limit of 50, and the returned field set. Does not cover pagination beyond limit or rate behavior, but that is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose and the sibling distinction, then examples. Every block earns its place, though the three examples plus the return-field sentence make it longer than strictly minimal; nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-shape burden and does so by listing the returned fields and ordering. Combined with the parameter guidance and routing to search_facts, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes further by showing concrete prefix syntax ('comms:<agent-id>:', 'chad:trio:', 'conventions/') and the intended feeding of since_epoch via last-wake-epoch. That meaning is not present in the raw schema strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (deterministic prefix scan over fact keys) with the scope constraint (optionally bounded by timestamp). Explicitly distinguishes itself from the sibling search_facts by explaining that the semantic search 'misses exact-key facts'. An agent can route between the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete use cases (R1 comms scans, dispatch discovery, trio listings, convention discovery) and the governing rule ('any case where you know the key prefix and want every match'). Names the alternative search_facts and the condition that selects against it, and reinforces with three worked examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invitesList Namespace Invites & GrantsARead-onlyIdempotentInspect
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='######'). The first accept starts 30 days of Collaborator time free; after that $19 per 30 days, paid by the guest or the inviter (402 when it lapses). After accepting, switch_workspace(name=) enters the workspace. Docs: https://ctxstore.ai/docs.html#verify-invitations
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), yet the description adds substantial context: it is a server-side authoritative list, rows carry status invited|active|revoked, verification requires matching grant_id plus namespace_prefix plus grantor, and the downstream accept flow costs 30 free days then $19/30 days with a 402 on lapse. That is behavior an agent could not infer from the annotations or empty schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core scope and return fields are front-loaded in the first sentence, with verification and follow-up acts after. The pricing/402 detail and the docs URL are somewhat tangential to a read-only listing tool and arguably belong with accept_invite, so the last paragraph is slightly over-weighted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain return values, and it does so with a concrete field list and enum values. It also covers the verification question and the next step after listing, leaving nothing essential for a correct call missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case, and the description correctly spends no words on arguments. It instead describes the output row shape, which is the only semantic surface available here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('List this account's namespace collaboration grants: incoming invitations and outgoing shares') and immediately enumerates the row fields, so an agent knows exactly what comes back. It is clearly distinct from invite, accept_invite, decline_invite, and revoke_grant, which mutate the same objects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger case ('An invitation referenced anywhere else ... can be checked against this server-side list') and routes the agent to accept_invite and switch_workspace for the follow-up flow. It stops short of stating an explicit exclusion, such as when to prefer list_workspaces or get_stats instead, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList WorkspacesARead-onlyIdempotentInspect
The places this account's memory is organised into: its own projects (anything written under project::*, newest activity first), the workspaces other people have granted it (enter one with switch_workspace(name=)), and, for a sharer, who they invited and whether each person accepted and entered yet (shared_by_you). Shows which workspace this session is in, if any. Use it when a person's request is about one project, or asks who has access, or whether an invitee came in.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is free; the description adds genuinely new behavior: ordering ('newest activity first'), the project:<slug>:* naming convention, and that the current-workspace field appears only 'if any'. It stops short of describing the shape of the shared_by_you records or ordering for granted workspaces.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries real information, but the opening is a long triple-clause construction loaded with nested parentheticals, and the usage guidance is buried at the end. Leading with the verb and the three return buckets would make it far more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description must carry the return shape alone, and it does: three result groups plus a conditional current-workspace field. Ordering for the granted-workspaces and shared_by_you sections is unspecified, a minor omission for a read-only list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description still supplies the key-prefix convention that governs the project entries and clarifies the grantor-name argument used by the sibling switch_workspace, which is extra context rather than schema repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates exactly what the call yields: own projects keyed by project:<slug>:*, workspaces granted by others, and shared_by_you invitee status, plus the current session workspace. That is unambiguous for an enumeration tool and rules out write siblings like switch_workspace, though it opens with a noun phrase ('The places...') rather than a verb, so the action itself is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Three concrete triggers are given ('request is about one project', 'asks who has access', 'whether an invitee came in'), and it explicitly routes the agent to switch_workspace(name=<grantor>) for entering a workspace. The gap is list_invites: the invitee-status content here overlaps that sibling and the description never says which to prefer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_contextLoad ContextARead-onlyIdempotentInspect
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: slug) to execute that profile's boot recipe — the server reads platform: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.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | 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 same cached bundle cheaply; pass full=true when you explicitly need everything (e.g. the inlined bundle was truncated). Default false. | |
| hint | No | 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 your previous self's agent:<id>:wake-baton:current queries; the hits not already in the layered bundle are appended as a baton section. A hinted bundle is compiled fresh (not served from the cache). | |
| vars | No | Variable substitutions for the recipe (e.g. {'TASK_FACT_KEY': 'comms:dispatch:dev:42'}). Unknown variables remain literal in the resolved keys. | |
| scope | No | 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:<agent_id>:self-note:closing preferred over global agent:<agent_id>:self-note:closing). | |
| profile | No | 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 platform_facts. | |
| section | No | 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', 'people', 'project:emily-core', 'agent:<your id>'). Bodies stay a get_fact away. | |
| agent_id | No | 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 — required for correct behaviour on multi-agent tenants where another agent's note would otherwise leak in. When omitted, falls back to the legacy substring scan for backwards compatibility. | |
| max_fact_chars | No | 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 splitting large facts instead. | |
| max_total_chars | No | 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 whether to lower top_k_per_layer or use targeted get_fact queries. Default 32000. | |
| top_k_per_layer | No | Max facts to return per layer (default 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: deterministic layer composition, a single-round-trip merged bundle for profile recipes, and the profile boot algorithm (read pointer, parse LOAD/REQUIRE/HANDLER, fetch named facts). It does not restate truncation/caching limits, which live in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior and structured into default-load, then profile-recipe usage. It is dense and slightly long, but for a 10-parameter tool with no output schema nearly every sentence carries load; minor redundancy with the schema's own parameter prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains what comes back (layered memory and merged bundles). It covers the default and profile flows well, but omits mention of the section-expansion and hint flows, which an agent must discover from parameter descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description meaningfully supplements it: profile semantics (server reads platform:profile:<profile>:current, follows the pointer, merges results) and vars supplying $TASK_FACT_KEY-style recipe variables are not obvious from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Load your bootstrap context') and decomposes exactly what is loaded (L0 identity, L1 architecture, L2 state, L3 session summary). It also distinguishes itself from the sibling search_facts, so an agent can tell it apart without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this at the START of a new session as an alternative to manual search_facts calls' gives explicit timing and names the alternative it replaces. It does not state when NOT to use it (e.g. mid-session refreshes vs. targeted get_fact), so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_salientMark Salient (this matters now)AIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Exact fact key — marks the current version. Provide this OR fact_id. | |
| reason | Yes | REQUIRED. Why this matters NOW, e.g. 'Snowflake migration deadline in 3 days' or 'debugging live incident #612'. | |
| weight | No | 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. | |
| fact_id | No | UUID of the fact to mark salient (from search results). Provide this OR key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior well beyond the annotations: max 1.4x boost, ~6-hour half-life, a global cap on stacked boosts, and the important safety guarantee that salience is ranking-only and cannot override tenant isolation, namespace grants, or privacy filters. This is context annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then decay behavior, then the sibling distinction, then usage constraint. Dense but every sentence carries a distinct, decision-relevant fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but for a ranking-marking operation the description supplies the full picture an agent needs: decay semantics, caps, safety limits, and required input. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already fully documented; the description's 'Name the current situation in reason' and its weight guidance largely restate what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (temporarily boost a fact's retrieval ranking) with a concrete mechanism (salience peptide) and immediately contrasts it with the sibling reinforce_fact. An agent can distinguish this from other fact tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers (approaching deadline, live incident, topic under active work) and names the alternative, reinforce_fact, along with the timescale distinction that selects between them (hours vs. weeks). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_factMove FactAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fact_id | Yes | The UUID of the fact to move | |
| new_layer | No | New layer: 0=identity, 1=architecture, 2=state, 3=session. Optional. | |
| new_namespace | No | New namespace (e.g. 'archive', 'bootstrap-v2'). Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish idempotent=true, destructive=false, readOnly=false. The description adds substantial behavioral context beyond that: it updates metadata in place, preserves fact_id, text, embedding, timestamp, and the deprecation chain, and explicitly avoids storage bloat. This is exactly the kind of mutation semantics the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then the invariants, then the use case. No filler — every clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-destructive, idempotent mutation with a fully documented schema, the description covers action, invariants, and motivation. The only omission is what the call returns or whether it reports confirmation, which is minor given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so fact_id, new_layer (with layer enum semantics), and new_namespace are already fully documented. The description names namespace and layer conceptually but adds no format, default, or validation detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Move a fact') and pins down the scope ('to a different namespace or layer without changing its content'). This cleanly separates it from siblings like store_fact, delete_fact, and get_fact without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit use case ('reclassifying facts, e.g. bootstrap-v2 refactor') and contrasts the alternative pattern ('store-new + soft-delete-old'), telling the agent when this is preferable. It stops short of naming the actual sibling tools or stating hard exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reinforce_factReinforce Fact (recall-on-success)AInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Exact fact key — reinforces the current version. Provide this OR fact_id. | |
| reason | Yes | REQUIRED. The concrete outcome this recall led to, e.g. 'used this fact to fix #492; deploy went green'. Rewards must trace to real outcomes. | |
| weight | No | Reward strength 0-3 (default 1). Use ~0.5 for minor wins, 1 for a confirmed success, 2-3 for major verified outcomes. | |
| fact_id | No | UUID of the fact to reinforce (from search results). Provide this OR key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the reward mechanics (bounded, time-decaying multiplier, max 1.5x, 14-day half-life) and, critically, the safety ceiling: the boost is ranking-only and cannot override tenant isolation, namespace grants, or privacy filters. Annotations merely say non-readonly/non-destructive/non-idempotent; the description explains the actual effect and its limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and mechanism, then the timing rule and safety constraint. The 'Reward peptide' flourish and parenthetical examples cost a little, but each sentence carries operational content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return/effect semantics, and it does: it explains exactly what the call changes (a bounded ranking multiplier) and what it cannot change. Timing, safety, and effect are all covered for this 4-param mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so key, fact_id, reason, and weight are already fully documented in the schema. The description reinforces the reason requirement and the outcome-tracing intent but adds no syntax or semantics beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('reinforce a fact') and immediately distinguishes it from similarity-based siblings by scoping it to facts whose recall led to a confirmed good outcome. The 'recall-on-success' framing makes it unambiguous versus mark_salient or store_fact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call ('AFTER the outcome is confirmed') and when not to ('never for a fact that merely seemed relevant'), with a concrete trigger list (fix worked, deploy green, user approved). This is the rare case of genuine when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_sessionResume SessionCIdempotentInspect
Call to load session continuity. Last session: no prior session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered structurally. The description adds no behavior beyond that: it does not say whether resuming mutates server state (note readOnlyHint=false despite the 'load' framing), what is returned, or what happens when no prior session exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short clauses with no padding, so it is terse, but the second fragment ('Last session: no prior session') reads as an injected dynamic value rather than usable instruction and creates more confusion than clarity without context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no parameters, so the description carries the full burden of explaining what resuming actually yields — and it does not. For a zero-arg stateful session tool sitting among several similar siblings, an agent is left guessing about both selection and result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; no parameter-level information is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'load' and object 'session continuity' are stated, but 'session continuity' is abstract and never concretized. Nothing separates this from close siblings such as get_session_seed, load_context, or wake_status, so an agent cannot tell which one to pick from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call to load session continuity' at best implies it belongs at session start, but there is no explicit when-to-use statement, no when-not, and no named alternative among the many context/session siblings. Routing must be inferred entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_grantRevoke Namespace Grant (Grantor)ADestructiveIdempotentInspect
Revoke a pending invitation or active grant as the GRANTOR (owner of the shared namespace). Idempotent. Grantees use decline_invite / leave_grant.
| Name | Required | Description | Default |
|---|---|---|---|
| grant_id | Yes | UUID of the grant to revoke. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so 'Idempotent' in the description adds no new information. What the description does add beyond the structured fields is the authorization requirement — the caller must be the grantor/namespace owner — which is real behavioral context an agent needs before invoking. It does not say what happens to the namespace or grantee state after revocation, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three terse sentences with the role constraint front-loaded, followed by the idempotency note and the alternative-tool routing. Nothing is padded and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool with rich annotations, the description covers scope, authorization role, idempotency, and alternatives. It leaves unspecified what a failed revocation by a non-owner looks like, but that gap is minor at this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter ('UUID of the grant to revoke'), so the schema carries the full parameter burden. The description adds no format, sourcing, or lookup guidance for grant_id, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (revoke) and resource (pending invitation or active grant) plus the actor role ('as the GRANTOR (owner of the shared namespace)'), which immediately distinguishes it from sibling grant/invite tools like decline_invite and leave_grant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the caller: grantors use this tool, while 'Grantees use decline_invite / leave_grant.' The condition that selects this tool versus its siblings is stated outright rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contextSearch ConversationsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language search query | |
| top_k | No | Number of results (default 20, max 100) | |
| source | No | Filter by source: 'chatgpt' or 'claude' | |
| days_back | No | Only search within last N days |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description clarifies the corpus it searches (conversations and session history) but adds nothing about result ranking, pagination, or result shape, and there is no output schema to cover that gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The scope statement comes first and the usage guidance follows immediately, making it easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should ideally hint at what search returns (ranking, snippet format, pagination), and it does not. Coverage of purpose and parameters is adequate, but the missing return-value context leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so query, top_k, source, and days_back are fully documented in the schema with defaults, ranges, and enum values. The description adds no parameter-level guidance beyond the schema, which meets the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: search across ingested conversations and session history. It implicitly distinguishes itself from fact-based siblings by targeting 'context that wasn't explicitly stored as a fact', though it never names search_facts directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear context for use (finding discussions, decisions made in conversation, or context not stored as a fact), which effectively routes the agent away from search_facts. It stops short of an explicit 'use X instead when...' exclusion statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_factsSearch FactsARead-onlyIdempotentInspect
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| layer | No | Context persistence layer: 0=identity, 1=architecture, 2=state, 3=session. | |
| query | Yes | What to search for | |
| top_k | No | Number of results | |
| category | No | Filter by category | |
| namespace | No | Filter results to a specific namespace. | |
| recollect | No | 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 (reward/salience). Set false for plain semantic results only. | |
| boost_recent | No | When true (default), appends the 5 most recent facts for recency signal. Set false to get pure semantic results without recent-fact injection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description's behavioral additions are thin: it discloses namespace prefix-matching semantics, but the RECOLLECTIONS/recent-fact augmentation behavior is already spelled out in the schema's recollect and boost_recent descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the routing decision before the mechanics and breaks the rest into short scannable blocks (namespace scoping, search tips). It is slightly longer than strictly necessary and omits any mention of recollect/boost_recent, so effort is spent unevenly across the parameter set.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, 1-required retrieval tool with no output schema and full schema coverage, the description supplies the missing routing context (when not to use it), namespace semantics and search strategy. There is no output schema to explain, and the output-shaping flags are documented in the schema, so nothing essential is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so a 3 is the floor and the schema already documents all seven parameters including the layer enum and the recollect/boost_recent toggles. The description goes slightly beyond that by explaining that namespace uses prefix matching ('webapp' matches 'webapp/decisions'), which the schema's one-line 'Filter results to a specific namespace' does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search your persistent memory for stored facts') and explicitly separates itself from the deterministic bootstrap siblings load_context() and wake_status(). An agent can route between semantic discovery and deterministic retrieval without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('when you need semantic discovery across the fact corpus') and when-to-prefer-alternatives ('For session bootstrap, prefer load_context() or wake_status()'). It even adds query-construction guidance ('use the words the fact was stored with'), which is unusually actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_accountSet up or restore memory accountAInspect
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 ' 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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | 6-digit verification code from email (required for mode='verify'). | |
| mode | Yes | '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 key from a prior session. 'link_email' = add email to an existing anonymous session. 'reveal_key' = echo the full API key (bound session, or email= + code= to verify by emailed OTP; responses otherwise show only a fingerprint). | |
| No | 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). | ||
| api_key | No | API key from a previous session (required for mode='restore') | |
| agent_id | No | 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 0008). wake_status and load_context will default to this agent_id when called without an explicit agent_id= arg. Per-call override still works. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: it explains the server's new-vs-returning branching, that it produces no duplicate/orphan accounts, that session IDs rotate between requests (forcing email= on verify and reveal_key), that reveal_key success responses only return a fingerprint, and that callers proving neither session nor email ownership are refused. None of this is in the annotations, which only convey the coarse read/write/destructive/idempotent profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the primary path and organizes the rest mode-by-mode, which suits an 8-value enum. It is somewhat long and the session-rotation caveat is repeated across the verify and reveal_key paragraphs, which is minor redundancy a tighter edit could remove.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateful, multi-mode auth tool with no output schema, the description covers the full flow: initial call shape, OTP confirmation step, restore path, key reveal, and the post-setup action. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes further by explaining *why* email must be passed on verify (session ID rotation on some clients) and by disambiguating the mode enum with concrete call examples such as setup_account(mode='link_or_create', email='...'). This adds reasoning the schema's terse enum description does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Set up or restore your persistent memory connection') and immediately enumerates the concrete modes with their triggers. An agent can distinguish this from siblings like resume_session, get_session_seed, and bind_agent (which it explicitly notes is subsumed by the agent_id param) without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing for each mode: 'link_or_create' when the user supplies an email, 'restore' when the user has an emk_* key, 'reveal_key' only when the full key is genuinely needed. It also names the alternative path (bind_agent via agent_id) and prescribes the follow-up action (call search_facts first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_factStore FactAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | 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'. | |
| text | Yes | The fact to store | |
| layer | No | Context persistence layer: 0=identity/stable, 1=architecture/monthly, 2=state/weekly, 3=session/daily. | |
| category | Yes | Fact category | |
| namespace | No | Optional namespace to organise facts (e.g. 'work', 'personal'). Defaults to 'default'. | |
| is_permanent | No | Whether this fact should bypass temporal decay | |
| related_facts | No | Optional list of related fact UUIDs to link (knowledge graph edges) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent write, so safety is covered. The description adds real behavioral context beyond that: same-key writes auto-archive the prior version, namespaces organize facts, and the layer system encodes decay horizons. It does not mention workspace scoping or what the call returns, so it is not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in a single sentence, then organized into scannable bullets that each carry a distinct tip. It is somewhat long, and a few bullets restate enum lists already present in the schema descriptions (category, layer), which is the main source of waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, rich annotations, and no output schema, the description covers the semantics an agent needs to store a fact well. It omits two things that matter for a write tool: whether the call returns a fact UUID or key, and whether facts are workspace-scoped (relevant given switch_workspace and list_workspaces siblings).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description meaningfully extends parameter meaning by showing how to phrase searchable text, when to use key (facts that change over time), and concrete namespace/layer/category conventions with examples. The duplication of the category and layer enumerations found in the schema slightly blunts the added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Store information that should persist across sessions.' It is clearly distinguishable from read/delete siblings like get_fact and delete_fact. However, it never differentiates itself from the very similar sibling 'store_facts' (plural), leaving the agent to guess which of the two write tools to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-store guidance (decisions and context, not raw data) and explicitly routes the agent to store_session_summary before ending a conversation, which is a named alternative for a specific condition. It stops short of stating when NOT to use this tool or how it differs from store_facts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_factsStore Facts (batch)AInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| facts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false), so the description's added value is the per-item write semantics: 'Each item is stored independently; the reply lists what landed and what did not,' which warns the agent about partial success. It stops short of stating auth requirements or duplicate handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the batch limit and batching rationale before the memory-portability motivation. Dense but every clause is doing work; the parenthetical platform list is slightly long but justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the reply ('lists what landed and what did not'). It covers the primary migration use case well, but leaves an agent guessing on category/layer/namespace semantics for a tool whose schema is undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the item-level semantics, and it only partly does: it implies 'text', 'one fact per item', and a date-learned field (which does not actually exist in the schema). The enum values for category, plus key, layer, namespace and is_permanent, are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and scope ('Store up to 50 facts in one call') and explicitly distinguishes itself from the sibling store_fact by noting it takes 'the same fields as store_fact per item'. An agent can tell the batch variant from the single-fact variant without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use scenario: 'when you already remember things about the person from your own platform memory (ChatGPT memory, Claude memory, Gemini saved info), write them here.' Clear context, though it never states the converse (when to prefer store_fact or delete_fact instead), so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_session_summarySave Session SummaryAInspect
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'
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Optional project slug for project-scoped last-wake-epoch watermark (conventions/wake-rehydration-v2:current). | |
| summary | Yes | What happened this session — decisions made, work done, context established | |
| decisions | No | Key decisions made or conclusions reached | |
| next_steps | No | What's pending, open questions, what to pick up next session | |
| session_id | No | Optional client identifier to scope this summary: 'claude-code', 'cursor', 'claude-chat', 'openclaw'. Defaults to bare session-latest. | |
| contributors | No | Optional list of contributor IDs when multiple agents or users collaborated this session (e.g. ['agent-A', 'chad', 'emily']). Stored in summary for attribution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering the safety profile (readOnly=false, destructive=false, idempotent=false), the description adds real value: it discloses that storing auto-archives the previous version (explaining the non-idempotent behavior), the key naming scheme, and that the next session retrieves it via load_context(). It does not describe failure modes or what happens on first-ever store, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose and the 'call before ending a conversation' directive are front-loaded in the first two lines. The multi-sentence collaborative-takeaway paragraph with an inline example is genuinely useful usage protocol but is longer than the tool description strictly needs, adding some bulk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation tool with 6 params, one required, and no output schema, the description covers purpose, timing, content guidance, storage/archive lifecycle, and cross-session retrieval. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. 'Include: what was discussed/decided, what changed, what's next/unresolved' loosely maps to summary/decisions/next_steps but largely repeats the schema's own descriptions, and the more cryptic params ('scope' watermark, 'contributors' attribution) are not clarified beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (store a compressed summary of this session) and names the exact storage mechanism: an L3 session fact keyed 'session-latest'. It clearly distinguishes itself from the generic store_fact/store_facts siblings by tying the write to the session lifecycle and naming load_context() as its consumer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: 'Call this before ending a conversation', plus concrete trigger signals ('okay I'm out', 'let's wrap', 'bye') and a confirm-before-storing protocol with a worked example. The alternative path (arbitrary facts via store_fact) is implicitly excluded by scoping this to session-end continuity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_workspaceSwitch WorkspaceAIdempotentInspect
Narrow this session's memory to one project: name='' scopes recall, the wake bundle, self-notes and the default namespace for new facts to project::* (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. The same call ENTERS a workspace someone shared with this account: name='' (or their tenant id, or the granted prefix, as listed by list_workspaces) switches this connection into it; no second server, no header, no restart; it holds for the session, and a new session re-enters with the same call. name='' leaves it. When a person asks to work in someone else's shared memory, call this.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Project slug (the <slug> in project:<slug>:*), the name of a granted workspace to enter (from list_workspaces), or '' to widen / leave. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=true, non-destructive), the description discloses stickiness for the session, persistence across reconnects, that the narrowed bundle is returned immediately, that identity/conventions always ride along, and that bind_agent is unaffected. These are non-obvious behavioral traits an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary use case and scoped effect before the shared-workspace variant. Slightly redundant on session stickiness ("Sticky for the session and across reconnects" partially repeats "it holds for the session"), which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter session-mutating tool with no output schema, the description covers return behavior, session/reconnect persistence, interaction with bind_agent, and the enter/leave lifecycle. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining what each value does downstream (project:<slug>:* scoping, tenant id / granted prefix accepted, '' widens or leaves). This gives the single parameter operational consequences, not just a type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and effect ("Narrow this session's memory to one project") and spells out exactly what gets scoped: recall, wake bundle, self-notes, and the default namespace. It is clearly distinguishable from siblings like list_workspaces and bind_agent, which it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use instructions are given for each mode: slug to narrow, '' to widen/leave, granted name to enter a shared workspace. It also names the routing condition ("When a person asks to work in someone else's shared memory, call this") and the boundary against bind_agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wake_statusWake StatusARead-onlyIdempotentInspect
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: slug) to additionally check the REQUIRE keys named in that profile's recipe. Missing required facts surface in the same missing[] list.
| Name | Required | Description | Default |
|---|---|---|---|
| vars | No | Variable substitutions for the recipe (e.g. {'TASK_FACT_KEY': 'comms:dispatch:dev:42'}). | |
| scope | No | 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:<agent_id>:self-note:closing preferred over global). | |
| profile | No | Optional profile slug to validate REQUIRE keys against (e.g. 'worker-dev'). | |
| agent_id | No | 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 tenant-wide substring scans — required for correct status on multi-agent tenants. When agent_id resolves no notes, response includes is_fresh_agent=true to signal a brand-new agent that should bootstrap from platform layer (embryo + conventions + bootstrap recipe). When omitted, the response includes a warning that the status is account-level. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description focuses on behavior the annotations can't convey: the layered return shape, the missing[] diagnostic list, the is_fresh_agent=true signal for brand-new agents, and the account-level warning when agent_id is omitted. It does not mention rate limits or auth requirements, but the added context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and return shape, then a second paragraph for the optional profile mode. Two paragraphs for four parameters is proportionate, though the second paragraph is dense and could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing the return, and it does: layer-by-layer found status, missing[], is_fresh_agent, and the account-level warning. Behavior across the optional profile path is also covered. Minor gap: it doesn't say how vars substitutions interact with the reported status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the structured fields already document vars, scope, profile, and agent_id thoroughly. The description still adds value by explaining the consequence of profile (REQUIRE keys fold into missing[]) and framing the whole call as a verification step, going beyond a restatement of the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reporting which context layers (embryo, conventions, identity, closing note, opening note) loaded at session start, plus a missing[] list. This is clearly distinguishable from load_context/resume_session, which perform the bootstrap rather than verify it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call it: 'after load_context() or resume_session() to verify your bootstrap was complete and diagnose what to fetch manually.' It also names the condition for the optional profile mode (validating REQUIRE keys for a given recipe), so the agent knows both the trigger and the alternative modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_eventsWatch Events (long-poll fact writes)ARead-onlyIdempotentInspect
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::', 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.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | 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. | |
| prefix | No | Only events whose key starts with this prefix. | |
| namespace | No | Only events in this namespace (exact). | |
| max_wait_s | No | Seconds to wait for the first event (0-25, default 20). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), but the description adds substantial context beyond them: max wait of 25s, up to 50 events returned plus next_since, server retention of ~10000 events per account, and workspace read-grant filtering of keys. This is the kind of operational behavior an agent needs and can't infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core mechanic and the no-streaming loop constraint, then examples. Dense but every sentence carries information (event shape, retention, cursor semantics) and nothing is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return burden and does so: event fields, the 50-event cap, and next_since are all explained. An agent can loop correctly and avoid missed events from this description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: since=0 replays retained events, a bare integer N returns seq > N, and next_since is the resume cursor to feed back. It reinforces and slightly extends the schema rather than merely restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Long-poll this account's fact-write events') and explicitly distinguishes itself from the re-scan pattern ('instead of re-scanning with since_epoch'). The event enumeration and returned shape make the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the when-to-use (instead of re-scanning), the exact loop pattern to follow because 'MCP has no streaming here', and names an alternative for long-lived clients (GET /api/v1/events SSE). Two concrete examples cover the common wait and resume cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Added
invite - Changed
switch_workspace1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Project slug (the <slug> in project:<slug>:*), or '' to widen."New value: +"Project slug (the <slug> in project:<slug>:*), the name of a granted workspace to enter (from list_workspaces), or '' to widen / leave."
1 tool update
- Added
watch_events
3 tool updates
- Changed
search_facts4 fields changed- changed
Input schema / properties / layer / descriptionPrevious value: -"Context persistence layer: 0=identity, 1=architecture, 2=state, 3=session. Pass 0-3 as integer or string."New value: +"Context persistence layer: 0=identity, 1=architecture, 2=state, 3=session." - added
Input schema / properties / layer / maximumAdded value: +3 - added
Input schema / properties / layer / minimumAdded value: +0 - changed
Input schema / properties / layer / typePrevious value: -[ - "integer", - "string" -]New value: +"integer"
- Changed
store_fact4 fields changed- changed
Input schema / properties / layer / descriptionPrevious value: -"Context persistence layer: 0=identity/stable, 1=architecture/monthly, 2=state/weekly, 3=session/daily. Pass 0-3 as integer or string."New value: +"Context persistence layer: 0=identity/stable, 1=architecture/monthly, 2=state/weekly, 3=session/daily." - added
Input schema / properties / layer / maximumAdded value: +3 - added
Input schema / properties / layer / minimumAdded value: +0 - changed
Input schema / properties / layer / typePrevious value: -[ - "integer", - "string" -]New value: +"integer"
- Changed
store_facts3 fields changed- added
Input schema / properties / facts / items / properties / layer / maximumAdded value: +3 - added
Input schema / properties / facts / items / properties / layer / minimumAdded value: +0 - changed
Input schema / properties / facts / items / properties / layer / typePrevious value: -[ - "integer", - "string" -]New value: +"integer"
31 tool updates
- First observed
accept_invite - First observed
bind_agent - First observed
decline_invite - First observed
delete_fact - First observed
get_fact - First observed
get_fact_history - First observed
get_session_seed - First observed
get_stats - First observed
ghost_mode - First observed
index_recent - First observed
index_search - First observed
index_stats - First observed
introduce_yourself - First observed
leave_grant - First observed
list_facts_by_key_prefix - First observed
list_invites - First observed
list_workspaces - First observed
load_context - First observed
mark_salient - First observed
move_fact - First observed
reinforce_fact - First observed
resume_session - First observed
revoke_grant - First observed
search_context - First observed
search_facts - First observed
setup_account - First observed
store_fact - First observed
store_facts - First observed
store_session_summary - First observed
switch_workspace - First observed
wake_status
Related MCP Connectors
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Long-term memory and a knowledge graph for AI agents: recall, notes, secrets and data sources.
Persistent memory for AI agents, for code, research and everyday life. Stale facts retire.
Persistent memory for AI assistants: store, search, and connect knowledge across conversations.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenancePersistent memory for AI agents with semantic memory, belief tracking, and dream consolidation, enabling cross-session knowledge retention.807 npm51MIT
- AlicenseNot gradedqualityDmaintenanceProvides persistent long-term memory for AI agents with semantic search and activation-based decay. Enables AI systems to remember across sessions through layered memory architecture and automatic context-aware retrieval.9 npmMIT
- AlicenseAqualityAmaintenanceLocal persistent memory for AI agents with recall, semantic search, forgetting, and encrypted storage.128579 npm25Apache 2.0
- FlicenseNot gradedqualityBmaintenanceA long-term memory system built for AI Agents. Agent wakes up already knowing who he is, not querying "who am I?" every session. Every turn calling back accurate memory context. Achieving accurate memory hits while also preventing memory from expanding at scale. No compression, no forgetting.41-
Glama MCP Gateway
Add one secure layer between your agents and this server.