Long-Term Memory
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., "@Long-Term Memorysave that my favorite color is blue"
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.
Long-Term Memory
Persistent, self-organizing memory for AI assistants.
Drop-in MCP server that gives Claude (and any MCP client) long-term memory — powered by semantic search, knowledge graphs, and reinforcement learning.
Note: This package was previously published as
mcp-memory-server. That package is deprecated — please uselong-term-memorygoing forward.
Why Long-Term Memory?
Current AI memory tools have two critical problems:
Problem | How we solve it |
Manual retrieval — you must ask "do you remember X?" |
|
Missed memories — AI decides what to save, so experiences/stories get lost | Every turn is auto-logged; sleep cycle extracts what the AI missed |
Token waste — entire memory dump inserted into context | Multi-resolution composer selects top-K memories within a token budget |
Related MCP server: my-memory-mcp
Key Features
RL-powered policy — Contextual bandit decides when to save, skip, or retrieve (not just keyword matching)
Semantic search — ChromaDB + multilingual sentence-transformer embeddings (
intfloat/multilingual-e5-small)Knowledge graph — Entity-relation graph (NetworkX) for multi-hop reasoning
GraphRAG hybrid retrieval — Vector similarity + graph traversal, fused and re-ranked by an RL re-ranker
Auto-linking — New memories automatically link to similar existing ones (similarity ≥ 0.92)
Multi-resolution text — Full text → summary → entity triples, composed within token budget
Automatic conversation logging — All turns recorded to SQLite; high-value turns instantly extracted to ChromaDB
Sentence-level splitting — Multi-sentence turns split into individual memories with independent categories
Sleep cycle memory extraction — Batch-processes missed memories from conversation logs using progressive RL extraction
Auto category classification —
memory_saveauto-classifies content category from patternsForgetting pipeline — Decay-based aging with consolidation, pinning, and immutable protection
Sleep cycle — Periodic maintenance: extraction, dedup, compress, forget, checkpoint
Live graph — Real-time WebSocket visualization of the memory graph
Multilingual — Korean and English pattern support out of the box
Quick Start (2 minutes)
1. Install
pip install long-term-memoryOr with uv:
uv pip install long-term-memorypip install long-term-memory[ko] # Korean NLP support
pip install long-term-memory[live] # Real-time graph visualization
pip install long-term-memory[viz] # Static graph visualization2. Setup client instructions
# For OpenClaw
aimemory-setup openclaw
# For Claude Code
aimemory-setup claudeThis injects memory usage instructions into your client's configuration files (SOUL.md/TOOLS.md for OpenClaw, CLAUDE.md for Claude Code). Re-run anytime to update.
By default, memories are stored in ./memory_db (resolved to an absolute path at install time). To use a custom location:
# OpenClaw — sets the DB path in the extension and mcporter config
aimemory-setup openclaw --db-path /path/to/my/memory_db
# Claude Code
aimemory-setup claude --db-path /path/to/my/memory_db
# Shell script (OpenClaw)
bash scripts/install_openclaw.sh --db-path /path/to/my/memory_dbYou can also set the AIMEMORY_DB_PATH environment variable, which all components respect:
export AIMEMORY_DB_PATH=/path/to/my/memory_db
aimemory-setup openclaw # picks up the env var automaticallyAll components (MCP server, live viewer, OpenClaw extension) will use the same absolute path, ensuring data consistency.
3. Connect to OpenClaw
mcporter config add aimemory --command aimemory-mcp --scope home4. Connect to Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"aimemory": {
"command": "aimemory-mcp"
}
}
}That's it. Claude now has persistent memory across all conversations.
{
"mcpServers": {
"aimemory": {
"command": "aimemory-mcp",
"args": ["--with-live"]
}
}
}Then open http://127.0.0.1:8765 to see the live memory graph.
{
"mcpServers": {
"aimemory": {
"command": "uv",
"args": ["run", "--project", "/path/to/long-term-memory", "aimemory-mcp", "--with-live"],
"env": {
"AIMEMORY_DB_PATH": "/path/to/memory_db"
}
}
}
}5. Connect to Claude Code
claude mcp add aimemory -- aimemory-mcpOr with live graph:
claude mcp add aimemory -- aimemory-mcp --with-liveLive Graph Visualization
Real-time WebSocket-based memory graph that updates as memories are saved, searched, or deleted.
# Option 1: auto-start with MCP server
aimemory-mcp --with-live
# Option 2: standalone server
aimemory-live --port 8765
# Option 3: standalone with custom DB path
aimemory-live --db-path /path/to/memory_db
# Option 4: via environment variable
AIMEMORY_LIVE=1 aimemory-mcpOpen http://127.0.0.1:8765 in a browser. Requires the [live] extra (pip install long-term-memory[live]). Features:
Force-directed graph layout with category-based coloring
New nodes glow green on save, blue on search
Event log sidebar with hover-to-highlight (hover a log entry to highlight related nodes)
Persistent event history across browser refreshes
Cross-process events — MCP server pushes events to the live graph via WebSocket
MCP Tools (13)
Tool | Description |
| Auto-retrieve relevant memories at turn start (multi-resolution context) |
| Save a new memory with keywords, category, and relations |
| Semantic similarity search |
| Update content or keywords of an existing memory |
| Delete a memory (respects immutability) |
| BFS graph traversal for related memories |
| Protect memories from forgetting |
| Total count and category breakdown |
| Generate interactive graph HTML |
| Trigger maintenance (extraction + consolidation + forgetting + checkpoint) |
| RL policy state (epsilon, action distribution, updates) |
| Ask the RL policy for a SAVE/SKIP/RETRIEVE decision with reasoning |
Configuration
All settings via environment variables:
Variable | Default | Description |
|
| ChromaDB persistence directory (use absolute path to ensure all components share the same DB) |
|
| Language for pattern matching ( |
|
| Sentence-transformer model |
|
| Logging level |
|
| Enable 778d enhanced RL policy ( |
|
| Enable GraphRAG hybrid retrieval ( |
|
| Live graph server host (for event push) |
|
| Live graph server port (for event push) |
Architecture
┌─────────────────────────────────────────────────┐
│ MCP Client │
│ (Claude Desktop / Claude Code / OpenClaw) │
└────────────────────┬────────────────────────────┘
│ stdio (JSON-RPC)
┌────────────────────▼────────────────────────────┐
│ FastMCP Server (13 tools) │
├──────────────────────────────────────────────────┤
│ MemoryBridge (orchestrator) │
├──────────┬──────────┬──────────┬─────────────────┤
│ RL Policy│ Retrieval│ Storage │ Maintenance │
│ │ │ │ │
│ Rule- │ ChromaDB │ Graph │ Sleep Cycle │
│ Based + │ vector + │ Memory │ (extraction, │
│ MLP │ Knowledge│ Store │ consolidation, │
│ Bandit │ Graph │ │ forgetting, │
│ │ (GraphRAG)│ │ checkpoints) │
│ Re-ranker│ │ SQLite │ │
│ (11d MLP)│ │ Conv Log │ Extraction RL │
└──────────┴──────────┴──────────┴─────────────────┘
↕ WebSocket (cross-process)
┌──────────────────────────────────────────────────┐
│ Live Graph Server (aimemory-live) │
│ vis.js force-directed graph + event log │
└──────────────────────────────────────────────────┘Development
# Clone and install dev dependencies
git clone https://github.com/ihwooMil/long-term-memory.git
cd long-term-memory
uv sync --extra dev
# Run tests (611+ tests)
uv run pytest tests/ -q
# Lint & format
uv run ruff check src/ tests/
uv run ruff format src/ tests/Migrating from mcp-memory-server
pip uninstall mcp-memory-server
pip install long-term-memoryNo code changes needed — the Python import name (aimemory) and CLI commands (aimemory-mcp, aimemory-viz, aimemory-live) remain the same.
License
MIT — see LICENSE for details.
Available Tools
13 toolsauto_searchA
Automatically retrieve and compose relevant memories for a user message.
Searches the memory store, selects the most relevant memories, and composes them into a context string within the token budget using multi-resolution levels (full text, summary, entity triple).
This tool should be called at the beginning of every conversation turn to inject relevant memory context.
Args: user_message: The user's current message to find relevant memories for. token_budget: Maximum tokens for the composed context (default: 1024). top_k: Number of memories to retrieve (default: 10, use higher values like 100 for memory review).
| Name | Required | Description | Default |
|---|---|---|---|
| top_k | No | ||
| token_budget | No | ||
| user_message | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that it searches, selects, and composes memories, but does not explicitly state whether it is read-only or if it has side effects. Since no annotations are provided, this lack of explicit side-effect disclosure leaves some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with the main purpose stated first, followed by a clear usage note. It is well-structured and free of unnecessary detail.
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 provides the core purpose and usage, but it does not specify the exact output format (beyond being a context string) or details about the multi-resolution levels. Given the tool's role in automatic injection, this is sufficient for basic use but lacks some detail for complex interactions.
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 only repeats the parameter names and defaults from the schema without providing additional semantics. For example, it doesn't explain the purpose of top_k or token_budget beyond their names, which is insufficient given the schema has no descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool automatically retrieves and composes relevant memories, which is a specific verb and resource. It distinguishes from sibling memory_search by mentioning the composition into a context string with token budget and multi-resolution levels, though it could be more explicit about the differentiation.
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 states when to use: at the beginning of every conversation turn to inject relevant memory context. However, it does not explicitly mention alternatives or when not to use, relying on the automatic nature to imply the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_deleteA
Delete a memory from the knowledge graph.
Cannot delete immutable memories. Automatically cleans up graph edges.
Args: memory_id: The ID of the memory to delete.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description takes on the full burden of disclosing behavior. It transparently states two important behaviors: the restriction on deleting immutable memories and the automatic cleanup of graph edges. This is more than a minimal disclosure, though it does not cover all possible edge cases like error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, well-structured, and front-loaded with the main purpose. The additional behavioral notes are presented as separate sentences, making it easy for an agent to quickly grasp the tool's function and constraints without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one parameter, clear action), the description is mostly complete. It covers the action, a key constraint, and a side effect. The presence of an output schema means return values need not be explained. It lacks only details on failure scenarios, which is a minor gap for a delete operation.
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 provides no description for the single parameter, so the tool description's explanation ('The ID of the memory to delete') is the only semantic guidance. However, this is essentially a restatement of the parameter name and lacks additional context such as format, origin, or validation rules, which limits its usefulness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete a memory') and the resource ('from the knowledge graph'), which unambiguously distinguishes it from sibling tools like memory_update or memory_save. The purpose is explicit and specific.
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 provide explicit guidance on when to use this tool over alternatives. It mentions a constraint ('Cannot delete immutable memories') but does not compare with other memory-related tools or describe ideal usage scenarios, leaving the agent to infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_pinA
Pin a memory to protect it from the forgetting pipeline.
Args: memory_id: The ID of the memory to pin.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 discloses the primary effect (protection from forgetting) but does not mention reversibility, permissions, or error cases; however for a simple pin operation this is sufficient 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 two short sentences, front-loaded with the action and purpose, and the parameter explanation is minimal and relevant.
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 simple – one required parameter. The description fully explains what the tool does and what the parameter means. Since an output schema is indicated as present, return values need not be described.
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 only specifies memory_id as a required string, but the description adds 'The ID of the memory to pin', giving clear meaning to the parameter and explaining what value to provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Pin a memory') and the purpose ('protect it from the forgetting pipeline'), differentiating it from the sibling memory_unpin which reverses this action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (protect a memory from forgetting) but does not explicitly contrast with alternatives like memory_unpin or mention conditions for use, leaving the guidance implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_saveA
Save a new memory to the knowledge graph.
Args: content: The memory content to save (Korean or English text). keywords: Optional list of keywords. Auto-extracted if not provided. category: Memory category. One of: fact, preference, experience, emotion, technical, core_principle. Defaults to "auto" which auto-classifies from content. related_ids: Optional list of memory IDs to link as related. immutable: If True, memory cannot be updated or deleted. pinned: If True, memory is protected from the forgetting pipeline.
| Name | Required | Description | Default |
|---|---|---|---|
| pinned | No | ||
| content | Yes | ||
| category | No | auto | |
| keywords | No | ||
| immutable | No | ||
| related_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose side effects, return values, error handling, or idempotency. It mentions auto-extraction and auto-classification of parameters but omits important behavioral details such as whether the operation can fail or what the success response looks like, especially given no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using a clear list format for parameters with no superfluous text. Each line is purposeful and directly explains a parameter or the core function, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers parameters well but omits any mention of the output schema or return value, which is necessary for an agent to know what to expect. It also lacks edge-case information, but given the tool's simplicity, the gaps are moderate rather than severe.
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 adds meaningful explanations for all six parameters, including the purpose of content, auto-extraction behavior for keywords, allowed categories, default of category, and semantics of immutable, pinned, and related_ids. This goes beyond the raw schema, which only lists types and defaults.
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: 'Save a new memory to the knowledge graph.' The verb 'save' and the object 'new memory' make the purpose unambiguous, and the distinction from update/delete tools is implied by the word 'new.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for new memories but does not explicitly contrast with alternatives like memory_update or memory_delete. It lacks explicit guidance on when to choose this tool over siblings, though the phrase 'new memory' provides some implicit direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_searchA
Search memories by semantic similarity.
Args: query: Search query text (Korean or English). top_k: Number of results to return (default: 5, max: 200). category: Optional category filter (fact/preference/experience/emotion/technical/core_principle).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| top_k | No | ||
| category | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The verb 'search' and the phrase 'by semantic similarity' clearly describe the core read-only behavior, and top_k indicates result count. It does not mention side effects, but the operation is naturally non-destructive and the description is sufficiently transparent for this 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 concise and well structured, with a short purpose line followed by a compact bullet list of parameters. No filler or redundant information is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose and all parameters, and the output schema is available, so an agent can invoke it correctly. It could optionally mention result ordering or no-result behavior, but these are not critical for basic 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?
All three parameters are explicitly explained: query text language, top_k default and maximum, and category as an optional filter with allowed values. This adds substantial semantic detail beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'search' and the resource 'memories', with semantic similarity as the matching method. It is unambiguous on its own, though it does not explicitly contrast with sibling tools like memory_get_related.
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 parameter notes provide useful usage hints such as query language, top_k default/max, and optional category values. However, it does not explicitly state when to prefer this tool over sibling tools like auto_search or memory_get_related; the intended use case is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_statsA
Get statistics about the memory store: total count and category breakdown.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 implies a read-only operation but does not explicitly state side effects, permissions, or lack thereof. For a simple stats getter, this is acceptable but not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that directly conveys the tool's purpose without unnecessary detail or repetition.
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 adequately specifies what statistics are provided (total count and category breakdown), which is sufficient for a simple stats tool. No additional context appears necessary.
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 is empty with 100% coverage, so the baseline is 3. There are no parameters to explain, and the description appropriately focuses on the output rather than 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 action ('Get statistics'), the resource ('memory store'), and the specific output (total count and category breakdown). It is distinct from sibling tools like memory_search or memory_visualize.
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 explicitly state when to use this tool versus alternatives, nor does it mention conditions or exclusions. It only describes what the tool does, leaving the agent to infer when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_unpinA
Remove pin protection from a memory, allowing it to be forgotten over time.
Args: memory_id: The ID of the memory to unpin.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 a key behavioral consequence: unpinning allows the memory to be forgotten over time. However, it does not mention reversibility, failure modes, or what happens after unpinning beyond the forgetting implication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, one sentence, with a clear argument list. No fluff or redundant wording; it is well-structured and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool, the description covers the essential action and consequence. It does not detail return values or error handling, but the output schema is not shown, so this is acceptable. The exclusion of low-level behaviors does not detract significantly from the completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains the parameter 'memory_id' as 'The ID of the memory to unpin,' providing clear meaning beyond the schema's minimal string type. This fully satisfies parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Remove pin protection from a memory, allowing it to be forgotten over time.' It distinguishes this from siblings like memory_pin (which adds protection) and memory_delete (which removes the memory entirely).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (unpinning a memory) but does not explicitly state when to use this tool versus alternatives (e.g., memory_pin or memory_delete). No direct comparisons or conditions are provided, leaving the user to infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_updateA
Update an existing memory's content and/or keywords.
Args: memory_id: The ID of the memory to update. content: New content text (optional, keeps existing if not provided). keywords: New keywords list (optional, keeps existing if not provided).
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | ||
| keywords | No | ||
| memory_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 discloses that content and keywords are optional and that omitted fields retain their existing values, which is useful. However, it does not mention what happens on invalid memory_id, whether changes are reversible, or any permission requirements. It is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose, followed by a simple args list. It avoids unnecessary prose and is easy to scan. The only minor issue is that the args list could be formatted more elegantly, but it is not bloated.
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 low complexity and the presence of an output schema, the description covers the essential behavior and parameters. However, it lacks guidance on when to choose this tool over memory_save or memory_delete, and does not address error cases. It is sufficient for a simple update but could be 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?
The schema has zero description coverage, so the description must compensate. It clearly explains each parameter: memory_id is the ID, content is new text, keywords is a list, and both optional fields preserve existing values when omitted. This adds meaning beyond the bare schema types and nullability.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (update), the resource (existing memory), and the specific fields (content and/or keywords). It distinguishes from siblings like memory_save (create) and memory_delete (remove) by focusing on modification of an existing item.
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 no explicit guidance on when to use this tool versus alternatives. It does not mention that it requires an existing memory_id or that creating new memories should use memory_save. The context is implied but not stated, leaving the agent to infer when this is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_visualizeB
Generate an interactive HTML visualization of the memory graph.
Creates a browser-viewable graph showing memory nodes, relationships, and knowledge graph entity triples. Requires the 'viz' extra to be installed.
Args: output_path: Optional output file path for the HTML. Defaults to data/visualizations/. include_inactive: If True, include inactive (forgotten) memories in the graph.
| Name | Required | Description | Default |
|---|---|---|---|
| output_path | No | ||
| include_inactive | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations provided, so the description carries the full burden of disclosing side effects. It mentions the 'viz' requirement but does not clarify whether the tool only reads memory or if it has any side effects, such as overwriting files or modifying the memory graph. The statement 'Creates a browser-viewable graph' implies file creation but lacks detail on behavior if the extra is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences. The main purpose is stated upfront, and supporting details (what the graph contains, the requirement for the 'viz' extra) are provided without redundancy or unnecessary wording.
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 provides a clear overview of the tool's output (an interactive HTML graph) but lacks details on the exact return value, how to locate the generated file, or any error handling (e.g., behavior if 'viz' is not installed). Given that an output schema is indicated, some of this is mitigated, but the description alone does not fully cover operational 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?
The input schema has zero description coverage for both parameters (output_path and include_inactive). The tool description adds no explanation of what these parameters control or their expected values, leaving the agent to infer their semantics from parameter names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the primary purpose: generating an interactive HTML visualization of the memory graph. It also specifies what the graph includes (memory nodes, relationships, knowledge graph entity triples), making the tool's function unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes the prerequisite that the 'viz' extra must be installed, which is a useful usage guideline. However, it does not explicitly contrast this tool with alternatives (e.g., when to choose visualization over memory_search or memory_stats), though the unique purpose is fairly self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
policy_decideA
Ask the RL policy to decide what memory action to take for a user message.
Returns the policy's decision (SAVE/SKIP/RETRIEVE) with reasoning. If SAVE: also returns the saved memory entry. If RETRIEVE: also returns retrieved memories.
Args: user_message: The user's message to evaluate. turn_id: Optional turn identifier.
| Name | Required | Description | Default |
|---|---|---|---|
| turn_id | No | ||
| user_message | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the decision output and conditional returns (SAVE/SKIP/RETRIEVE with reasoning, and saved/retrieved memories). However, it is ambiguous whether the tool actually saves or retrieves memory or simply returns the decision; the phrase 'also returns the saved memory entry' could imply side effects. Since no annotations are provided, the description carries the full burden of transparency and this ambiguity is a gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a clear first sentence stating the purpose. The return behavior is organized into conditional statements, making it easy to scan. No extraneous information is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's core purpose, inputs, and expected outputs. However, it leaves ambiguity about whether the tool has side effects (e.g., saving or retrieving memory) or purely returns a decision. Given the existence of sibling tools that perform actions, clarifying this would improve completeness. Overall, it is mostly complete for a decision-making tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully covers both parameters (user_message and turn_id), and the description provides minimal additional context: user_message is the message to evaluate and turn_id is an optional identifier. This meets the baseline for full schema coverage but does not add significant semantic depth beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: asking the RL policy to decide a memory action for a user message. It specifies the verb 'ask' and the resource 'RL policy', and the outcome is a decision (SAVE/SKIP/RETRIEVE). This distinguishes it from sibling tools like memory_save or memory_search which execute actions rather than decide them.
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 provide guidance on when to use this tool versus the sibling tools. It does not mention alternatives or conditions for selection, such as 'use when you need to decide before executing memory_save'. The 'when' context is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
policy_statusA
Get the current status of the memory policy (RL bandit model).
Returns epsilon (exploration rate), recent action distribution, and total update count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 states what the tool returns but does not mention side effects (e.g., read-only, no mutation) or any potential caveats like caching or latency. For a status tool, the read-only nature is generally assumed, but not explicitly stated.
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 and well-structured. It starts with the action ('Get'), states the object ('current status of the memory policy'), and then lists the return fields in a clear, bullet-free sentence. No unnecessary words or repetition.
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 that there is no output schema, the description adequately explains what the tool returns. It lists all three fields (epsilon, action distribution, update count) so a user knows what to expect. It does not dive into the meaning of these fields, but that is typically outside the scope of a tool description. Overall, it is complete for its purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is 100% by default. The baseline score of 3 applies, and the description appropriately avoids mentioning any parameters since none exist.
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: to get the current status of the memory policy. It also specifies the exact data returned (epsilon, action distribution, update count), making the tool's function unambiguous. It is distinct from sibling tools like policy_decide or memory_stats, so no confusion arises.
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 explicitly state when to use this tool versus alternatives. However, as a status getter, its usage context is somewhat implicit. It would benefit from a note such as 'Use this to monitor the policy state' or 'Compare with policy_decide for actions,' but its absence is not a major flaw.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sleep_cycle_runA
Run the memory sleep cycle.
Performs consolidation, resolution regeneration, forgetting, and checkpoint saving.
This performs periodic memory maintenance. Recommended to run periodically (e.g., daily or after many conversations).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears the full burden of disclosing effects. It lists the main actions including 'forgetting,' which implies potential data removal, but does not explicitly state whether the operation is destructive or reversible. It also mentions checkpoint saving without detailing recovery implications. Lacks a warning about permanent memory loss but is reasonably transparent for the listed actions.
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 clear but slightly redundant: it states 'Run the memory sleep cycle' and then 'This performs periodic memory maintenance' which repeats the same idea. Could be tightened but remains concise overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and an output schema that is not described, the description provides sufficient context: what the tool does, when to use it, and the key operations involved. It does not mention what the output contains, but the output schema exists separately and isn't required for understanding the tool's core behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the schema coverage is trivially 100%. The description doesn't need to explain any parameters, as none exist. The action is fully described without parameter dependencies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Run the memory sleep cycle' with a specific verb and resource. It enumerates specific actions (consolidation, resolution regeneration, forgetting, checkpoint saving) that distinguish it from other memory-related tools like memory_save or memory_update.
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 recommends when to run: 'Recommended to run periodically (e.g., daily or after many conversations).' This gives clear guidance on when to use the tool, distinguishing it from on-demand memory operations.
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.
13 tool updates
v0.1.0- First observed
auto_search - First observed
memory_delete - First observed
memory_get_related - First observed
memory_pin - First observed
memory_save - First observed
memory_search - First observed
memory_stats - First observed
memory_unpin - First observed
memory_update - First observed
memory_visualize - First observed
policy_decide - First observed
policy_status - First observed
sleep_cycle_run
TDQS
Scored across 13 tools
Most tools have distinct purposes, but memory_search and auto_search overlap in retrieval functionality; descriptions clarify the difference (direct search vs. automatic composition), preventing major confusion.
The majority use the memory_ prefix, but sleep_cycle_run, policy_status, policy_decide, and auto_search break the pattern. The naming is readable but not consistently structured.
13 tools is a reasonable size for a full-featured memory system, covering CRUD, search, pinning, stats, visualization, policy, and maintenance. Not excessive, though a few could potentially be consolidated.
The toolset covers core memory operations well, including save, update, delete, search, related memories, pin/unpin, stats, and visualization. A notable gap is lack of a direct get-memory-by-ID operation, but this is mitigated by search and related-memory retrieval.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
Persistent personal memory for AI assistants — save, search, and recall across every MCP client.
- EngramOAuthapp.getengram
Persistent, verbatim, searchable memory for AI assistants — one memory across every MCP client.
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenancePersistent semantic memory server for AI assistants via MCP, enabling long-term context retention and semantic search across conversations.11MIT
- FlicenseNot gradedqualityDmaintenanceA MCP server that provides persistent memory for AI assistants, storing personal information, relationships, and observations to enable personalized and contextual conversations.4-
- AlicenseNot gradedqualityCmaintenancePersistent memory infrastructure for AI agents, enabling cross-session recall and autonomous memory evolution via an MCP server.1MIT
- FlicenseNot gradedqualityBmaintenanceA persistent memory server for AI agents using MCP protocol, enabling semantic storage and retrieval of dialogues, documents, and agent states.-