r3 (Recall)
This server provides intelligent memory management for AI apps via MCP, including semantic search, knowledge graphs, caching, and bulk import/export.
Add memories: Store content or message arrays with async processing, priority levels, metadata, and optional duplicate skipping.
Search memories: Hybrid search combining semantic, keyword, entity, and recency scoring, with cache-first or cloud-first routing.
Get all memories: Paginated retrieval filtered by user, with optional cache statistics.
Delete memories: Remove specific memories with automatic cache invalidation.
Deduplicate memories: Find and merge duplicate memories using a similarity threshold, with dry-run preview.
Optimize cache: Control cache size, force refresh from cloud, and promote important memories.
Monitor health: View cache performance stats and background sync/job queue status.
Extract entities: Pull people, organizations, technologies, and projects from text using NLP.
Query knowledge graph: Retrieve graph nodes/edges filtered by entity, type, or relationship.
Find connections: Traverse relationships between entities up to a specified depth.
Import memories: Bulk import from the Mem0 API or a JSON file with batching and duplicate handling.
Enables integration with the Gemini CLI for context-aware responses and persistent memory storage.
Facilitates persistent context management in LangChain applications using semantic search and priority-based memory storage.
Enables storage and retrieval of user-specific memories and metadata within Next.js App Router projects.
Utilizes Redis as a high-performance local cache for low-latency memory access and intelligent data tiering.
Integrates with the Vercel AI SDK to provide semantic context augmentation for AI-driven applications.
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., "@r3 (Recall)search for my notes on the system architecture from last week"
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.
r3
Persistent memory for MCP clients (Claude Desktop, Claude Code, Cursor) that runs entirely on your machine, with no accounts, no API keys, and no cloud service required to start.

Quick start
npx @n3wth/r3That single command starts an MCP server backed by an embedded Redis instance and a local vector index. There is no separate database to install and no signup step.
Related MCP server: Synapse Memory
How it works
MCP client (Claude Desktop / Claude Code / Cursor)
|
v
r3 MCP server (stdio)
|
+----+-----------------------+
| |
embedded Redis vectra local index
(redis-memory-server, (on-disk vector store
auto-downloaded binary, for semantic search,
no external service) no external service)
|
+--- optional ---> Mem0 cloud API (MEM0_API_KEY)
cross-device sync, off by defaultEmbedded Redis —
redis-memory-serverdownloads and manages a local Redis binary for you. It stores memory content and metadata. If it cannot start, r3 falls back to an in-process store.vectra — a local, file-backed vector index used for semantic search. No network calls, no external vector database.
Mem0 (optional) — if
MEM0_API_KEYis set, r3 also syncs to Mem0's cloud API so memories can follow you across machines. Without a key, nothing leaves your machine.
MCP client configuration
Claude Desktop
Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"r3": {
"command": "npx",
"args": ["@n3wth/r3"]
}
}
}Claude Code
claude mcp add r3 "npx @n3wth/r3"Cursor
Add to .cursor/mcp.json in your project (or the global Cursor MCP config):
{
"mcpServers": {
"r3": {
"command": "npx",
"args": ["@n3wth/r3"]
}
}
}Restart the client after editing config. In a new conversation:
You: Remember that I prefer TypeScript and dark mode.
AI: I'll remember that.
[new conversation]
You: What are my preferences?
AI: You prefer TypeScript and dark mode.Tools
Tool | Description |
| Store content with optional metadata and priority |
| Query memories using semantic or keyword search |
| List stored memories with pagination |
| Retrieve a specific memory by ID |
| Modify existing memory content or metadata |
| Remove a memory |
| Find and merge duplicate memories |
| Report cache hit rate and storage stats |
| Report Mem0 cloud sync status |
| Run cache maintenance |
| Bulk import memories |
Enhanced mode (default, INTELLIGENCE_MODE=enhanced) adds:
Tool | Description |
| Extract named entities from text |
| Return the entity/relationship graph |
| Find entities connected to a given entity |
Configuration
Environment variables, all optional:
Variable | Description | Default |
| Use an external Redis instead of the embedded one | embedded server |
| Enables Mem0 cloud sync | unset (local only) |
| Namespace for memories |
|
|
|
|
Example with cloud sync enabled:
{
"mcpServers": {
"r3": {
"command": "npx",
"args": ["@n3wth/r3"],
"env": {
"MEM0_API_KEY": "mem0_..."
}
}
}
}Comparison
r3 | mem0 (OSS) | zep | |
Runs fully local with zero config | yes (embedded Redis + vectra) | requires a Postgres/vector DB you configure | requires a Postgres instance you configure |
Needs an API key to try it | no | no (self-hosted) / yes (cloud) | yes (cloud), or self-hosted setup |
Optional cloud sync | yes, via Mem0 | n/a (is the cloud option) | yes |
This table only reflects setup requirements observed in each project's own documentation, not benchmark performance or feature completeness. Verify against current upstream docs before relying on it.
Known issues
See LAUNCH_AUDIT.md for current limitations, including a native module build failure on some macOS setups.
Documentation
Full documentation at r3.n3wth.com.
License
MIT
Available Tools
14 toolsadd_memoryA
Store a new memory with automatic deduplication and indexing. Use for persisting facts, preferences, or conversation context. Checks for duplicates by default (85% similarity threshold). Returns immediately; background processing handles indexing. Prefer over update_memory for new content. Returns: confirmation text. Side effects: creates memory record, updates search index, may skip if duplicate detected.
| Name | Required | Description | Default |
|---|---|---|---|
| async | No | Enable background processing. true: returns immediately, indexes async. false: blocks until complete. Default: true. | |
| content | No | Plain text content to store. Use instead of messages for simple facts. Either content or messages required, not both. | |
| user_id | No | User namespace for memory isolation. Default: "oliver". Use consistent IDs to retrieve related memories. | |
| messages | No | Conversation messages to store. Use instead of content for multi-turn context. Each message needs role and content fields. | |
| metadata | No | Key-value pairs for categorization (e.g., {category: 'preferences', source: 'onboarding'}). Searchable via search_memory. | |
| priority | No | Cache priority. high: immediate L1 cache (24h TTL). medium: standard processing. low: L2 cache (7d TTL). Default: medium. | |
| skip_duplicate_check | No | Bypass duplicate detection. Use only when intentionally storing similar content. Default: false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the sparse annotations by disclosing deduplication with an 85% threshold, background indexing, side effects, and the possibility of skipping a duplicate. However, 'Returns immediately' is stated unconditionally even though the schema allows async=false to block until completion, so the description slightly oversimplifies behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and compact, with the core action and key behaviors in the first sentences. It loses a point for slight redundancy: the immediate-return and background-processing idea appears twice, once in prose and once in the side-effect list.
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 having seven parameters and no output schema, the description covers the use case, duplicate-check behavior, async return behavior, expected return value ('confirmation text'), and side effects. Combined with a fully documented schema, this is complete enough for an agent to invoke the 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?
Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by giving the default duplicate-detection threshold (85%) and by noting return behavior and side effects, which helps contextualize skip_duplicate_check and async. It does not deeply annotate each parameter, but the schema already does that.
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: 'Store a new memory with automatic deduplication and indexing.' It also names the exact use cases (facts, preferences, conversation context) and explicitly distinguishes itself from update_memory, so an agent can tell at a glance which operation this is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool ('Use for persisting facts, preferences, or conversation context') and gives a direct sibling-route instruction: 'Prefer over update_memory for new content.' This is explicit enough for an agent to choose between the two most similar memory tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cache_statsARead-onlyIdempotent
View cache performance metrics and health status. Use for monitoring and debugging. Shows memory count, access patterns, and hit rates. Read-only. Returns: summary text with cached memory count. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description correctly reinforces 'Read-only' and 'No side effects.' It adds value by specifying the return format: 'summary text with cached memory count,' which helps the agent set expectations. 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?
Two concise sentences that state purpose, usage, and result. Every sentence earns its place, and the key scoping info ('monitoring and debugging') is front-loaded. 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?
For a zero-parameter read-only tool with annotations covering safety, the description fully covers what an agent needs: what it does, when to use it, and what it returns. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool takes zero parameters, so the baseline is 4. The description does not need to explain parameters; it correctly omits them, and the schema confirms no input is required.
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 the verb 'View' on the resource 'cache performance metrics and health status.' Distinguishes from siblings like optimize_cache (which modifies cache) and get_all_memories (which lists memories) by focusing on metrics and health. The purpose is 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?
Explicitly states 'Use for monitoring and debugging,' giving clear context for when to invoke. Does not name alternatives or explicit exclusions, but the read-only nature and health-check scope make it obvious it's for diagnostics rather than operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deduplicate_memoriesADestructive
Detect and optionally remove duplicate memories using content similarity. Run with dry_run=true first to preview. Compares all memories pairwise using Jaccard similarity. Groups duplicates with a primary (oldest) and candidates for removal. Returns: summary with duplicate groups. Side effects (when dry_run=false): deletes duplicate memories, invalidates cache.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | true: preview duplicates without deletion (safe). false: actually delete duplicates (destructive). Default: true. | |
| user_id | No | User namespace to deduplicate. Default: "oliver". | |
| similarity_threshold | No | Minimum similarity (0-1) to consider as duplicate. 0.85 = 85% similar. Higher = stricter. Range: 0.5-1.0. Default: 0.85. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description adds valuable behavior: it deletes duplicates, invalidates cache, uses Jaccard similarity, groups with primary oldest, and supports a safe dry-run mode. 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?
Every sentence earns its place: purpose, safety instruction, method, grouping behavior, return value, and side effects. Front-loaded with the core action and preview guidance; no filler or 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?
Despite no output schema, the description states what is returned ('summary with duplicate groups'). The pairwise algorithm, grouping strategy, dry-run behavior, and side effects are all covered. Sufficient for an agent to invoke it correctly, especially with the destructive flag properly contextualized.
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 each parameter already has a rich description. The tool description adds no parameter-level detail beyond the schema, which is acceptable; the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Detect and optionally remove') and resource ('duplicate memories'), with a precise method (content similarity, Jaccard, pairwise). Clearly differentiates itself from siblings like delete_memory by focusing on deduplication rather than single-record operations.
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 instructs to run with dry_run=true first for safe preview, and warns that dry_run=false is destructive. While it doesn't name sibling alternatives or provide when-not-to-use guidance, the operational workflow is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_memoryADestructiveIdempotent
Permanently remove a memory by ID. Irreversible operation. Removes from storage, cache, and search index. Use deduplicate_memories with dry_run first to preview bulk deletions. Returns: confirmation text. Side effects: deletes memory record, removes from all indexes, invalidates cache.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes | Unique identifier of memory to delete. Obtain from search_memory or get_all_memories. Operation succeeds even if ID not found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive/read-only traits, and the description adds meaningful specifics: the operation is irreversible, removes from storage/cache/search index, invalidates cache, and returns a confirmation text. No contradiction exists with idempotentHint or destructiveHint.
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 front-loaded with the primary action and includes useful return and side-effect details. It loses a point for redundancy: 'Irreversible operation' repeats 'Permanently remove', and the side-effects fragment duplicates 'removes from storage, cache, and search index'.
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 destructive tool with no output schema, the description covers the return value, side effects, and a relevant alternative workflow. The only notable behavioral detail not repeated in the description ('succeeds if ID not found') is already present in the input schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the memory_id parameter is fully documented in the schema, including the 'succeeds even if ID not found' behavior. The description adds minimal parameter meaning beyond the word 'by ID', which is acceptable given the complete 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 states a specific verb ('remove'), resource ('memory'), and key ('by ID'), making the tool's core purpose unmistakable. It also distinguishes this from sibling deduplicate_memories by framing that tool as the bulk-deletion preview alternative.
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 tells the agent to use deduplicate_memories with dry_run first for bulk deletions, providing a concrete alternative. It does not exhaustively specify every condition for choosing delete_memory over other siblings, but for a single-object delete operation the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_entitiesARead-onlyIdempotent
Extract named entities and relationships from text using NLP. Identifies people, organizations, technologies, and projects. Also extracts relationships (WORKS_FOR, USES, etc.) and keywords. Requires enhanced intelligence mode. Read-only, stateless. Returns: {people[], organizations[], technologies[], projects[], relationships[], keywords[]}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Input text to analyze. Longer text yields more entities. Supports natural language, code comments, or structured text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds beyond that: it discloses the 'enhanced intelligence mode' requirement, states the tool is stateless, and explicitly lists the returned fields (people, organizations, technologies, projects, relationships, keywords). This is valuable context an agent needs but would not know from annotations alone.
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 moderately detailed but every sentence carries meaning: purpose, entity types, relationship types, requirements, safety (repeats annotation), and return shape. It is front-loaded with the purpose and specifics. The only minor redundancy is 'Read-only, stateless' which partly duplicates annotations, but it is brief and not harmful. Overall, it is appropriately concise for a tool with no 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?
For a single-parameter NLP tool with no output schema, the description is very complete: it defines input type and expectations, lists all output categories, states the mode requirement, and clarifies it is stateless. Siblings are unrelated, so no additional disambiguation is needed. An agent is fully equipped to call this tool correctly without external guidance.
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 schema documents the 'text' parameter at 100% coverage, so the baseline is 3. The description adds extra semantics not in the schema: 'Longer text yields more entities' and 'Supports natural language, code comments, or structured text.' These hints help an agent decide how much text to provide and what formats are acceptable, thereby exceeding the schema's basic type and description.
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 verb 'Extract' and the resource 'named entities and relationships from text using NLP', and enumerates the entity types (people, organizations, technologies, projects) and relationship types (WORKS_FOR, USES). It is clearly distinct from sibling memory-management tools, which focus on storage/retrieval rather than extraction, so an agent would have no trouble selecting it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not name a specific alternative or exclusion, but the sibling tools are all memory-related and have no overlap, so the intended usage context is obvious. It does include a critical usage condition: 'Requires enhanced intelligence mode', which tells the agent when it can be invoked. It also notes the tool is read-only and stateless, implying it is for analysis, not modification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_connectionsARead-onlyIdempotent
Discover relationship paths between entities in the knowledge graph. Uses BFS traversal to find how entities connect. Useful for answering 'how is X related to Y?' questions. Requires enhanced mode. Read-only. Returns: {from, to, max_depth, paths_found, paths[]} where each path is array of {from, to, type} edges.
| Name | Required | Description | Default |
|---|---|---|---|
| max_depth | No | Maximum relationship hops to traverse. Range: 1-5. Higher values exponentially increase results. Default: 2. | |
| to_entity | No | Target entity name. If omitted, returns all reachable entities up to max_depth. | |
| from_entity | Yes | Starting entity name for path search. Must match an entity in the knowledge graph exactly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, idempotent, and non-destructive hints. The description adds meaningful behavior: BFS traversal, the enhanced-mode requirement, and the return payload structure. This exceeds what the annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded with the core purpose. The sentence on return format is useful, but 'Read-only' is redundant with annotations and some phrasing is slightly repetitive.
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 3-parameter tool with no output schema, the description covers the key behavioral detail, the return shape, the required mode, and the primary use case. No critical information needed to invoke or interpret the tool appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, and each parameter already has a descriptive definition. The tool description does not add material parameter meaning beyond the schema, so the baseline of 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 states a specific verb and resource ('Discover relationship paths between entities in the knowledge graph') and clarifies the goal with a concrete use case ('how is X related to Y?'). It clearly differentiates from siblings like get_knowledge_graph by focusing on paths rather than the whole graph.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear context for use ('answering how is X related to Y') and a prerequisite ('Requires enhanced mode'). It does not explicitly name alternatives or state when not to use this tool, but the purpose is specific enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_memoriesARead-onlyIdempotent
List all memories for a user with pagination. Use for browsing or bulk operations. For content search, use search_memory instead. Cache-first by default. Large result sets are automatically truncated. Read-only. Returns: {total, limit, offset, returned, hasMore, source, memories[]}.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum memories per page. Range: 1-500. Default: 100. Use with offset for pagination. | |
| offset | No | Number of memories to skip. Use for pagination: page N = offset (N-1)*limit. Default: 0. | |
| user_id | No | User namespace to list. Default: "oliver". | |
| prefer_cache | No | true: return cached memories (faster). false: fetch from storage (fresher). Default: true. | |
| include_cache_stats | No | Append cache statistics to response. Useful for monitoring. Default: true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds meaningful behavioral context beyond the annotations: cache-first default and automatic truncation of large result sets. It does not contradict the annotations, but could have expanded slightly on cache implications.
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 succinct sentences with no wasted words. It front-loads the core action, then gives usage guidance, behavioral notes, and return shape, all in a logical and efficient 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?
The description includes the essential return shape ({total, limit, offset, returned, hasMore, source, memories[]}), which compensates for the absence of an output schema. Combined with complete parameter documentation and explicit sibling routing, an agent has everything needed to invoke 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?
Schema description coverage is 100%, and each parameter is already clearly documented with ranges, defaults, and usage semantics. The description mentions pagination generally but adds no parameter-level meaning beyond what the schema provides, matching the baseline expected score.
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 the specific verb 'List' and resource 'all memories for a user with pagination,' clearly defining the tool's scope. It also distinguishes the tool from its sibling search_memory, so an agent can differentiate them immediately.
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 ('for browsing or bulk operations') and directs the agent to an alternative when needed ('For content search, use search_memory instead'). This is precise routing guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_knowledge_graphARead-onlyIdempotent
Build a knowledge graph from stored memories. Returns entities as nodes and relationships as edges. Use for visualizing connections between concepts. Requires enhanced intelligence mode with prior entity extraction. Read-only. Returns: {nodes[], edges[]} where nodes have {id, type, name, memories[]} and edges have {from, to, type, confidence}.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum nodes to return. Range: 1-100. Default: 20. Edges limited proportionally. | |
| entity_name | No | Filter nodes containing this name (case-insensitive substring match). Omit for all entities. | |
| entity_type | No | Filter nodes by type: 'people', 'organizations', 'technologies', or 'projects'. Omit for all types. | |
| relationship_type | No | Filter edges by relationship: 'WORKS_FOR', 'USES', 'BUILT_WITH', 'KNOWS', etc. Omit for all relationships. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive, and the description reinforces this with 'Read-only.' It adds valuable behavioral context beyond annotations by disclosing the enhanced-intelligence prerequisite and prior entity-extraction dependency, and by specifying the exact node/edge return shape.
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 efficiently organized: purpose first, then use case, prerequisite, read-only note, and return shape. Every sentence contributes meaningful information, though the 'Read-only' sentence is redundant with annotations and could be omitted.
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 moderate complexity, the description covers the main invocation context: what it returns, when to use it, the required mode, and read-only behavior. The schema covers all parameter semantics. A minor gap is lack of guidance on alternative tools for similar graph/connection tasks, but overall the tool is well specified.
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 100% coverage with detailed descriptions for all four parameters, including ranges, defaults, filter semantics, and example values. The description adds no additional parameter-level meaning, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Build a knowledge graph from stored memories.' It clearly distinguishes itself from sibling memory retrieval tools by emphasizing entities-as-nodes/relationships-as-edges and the use case of visualizing connections between concepts.
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 the tool: 'Use for visualizing connections between concepts.' It also provides a critical prerequisite: 'Requires enhanced intelligence mode with prior entity extraction.' However, it does not explicitly mention alternatives or when-not-to-use scenarios relative to siblings like find_connections.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_memoryARead-onlyIdempotent
Retrieve a single memory by its unique ID. Use when you have a specific memory_id from prior search/list results. Returns null if not found. Prefer search_memory for content-based lookup. Read-only operation. Returns: Memory object {id, content, user_id, metadata} or null.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | No | User namespace. Must match the user_id used when memory was created. Default: "oliver". | |
| memory_id | Yes | Unique identifier of the memory to retrieve. Obtained from add_memory response, search_memory results, or get_all_memories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive; the description adds the crucial 'Returns null if not found' behavior and the exact return shape (Memory object {id, content, user_id, metadata}). It repeats 'Read-only operation' but supplements annotation data with retrieval semantics rather than contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences deliver purpose, usage, and return behavior with no filler. The most decision-relevant facts (ID-based retrieval, null return, search_memory alternative) are 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 simple get-by-primary-key operation, the description is self-sufficient: it specifies how to obtain the ID, what the read-only semantics are, what is returned, and the null case. The optional user_id parameter is fully covered by the schema, so no critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage: both parameters, including the memory_id provenance and user_id default, are documented. The description adds no new parameter-level detail beyond what the schema already states, so it stays at 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 opens with a specific verb-resource pair ('Retrieve a single memory by its unique ID') and immediately clarifies key behavior. It differentiates from search_memory by explicitly directing content-based lookups elsewhere, so an agent can select this tool over siblings without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to use the tool: when you have a specific memory_id from prior search/list results. It also gives an explicit alternative for other cases ('Prefer search_memory for content-based lookup') and notes the null result for missing IDs, making the decision boundary concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_memoriesA
Bulk import memories from external sources. Supports Mem0 API export or local JSON files. Processes in batches with duplicate detection. Use for migration or backup restoration. Returns: summary with imported/skipped/failed counts. Side effects: creates multiple memory records, updates search index.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Import source. 'mem0_api': fetch from Mem0 cloud (requires api_key). 'json_file': read local file (requires file_path). | |
| api_key | No | Mem0 API token for authentication. Required when source='mem0_api'. Get from https://mem0.ai dashboard. | |
| user_id | No | User namespace for imported memories. Default: "oliver". | |
| priority | No | Cache priority for all imported memories. Default: high (L1 cache). | |
| file_path | No | Absolute path to JSON file. Required when source='json_file'. Must be array of memory objects or {memories: [...]}. | |
| batch_size | No | Memories per batch. Lower values are safer but slower. Range: 10-200. Default: 50. | |
| skip_duplicates | No | Check each memory for duplicates before import. Slower but prevents bloat. Default: true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly discloses side effects: 'creates multiple memory records, updates search index' and states the return summary with imported/skipped/failed counts. This goes well beyond annotations, which only mark readOnly=false and idempotent=false, and is consistent with the lack of readOnlyHint.
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?
Each sentence serves a distinct purpose: scope, supported sources, processing behavior, intended use, return value, and side effects. The description is front-loaded with the core purpose and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with seven parameters and no output schema, the description covers the essential missing pieces: return summary and side effects, while the schema handles parameter semantics. It also directs to migration/backup use, and the sibling list provides enough separation for correct tool selection.
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%, and the schema already details enums, defaults, conditional requirements, and ranges. The description does not add new parameter-level meaning beyond restating batch/duplicate behavior, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Bulk import memories from external sources', naming a specific verb, resource, and scope. It further specifies Mem0 API export or local JSON files and duplicate detection, which clearly differentiates it from siblings like add_memory and deduplicate_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?
Explicitly states 'Use for migration or backup restoration', giving clear context for when to invoke the tool. It does not explicitly rule out alternatives such as add_memory for single inserts or deduplicate_memories for deduping existing stores, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimize_cacheAIdempotent
Reorganize cache for optimal hit rates. Promotes frequently accessed memories to L1 (24h TTL), demotes cold data to L2 (7d TTL). Use periodically for large memory stores. May temporarily increase latency during optimization. Returns: summary of cached memories. Side effects: modifies cache TTLs, may evict old entries.
| Name | Required | Description | Default |
|---|---|---|---|
| max_memories | No | Maximum memories to keep in cache. Range: 100-10000. Older/colder items evicted first. Default: 1000. | |
| force_refresh | No | true: clear cache and reload all from storage. false: optimize existing cache. Default: false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing concrete side effects: 'modifies cache TTLs, may evict old entries' and the caveat 'May temporarily increase latency during optimization'. It also states the return value, which is useful given there is no output schema. These details add valuable context beyond readOnlyHint and idempotentHint.
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?
Four sentences, each carrying essential information: purpose, mechanism, usage timing, side effects, and output. The most important purpose is front-loaded, and there is no filler or repetition of schema 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?
For a two-parameter tool with fully documented schema and no output schema, the description covers all necessary call context: what it does, when to run it, side effects, latency risk, and what it returns. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers both parameters with thorough descriptions (ranges, defaults, behavior for force_refresh), so the description does not need to repeat them. The description adds no parameter-specific detail, but per the baseline for 100% schema coverage, a 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 opens with a specific verb and resource: 'Reorganize cache for optimal hit rates', and then details the exact mechanism (promoting to L1 with 24h TTL, demoting to L2 with 7d TTL). This clearly distinguishes it from siblings like cache_stats (read-only reporting) or deduplicate_memories (removing duplicates), so an agent can tell them apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use periodically for large memory stores', giving a clear when-to-use condition. However, it does not mention when not to use it or name alternatives, so it falls just short of the highest bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_memoryARead-onlyIdempotent
Find memories matching a natural language query using hybrid semantic + keyword search. Primary retrieval tool for content-based lookup. Uses vector similarity (enhanced mode) or keyword matching (basic mode). Cache-first by default for speed. Returns ranked results with relevance scores. Read-only. Returns: array of Memory objects or 'No memories found' text.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return. Range: 1-100. Higher values increase latency. Default: 10. | |
| query | Yes | Natural language search query. Supports keywords, phrases, or questions. More specific queries yield better relevance ranking. | |
| user_id | No | User namespace to search within. Default: "oliver". | |
| prefer_cache | No | true: check cache first, fall back to storage. false: query storage directly, then cache results. Default: true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and idempotent hints, so the description builds on that by adding caching behavior ('Cache-first by default'), search modes ('enhanced mode' vs 'basic mode'), and output specification (ranked results with relevance scores and the exact return type). These details go beyond what annotations provide and add meaningful 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 four sentences with a logical flow: core purpose, positioning, mode and caching details, and return format. It is front-loaded with the main function and avoids redundancy. Every sentence contributes value, making it both concise and well-structured.
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 retrieval tool with no output schema, it adequately describes the return values and modes. It clarifies caching and ranking, but leaves ambiguity regarding how enhanced vs basic mode is selected (no parameter exists) and does not specify pagination beyond the limit parameter. These are minor gaps but do not prevent correct usage.
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 parameters with 100% description coverage, so the baseline is 3. The description adds only indirect context (e.g., 'Cache-first by default' aligns with prefer_cache), but does not substantively enhance parameter understanding beyond what the schema already provides. It mentions output but not parameter-specific nuances.
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 'Find memories matching a natural language query' and positions it as the 'Primary retrieval tool for content-based lookup,' distinguishing it from siblings like get_memory (likely by ID) and get_all_memories (list all). The verb and resource are specific and immediately convey 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?
The description explicitly labels this as the primary retrieval tool, giving strong contextual guidance on when to use it. It also notes cache-first behavior as a usage consideration. However, it does not explicitly state when to avoid it or name alternatives such as get_memory for ID-based lookup, though the 'primary' designation implies precedence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_statusARead-onlyIdempotent
Check background job queue and sync status. Shows pending async operations from add_memory calls. Use to verify all writes completed. Read-only. Returns: count of pending operations or 'All operations complete'. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description reinforces them with 'Read-only' and 'No side effects'. It adds useful context by explaining the tool reports pending operations from add_memory calls and describing the return values, which goes 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 economical and front-loaded: it opens with the core purpose, then adds the specific use case, safety characteristics, and return behavior in a few short sentences. Every sentence earns its place 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?
For a zero-parameter read-only status tool, the description is complete: it explains what the tool does, when to use it, that it has no side effects, and what it returns. Since there is no output schema, the explicit return description fully covers the agent's need.
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 there is no schema burden to compensate for. The description adds relevant semantic context about what the tool reports and returns, making the no-parameter interface entirely self-explanatory.
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 checks the background job queue and sync status, and specifically ties it to pending async operations from add_memory calls. This distinguishes it from siblings like cache_stats and get_memory by focusing on write verification rather than data retrieval or cache management.
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 'Use to verify all writes completed', giving a clear context for when to call the tool. It does not name specific alternatives or exclusion conditions, but the intended use case is unambiguous enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_memoryAIdempotent
Modify an existing memory's content or metadata. Use for corrections or adding context to existing memories. Fails if memory_id not found. Prefer add_memory for new content. Invalidates search cache. Returns: updated Memory object. Side effects: modifies memory record, invalidates cached search results.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | New content to replace existing. Omit to keep current content unchanged. | |
| user_id | No | User namespace. Must match original. Default: "oliver". | |
| metadata | No | Metadata fields to merge. Existing fields not specified are preserved. Pass null value to remove a field. | |
| memory_id | Yes | Unique identifier of the memory to update. Must exist or operation fails with error. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate readOnly=false and destructiveHint=false, but the description adds meaningful behavioral context: cache invalidation, mutation of the memory record, failure when the memory_id is missing, and the returned updated Memory object. This goes beyond the structured annotations and gives the agent a clearer picture of the side effects.
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 and front-loaded with the core purpose, but there is slight redundancy: 'Invalidates search cache' appears both as a standalone sentence and again in the side-effects sentence. This is minor and does not detract much from the overall 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?
Given the 4-parameter schema, the presence of nested objects, and the absence of an output schema, the description covers everything essential: what it modifies, when to use it, failure behavior, side effects, and the return value. The tool can be invoked correctly with just this description plus the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter already well-documented in the schema (e.g., metadata merge semantics, user namespace default, failure on missing id). The description does not need to add much parameter detail, though it could have reinforced the merge/null semantics in prose.
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 action ('Modify an existing memory's content or metadata') and identifies its resource. It also distinguishes itself from add_memory, which is a key sibling tool, by explicitly saying to prefer add_memory for new content.
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 gives concrete guidance on when to use this tool ('for corrections or adding context to existing memories') and when not to ('Prefer add_memory for new content'). It also warns that the operation fails if memory_id is not found, which helps the agent decide whether this is the right 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. Dates show when Glama detected each change.
12 tool updates
v1.3.2- Changed
add_memory11 fields changed- removed
Input schema / properties / async / defaultRemoved value: -true - changed
Input schema / properties / async / descriptionPrevious value: -"Process asynchronously for better performance"New value: +"Enable background processing. true: returns immediately, indexes async. false: blocks until complete. Default: true." - changed
Input schema / properties / content / descriptionPrevious value: -"Direct memory content (alternative to messages)"New value: +"Plain text content to store. Use instead of messages for simple facts. Either content or messages required, not both." - changed
Input schema / properties / messages / descriptionPrevious value: -"Array of message objects (alternative to content)"New value: +"Conversation messages to store. Use instead of content for multi-turn context. Each message needs role and content fields." - changed
Input schema / properties / metadata / descriptionPrevious value: -"Additional metadata"New value: +"Key-value pairs for categorization (e.g., {category: 'preferences', source: 'onboarding'}). Searchable via search_memory." - removed
Input schema / properties / priority / defaultRemoved value: -"medium" - changed
Input schema / properties / priority / descriptionPrevious value: -"Processing priority (high = immediate cache)"New value: +"Cache priority. high: immediate L1 cache (24h TTL). medium: standard processing. low: L2 cache (7d TTL). Default: medium." - removed
Input schema / properties / skip_duplicate_check / defaultRemoved value: -false - changed
Input schema / properties / skip_duplicate_check / descriptionPrevious value: -"Skip duplicate detection (use with caution)"New value: +"Bypass duplicate detection. Use only when intentionally storing similar content. Default: false." - removed
Input schema / properties / user_id / defaultRemoved value: -"oliver" - added
Input schema / properties / user_id / descriptionAdded value: +"User namespace for memory isolation. Default: \"oliver\". Use consistent IDs to retrieve related memories."
- Changed
deduplicate_memories6 fields changed- removed
Input schema / properties / dry_run / defaultRemoved value: -true - changed
Input schema / properties / dry_run / descriptionPrevious value: -"Preview duplicates without deleting"New value: +"true: preview duplicates without deletion (safe). false: actually delete duplicates (destructive). Default: true." - removed
Input schema / properties / similarity_threshold / defaultRemoved value: -0.85 - changed
Input schema / properties / similarity_threshold / descriptionPrevious value: -"Similarity threshold for duplicate detection (0-1)"New value: +"Minimum similarity (0-1) to consider as duplicate. 0.85 = 85% similar. Higher = stricter. Range: 0.5-1.0. Default: 0.85." - removed
Input schema / properties / user_id / defaultRemoved value: -"oliver" - added
Input schema / properties / user_id / descriptionAdded value: +"User namespace to deduplicate. Default: \"oliver\"."
- Changed
delete_memory1 field changed- changed
Input schema / properties / memory_id / descriptionPrevious value: -"ID of memory to delete"New value: +"Unique identifier of memory to delete. Obtain from search_memory or get_all_memories. Operation succeeds even if ID not found."
- Changed
extract_entities1 field changed- changed
Input schema / properties / text / descriptionPrevious value: -"Text to extract entities from"New value: +"Input text to analyze. Longer text yields more entities. Supports natural language, code comments, or structured text."
- Changed
find_connections4 fields changed- changed
Input schema / properties / from_entity / descriptionPrevious value: -"Starting entity name"New value: +"Starting entity name for path search. Must match an entity in the knowledge graph exactly." - removed
Input schema / properties / max_depth / defaultRemoved value: -2 - changed
Input schema / properties / max_depth / descriptionPrevious value: -"Maximum relationship depth to traverse"New value: +"Maximum relationship hops to traverse. Range: 1-5. Higher values exponentially increase results. Default: 2." - changed
Input schema / properties / to_entity / descriptionPrevious value: -"Target entity name (optional - finds all if not specified)"New value: +"Target entity name. If omitted, returns all reachable entities up to max_depth."
- Changed
get_all_memories10 fields changed- removed
Input schema / properties / include_cache_stats / defaultRemoved value: -true - changed
Input schema / properties / include_cache_stats / descriptionPrevious value: -"Include Redis cache statistics"New value: +"Append cache statistics to response. Useful for monitoring. Default: true." - removed
Input schema / properties / limit / defaultRemoved value: -100 - changed
Input schema / properties / limit / descriptionPrevious value: -"Number of memories to return (max 500)"New value: +"Maximum memories per page. Range: 1-500. Default: 100. Use with offset for pagination." - removed
Input schema / properties / offset / defaultRemoved value: -0 - changed
Input schema / properties / offset / descriptionPrevious value: -"Number of memories to skip for pagination"New value: +"Number of memories to skip. Use for pagination: page N = offset (N-1)*limit. Default: 0." - removed
Input schema / properties / prefer_cache / defaultRemoved value: -true - changed
Input schema / properties / prefer_cache / descriptionPrevious value: -"Use cached memories first to avoid slow API calls"New value: +"true: return cached memories (faster). false: fetch from storage (fresher). Default: true." - removed
Input schema / properties / user_id / defaultRemoved value: -"oliver" - added
Input schema / properties / user_id / descriptionAdded value: +"User namespace to list. Default: \"oliver\"."
- Changed
get_knowledge_graph5 fields changed- changed
Input schema / properties / entity_name / descriptionPrevious value: -"Filter by specific entity name"New value: +"Filter nodes containing this name (case-insensitive substring match). Omit for all entities." - changed
Input schema / properties / entity_type / descriptionPrevious value: -"Filter by entity type (people, organizations, technologies, projects)"New value: +"Filter nodes by type: 'people', 'organizations', 'technologies', or 'projects'. Omit for all types." - removed
Input schema / properties / limit / defaultRemoved value: -20 - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of nodes to return"New value: +"Maximum nodes to return. Range: 1-100. Default: 20. Edges limited proportionally." - changed
Input schema / properties / relationship_type / descriptionPrevious value: -"Filter by relationship type (WORKS_FOR, USES, BUILT_WITH, etc.)"New value: +"Filter edges by relationship: 'WORKS_FOR', 'USES', 'BUILT_WITH', 'KNOWS', etc. Omit for all relationships."
- Added
get_memory - Changed
import_memories11 fields changed- changed
Input schema / properties / api_key / descriptionPrevious value: -"Mem0 API key (required for mem0_api source)"New value: +"Mem0 API token for authentication. Required when source='mem0_api'. Get from https://mem0.ai dashboard." - removed
Input schema / properties / batch_size / defaultRemoved value: -50 - changed
Input schema / properties / batch_size / descriptionPrevious value: -"Number of memories to import per batch"New value: +"Memories per batch. Lower values are safer but slower. Range: 10-200. Default: 50." - changed
Input schema / properties / file_path / descriptionPrevious value: -"Path to JSON file (required for json_file source)"New value: +"Absolute path to JSON file. Required when source='json_file'. Must be array of memory objects or {memories: [...]}." - removed
Input schema / properties / priority / defaultRemoved value: -"high" - changed
Input schema / properties / priority / descriptionPrevious value: -"Cache priority for imported memories"New value: +"Cache priority for all imported memories. Default: high (L1 cache)." - removed
Input schema / properties / skip_duplicates / defaultRemoved value: -true - changed
Input schema / properties / skip_duplicates / descriptionPrevious value: -"Skip duplicate memories during import"New value: +"Check each memory for duplicates before import. Slower but prevents bloat. Default: true." - changed
Input schema / properties / source / descriptionPrevious value: -"Source of memories to import"New value: +"Import source. 'mem0_api': fetch from Mem0 cloud (requires api_key). 'json_file': read local file (requires file_path)." - removed
Input schema / properties / user_id / defaultRemoved value: -"oliver" - changed
Input schema / properties / user_id / descriptionPrevious value: -"User ID for mem0 API"New value: +"User namespace for imported memories. Default: \"oliver\"."
- Changed
optimize_cache4 fields changed- removed
Input schema / properties / force_refresh / defaultRemoved value: -false - changed
Input schema / properties / force_refresh / descriptionPrevious value: -"Force refresh all memories from cloud"New value: +"true: clear cache and reload all from storage. false: optimize existing cache. Default: false." - removed
Input schema / properties / max_memories / defaultRemoved value: -1000 - changed
Input schema / properties / max_memories / descriptionPrevious value: -"Maximum memories to cache"New value: +"Maximum memories to keep in cache. Range: 100-10000. Older/colder items evicted first. Default: 1000."
- Changed
search_memory7 fields changed- removed
Input schema / properties / limit / defaultRemoved value: -10 - added
Input schema / properties / limit / descriptionAdded value: +"Maximum results to return. Range: 1-100. Higher values increase latency. Default: 10." - removed
Input schema / properties / prefer_cache / defaultRemoved value: -true - changed
Input schema / properties / prefer_cache / descriptionPrevious value: -"true = cache-first with fallback, false = cloud-first with caching"New value: +"true: check cache first, fall back to storage. false: query storage directly, then cache results. Default: true." - changed
Input schema / properties / query / descriptionPrevious value: -"Search query"New value: +"Natural language search query. Supports keywords, phrases, or questions. More specific queries yield better relevance ranking." - removed
Input schema / properties / user_id / defaultRemoved value: -"oliver" - added
Input schema / properties / user_id / descriptionAdded value: +"User namespace to search within. Default: \"oliver\"."
- Added
update_memory
12 tool updates
v1.3.1- First observed
add_memory - First observed
cache_stats - First observed
deduplicate_memories - First observed
delete_memory - First observed
extract_entities - First observed
find_connections - First observed
get_all_memories - First observed
get_knowledge_graph - First observed
import_memories - First observed
optimize_cache - First observed
search_memory - First observed
sync_status
TDQS
Each tool targets a distinct operation: core memory CRUD, bulk import, deduplication, cache monitoring/optimization, sync checking, and knowledge graph pipeline steps are clearly separated. Potential overlaps like get_all_memories vs search_memory or add_memory vs deduplicate_memories are explicitly disambiguated by descriptions of intended use.
Most tools follow a clear verb_noun snake_case pattern (add_memory, get_memory, update_memory, delete_memory, search_memory, import_memories, extract_entities, find_connections). Minor deviations exist: cache_stats and sync_status are noun-style rather than verb_noun, but they remain readable and consistent in style overall.
14 tools is well-scoped for a memory server covering CRUD, search, bulk operations, cache maintenance, sync status, and knowledge graph features. Each tool has a legitimate place and none feel redundant or purely decorative.
The memory lifecycle is fully covered: add, get, update, delete, search, list, import, and deduplicate. Cache and sync monitoring are included, and knowledge graph extraction/querying extends the surface nicely. Minor gaps exist (no explicit export tool or cache configuration tool), but these do not create dead ends for core workflows.
Maintenance
Related MCP Connectors
An MCP memory server. One memory your agents share — across models, devices and apps.
Cloud-hosted MCP server for durable AI memory
Persistent personal memory for AI assistants — save, search, and recall across every MCP client.
Person-owned AI memory that learns, not just stores — portable context for any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceOpen-source MCP server that gives any LLM long-term memory using a knowledge graph and vector search hybrid. It stores entities, observations, and relationships, enabling semantic recall across sessions with automatic clustering and fail-loud infrastructure.50MIT
- AlicenseNot gradedqualityCmaintenanceA lightweight MCP server that provides long-term memory for LLMs by storing and retrieving important facts, decisions, and preferences through smart semantic search and automatic organization.10MIT
- AlicenseNot gradedqualityBmaintenancePersistent memory MCP server for AI agents that stores, recalls, and searches conversation history, key-value context, and long-term entries across sessions with semantic search and FIFO queues.751-
- AlicenseAqualityDmaintenanceMCP server for persistent, semantic memory across AI sessions; store context, decisions, and learnings and recall them with natural language search.265MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/n3wth/r3'
If you have feedback or need assistance with the MCP directory API, please join our Discord server