pūrmemo
OfficialProvides persistent memory for Windsurf (by Codeium) AI coding assistant via MCP, allowing recall of previous work and context.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pūrmemoremember that I am working on the login system"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pūrmemo
Memory for your AI tools. Claude remembers who you are, what you're working on, and what you said last time — across every session, on every platform.
Just want it in ChatGPT or Claude.ai in your browser? Get the Chrome Extension instead.
Install in 30 seconds
1. Paste this into your terminal
Mac or Linux:
curl -fsSL https://app.purmemo.ai/install | shWindows (PowerShell):
irm https://app.purmemo.ai/install.ps1 | iexThat's it for installing. The script handles everything — it'll install Node if you don't have it, set up the purmemo command, and tell you when it's done.
2. Type purmemo
purmemoYour browser opens. Sign in (or create a free account). Close the tab when it says you're done.
3. Restart Claude
Quit and reopen Claude Desktop (or Claude Code). pūrmemo is now connected.
You'll know it worked when your next Claude session opens with a header like:
pūrmemo v15.7.20 · you@example.com · Free · 0 memoriesTry saying "save this" at the end of a conversation, or "what was I working on?" at the start of a new one.
Related MCP server: memcp
If something goes wrong
purmemo command not found? Close and reopen your terminal, then try again. New commands sometimes need a fresh shell.
You see "Failed to read token" or "bad decrypt"? Run:
purmemo --update && purmemo initThis clears any stale credentials and signs you back in. (Fixed in v15.7.20+ — if you're on an older version, this is a one-time thing.)
Anything else? Open an issue at github.com/purmemo-ai/purmemo-mcp/issues — we read every one.
What it does
Remembers everything — save any conversation, recall it later by typing what you remember about it.
Knows who you are — your role, your projects, your stack — loaded automatically into every new session.
Works everywhere — Claude Code, Claude Desktop, Cursor, Windsurf, Zed, anything that speaks MCP.
Three slash commands you'll use most:
You type | What happens |
| Saves this conversation. Use the same title later → updates the same memory. |
| Search your memories in plain English. |
| At the start of a session — loads who you are and what you were last working on. |
Other ways to install
npm install -g purmemo-mcp && purmemoOr, run it once without installing globally:
npx purmemo-mcp@latest initOpen Claude Desktop → Settings → Developer → Edit Config and add:
{
"mcpServers": {
"purmemo": {
"url": "https://mcp.purmemo.ai/mcp/messages",
"transport": "streamable-http"
}
}
}Restart Claude Desktop. You'll be prompted to sign in via OAuth on first use.
Get your API key from app.purmemo.ai → Settings → API Keys, then edit:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"purmemo": {
"command": "npx",
"args": ["-y", "purmemo-mcp"],
"env": { "PURMEMO_API_KEY": "your-api-key-here" }
}
}
}Restart Claude Desktop after saving.
Cursor — edit ~/.cursor/mcp.json:
{ "mcpServers": { "purmemo": { "command": "npx", "args": ["-y", "purmemo-mcp"], "env": { "PURMEMO_API_KEY": "your-api-key" } } } }Windsurf — edit ~/.codeium/windsurf/mcp_config.json (same shape as above).
Zed — edit ~/.config/zed/settings.json, add under context_servers:
{ "context_servers": { "purmemo": { "command": { "path": "npx", "args": ["-y", "purmemo-mcp"], "env": { "PURMEMO_API_KEY": "your-api-key" } } } } }Pricing
Plan | Price | Recalls | Saves |
Free | $0 | 50/month | Unlimited |
Pro | $19/month | Unlimited | Unlimited |
For developers
Looking for the technical stuff? It's all here:
Tools, resources, prompts reference — every MCP tool the server exposes (
save_conversation,recall_memories,commit,snapshot,run_workflow, etc.)Living document semantics —
mode='append'vsmode='replace', chunking behavior, ADR-036/038 details.Identity layer — the cognitive fingerprint that loads into every session.
Architecture decisions (ADRs) — every design decision, with context and trade-offs.
Source for the install scripts — read before running, if you want.
Links
Dashboard — view and manage memories
Chrome Extension — for ChatGPT, Claude.ai, Gemini in browser
Privacy Policy — encrypted in transit and at rest, never shared
License
The MCP connector code in this repo is MIT licensed. The pūrmemo platform, API, and backend are proprietary.
Available Tools
28 toolsaccept_snapshotA
Promote a draft snapshot to canonical. Supersedes the prior canonical for this topic.
If gate blockers exist (conflicts detected, tier downgrade, or first canonical), returns them for review. Pass force: true to approve and promote anyway.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Override gate blockers. Default false. | |
| snapshot_id | Yes | UUID of the draft snapshot to promote. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavioral traits beyond annotations: it explains gate blockers (conflicts, downgrade, first canonical) and the effect of force=true. Annotations already indicate mutation (readOnlyHint=false) and non-destructive (destructiveHint=false), but the description adds context on validation and override behavior. No contradiction.
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 description is concise (three sentences) and well-structured: purpose, gate behavior, force option. Each sentence adds value without redundancy.
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?
The description covers the main behavior (promotion, gate blockers, force override). While it doesn't explicitly state the success output format, the purpose is clear. Given no output schema, the description is adequate for an agent to invoke 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. The description adds value by explaining the role of force in overriding gate blockers, which goes beyond the schema description. It clarifies the decision pathway, but parameters are already well-described in 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?
The description clearly states the action: 'Promote a draft snapshot to canonical.' It specifies the resource (draft snapshot) and outcome (supersedes prior canonical), distinguishing it from sibling tools like save_snapshot (draft creation) and get_snapshot (retrieval).
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 provides context for when to use the tool (to finalize a draft) and explains the gate blocker mechanism and force override. However, it lacks explicit guidance on when not to use it or compare to similar tools like commit, which could improve clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commitA
Persist a commitment-shaped artifact (PRD, ADR, spec, OKR) as a memory with intent='commitment'.
WHEN TO USE: This is the write primitive for /prd, /decide, /spec, /commit slash commands. Call after the artifact is fully drafted in the conversation. Send the COMPLETE artifact verbatim — do NOT summarize.
INSERT-only. Each call creates a new memory; supersede prior versions by recency, never overwrite. No conversationId parameter (intentional — see ADR-034).
QUERYABLE: GET /api/v1/commitments/?type= returns all commitments of a given type, filterable by target_date and sorted by recency.
EXAMPLES:
commit(title="ADR-035 - Foo - Bar - 2026-04-28", type="ADR", content="", key_result="single-sentence chosen-option statement")
commit(title="PRD - Email verification flow", type="PRD", content="", target_date="2026-05-15")
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional tags for categorization. "commitment" and the lowercased commitment_type are added automatically. | |
| title | Yes | Title following the pattern "[Type]-NNN - [Project] - [Subject] - [Date]" for ADRs, or "[Project] - [Type] - [Feature]" for PRDs/specs. | |
| content | Yes | COMPLETE artifact content, verbatim — the full markdown body of the PRD/ADR/spec/OKR. | |
| key_result | No | Optional one-sentence concrete deliverable. What is true when this commitment is honored? | |
| target_date | No | Optional target date in YYYY-MM-DD format. Omit if no deadline. | |
| commitment_type | Yes | The kind of commitment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals INSERT-only behavior, no overwrite, intentional lack of conversationId, and queryability via GET endpoint. This adds value beyond annotations (readOnlyHint=false, destructiveHint=false) and does not contradict them.
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 description is substantive and well-structured with sections (WHEN TO USE, INSERT-only, QUERYABLE, EXAMPLES). While slightly lengthy, every sentence adds value; no redundancy.
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?
Given the tool's complexity (6 params, no output schema), the description covers all necessary aspects: purpose, usage, parameters, behavior, and examples. It is self-contained and 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?
All 6 parameters have schema descriptions (100% coverage). The description adds context: title patterns, verbatim content requirement, key_result as single-sentence deliverable, auto-added tags. This enriches the schema beyond raw definitions.
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 clearly states the tool's purpose: persisting commitment-shaped artifacts (PRD, ADR, spec, OKR) as memories with intent='commitment'. It provides examples and distinguishes itself as the write primitive for specific slash commands, differentiating from 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?
The description explicitly states when to use (after artifact is fully drafted, for slash commands) and what not to do (do not summarize). It also clarifies insertion semantics (INSERT-only, never overwrite) and mentions queryability, providing clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_taskA
Mark a project task as done and close the Jered Loop for this session.
Sets status='done', records completion_summary, clears active_session_id. Returns the next pending task so you know what comes next before closing.
Call this BEFORE ending a session — Jered's rule: consciously close each task.
RETURNS:
completed — the task that was just finished
next_task — { id, sequence, title } of next pending task, or null if all done
message — "Task complete. N tasks remaining." or "Task complete. All tasks done!"
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The task UUID from get_next_task | |
| project_name | Yes | The project name (e.g. "purmemo") | |
| verification_summary | Yes | What was done and verified — used as completion_summary on the task |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details exactly what state changes occur: sets status='done', records completion_summary, clears active_session_id. It also specifies the return structure. This goes beyond the annotations (which only indicate non-read-only, non-destructive, non-idempotent, and open-world) by providing concrete behavioral details without contradiction.
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 description is concise and well-structured: three short paragraphs followed by a bulleted 'RETURNS' section. The main action is front-loaded, and every sentence adds necessary information with no fluff.
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?
Given the absence of an output schema, the description fully compensates by detailing the return fields (completed, next_task, message). It also explains the behavioral impact and usage context, making it complete for agent decision-making.
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 input schema covers all three parameters with descriptions (100% coverage). The description adds value by explaining that 'verification_summary' becomes 'completion_summary' and that 'task_id' comes from 'get_next_task', offering meaningful context 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?
The description explicitly states the action ('Mark a project task as done') and the resource ('project task'), using specific verbs and distinguishing the tool by mentioning it closes the Jered Loop and returns the next pending task, which differentiates it from siblings like get_next_task.
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 provides explicit when-to-use guidance: 'Call this BEFORE ending a session — Jered's rule: consciously close each task.' It also explains the effects (sets status, records summary, clears session). While it doesn't explicitly state when not to use, the context is clear enough for a completion tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_handoff_briefARead-onlyIdempotent
Generate a surgical context brief for a new AI session. Instead of re-explaining your context, the AI already knows where you left off.
Uses a 5-layer compaction hierarchy to maximize signal in ~2,000 tokens:
Intent — What you were trying to accomplish (never cut)
Decisions — What was decided and completed
Open Loops — Blockers, unresolved items, active todos
Context — Technologies, entities, project details
Content — Brief excerpts (trimmed to fit budget)
Call this at the start of a new session or when switching projects to give the AI instant context. No new data is generated — composes from your existing V2 intelligence extraction data.
| Name | Required | Description | Default |
|---|---|---|---|
| project_name | No | Optional: filter brief to a specific project. If omitted, uses all recent activity. | |
| token_budget | No | Optional: approximate token budget for the brief (default ~2000 tokens). Range: 500-5000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as readOnlyHint=true and idempotentHint=true. The description reinforces this with 'No new data is generated' and details the 5-layer compaction process, adding behavioral context beyond 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?
The description is concise (10 lines) with a clear front-loaded purpose. Each section (intent, decisions, etc.) is presented succinctly. No unnecessary information is included, and the structure aids readability.
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?
Given the tool's simplicity (2 optional params, no output schema) and strong annotations, the description fully covers the behavioral context: what it does, how it works (5-layer compaction), when to use it, and the fact it uses existing data. No gaps remain for an agent to understand the 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 coverage is 100% and already describes both parameters (project_name, token_budget) with defaults and ranges. The description adds context by mentioning the token budget in relation to the compaction hierarchy, but does not significantly enhance understanding 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?
The description clearly states the tool generates a surgical context brief for a new AI session, specifying the verb 'generate' and the resource 'handoff brief'. It distinguishes itself from re-explaining context by leveraging existing data, and the 5-layer hierarchy adds specificity.
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: 'at the start of a new session or when switching projects'. Also contrasts with re-explaining context, providing an alternative. However, it does not directly compare to sibling tools like recall_memories or get_snapshot, which could serve similar purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_acknowledged_errorsARead-onlyIdempotent
Fetch open and acknowledged errors waiting for AI investigation.
Returns errors with status 'open' or 'acknowledged' — all errors needing
attention. Each error includes recent_occurrences[] with per-request context
(user_id, path, method) for investigation.
USAGE:
- Call this when user says "investigate errors" or "/investigate-errors"
- Errors are sorted by occurrence count (most frequent first)
- Each result includes recent_occurrences[] for per-request investigation context
QUERY PARAMETERS:
- limit: Max errors to return (default: 10)
- level_filter: Filter by level - 'all', 'critical', 'error', 'warning' (default: 'all')
- min_occurrences: Only errors with occurrence_count >= this (default: 1)
EXAMPLE:
get_acknowledged_errors(limit=5, level_filter="error", min_occurrences=3)
→ Returns top 5 error-level issues that occurred 3+ times
RETURNS:
- acknowledged_errors: Array of error objects (open + acknowledged)
- total_count: Number of errors returned
- filters_applied: Summary of filters used| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of errors to return | |
| level_filter | No | Filter by error level | all |
| min_occurrences | No | Only errors with occurrence_count >= this |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds beyond that: sorting by occurrence count, inclusion of recent_occurrences[], and filters applied. No contradictions.
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 description is well-structured with sections (USAGE, QUERY PARAMETERS, EXAMPLE, RETURNS), front-loads the main purpose, and is not overly verbose. The example is useful. Minor trim possible but overall efficient.
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?
Given no output schema, the description clearly specifies the return format (acknowledged_errors array, total_count, filters_applied). All parameters are documented with examples and defaults, making it complete for a read-only fetch 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 coverage is 100% with descriptions for all 3 parameters. The description adds context with defaults, explanations, and a helpful example. Since the schema already fully describes parameters, the description adds moderate extra 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?
The description clearly states the tool fetches open and acknowledged errors for AI investigation, specifying statuses and including recent_occurrences. This distinct purpose differentiates it from sibling tools like get_investigations or get_test_results.
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 USAGE section provides explicit triggers ('investigate errors', '/investigate-errors') and details sorting and context. While it doesn't explicitly state when not to use or list alternatives, the clear purpose makes the usage context obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_artifactsARead-onlyIdempotent
List artifacts linked to a parent conversation. Pairs with save_artifact.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows (default 20, max 100) | |
| artifact_type | No | Optional filter: research|code|table|framework|spec|diagram|other | |
| parent_conversation_id | Yes | Parent conversation id that artifacts were saved against |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds that it lists artifacts and pairs with save_artifact, which is consistent but does not provide significant additional behavioral traits beyond what annotations offer.
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 description consists of two concise and front-loaded sentences with no wasted words. It efficiently conveys the purpose and relationship to a sibling tool.
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?
Given the tool has 3 well-documented parameters and no output schema, the description is adequate for a simple list operation. It could mention the response format, but the context signals and annotations provide sufficient information.
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 all parameters are documented in the schema. The description adds no extra meaning or examples for parameters, maintaining the baseline score of 3.
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 clearly states the tool lists artifacts linked to a parent conversation, with a specific verb 'List' and resource 'artifacts'. It also mentions pairing with save_artifact, which distinguishes it from other list tools like get_investigations or get_snapshot.
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 implies usage context by stating 'pairs with save_artifact', but does not explicitly provide when-to-use or when-not-to-use guidance compared to sibling tools. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_investigationsARead-onlyIdempotent
List error investigation results (admin). Pairs with save_investigation_result.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows (default 25, max 100) | |
| status | No | Optional: in_progress | completed | |
| incident_id | No | Optional: filter by a specific incident |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds only the 'admin' context, but does not discuss return format, pagination, or other behavioral traits beyond 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?
The description is a single, efficient sentence that front-loads the main purpose. No wasted words, but could be slightly expanded for clarity.
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 simple listing tool with no output schema, the description is adequate. However, it lacks details about return values and specific usage scenarios, and the pairing hint is minimal.
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?
Input schema coverage is 100% with clear descriptions for all three parameters. The description does not add additional meaning beyond what the schema already provides.
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 clearly states the verb 'List', the resource 'error investigation results', and the audience 'admin'. It also names a sibling tool, distinguishing it from others like 'save_investigation_result'.
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 implies usage by stating it pairs with 'save_investigation_result', but lacks explicit guidance on when to use versus other listing tools or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_memory_detailsARead-onlyIdempotent
Get complete details of a specific memory, including all linked parts if chunked
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Character offset for paginated retrieval of large memories. When a response says "use offset: N to continue", pass that value here to get the next page. | |
| maxChars | No | Maximum characters per page (default 80000, min 1000, max 500000). Reduce for faster responses on slow connections. | |
| memoryId | Yes | UUID of the memory to retrieve, OR an ordinal number ("1", "2", etc.) referencing the position from the last recall_memories result | |
| includeLinkedParts | No | Include all linked parts if this is a chunked memory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint. The description adds behavioral details about chunked memory linked parts and pagination via offset/maxChars parameters, which are not covered by annotations. This adds value beyond 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?
The description is a single sentence that is front-loaded with the primary action and resource, no wasted words. Every part adds value.
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 tool with 4 parameters and no output schema, the description leaves out the structure of 'complete details' and potential limitations. It covers purpose and major features but could be more complete regarding response format or error conditions.
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 3. The description adds contextual meaning to the parameters (e.g., 'linked parts' maps to includeLinkedParts, pagination hints for offset/maxChars). However, it does not elaborate on parameter syntax beyond 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?
The description clearly specifies the verb 'Get' and resource 'complete details of a specific memory', including the notable feature of linked parts. This distinguishes it from sibling tools like recall_memories (listing) and get_public_memory.
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 implies usage for retrieving full memory details, especially for chunked memories, but lacks explicit when-to-use or when-not-to-use guidance or alternatives. The context is provided by the tool name and schema, but no direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_next_taskA
Get the next pending task for a project and mark it active.
Fetches the lowest-sequence pending task from the project_tasks queue, sets its status to 'active', and returns the task details plus a brief from the linked PRD memory.
NOTE: project_tasks is a structured work queue — separate from recall_memories todos. Tasks are created explicitly via the task management workflow, not auto-populated from saved conversations. If this returns "no pending tasks", the project queue is empty — use recall_memories to find work items in saved conversations instead.
Call this at the start of a work session to pick up where you left off. When done, call complete_task({ task_id, verification_summary }) to close the loop.
RETURNS:
task.id — use this in complete_task
task.sequence — task order number
task.title — what to do
task.description — how to do it
task.acceptance_criteria — how to know it's done
task.context_brief — first 500 chars of the PRD for context
task.total_remaining — pending tasks left (including this one)
| Name | Required | Description | Default |
|---|---|---|---|
| project_name | Yes | The project name to fetch the next task for (e.g. "purmemo") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses state change (marks task active), mentions the structured queue nature, and that tasks are created explicitly. Annotations indicate readOnlyHint=false and no destructiveHint, consistent with description. No contradictions.
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?
Well-structured with sections, bullet points for return values. Front-loaded with main purpose. No unnecessary 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?
Given no output schema, description explicitly lists all return fields. Covers context, usage, side effects, error case. Complete for a task fetching/updating 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 coverage is 100% with description for project_name. Description adds minimal value beyond schema (example value 'purmemo'). 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?
Clearly states 'Get the next pending task for a project and mark it active.' Specifies verb (get), resource (next pending task), and scope (for a project). Distinguishes from sibling tools like complete_task and recall_memories.
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 guidance: call at start of work session, use recall_memories if no pending tasks, and call complete_task after finishing. Clearly distinguishes from recall_memories as alternative for finding work items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_public_memoryARead-onlyIdempotent
Retrieve the FULL content of a public or unlisted memory by ID.
WHEN TO USE:
After recall_public returns a preview and you need the complete content
When a user wants to read or implement from a shared community memory
When you have a public memory ID and need the full text
This is the tool that closes the loop: recall_public finds memories, this tool retrieves them in full. No authentication required — public knowledge is free.
EXAMPLE: get_public_memory({ memory_id: "abc-123-def-456" })
RETURNS: Full memory content, observations, entities, tags, author attribution, and metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes | UUID of the public memory to retrieve in full |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds that no authentication is required and lists the return contents (observations, entities, etc.), providing context beyond annotations without contradiction.
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 description is well-structured with header, WHEN TO USE, explanatory note, example, and RETURNS. Each sentence adds value, and there is no wasted text.
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?
Despite no output schema, the description lists all return components (content, observations, entities, tags, author attribution, metadata). Given the tool's simplicity (one parameter and full annotations), the description is complete and sufficient.
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% with the parameter 'memory_id' well-described as 'UUID of the public memory to retrieve in full'. The description provides an example usage but does not add significant new meaning 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?
The description clearly states 'Retrieve the FULL content of a public or unlisted memory by ID.' It specifies the verb (retrieve), resource (public memory), and scope (full content). It distinguishes from the sibling tool 'recall_public' which returns a preview.
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 explicitly states when to use: after recall_public, when user wants to read/implement, when having a public memory ID. It also notes that this tool 'closes the loop' with recall_public. Though no explicit when-not, the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_snapshotARead-onlyIdempotent
Read an existing canonical snapshot into context. Fast — no LLM calls.
WHEN TO USE: When you need the current canonical state document for a topic (e.g. architecture, auth, glossary) without generating a new one.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Topic to fetch canonical snapshot for. Either topic or snapshot_id required. | |
| snapshot_id | No | Specific snapshot UUID. Either topic or snapshot_id required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds 'Fast — no LLM calls,' providing further behavioral context without contradicting 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?
The description is extremely concise with two short sentences plus a focused usage section. Every word adds value, and the most critical info 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?
All essential aspects are covered: purpose, usage guidelines, behavioral traits, and parameters. No output schema is needed for this read operation, and the description is 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 description coverage is 100%, so the parameter descriptions are sufficient. The tool description does not add extra meaning beyond what the schema already provides, meeting the baseline.
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 clearly states the tool reads an existing canonical snapshot into context, distinguishing it from sibling tools like save_snapshot or snapshot_sources.
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 explicit 'WHEN TO USE' section provides clear guidance on when to invoke this tool (when needing current canonical state without generation), and implies when not to use (when generation is needed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_test_resultsARead-onlyIdempotent
List recent test results for a project, newest first.
Pairs with save_test_result — use this to recall past test outcomes without having to query the conversational memory layer.
USAGE:
Latest 50 results: get_test_results({ project_name: "polymathematics" })
Only failures: get_test_results({ project_name, passed: false })
Custom limit: get_test_results({ project_name, limit: 10 })
RETURNS:
results[] — each with id, test_suite, passed, failure_details, updated_at
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows (default 50, max 200) | |
| passed | No | Filter: only passed (true) or only failed (false). Omit for all. | |
| project_name | Yes | The project name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. Description adds context about pairing with save_test_result, default limit (50) and max limit (200), and return structure with fields (id, test_suite, passed, failure_details, updated_at). No contradictions.
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?
Well-structured with clear sections: main purpose, pairing note, usage examples, returns. Concise with no redundant information. Front-loaded with primary action.
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?
Covers purpose, usage, default limit, max limit, and return fields. Given no output schema, description adequately describes response structure. Ordering ('newest first') is specified. Complete for a simple list 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 coverage is 100% with each parameter described. Description provides usage examples that illustrate parameters (passed filter, limit) and explains default and max limit, but does not add significant 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?
Clearly states 'List recent test results for a project, newest first.' Specifies verb, resource, and ordering. Distinguishes from sibling tools like save_test_result.
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 tells when to use: 'Pairs with save_test_result — use this to recall past test outcomes without having to query the conversational memory layer.' Provides usage examples with different filtering options. Lacks explicit when-not but covers alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_contextARead-onlyIdempotent
Get the current user's cognitive identity and active session context.
Call this at the START of a conversation to understand who you're talking to — their role, expertise, current project, and recent memory themes.
This is the core of Purmemo's identity layer: once set in the dashboard, your identity travels silently to every AI session so you're never explaining yourself from scratch again.
WHAT IT RETURNS:
identity: role, expertise areas, primary domain, work style, preferred tools
current_session: what the user is working on right now (project, focus)
memory_summary: 2-3 sentence synthesis of the user's most recent memory themes
WHEN TO CALL:
At the start of every new session (add to Claude system prompt)
When user says "load my context" or "what do you know about me?"
Before making recommendations that depend on knowing the user's background
EXAMPLE USAGE: → User starts new Claude session → Claude calls get_user_context automatically → Response: { role: "founder", expertise: ["product", "fullstack"], project: "purmemo", focus: "identity layer", memory_summary: "Chris has been building Purmemo's..." } → Claude responds with full context already loaded — no re-explaining needed
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds behavioral context by explaining the tool returns identity, session, and memory summary, and illustrates this with an example. It reinforces the safe, read-only nature without contradicting 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?
The description is well-structured with clear sections (WHAT IT RETURNS, WHEN TO CALL, EXAMPLE USAGE) and front-loads the purpose in the first sentence. It is somewhat lengthy but each section adds value, especially given the absence of an 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 zero parameters, no output schema, and informative annotations, the description fully compensates by detailing the return payload, usage timing, and an example. It provides complete context for an agent to use this tool 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?
The tool has zero parameters, so schema coverage is complete. The description does not need to add parameter semantics, and the baseline of 4 is appropriate since no parameters exist to elaborate on.
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 opens with a specific verb and resource: 'Get the current user's cognitive identity and active session context.' It clearly distinguishes this tool from siblings by focusing on identity and session context, and further clarifies it is 'the core of Purmemo's identity layer.'
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 'WHEN TO CALL' section provides explicit usage scenarios: at the start of a new session, when the user requests context, and before making recommendations. It does not explicitly mention when not to use or alternatives, but given the tool's unique role among siblings, this is sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_clustersARead-onlyIdempotent
Browse the memory map. With NO arguments, returns the user's PROJECT -> THEME hierarchy with member counts (the "galaxy" as text) — use this to show "what projects/topics do I have?". With cluster="", OPENS that cluster and lists its member memories (a project title pulls every memory across all its themes; a theme title pulls that theme). Pair with recall_memories(cluster=...) to then semantically search inside a cluster. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| cluster | No | Optional. A cluster/project/theme TITLE (case-insensitive) or a cluster UUID to OPEN — lists that cluster's memories. Omit to LIST all projects and themes with counts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds useful behavioral detail above annotations: the read-only label reinforces safety, and it explains the dual-mode behavior (list vs open) and how project titles span all themes. It doesn't disclose return format or pagination, but the annotated safety profile and mode explanation cover most of the behavioral burden.
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 tightly-scoped sentences, zero filler. Every sentence earns its place: mode 1 (no-arg galaxy view), mode 2 (open with cluster=), and the pairing tip with recall_memories. Front-loaded with the purpose verb and immediately readable.
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 tool with no output schema and strong annotations, the description is complete. It covers both invocation modes, the pairing workflow with recall_memories, and read-only safety. The complexity is low and fully documented. There is no return-format requirement since output_schema is absent but the tool is simple enough that this isn't a 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% — the schema already documents the cluster parameter (title case-insensitive or UUID, omit to list). The description adds the dual-mode orchestration detail (open vs list) and mentions case-insensitivity is in the schema. Baseline 3 for full schema coverage is appropriate; the description reinforces but doesn't substantially expand 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?
The description clearly states a specific verb+resource ('Browse/list clusters') with an explicit two-mode behavior: no-arg listing of PROJECT -> THEME hierarchy with counts, and cluster= argument that opens a cluster and lists its member memories. It distinguishes itself from siblings by naming recall_memories as the semantic-search companion and from get_memory_details as a different level of granularity.
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 guidance: 'use this to show what projects/topics do I have?' and explains the open vs list modes with cluster=selector behavior. Names the pairing companion recall_memories(cluster=...) explicitly for semantic search afterward, giving clear context on when this tool vs alternatives is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workflowsARead-onlyIdempotent
List all available Purmemo workflows — structured, memory-powered processes you can run.
WHEN TO USE THIS TOOL:
User asks "what can you help me with?" or "what workflows do you have?"
User wants to see available capabilities before choosing one
User says "show me what's available" or "list workflows"
Returns the full catalog of workflows organized by category with descriptions.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Optional filter by category. Omit to see all workflows. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint. Description adds that output is 'full catalog organized by category with descriptions', which is helpful beyond 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?
Two concise paragraphs, front-loaded with purpose, then usage guidelines. No wasted words.
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?
Covers purpose, usage, output structure. No output schema needed; description sufficiently describes return format.
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% with adequate description for the single parameter. Description adds no further detail beyond 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?
Clearly states it lists workflows and describes them as 'structured, memory-powered processes'. Distinguishes from siblings like run_workflow.
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 provides a 'WHEN TO USE THIS TOOL' section with specific user queries, guiding selection vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recall_memoriesARead-onlyIdempotent
Search and retrieve saved memories with intelligent semantic ranking.
🎯 BASIC SEARCH: recall_memories(query="authentication") → Returns all memories about authentication, ranked by semantic relevance
🔍 FILTERED SEARCH (Phase 2 Knowledge Graph Intelligence): Use filters when you need PRECISION over semantic similarity:
✓ entity="name" - Find memories mentioning specific people/projects/technologies Example: entity="purmemo" → Only memories discussing purmemo
✓ has_observations=true - Find substantial, fact-dense conversations Example: has_observations=true → Only high-quality technical discussions
✓ initiative="project" - Scope to specific initiatives/goals Example: initiative="Q1 OKRs" → Only Q1-related memories
✓ intent="type" - Filter by conversation purpose Options: decision, learning, question, blocker Example: intent="blocker" → Only conversations about blockers
💡 WHEN TO FILTER:
Use entity when user asks about specific person/project by name
Use has_observations for "detailed" or "substantial" requests
Use initiative/stakeholder for project-specific searches
Use intent when user asks for decisions, learnings, or blockers
📝 COMBINED EXAMPLES: recall_memories(query="auth", entity="purmemo", has_observations=true) → Find detailed technical discussions about purmemo authentication
recall_memories(query="blockers", intent="blocker", stakeholder="Engineering") → Find engineering team blockers
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of memories to return | |
| query | Yes | Search query - can be keywords, topics, or specific content | |
| entity | No | Filter by entity name (people, projects, technologies). Use when user asks about a specific person, project, or technology by name. Example: entity="Alice" finds only memories mentioning Alice. More precise than semantic search. Supports partial matching. | |
| intent | No | Filter by conversation intent/purpose. Options: "decision" (decisions made), "learning" (knowledge gained), "question" (open questions), "blocker" (obstacles/issues). Use when user asks specifically for one of these types. Example: intent="decision" finds only conversations where decisions were made. Exact match only. | |
| cluster | No | Scope recall to a CLUSTER's members ("reverse cluster search"). Accepts a cluster/project title (e.g. cluster="Personal Design Language") or a cluster UUID. A PROJECT name pulls every memory across all its themes; a THEME name pulls that theme. Use when the user asks for "everything about <project/topic>" — it returns the whole cluster, not just the embedding-nearest memories. Case-insensitive for titles. | |
| deadline | No | Filter by deadline date from conversation context (YYYY-MM-DD format). Use when user asks about time-sensitive memories or specific deadlines. Example: deadline="2025-03-31" finds memories with March 31, 2025 deadline. Exact match only. | |
| initiative | No | Filter by initiative/project name from conversation context. Use when user scopes search to specific project or goal. Example: initiative="Q1 OKRs" finds only Q1-related memories. Supports partial matching (ILIKE). | |
| stakeholder | No | Filter by stakeholder (person or team) from conversation context. Use when user asks about specific person's or team's involvement. Example: stakeholder="Engineering Team" finds memories where Engineering Team was mentioned as stakeholder. Supports partial matching (ILIKE). | |
| includeChunked | No | Include chunked/multi-part conversations in results | |
| has_observations | No | Filter by conversation quality based on extracted observations (atomic facts). Set to true to find substantial, structured conversations with extracted knowledge (high-quality technical discussions, detailed planning). Set to false for lightweight chats. Omit to return all memories regardless of observation count. Use when user asks for "detailed", "substantial", or "in-depth" information. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the safety profile is fully covered. The description adds behavioral context by explaining ranking semantics ('ranked by semantic relevance'), the Phase 2 Knowledge Graph filtering capability, and filter behaviors like partial matching vs exact match for different filters. It does not describe pagination or total return behavior beyond the limit parameter, but the annotation coverage is strong.
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?
Well-structured with clear sections (BASIC SEARCH, FILTERED SEARCH, WHEN TO FILTER, COMBINED EXAMPLES) using emoji headers for visual scannability. The content is somewhat verbose with many examples, but each serves a distinct purpose (each filter has its own example). The combined examples at the end add practical value. Slightly longer than strictly necessary but well-organized and front-loaded with the core purpose.
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 10-parameter tool with no output schema, this description is remarkably complete. It covers all filter types with examples, provides usage timing guidance, distinguishes exact vs partial matching semantics, and gives combined real-world patterns. The sibling context shows this is a memory-retrieval tool among many, and the description effectively positions it as THE semantic memory search tool. No output schema exists, so return-format information would be valuable but the schema itself documents the limit parameter and the filter semantics are thoroughly covered.
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 each parameter already has rich descriptions with usage guidance and examples. The description adds value by showing FILTERED SEARCH patterns, the Phase 2 context, and combined examples like recall_memories(query='auth', entity='purmemo', has_observations=true). It also corrects/clarifies the 'stakeholder' parameter mentioned in the combined example that wasn't prominently promoted. However, some of this is redundant with the schema descriptions.
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 ('Search and retrieve saved memories') with clear semantic ranking. It distinguishes itself from siblings like recall_public (public memories) and get_memory_details (single memory lookup) through its filter-focused identity. The extensive examples reinforce the core purpose.
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 FILTER guidance with concrete use-cases ('Use entity when user asks about specific person/project by name', 'Use intent when user asks for decisions'). The description explains when filters are needed for PRECISION over semantic similarity, and demonstrates combined usage patterns. It clearly distinguishes filtered vs basic search scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recall_publicARead-onlyIdempotent
Search public memories shared by all Purmemo users. This is the community knowledge base.
WHEN TO USE:
User asks "what have other people saved about X?"
User wants to explore community knowledge
User asks to search public/shared memories
Looking for solutions others have found
DOES NOT COUNT AGAINST RECALL QUOTA — public knowledge is free.
FILTERS:
query: Semantic search query (uses vector similarity)
tag: Filter by tag
platform: Filter by source platform
sort: "recent" or "popular" (by recall count)
EXAMPLE: recall_public({ query: "MCP server testing best practices" })
RETURNS: List of public memories with author attribution, relevance scores, and recall counts.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter by tag | |
| page | No | Page number (default 1) | |
| sort | No | Sort order: recent (newest first) or popular (most recalled first) | |
| query | No | Search query for semantic search across public memories | |
| platform | No | Filter by source platform (chatgpt, claude, gemini, etc.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, destructive, idempotent, and openWorld hints. The description adds non-obvious behavioral context: it does not consume recall quota, returns author attribution and relevance scores. No contradiction with 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?
The description is well-organized with labeled sections, front-loading the core purpose. Every sentence contributes useful information, though the 'FILTERS' section slightly repeats schema details.
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?
The description explains return values (list with author attribution, relevance scores, recall counts) despite no output schema. However, it omits how the 'page' parameter works (pagination limits, default behavior), leaving a minor completeness 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 coverage is 100%, so baseline is 3. The description provides additional semantics for parameters (e.g., 'semantic search query', 'by recall count' for sort) and gives an example call, adding value beyond 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?
The description explicitly states 'Search public memories shared by all Purmemo users' with clear verb (search) and resource (public memories). It distinguishes from sibling 'recall_memories' (private) and 'get_public_memory' (single memory fetch).
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 'WHEN TO USE' section lists four concrete scenarios with user-question phrasing. It also specifies what the tool does NOT do (count against quota), providing clear boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_memoryAIdempotent
Report a public memory for inappropriate content.
WHEN TO USE:
User encounters spam, misleading, or inappropriate public content
User wants to flag content that contains personal information
REASONS: spam, inappropriate, misleading, personal_info, other
After 3 reports, a memory is automatically hidden from public view pending admin review.
EXAMPLE: report_memory({ memory_id: "abc-123", reason: "spam", description: "Promotional content" })
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Reason for reporting | |
| memory_id | Yes | UUID of the public memory to report | |
| description | No | Optional additional details about the report |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (which declare non-destructive, idempotent, open-world), the description reveals that after 3 reports, a memory is automatically hidden from public view pending admin review. This adds valuable insight into the tool's side effects and consequences of repeated use.
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 description is well-structured with a clear header, 'WHEN TO USE' section, list of reasons, a behavioral note, and an example. It is concise, front-loaded with the purpose, and every sentence adds value without redundancy.
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?
Given the tool's simplicity (no output schema), the description covers essential aspects: purpose, use cases, reasons, and a key behavioral outcome. The example provides a concrete usage pattern. It could be slightly more complete by explaining the return result, but it is sufficient for an 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 input schema already provides descriptions for all three parameters (100% coverage), so the baseline is 3. The description adds a bit of extra context by listing the reasons and giving an example call, but it doesn't significantly elaborate on parameter meanings 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?
The description clearly states the tool's action ('report') and resource ('public memory') with the specific purpose ('inappropriate content'), using a strong verb and resource combination. It distinguishes itself from sibling tools by explicitly mentioning a unique function not covered by others.
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 provides explicit 'WHEN TO USE' conditions, listing relevant scenarios like spam, misleading content, and personal information. It also includes the allowable reasons, offering clear context for when the tool should be invoked, though it does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_workflowARead-onlyIdempotent
Run a Purmemo workflow — structured, memory-powered processes for product, engineering, business, and operations tasks. Your relevant memories and identity are automatically loaded to personalize every workflow.
WHEN TO USE THIS TOOL:
User wants to write a PRD, debug an issue, plan a sprint, review code, or any structured task
User describes a goal but doesn't know the exact process ("I want to ship a feature")
User asks for strategic advice, design guidance, or operational help
User says "help me", "guide me", "walk me through", or describes a business/product/engineering need
AVAILABLE WORKFLOWS (pass the workflow name, or describe what you need): Product: prd, roadmap, story, design, feedback Strategy: ceo, growth, metrics, intel Engineering: debug, review, deploy, incident Operations: sprint Content: copy
EXAMPLES: run_workflow(workflow="prd", input="notification system for mobile app") run_workflow(workflow="debug", input="TypeError: Cannot read property 'map' of undefined in Timeline") run_workflow(input="production is down, users can't save memories") → auto-routes to incident run_workflow(input="what should I focus on this week?") → auto-routes to sprint run_workflow(input="how's the business doing?") → auto-routes to metrics
DO NOT use this tool for: simple memory recall (use recall_memories), saving conversations (use save_conversation), or finding related discussions (use discover_related_conversations).
If no specific workflow is named, the system auto-routes based on the user's intent.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | What you want to accomplish, the problem to solve, or context for the workflow. | |
| workflow | No | Workflow name (e.g., "prd", "debug", "sprint"). Use list_workflows to see all available options including custom workflows. Optional — if omitted, auto-routes from input. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is covered. The description adds behavioral context beyond that: memories are automatically loaded, and workflows can auto-route based on intent. This is useful, though it doesn't detail potential side effects or output behavior (which may be acceptable given the readOnly hint).
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 description is long but well-organized with clear headings, examples, and a negative usage section. Every section serves a purpose. It is slightly wordy but appropriately structured for a tool with many workflow options and routing rules.
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?
The description is thorough on usage, workflows, and exclusions, but it omits any mention of return values or output format. Since there is no output schema, the description should compensate for this lack. Without knowing what the tool returns (text, steps, or a status), an agent cannot fully anticipate the tool's behavior, leaving a notable 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% for both parameters, but the description adds significant semantic value by listing valid workflow names, providing concrete examples of input and workflow values, and explaining the auto-routing behavior when the workflow parameter is omitted. This goes well 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?
The description clearly states the tool's purpose: 'Run a Purmemo workflow — structured, memory-powered processes' and distinguishes it from sibling tools by listing what NOT to use it for (e.g., recall_memories, save_conversation, discover_related_conversations). The available workflow list further clarifies its scope.
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 includes an explicit 'WHEN TO USE THIS TOOL' section with concrete scenarios and a 'DO NOT use this tool for' section naming alternative tools. It also explains auto-routing when no workflow is specified, giving clear guidance on when to call and when to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_artifactA
Save a single artifact (research report, table, framework, spec, code) linked to a conversation memory.
WHEN TO USE: After calling save_conversation for a session that produced artifacts. Call this ONCE PER ARTIFACT with the full verbatim content — do NOT summarize or truncate.
WHY: Artifacts are the highest-value output of research sessions. Saving them separately ensures complete preservation. Each artifact becomes a first-class searchable object linked to its parent conversation.
FLOW:
save_conversation(title="Research Session", conversationId="my-research") → saves the conversation transcript
save_artifact(conversationId="my-research", title="Competitive Analysis", type="research", content="")
save_artifact(conversationId="my-research", title="Ranking Table", type="table", content="")
IMPORTANT: Send the COMPLETE artifact content in the content field. The entire point of this tool is to preserve artifacts that would otherwise be lost or summarized. Minimum 100 characters.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional tags for categorization | |
| type | Yes | Type of artifact | |
| title | Yes | Title of this artifact (e.g., "Competitive Analysis Report", "Architecture Ranking Table", "Implementation Spec") | |
| content | Yes | COMPLETE artifact content — the full verbatim text, not a summary. | |
| conversationId | Yes | The conversationId of the parent memory to link this artifact to. Must match the conversationId used in save_conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are present (readOnlyHint: false, destructiveHint: false, openWorldHint: true). The description adds context about artifacts being high-value and becoming searchable objects, which goes beyond the annotations. It does not contradict 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?
The description is well-structured with clear sections (short statement, WHEN TO USE, WHY, FLOW, IMPORTANT). It is front-loaded with key information and every part serves a purpose without redundancy.
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?
Given the parameter count, required fields, no output schema, and annotations, the description fully covers purpose, usage flow, parameter details, and importance. An agent can effectively use the tool based on this description.
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 adds semantics for conversationId (must match save_conversation), content (full verbatim, not summary), and provides examples for title and type. This adds value 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?
The description clearly states the tool saves a single artifact linked to a conversation memory, with a specific verb and resource. It distinguishes from siblings like save_conversation and save_investigation_result by focusing on artifacts.
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 provides explicit WHEN TO USE guidelines, stating it should be called after save_conversation, once per artifact, with full content. It includes a FLOW example and explicit instructions not to summarize or truncate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_conversationA
Save complete conversations as memory. REQUIRED: Send COMPLETE conversation in 'conversationContent' parameter (minimum 100 chars, should be thousands). Include EVERY message verbatim - NO summaries or partial content.
Intelligently tracks context, extracts project details, and routes to a single memory per conversation topic.
HOW SAVES TARGET MEMORIES:
- conversationId is auto-generated from title slug (e.g., "MCP Tools" → "mcp-tools")
- Same title (or explicit conversationId) → targets the existing memory
- The 'mode' parameter controls what happens to that existing memory:
• mode='replace' (default): overwrites the existing content with what you send
• mode='append': concatenates new content below existing with a timestamped separator
(\n\n--- UPDATE <ISO8601> ---\n\n) — preserves all prior history in the live row
- The /save skill sets mode='append' automatically for living-document use
- For one-shot snapshots, ad-hoc captures, or explicit overwrite: pass mode='replace'
PRIOR CONTENT IS NEVER LOST:
- Even with mode='replace', prior content is snapshotted to memory_events audit log on every update
- Recovery from overwrites requires a one-off script (out-of-band)
- Use mode='append' if you want history to remain visible inline in the live memory
INTELLIGENT EXTRACTION (independent of mode):
- Auto-extracts project context (name, component, feature being discussed)
- Detects work iteration and status (planning/in_progress/completed/blocked)
- Generates smart titles like "Purmemo - Timeline View - Implementation"
- Tracks technologies, tools used, identifies relationships/dependencies
SERVER AUTO-CHUNKING:
- Large conversations (>15K chars) automatically split into linked chunks
- Small conversations (<15K chars) saved directly as single memory
- You always send complete content — server handles chunking
- APPEND + CHUNKING: append mode works only for content <15K chars. Saves >15K
with mode='append' are rejected with a clear error — appending to chunked
storage would double each chunk's content on re-save. For long-running living
docs, send only the new delta since the last save (keep it <15K) or use
mode='replace' for full re-saves.
- KNOWN CAVEAT: a doc that is saved small (single memory) and later grows past 15K
transitions to chunked storage at a new conversation_id space — the original
single memory becomes orphaned. Tracked under ADR-038 (uniform namespace).
EXAMPLES:
User: "Save progress" via /save skill
→ /save sets mode='append'; new content is appended below prior content
User: "Save this snapshot" (one-shot capture)
→ mode='replace' default; current content overwrites any existing memory at this title
User: "Save as conversation react-hooks-guide" with explicit append
→ save_conversation(conversationId="react-hooks-guide", mode="append")
→ Appends to existing memory at that ID (or creates if new)
WHAT TO INCLUDE (COMPLETE CONVERSATION REQUIRED):
- EVERY user message (verbatim, not paraphrased)
- EVERY assistant response (complete, not summarized)
- ALL code blocks with full syntax
- ALL artifacts with complete content (not just titles/descriptions)
- ALL file paths, URLs, and references mentioned
- ALL system messages and tool outputs
- EXACT conversation flow and context
- Minimum 500 characters expected - should be THOUSANDS of characters
FORMAT REQUIRED:
=== CONVERSATION START ===
[timestamp] USER: [complete user message 1]
[timestamp] ASSISTANT: [complete assistant response 1]
[timestamp] USER: [complete user message 2]
[timestamp] ASSISTANT: [complete assistant response 2]
... [continue for ALL exchanges]
=== ARTIFACTS ===
[Include ALL artifacts with full content]
=== CODE BLOCKS ===
[Include ALL code with syntax highlighting]
=== END ===
IMPORTANT: Do NOT send just "save this conversation" or summaries. If you send less than 500 chars, you're doing it wrong. Include the COMPLETE conversation with all details.
ARTIFACT PRESERVATION (ADR-025):
If this conversation produced artifacts (research reports, tables, frameworks, specs, design documents),
save them SEPARATELY using save_artifact after this call.
Flow: save_conversation first, then save_artifact for each artifact.
This ensures artifacts are preserved in full — do not try to embed large artifacts in conversationContent.| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How to handle a save that targets an existing memory (same title or conversationId). "replace" (default) overwrites the existing content with what you send. "append" concatenates new content below the existing content with a timestamped separator (\n\n--- UPDATE <ISO8601> ---\n\n). Use "append" for living documents you genuinely want to grow over time; use "replace" for one-shot snapshots and ad-hoc captures. The /save skill defaults to "append" automatically — you only need to pass this for explicit overrides. | replace |
| tags | No | Tags for categorization | |
| title | No | Title for this conversation memory | Conversation 2026-08-03T19:20:47.417Z |
| priority | No | Priority level for this memory | medium |
| conversationId | No | Optional unique identifier for living document pattern. If provided and memory exists with this conversationId, UPDATES that memory instead of creating new one. Use for maintaining single memory per conversation that updates over time. | |
| conversationContent | Yes | COMPLETE conversation transcript - minimum 500 characters expected. Include EVERYTHING discussed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=true. The description goes well beyond annotations by disclosing that prior content is NEVER lost (snapshotted to memory_events audit log), documenting the server-side chunking behavior (>15K auto-split), the append-chunking rejection limit, and the ADR-038 orphaned memory caveat. It also discloses the field constraints like minimum characters. The only area not covered is return format/output, though that's largely acceptable given this is a save operation.
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 description is long but densely informative with clear section headers (HOW SAVES TARGET MEMORIES, PRIOR CONTENT IS NEVER LOST, INTELLIGENT EXTRACTION, SERVER AUTO-CHUNKING, EXAMPLES, WHAT TO INCLUDE, FORMAT REQUIRED, ARTIFACT PRESERVATION). Front-loads the critical requirement (send complete content) first. It earns its length given the complexity of the tool's behavior, though some redundancy exists between the opening paragraphs and the later 'WHAT TO INCLUDE' section which repeats the same admonitions about complete 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?
Given the complexity (6 params, chunking behavior, append/replace semantics, audit logging, ADR caveats, artifact handoff), the description is remarkably complete. It covers edge cases (append+chunking rejection), warns about the orphaned memory caveat, provides the exact required format template, and provides a clear action flow for artifact preservation. There is no output schema, so return-value documentation isn't necessary, and the description adequately compensates for the tool's behavioral complexity.
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%, providing baseline 3. However, the description adds substantial meaning beyond the schema: it explains the auto-generation of conversationId from title slug, details the exact append separator format (\n\n--- UPDATE <ISO8601> ---\n\n), explains the conversationContent minimum is actually 500 chars not just the 100 in schema, and provides concrete EXAMPLES showing parameter usage for each mode. The description compensates heavily and transforms the parameters into a clear mental model.
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 clearly states the purpose: saving complete conversations as memories, with a specific emphasis on requiring complete verbatim content. It distinguishes itself from siblings like save_artifact (which is explicitly referenced for artifacts) and recall_memories by describing the write/save function distinctly. The verb+resource ('Save... as memory') plus the content requirements make the purpose unmistakable.
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 provides exceptionally detailed guidance on when to use this tool, how mode affects targeting, and explicitly names save_artifact as the alternative for artifacts ('save them SEPARATELY using save_artifact after this call'). It distinguishes replace vs append use cases, explains the /save skill behavior, and gives explicit when-to-use guidance for living documents vs one-shot snapshots.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_investigation_resultA
Save AI investigation results for an error incident.
Used to store investigation results for audit trail and learning from past fixes.
Call this after investigating an error and proposing/deploying a fix.
USAGE:
- Call after completing investigation and deploying fix
- Stores root cause analysis, research sources, proposed changes
- Creates audit trail for learning from past investigations
REQUEST FIELDS:
- incident_id: UUID of the error incident (from get_acknowledged_errors)
- root_cause_analysis: Your analysis of what caused the error
- similar_incidents_analyzed: Array of similar incident IDs found
- research_sources: Array of URLs used (search_web_ai, Context7 docs)
- fix_type: Type of fix - 'code_change', 'config_update', 'deployment', 'migration', 'documentation'
- proposed_changes: Object with file paths and changes made
- confidence_score: Your confidence in the fix (0.0-1.0)
- risk_level: Risk assessment - 'low', 'medium', 'high'
- test_plan: How you tested the fix
- rollback_plan: How to roll back if needed
- deployment_commit_hash: Git commit hash of the fix
- deployment_results: Object with deployment success/failure details
EXAMPLE:
save_investigation_result({
incident_id: "550e8400-e29b-41d4-a716-446655440000",
root_cause_analysis: "Timeout set to 5s, too short for slow networks",
fix_type: "code_change",
confidence_score: 0.85,
risk_level: "low",
deployment_commit_hash: "abc123def456"
})
RETURNS:
- investigation_id: UUID of saved investigation
- incident_id: UUID of the error incident
- investigation_status: 'in_progress' or 'completed'
- deployment_status: 'not_started', 'in_progress', 'completed'
- success: true if saved successfully| Name | Required | Description | Default |
|---|---|---|---|
| fix_type | No | Type of fix applied | |
| test_plan | No | How the fix was tested | |
| risk_level | No | Risk assessment of the fix | |
| incident_id | Yes | UUID of the error incident from get_acknowledged_errors | |
| rollback_plan | No | How to roll back if fix fails | |
| confidence_score | No | AI confidence in proposed fix (0.0-1.0) | |
| proposed_changes | No | Object with file paths and changes made | |
| research_sources | No | Array of research sources used (URLs from search_web_ai, Context7) | |
| deployment_results | No | Deployment success/failure details | |
| root_cause_analysis | No | Your analysis of what caused the error | |
| deployment_commit_hash | No | Git commit hash of the deployed fix | |
| similar_incidents_analyzed | No | Array of similar incident IDs found via recall_memories |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, so the tool is a write operation but not destructive. The description adds that it stores results for audit trail and returns specific fields. It does not contradict annotations. It could mention more about idempotency or overwrite behavior, but given annotations are present, the description provides adequate context.
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 description is well-structured with sections (header, usage, request fields, example, returns). It is relatively long but every section adds value. The front-loaded purpose statement helps quick understanding. Minor redundancy in the usage section could be trimmed, but overall it's effective.
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?
Given the tool has 12 parameters, nested objects, and no output schema, the description covers each parameter, provides an example, and lists return fields. It explains the tool's role in the investigation workflow. It could clarify optional parameters' behavior when omitted, but it is sufficiently complete for an agent to use 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?
Parameter descriptions are already present in the schema (100% coverage). The description goes further by grouping them under 'REQUEST FIELDS' and explaining usage context, e.g., 'root_cause_analysis: Your analysis', 'similar_incidents_analyzed: from recall_memories'. This adds semantic depth 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?
The description begins with a clear action: 'Save AI investigation results for an error incident.' It specifies the resource (investigation results) and context (error incident, audit trail). The usage section ties it to a specific workflow step (after investigation and fix deployment), distinguishing it from sibling tools like save_artifact or save_snapshot.
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 provides explicit usage instructions: 'Call after completing investigation and deploying fix.' It explains the purpose (store for audit trail, learning). However, it does not explicitly state when not to use this tool or mention alternative tools for different scenarios. Still, the guidance is clear and useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_snapshotA
Persist your synthesized snapshot content as a draft. Step 3 of the MCP snapshot path (ADR-032 Amendment A).
Call this after synthesizing from snapshot_sources(). Backend derives evidence_tier from cited_ids — not caller-controlled. Runs claim verification on your content.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Skip event-driven regeneration gate. Default false. | |
| topic | Yes | Topic this snapshot covers. | |
| content | Yes | Your synthesized snapshot content (markdown). Min 100 chars. | |
| cited_ids | Yes | Memory IDs cited — use the cited_memory_ids from snapshot_sources(). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false, destructiveHint=false, idempotentHint=false. The description adds valuable behavioral context: 'Runs claim verification on your content' and 'Backend derives evidence_tier from cited_ids — not caller-controlled.' This goes beyond annotations, though it could mention side effects or error conditions.
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 concise sentences: first states the primary action, second provides usage context and step number, third adds behavioral notes. No fluff, front-loaded with key information. Every sentence earns its place.
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?
Given the multi-step snapshot process and 4 parameters, the description effectively sets context (step 3, post-snapshot_sources). It mentions claim verification and evidence_tier derivation but does not specify return values or next steps (e.g., accept_snapshot). With no output schema, a brief note on output would improve 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?
Schema coverage is 100%, so baseline is 3. The description adds marginal value by explaining that evidence_tier is derived from cited_ids, adding meaning to that parameter. The force parameter's effect is implied but not elaborated. Overall, the description complements the schema without fully compensating for its own lack of detail.
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 clearly states the tool persists a synthesized snapshot draft and identifies it as step 3 of the MCP snapshot path. It distinguishes from siblings like snapshot_sources (which produces sources) and accept_snapshot (which finalizes), making the purpose specific and 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?
The description explicitly says 'Call this after synthesizing from snapshot_sources()', providing clear usage context. It also notes that evidence_tier is backend-derived and claim verification runs. However, it does not mention when not to use this tool or alternatives for non-draft saves, slightly limiting guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_test_resultAIdempotent
Save a test result memory for a project, linked to the current active task.
Call this after running tests — pass or fail — to record the outcome. Saves a memory with category='test_result' and links it to the most recent active task. Re-running with the same test_suite name updates the existing memory (living document).
USAGE:
After a passing test run: save_test_result({ project_name, passed: true, test_suite })
After a failing run: save_test_result({ ..., passed: false, failure_details: "..." })
RETURNS:
memory_id — UUID of the saved test result memory
status — "PASSED" or "FAILED"
linked_task — the active task this result is associated with (if any)
| Name | Required | Description | Default |
|---|---|---|---|
| passed | Yes | Whether the test suite passed | |
| test_suite | Yes | Name of the test suite (e.g. "get_next_task e2e") | |
| project_name | Yes | The project name (e.g. "purmemo") | |
| failure_details | No | Details about what failed — only include when passed=false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses idempotent behavior: 'Re-running with the same test_suite name updates the existing memory (living document).' Also explains linking to active task and return values. Adds significant value beyond annotations which only hint at idempotency.
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?
Concise, well-structured with clear sections (purpose, usage, returns). Every sentence adds value without redundancy. Front-loaded with core action.
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?
Given 4 parameters, no output schema, but description thoroughly covers inputs, behavior (update on re-run), linking, and return values. Complete for a straightforward save 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?
All 4 parameters are described in schema (100% coverage), but the description adds extra context: failure_details is only for passed=false. Usage examples show parameter combinations, enhancing schema clarity.
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 clearly states 'Save a test result memory for a project, linked to the current active task,' using specific verb and resource. It uniquely identifies the tool's purpose among siblings like 'save_artifact' or 'save_investigation_result'.
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 'Call this after running tests — pass or fail — to record the outcome' and provides examples for both passing and failing cases. Does not explicitly exclude other use cases or mention alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshotA
Generate a state-shaped artifact for a topic from your saved memories.
WHEN TO USE: When you want a current-state document derived from saved conversations — architecture map, glossary, runbook, manifesto, project state. The slash command /snapshot calls this.
HOW IT WORKS:
Queries memories matching the topic (fuzzy match against tags + title), recency-weighted.
Builds a draft snapshot via the deterministic baseline generator (concatenates source memories — Phase 1 baseline; Gemini integration ships later).
Computes evidence_tier (A/B/C, deterministic) and grounded_ratio (claim verification).
Persists as status='draft'. Promotion to canonical requires explicit POST /api/v1/snapshots/{id}/accept per ADR-032.
INSERT-only — each call creates a new draft (versioned). Two snapshots of the same topic both exist; supersede via /accept.
EXAMPLES:
snapshot(topic: "architecture") — gathers all memories tagged or titled with "architecture"
snapshot(topic: "auth") — pulls everything auth-related, recency-weighted
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | The topic to snapshot. A keyword that fuzzy-matches memory tags and titles. Examples: "architecture", "glossary", "auth", "onboarding". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (creating), destructiveHint=false (non-destructive draft), idempotentHint=false (each call creates new draft), and openWorldHint=true. The description adds detailed behavioral context: it is INSERT-only, creates a draft, explains the process (fuzzy match, recency-weighting, evidence tier), and mentions future integration ('Gemini integration ships later').
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 description is well-structured with sections (WHEN TO USE, HOW IT WORKS, EXAMPLES) and bullet points. Every sentence adds value without unnecessary verbosity.
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?
Despite no output schema, the description explains the output: a draft snapshot with evidence_tier and grounded_ratio, status='draft', and the required subsequent action (accept_snapshot). It covers the tool's behavior comprehensively.
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 single parameter 'topic' has full schema coverage (100%) with description, min/max length, and examples. The description adds meaning beyond schema: it explains the parameter is used for fuzzy matching against tags and titles, and that matching is recency-weighted.
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 clearly states the tool's purpose: 'Generate a state-shaped artifact for a topic from your saved memories.' It uses a specific verb ('Generate') and resource ('artifact'), and the description differentiates it from siblings like 'get_snapshot' and 'accept_snapshot' by detailing that it creates a new draft.
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 'WHEN TO USE' section explicitly lists use cases (architecture map, glossary, runbook, etc.) and mentions the slash command. While it doesn't explicitly say when not to use alternatives, the context is clear and differentiates from other snapshot-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshot_sourcesARead-onlyIdempotent
Fetch citation bundle + conflict detection for a topic so YOU can synthesize the snapshot in-context. Step 1 of the MCP snapshot path (ADR-032 Amendment A).
WHEN TO USE: When you want to generate a snapshot from inside Claude. Returns source memories + conflicts so you synthesize, then call save_snapshot() to persist.
FLOW:
snapshot_sources(topic) → sources returned to you
You synthesize a current-state document from the sources
save_snapshot(topic, content, cited_ids) → persists your synthesis as a draft
accept_snapshot(snapshot_id) → promotes to canonical
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Topic keyword — fuzzy matches memory tags and titles. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows it's a safe read operation. The description adds valuable behavioral context by explaining the role as step 1 of a multi-step process and what it returns (sources + conflicts), which goes beyond 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?
The description is well-organized with clear sections (main purpose, WHEN TO USE, FLOW) and uses concise, direct language. While slightly longer than necessary, it efficiently communicates all critical information without redundancy.
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?
Given the tool's simplicity (one parameter, read-only, no output schema), the description is complete. It explains the tool's placement in a workflow, what it returns, and how to proceed (synthesize and call save_snapshot). The absence of an output schema does not detract because the description implies the return structure.
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 parameter 'topic', and its description already explains fuzzy matching. The tool description does not add additional semantic meaning beyond what the schema provides, so the baseline score of 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 clearly states the tool fetches citation bundles and conflict detection for a topic, with specific verbs ('Fetch') and resources ('citation bundle + conflict detection'). It distinguishes itself from sibling tools like save_snapshot and accept_snapshot by explicitly outlining the snapshot generation flow.
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 'WHEN TO USE' section explicitly states the tool is for generating a snapshot from inside Claude, providing clear context. It references sibling tools (save_snapshot, accept_snapshot) in the flow but does not explicitly state when not to use it, which is acceptable given the clarity of the flow.
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.
3 tool updates
v15.7.26- Added
list_clusters - Changed
recall_memories1 field changed- added
Input schema / properties / clusterAdded value: +{ + "description": "Scope recall to a CLUSTER's members (\"reverse cluster search\"). Accepts a cluster/project title (e.g. cluster=\"Personal Design Language\") or a cluster UUID. A PROJECT name pulls every memory across all its themes; a THEME name pulls that theme. Use when the user asks for \"everything about <project/topic>\" — it returns the whole cluster, not just the embedding-nearest memories. Case-insensitive for titles.", + "type": "string" +}
- Changed
save_conversation1 field changed- changed
Input schema / properties / title / defaultPrevious value: -"Conversation 2026-06-21T14:08:37.634Z"New value: +"Conversation 2026-08-03T19:20:47.417Z"
27 tool updates
v15.7.23- First observed
accept_snapshot - First observed
commit - First observed
complete_task - First observed
discover_related_conversations - First observed
generate_handoff_brief - First observed
get_acknowledged_errors - First observed
get_artifacts - First observed
get_investigations - First observed
get_memory_details - First observed
get_next_task - First observed
get_public_memory - First observed
get_snapshot - First observed
get_test_results - First observed
get_user_context - First observed
list_workflows - First observed
recall_memories - First observed
recall_public - First observed
report_memory - First observed
run_workflow - First observed
save_artifact - First observed
save_conversation - First observed
save_investigation_result - First observed
save_snapshot - First observed
save_test_result - First observed
share_memory - First observed
snapshot - First observed
snapshot_sources
TDQS
Scored across 28 tools
The snapshot-related tools are genuinely confusing: 'snapshot', 'get_snapshot', and 'save_snapshot' all sound like the same operation, and their actual distinctions (generate draft, read canonical, persist synthesized draft) are buried in descriptions. Several retrieval tools also overlap in feel — recall_memories, recall_public, get_memory_details, and discover_related_conversations — though their domains are more defensible. Overall, an agent could easily pick the wrong snapshot tool.
The vast majority of tools follow a clean snake_case verb_noun pattern: get_snapshot, list_workflows, save_conversation, complete_task, accept_snapshot. The exceptions are 'snapshot' and 'commit', which are bare verbs/nouns and break the otherwise predictable convention.
28 tools is past the 25-tool threshold for 'too many' and the server spans at least seven distinct domains: memory, snapshots, public sharing, workflows, tasks, test results, and incident investigation. Several clusters, especially error investigation and test result tracking, feel bolted on rather than core to a personal memory tool.
Core memory, snapshot, public-memory, and workflow paths are reasonably covered, with save/retrieve pairs like save_artifact/get_artifacts and save_test_result/get_test_results. However, notable gaps remain: 'commit' has no MCP retrieval tool for commitments, and the task queue has get_next_task/complete_task but no create/update task tool, making those lifecycles incomplete.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
- memoryOAuthcom.leapmemory
Long-term memory for AI assistants. Isolated per-user storage, recall across conversations.
- TaprootOAuthcom.taproothq
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides long-term memory capabilities for Claude through persistent storage and full-text search of context across conversations. Enables storing, searching, and managing memories organized by categories like facts, preferences, projects, and goals.81MIT
- -licenseNot gradedqualityDmaintenanceProvides persistent memory for AI assistants like Claude, storing and retrieving information across conversations using a local SQLite database.-
- AlicenseNot gradedqualityDmaintenanceProvides persistent cross-session memory for Claude Code, enabling it to remember user preferences, decisions, and project context across new sessions.Apache 2.0

BaseGrid MCP Serverofficial
FlicenseNot gradedqualityDmaintenanceGives Claude Desktop, Cursor, Cline, and other MCP-compatible AI tools persistent memory, enabling them to store and recall information seamlessly across sessions.141-