tdai-memory-mcp
The server provides persistent, searchable long-term memory for AI coding agents, running locally with an embedded SQLite database (no external database or API key required).
Memory Operations: Recall past memory using hybrid BM25 + vector search with pagination/token limits; capture decisions, learnings, tasks, errors, conversations, and atomic facts; search by keyword/semantic similarity with filters; forget by ID, tag, type, or date with confirmation.
Agent Handoff & ADRs: Create structured handoff packets to transfer context between sessions/agents (saving 60–85% tokens); record architecture decision records with rationale, alternatives, and consequences.
Data Management: Export/import memory as JSON (filterable, stdout support); backup database and audit log; view memory in a local web viewer at http://localhost:7331; print stats (counts, top tags, sessions, etc.).
Automation: Install agent skills and lifecycle hooks (SessionStart auto-recall, Stop handoff reminder) for Claude Code, Devin CLI, and others.
Optional LLM Pipeline: With an API key, distill raw captures into atomic facts (L1), scenarios (L2), and persona profiles (L3); otherwise, raw captures and hybrid search work in noop mode.
Security: Automatic secret redaction on captures; token caps on recall (4,000) and search (8,000); audit log of all tool calls with hashed arguments.
Team Collaboration: Sync shared team memory via a committed
.tdai-memory/memory-export.jsonfile in a repo.Programmatic Access: TypeScript SDK for direct
capture,recall,handoff,adrcalls.Configuration: Configurable via environment variables or config file; supports multiple clients (Claude Code, Cursor, Codex CLI, Devin CLI, Trae); Docker support.
Syncs project memory to a Git repository, enabling team sharing through commits, diffs, and merges.
Click on "Deploy 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., "@tdai-memory-mcpwhat did we decide about the API design?"
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.
tdai-memory-mcp → remem-mcp
This package has been renamed to remem-mcp.
Migrate
npx remem-mcp setupYour existing memory.db is preserved — same SQLite file, same path (~/.local/share/remem-mcp/memory.db).
Related MCP server: Memryzed
What changed
Package name:
tdai-memory-mcp→remem-mcpEnv vars:
TDAI_*→REMEM_*Everything else stays the same: same tools, same DB, same hooks
Links
New repo: github.com/tinhien11/remem-mcp
Available Tools
7 toolsadrA
Record an Architecture Decision Record (ADR). Use this tool when you make a technical decision that future agents should know about. The ADR is stored as a structured capture and can be recalled by any agent working on the same project.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional tags for filtering. Example: ['arch', 'storage']. | |
| title | Yes | A short title for the decision. Example: 'Use SQLite for local storage'. | |
| context | Yes | The problem or situation that requires a decision. Why is this decision needed? | |
| task_id | No | The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation. | |
| team_id | No | The team ID. Use this to isolate memory by team. When set, all queries filter by this value. | |
| user_id | No | The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both. | |
| agent_id | No | The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent. | |
| decision | Yes | The decision that was made. What was chosen? | |
| session_key | No | The session key. The default is hash(cwd). | |
| alternatives | No | Other options that were considered but rejected. Include why each was rejected. | |
| consequences | No | The consequences of this decision. What are the trade-offs, risks, and benefits? |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that the ADR is stored as a structured capture and can be recalled by any agent on the same project. However, it does not clarify whether the tool creates a new record each time, whether it overwrites existing records, or any side effects like memory isolation when team_id/task_id are used. The description offers some context but not complete behavioral transparency.
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 three sentences, each earning its place: the first names the action, the second provides a usage condition, and the third explains storage and sharing. It is front-loaded and free of redundant wording, making it easy for an agent to parse quickly.
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 tool has a moderate complexity with 11 parameters and 3 required, but the description includes the key context: what the tool does, when to use it, and how the resulting data is used (recallable). It does not explicitly link to related tools like recall or capture, but the phrase 'can be recalled' hints at the ecosystem. The absence of an output schema means no return-value explanation is needed, and the description covers the essential usage scenario.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters. The description does not add additional parameter-level meaning beyond what the schema provides. According to the guidelines, a baseline of 3 is appropriate when the schema covers all parameters.
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 records an Architecture Decision Record (ADR) with a specific verb ('Record') and resource ('Architecture Decision Record'). It also explains the purpose: 'when you make a technical decision that future agents should know about,' which distinguishes it from generic capture tools.
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 tells the agent when to use the tool: 'Use this tool when you make a technical decision that future agents should know about.' It does not mention alternatives or exclusions, but the condition is clear and actionable. The mention that ADRs are 'recalled by any agent' also sets expectations for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
captureA
Save a decision, a learning, or a task outcome to memory. Call this tool after you complete a non-trivial task, make a decision, or fix a bug with a known root cause. You can capture a single text string, or a list of role-based conversation messages.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional tags. | |
| type | Yes | The type of the memory. | |
| content | No | The text to remember. The tool redacts secrets before it stores the text. Use this for a single message. Use 'messages' instead for a multi-turn conversation. | |
| task_id | No | The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation. | |
| team_id | No | The team ID. Use this to isolate memory by team. When set, all queries filter by this value. | |
| user_id | No | The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both. | |
| agent_id | No | The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent. | |
| messages | No | A list of role-based conversation messages to capture. When set, 'content' is ignored. The tool flattens the messages into a single text for search, and stores the original messages for retrieval. | |
| metadata | No | Optional metadata. | |
| verified | No | Set this to true to mark the capture as verified. Verified captures rank higher in recall. | |
| supersedes | No | The ID of a capture that this one replaces. The old capture is marked as stale and ranks lower. | |
| session_key | No | The session key. The default is hash(cwd). | |
| override_rejection | No | Set this to true to force capture even if the content was previously rejected. Use this only when the rejection reason no longer applies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It states the tool 'Save[s]... to memory' and mentions both single-text and message-list capture modes, but it doesn't describe side effects (e.g., superseding marks old captures stale) or return values. The minimal disclosure is viable but not rich, relying on the schema for deeper details.
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 two sentences, front-loaded with purpose, and each sentence earns its place. It states what the tool does, when to use it, and the input modes without redundant 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?
The tool has 13 parameters and no output schema, but the comprehensive schema covers parameter meaning. The description supplies the crucial 'when to call' context and high-level input options. It doesn't state return values, but for a memory-capture tool this gap is acceptable given the schema's richness and the clear distinction from sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters. The description adds conceptual grouping ('decision, learning, task outcome' align with the type enum and the content vs messages distinction) but doesn't introduce syntax or format details beyond the schema. This matches the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Save a decision, a learning, or a task outcome to memory,' which is a specific verb (Save) plus resource (memory). It clearly distinguishes the tool from sibling read/delete tools like recall, search, and forget, and enumerates concrete use cases for when to capture, such as after a non-trivial task or bug fix.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this tool after you complete a non-trivial task, make a decision, or fix a bug with a known root cause' provides explicit when-to-use triggers. It doesn't list alternatives or exclusions, but the context of sibling tools (recall/search/forget) makes the usage unambiguous, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forgetA
Delete specific memory entries. Use this tool only when the user requests a deletion. Do not auto-forget.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The ID of the capture to delete. | |
| filter | No | ||
| reason | No | The reason for rejection. Required when reject is true. The agent stores this with the tombstone. | |
| reject | No | Set this to true to reject the capture instead of deleting it. The capture is marked as rejected with a reason, and the same content cannot be captured again. Use this when the memory is wrong, not just outdated. | |
| confirm | No | Set this to true to execute the deletion. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It only says 'Delete specific memory entries' and 'Do not auto-forget'; it fails to mention that deletion is permanent, requires confirm=true, or that reject mode creates a tombstone. This is a significant gap for a destructive mutation tool.
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 three short, front-loaded sentences with no filler. It delivers the core action and usage constraint efficiently.
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 tool is complex with nested filters, reject/confirm semantics, and no output schema. The description is minimally viable but omits critical distinctions like delete vs reject and the permanent/destructive nature. The schema helps, but the description alone would not fully orient 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?
Schema description coverage is 80% and each parameter already has a detailed description (id, filter, reason, reject, confirm). The description adds no extra parameter semantics, so a baseline score of 3 is appropriate given the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool deletes specific memory entries, providing a specific verb and resource. This distinguishes it from sibling tools like recall, search, and knowledge_delete.
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 this tool ('only when the user requests a deletion') and when not to ('Do not auto-forget'). This is strong, unambiguous usage guidance even though it doesn't name specific alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
handoffA
Write a structured handoff packet for the next agent session. Call this tool at the end of a session, or before you switch to a different agent. The next agent calls recall to load this packet and continue without re-reading files. This saves 60-85% of tokens compared to re-discovering context.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | A one-line description of the task. | |
| files | No | A list of files that matter for this task. Use the format: path:lines - reason. | |
| status | Yes | The current status of the task. | |
| task_id | No | The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation. | |
| team_id | No | The team ID. Use this to isolate memory by team. When set, all queries filter by this value. | |
| user_id | No | The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both. | |
| agent_id | No | The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent. | |
| progress | Yes | A summary of what has been done so far. Include the root cause if this is a bug fix. | |
| decisions | No | A list of decisions made during this session. Include what was chosen and why. | |
| next_steps | No | A list of next steps for the next agent. Order by priority. | |
| session_key | No | The session key. The default is hash(cwd). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool writes a packet and that recall loads it, and notes token savings. However, it does not mention whether calling it repeatedly overwrites an existing packet, any persistence details, or prerequisites. This is moderate transparency but leaves some behavioral aspects implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: purpose, timing, and consequence. It is short, front-loaded, and contains no wasteful or repetitive language.
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 a rich schema and no output schema or annotations, the description is largely complete: it explains the tool's role and its relationship to recall. It could optionally mention the memory isolation fields or overwrite behavior, but given the high schema coverage, this is a minor 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?
The description itself contains no parameter information, but the input schema covers all 11 parameters with descriptions and enum definitions. Since schema coverage is 100%, the baseline score of 3 applies; the description adds no extra parameter semantics 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 'Write a structured handoff packet for the next agent session' with a specific verb and resource. It distinguishes itself from sibling tools by explicitly connecting to 'recall' as the load counterpart, making its role unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Call this tool at the end of a session, or before you switch to a different agent' and explains that the next agent 'calls recall to load this packet', providing a clear usage scenario and naming the alternative tool. This leaves no doubt about when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallA
Retrieve relevant past memory. Call this tool before you answer the user. Use it when the user references past work or when the task needs project context.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | The search mode. | hybrid |
| limit | No | The maximum number of results. | |
| query | Yes | A natural language query. The tool uses this text for the BM25 search and the vector search. | |
| offset | No | The pagination offset. Use this to get the next page of results. | |
| task_id | No | The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation. | |
| team_id | No | The team ID. Use this to isolate memory by team. When set, all queries filter by this value. | |
| user_id | No | The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both. | |
| agent_id | No | The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent. | |
| max_tokens | No | The maximum number of tokens in the response. If the result exceeds this value, the tool truncates the text. | |
| session_key | No | The session key. The default is hash(cwd). Use this to recall memory from a different project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'retrieve,' which implies a read-only operation, but it does not explicitly confirm non-destructiveness, describe what the results look like, or mention truncation or pagination behavior. The schema provides some technical details, but the description itself adds no behavioral context beyond the verb.
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—two sentences—with the purpose front-loaded in the first sentence ('Retrieve relevant past memory') and usage guidance in the second. There is no redundant information or fluff; every word 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?
The tool has 10 parameters, no output schema, and several similar siblings (e.g., 'search', 'related'). The description provides useful usage timing but does not describe the return format, how to use modes, or how this differs from 'search'. These gaps make it adequate but not fully complete for an agent to invoke with confidence.
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%, with every parameter having a meaningful description (e.g., mode, limit, offset, user_id). The baseline for such coverage is 3, and the tool description adds no additional parameter semantics. It neither compensates for gaps nor adds value beyond the schema, so the baseline score stands.
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 with a specific verb and resource: 'Retrieve relevant past memory.' This distinguishes it as a memory recall operation, but it does not explicitly differentiate it from sibling tools like 'search' or 'knowledge_get', so it earns a 4 rather than a 5.
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 clear usage context: 'Call this tool before you answer the user' and 'Use it when the user references past work or when the task needs project context.' This gives strong contextual guidance, but it does not mention when not to use it or name alternative tools, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolveA
Resolve a conflict between two captures. Mark one as the winner and the other as stale. Call this tool when capture reports a conflict between two memories.
| Name | Required | Description | Default |
|---|---|---|---|
| loser | Yes | The ID of the capture that is wrong or outdated. This capture is marked as stale. | |
| reason | No | The reason for the resolution. The agent stores this in the audit log. | |
| winner | Yes | The ID of the capture that is correct. This capture stays active. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden of behavioral disclosure. It states the core effect (mark one winner, one stale), but does not mention irreversibility, permissions, audit logging, or other side effects. The reason parameter's audit log behavior is only in the schema, not the description. This is a significant gap for a mutation tool.
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 three sentences, front-loaded with the purpose, and lacks unnecessary filler. The second sentence about marking winner/stale clarifies the mechanism without being verbose. It earns a high score for conciseness and structure.
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 mutation tool with no output schema and 100% param coverage, the description plus schema provide a fairly complete picture: what it does, when to use it, and what happens to winner/loser. The lack of output schema doesn't matter. Minor ambiguity about 'capture reports a conflict' but it's understandable in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented. The description does not add any parameter-specific meaning beyond the schema, but it doesn't need to. 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's purpose: 'Resolve a conflict between two captures.' It identifies the specific action (resolve), the resource (captures), and distinguishes itself from siblings like update or consolidate by focusing on conflict resolution between two captures.
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 call the tool: 'Call this tool when capture reports a conflict between two memories.' This provides clear context, but it does not mention alternatives or exclusion cases. Thus it meets the criteria for 'clear context, no exclusions'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search memory by keyword or by semantic similarity. Use this tool when recall is too broad and you need specific facts.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | The search mode. | hybrid |
| limit | No | ||
| query | Yes | The search text. | |
| filters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose that search is by keyword or semantic similarity, which is useful. However, it doesn't mention the default hybrid mode, whether results are paginated with a limit, or what the return format looks like. Since search is inherently read-only, that isn't a concern, but more behavioral detail would be beneficial.
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 highly concise: two sentences that state the core function and provide usage guidance. No wasted words, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no annotations and no output schema, the description is adequate but sparse. It explains the primary purpose and when to use it, but omits mention of available filters, limits, and mode options. Given the moderate complexity of the input schema, a bit more context would make the description more 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 50%, and the description adds no parameter guidance. It doesn't explain the 'mode' enum, 'limit', or 'filters' object. While the schema has some descriptions for 'query' and 'mode', parameters like 'limit' and many filter fields lack descriptions. The tool description should compensate but does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Search memory by keyword or by semantic similarity.' It uses a specific verb and resource, and it distinguishes from recall by indicating when this tool should be preferred ('when recall is too broad and you need specific facts'). This effectively differentiates from the likely sibling 'recall'.
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: 'Use this tool when recall is too broad and you need specific facts.' It implies that recall is for broad queries and that this tool is for targeted fact-finding. It does not explicitly list alternatives or exclusions beyond this, but the context is clear enough for a search tool.
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.
7 tool updates
v0.5.17- Removed
knowledge_create - Removed
knowledge_delete - Removed
knowledge_get - Removed
knowledge_list - Removed
skill_get - Removed
skill_list - Removed
skill_search
14 tool updates
v0.3.2- Changed
adr4 fields changed- added
Input schema / properties / agent_idAdded value: +{ + "description": "The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent.", + "type": "string" +} - added
Input schema / properties / task_idAdded value: +{ + "description": "The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation.", + "type": "string" +} - added
Input schema / properties / team_idAdded value: +{ + "description": "The team ID. Use this to isolate memory by team. When set, all queries filter by this value.", + "type": "string" +} - added
Input schema / properties / user_idAdded value: +{ + "description": "The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both.", + "type": "string" +}
- Changed
capture10 fields changed- added
Input schema / properties / agent_idAdded value: +{ + "description": "The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent.", + "type": "string" +} - changed
Input schema / properties / content / descriptionPrevious value: -"The text to remember. The tool redacts secrets before it stores the text."New value: +"The text to remember. The tool redacts secrets before it stores the text. Use this for a single message. Use 'messages' instead for a multi-turn conversation." - added
Input schema / properties / messagesAdded value: +{ + "description": "A list of role-based conversation messages to capture. When set, 'content' is ignored. The tool flattens the messages into a single text for search, and stores the original messages for retrieval.", + "items": { + "properties": { + "content": { + "description": "The message content.", + "type": "string" + }, + "role": { + "description": "The role of the speaker: 'user' or 'assistant'.", + "type": "string" + } + }, + "required": [ + "role", + "content" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / override_rejectionAdded value: +{ + "default": false, + "description": "Set this to true to force capture even if the content was previously rejected. Use this only when the rejection reason no longer applies.", + "type": "boolean" +} - added
Input schema / properties / supersedesAdded value: +{ + "description": "The ID of a capture that this one replaces. The old capture is marked as stale and ranks lower.", + "type": "string" +} - added
Input schema / properties / task_idAdded value: +{ + "description": "The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation.", + "type": "string" +} - added
Input schema / properties / team_idAdded value: +{ + "description": "The team ID. Use this to isolate memory by team. When set, all queries filter by this value.", + "type": "string" +} - added
Input schema / properties / user_idAdded value: +{ + "description": "The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both.", + "type": "string" +} - added
Input schema / properties / verifiedAdded value: +{ + "default": false, + "description": "Set this to true to mark the capture as verified. Verified captures rank higher in recall.", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "content", - "type" -]New value: +[ + "type" +]
- Changed
forget5 fields changed- added
Input schema / properties / filter / properties / task_idAdded value: +{ + "description": "Delete captures linked to this task only.", + "type": "string" +} - added
Input schema / properties / filter / properties / team_idAdded value: +{ + "description": "Delete captures from this team only.", + "type": "string" +} - added
Input schema / properties / filter / properties / user_idAdded value: +{ + "description": "Delete captures from this user only.", + "type": "string" +} - added
Input schema / properties / reasonAdded value: +{ + "description": "The reason for rejection. Required when reject is true. The agent stores this with the tombstone.", + "type": "string" +} - added
Input schema / properties / rejectAdded value: +{ + "default": false, + "description": "Set this to true to reject the capture instead of deleting it. The capture is marked as rejected with a reason, and the same content cannot be captured again. Use this when the memory is wrong, not just outdated.", + "type": "boolean" +}
- Changed
handoff4 fields changed- added
Input schema / properties / agent_idAdded value: +{ + "description": "The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent.", + "type": "string" +} - added
Input schema / properties / task_idAdded value: +{ + "description": "The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation.", + "type": "string" +} - added
Input schema / properties / team_idAdded value: +{ + "description": "The team ID. Use this to isolate memory by team. When set, all queries filter by this value.", + "type": "string" +} - added
Input schema / properties / user_idAdded value: +{ + "description": "The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both.", + "type": "string" +}
- Added
knowledge_create - Added
knowledge_delete - Added
knowledge_get - Added
knowledge_list - Changed
recall4 fields changed- added
Input schema / properties / agent_idAdded value: +{ + "description": "The agent ID. Use this to isolate memory by agent role within a team. Defaults to the detected agent.", + "type": "string" +} - added
Input schema / properties / task_idAdded value: +{ + "description": "The task ID. Use this to isolate memory by a specific task. Link captures to a task for finer isolation.", + "type": "string" +} - added
Input schema / properties / team_idAdded value: +{ + "description": "The team ID. Use this to isolate memory by team. When set, all queries filter by this value.", + "type": "string" +} - added
Input schema / properties / user_idAdded value: +{ + "description": "The user ID. Use this to isolate memory by user within a team. When set with team_id, queries filter by both.", + "type": "string" +}
- Added
resolve - Changed
search3 fields changed- added
Input schema / properties / filters / properties / task_idAdded value: +{ + "description": "Filter by task ID.", + "type": "string" +} - added
Input schema / properties / filters / properties / team_idAdded value: +{ + "description": "Filter by team ID.", + "type": "string" +} - added
Input schema / properties / filters / properties / user_idAdded value: +{ + "description": "Filter by user ID.", + "type": "string" +}
- Added
skill_get - Added
skill_list - Added
skill_search
6 tool updates
v0.2.0- First observed
adr - First observed
capture - First observed
forget - First observed
handoff - First observed
recall - First observed
search
TDQS
Scored across 7 tools
Most tools have clearly distinct purposes: recall for broad context, search for specific facts, capture for saving, resolve for conflicts, forget for deletion, handoff for session transfer, and adr for architecture decisions. The main overlap is between recall and search, but their descriptions clarify the difference (broad versus specific).
Tool names are mostly single-word lowercase verbs (recall, capture, search, resolve, forget), which forms a predictable pattern. However, 'handoff' is a noun/phrasal verb and 'adr' is an acronym, creating minor deviations from the otherwise consistent verb style.
With 7 tools, the set is well-scoped for a memory-management server. Each tool serves a distinct memory lifecycle function without unnecessary bloat or overlap.
The tool surface covers core memory operations: store (capture), retrieve (recall/search), delete (forget), conflict handling (resolve), plus specialized features (handoff, adr). A missing explicit 'update memory' tool is a minor gap, but capture can serve that role implicitly.
Maintenance
Related MCP Connectors
Local-first, governed memory and session continuity for AI coding agents. No cloud, no telemetry.
91An MCP memory server. One memory your agents share — across models, devices and apps.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Persistent memory for AI agents across Claude, ChatGPT and any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.1 npm1Apache 2.0
- FlicenseNot gradedqualityCmaintenanceLocal-first cross-agent memory for AI coding agents. Persistent, shared memory over MCP — what you tell one agent can be recalled by another — with all data stored in a single local SQLite file, no cloud and no API keys.-
- AlicenseNot gradedqualityCmaintenancePersistent memory for AI coding agents. Enables agents to save and recall decisions, patterns, bugs, and context across sessions via an MCP server with local SQLite storage.14 npm2MIT
- AlicenseNot gradedqualityAmaintenanceA local memory server for AI agents that stores and retrieves information via MCP, keeping all data in SQLite on your machine.288 PyPI1Apache 2.0