Skip to main content
Glama
ihwooMil

Long-Term Memory

by ihwooMil

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.

CI PyPI Python License: MIT

Note: This package was previously published as mcp-memory-server. That package is deprecated — please use long-term-memory going 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?"

auto_search runs every turn, injecting relevant memories automatically

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 classificationmemory_save auto-classifies content category from patterns

  • Forgetting 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-memory

Or with uv:

uv pip install long-term-memory
pip 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 visualization

2. Setup client instructions

# For OpenClaw
aimemory-setup openclaw

# For Claude Code
aimemory-setup claude

This 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_db

You 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 automatically

All 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 home

4. 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-mcp

Or with live graph:

claude mcp add aimemory -- aimemory-mcp --with-live

Live 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-mcp

Open 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_search

Auto-retrieve relevant memories at turn start (multi-resolution context)

memory_save

Save a new memory with keywords, category, and relations

memory_search

Semantic similarity search

memory_update

Update content or keywords of an existing memory

memory_delete

Delete a memory (respects immutability)

memory_get_related

BFS graph traversal for related memories

memory_pin / memory_unpin

Protect memories from forgetting

memory_stats

Total count and category breakdown

memory_visualize

Generate interactive graph HTML

sleep_cycle_run

Trigger maintenance (extraction + consolidation + forgetting + checkpoint)

policy_status

RL policy state (epsilon, action distribution, updates)

policy_decide

Ask the RL policy for a SAVE/SKIP/RETRIEVE decision with reasoning


Configuration

All settings via environment variables:

Variable

Default

Description

AIMEMORY_DB_PATH

./memory_db

ChromaDB persistence directory (use absolute path to ensure all components share the same DB)

AIMEMORY_LANGUAGE

ko

Language for pattern matching (ko / en)

AIMEMORY_EMBEDDING_MODEL

intfloat/multilingual-e5-small

Sentence-transformer model

AIMEMORY_LOG_LEVEL

INFO

Logging level

AIMEMORY_ENHANCED_POLICY

0

Enable 778d enhanced RL policy (1 to enable)

AIMEMORY_GRAPH_RAG

0

Enable GraphRAG hybrid retrieval (1 to enable)

AIMEMORY_LIVE_HOST

127.0.0.1

Live graph server host (for event push)

AIMEMORY_LIVE_PORT

8765

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-memory

No 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 tools
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.

ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pinnedNo
contentYes
categoryNoauto
keywordsNo
immutableNo
related_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_statsA

Get statistics about the memory store: total count and category breakdown.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
contentNo
keywordsNo
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
output_pathNo
include_inactiveNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
turn_idNo
user_messageYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 13 tool updatesv0.1.0
    • First observedauto_search
    • First observedmemory_delete
    • First observedmemory_get_related
    • First observedmemory_pin
    • First observedmemory_save
    • First observedmemory_search
    • First observedmemory_stats
    • First observedmemory_unpin
    • First observedmemory_update
    • First observedmemory_visualize
    • First observedpolicy_decide
    • First observedpolicy_status
    • First observedsleep_cycle_run

TDQS

A3.7/5.0

Scored across 13 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Persistent semantic memory server for AI assistants via MCP, enabling long-term context retention and semantic search across conversations.
    11
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A MCP server that provides persistent memory for AI assistants, storing personal information, relationships, and observations to enable personalized and contextual conversations.
    4
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    A persistent memory server for AI agents using MCP protocol, enabling semantic storage and retrieval of dialogues, documents, and agent states.
    -