Skip to main content
Glama

🧠 Recall MCP β€” Long-term Memory for AI Agents

Your agent finally remembers what it did yesterday. Cross-session, persistent, semantic memory for any MCP-compatible agent (Claude Desktop, Cursor, Cline, Continue, …).

MCP Compatible License: MIT Python 3.10+ Zero Dependencies Stars


🎯 The Problem (worth 100,000+ GitHub stars)

Every time you start a new chat with Claude, Cursor, or any AI agent, it starts from zero. It doesn't remember:

  • The bug you fixed yesterday

  • The architecture decisions from last week

  • Your codebase conventions (tabs vs spaces, framework version, test runner)

  • Your preferences ("always use TypeScript", "never commit directly to main")

  • The project's gotchas ("the auth middleware is broken, bypass it for now")

This means:

  • πŸ” You repeat yourself β€” explain the same context every session

  • 🐌 Slower iteration β€” agent re-discovers what it already knew

  • πŸ“‰ Worse quality β€” no accumulated knowledge

  • πŸ’Έ Wasted tokens β€” re-reading the same files, re-asking the same questions

Related MCP server: Central Intelligence

✨ The Solution

Recall MCP gives your agent persistent, searchable memory across sessions.

# Yesterday, in chat session A:
agent.call("remember", content="User prefers tabs over spaces. Project uses Next.js 14 with App Router.")
agent.call("remember", content="Auth middleware has a known bug with session expiry; bypass for now.")

# Today, in chat session B (fresh context):
agent.call("recall", query="code style preferences")
# β†’ [{"content": "User prefers tabs over spaces. Project uses Next.js 14 with App Router.",
#     "score": 0.95, "tags": ["coding-style"], "project": "webapp", ...}]

agent.call("recall", query="known bugs auth")
# β†’ [{"content": "Auth middleware has a known bug with session expiry; bypass for now.",
#     "score": 0.87, ...}]

Why it's better than context-pruning approaches

Approach

When it works

When it fails

Context pruning (e.g. the other skill I shipped)

Compresses tool output within a session

Useless across sessions β€” the agent still forgets everything when you start a new chat

Recall MCP (this project)

Works across sessions β€” yesterday's context is searchable today

Doesn't help if your conversation is one-shot

They're complementary: use a pruner to fit more useful context in the current session, and use Recall so the next session doesn't have to start from scratch.

πŸš€ Quick Start

1. Install

Option A β€” pip (PyPI, recommended):

pip install recall-mcp
# After install, the `recall-mcp` command is available:
recall-mcp   # starts the MCP server on stdio

Option B β€” uvx (no install, run directly):

uvx recall-mcp

Option C β€” single-file (zero install):

curl -sSL https://github.com/eddyflores100-lang/recall-mcp/raw/main/mcp_recall.py \
  -o ~/.local/bin/recall-mcp
chmod +x ~/.local/bin/recall-mcp

No pip install step, no virtualenv, no API keys β€” just Python 3.10+ with stdlib.

2. Configure with your agent

If you installed via pip/uvx: use "command": "recall-mcp" with no args. If you used the single-file download: use "command": "python3" with "args": ["/path/to/mcp_recall.py"].

Claude Desktop β€” edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "recall": {
      "command": "recall-mcp"
    }
  }
}

Cursor β€” .cursor/mcp.json:

{
  "mcpServers": {
    "recall": {
      "command": "recall-mcp"
    }
  }
}

Cline / Continue / any MCP client β€” same pattern: set command to recall-mcp (post-install) or python3 with the script path (single-file mode).

3. Start using

Restart your agent and you'll see 8 new tools available. Try:

"Remember that I prefer functional React components over class components."

Then start a brand new chat:

"Recall what I told you about React conventions."

Your agent will pull the memory and continue where you left off.

πŸ› οΈ MCP Tools (8 total)

Tool

What it does

remember

Store a memory with optional tags / project / importance (0..1). Auto-deduplicates by content hash.

recall

Semantic-ish search via FTS5 BM25 + recency/importance/access-count boosting.

forget

Delete a memory by id or by FTS content match (deletes all matches).

list_memories

List with filters: project, tag, limit, order (recent / oldest / accessed / important).

summarize_session

Pass a list of chat messages β†’ automatically extracts memorable facts/preferences/decisions and stores them.

get_stats

Total count, per-project, per-source, per-tag breakdown, oldest, newest, most-accessed, avg importance, DB size.

export_memories

Dump memories as JSON (optionally per-project) β€” perfect for backups or transferring between machines.

import_memories

Load JSON back in. on_duplicate policy: skip / bump (increment access) / replace (overwrite metadata).

Tool call examples

// remember
{
  "content": "PostgreSQL connection string format: postgres://user:pass@host:5432/db",
  "tags": ["database", "postgres"],
  "project": "backend",
  "importance": 0.8
}

// recall
{
  "query": "how to connect to postgres",
  "limit": 5,
  "project": "backend",
  "min_importance": 0.3
}

// summarize_session (great for end-of-session snapshots)
{
  "messages": [
    {"role": "user", "content": "I always use pnpm, never npm."},
    {"role": "assistant", "content": "Noted. I'll use pnpm throughout."},
    {"role": "user", "content": "We decided to deploy on Vercel."}
  ],
  "project": "webapp"
}

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      stdio (JSON-RPC)      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  MCP client  β”‚ ◄────────────────────────► β”‚  mcp_recall.py    β”‚
β”‚ (Claude /    β”‚                              β”‚                  β”‚
β”‚  Cursor /    β”‚                              β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  Cline …)    β”‚                              β”‚  β”‚ MemoryStoreβ”‚  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                              β”‚  β”‚   - rememberβ”‚  β”‚
                                              β”‚  β”‚   - recall  β”‚  β”‚
                                              β”‚  β”‚   - forget  β”‚  β”‚
                                              β”‚  β”‚   - stats   β”‚  β”‚
                                              β”‚  β”‚   ...       β”‚  β”‚
                                              β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β”‚
                                              β”‚         β”‚        β”‚
                                              β”‚         β–Ό        β”‚
                                              β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
                                              β”‚  β”‚  SQLite    β”‚  β”‚
                                              β”‚  β”‚  + FTS5    β”‚  β”‚
                                              β”‚  β”‚ (local file)β”‚  β”‚
                                              β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                              Default path:
                                              ~/.recall/memory.db

Ranking formula (for recall results):

score = bm25_rank Γ— 1.0
      + recency_decay Γ— 0.5         (full weight 90d, then linear fade to 0.25)
      + importance Γ— 0.5           (user-set 0..1)
      + min(access_count Γ— 0.05, 0.5)

This means: a memory that matches the query, was recently stored, marked as important, and accessed often will rank highest. A 6-month-old low-importance memory won't completely vanish, but it won't crowd out fresher results either.

πŸ”’ Privacy & Security

  • 100% local β€” every byte lives in ~/.recall/memory.db on your machine.

  • Zero telemetry β€” no external API calls, no analytics, no phone-home.

  • Auto-redacts secrets before storage. Detected patterns include:

    • GitHub tokens (ghp_…, gho_…, ghs_…, fine-grained)

    • OpenAI keys (sk-…), Anthropic keys (sk-ant-…), Gemini (AIza…)

    • AWS access keys (AKIA…)

    • JWTs (eyJ…)

    • Stripe keys, Slack tokens, Bearer tokens, private keys

    • password=… assignments

    • Connection strings with embedded credentials (postgres://user:pass@…)

    • All replaced with [REDACTED] before being written to disk.

  • Per-project isolation β€” memories from project A don't bleed into project B's recall unless you ask for them.

  • Export anytime β€” export_memories gives you the full database as JSON. Your data is yours.

πŸ“Š Comparison

Feature

Recall MCP

mem0

LangChain Memory

Zep

Local-first (no cloud)

βœ…

❌

βœ…

❌

Zero external dependencies

βœ…

❌

❌

❌

MCP-native

βœ…

❌

❌

❌

Cross-session

βœ…

βœ…

❌ (per-conversation)

βœ…

Auto-summarize sessions

βœ…

❌

❌

βœ…

Smart decay (LRU + recency)

βœ…

❌

❌

❌

Secret redaction built-in

βœ…

❌

❌

❌

Export / import

βœ…

partial

❌

❌

Free (no paid plan)

βœ…

$

βœ…

$

Setup time

30 sec

10 min

5 min

10 min

βš™οΈ Configuration (env vars)

Var

Default

Description

RECALL_MCP_DB

~/.recall/memory.db

Path to SQLite DB file

RECALL_MAX_LENGTH

50000

Max chars per memory (truncates with notice)

RECALL_DECAY_DAYS

90

Days at full weight before decay starts

RECALL_MAX_RESULTS

50

Hard cap on recall and list_memories limits

RECALL_LOG_LEVEL

INFO

DEBUG / INFO / WARNING / ERROR (stderr only)

πŸ§ͺ Testing

# Option A β€” full pytest suite (43 tests across 4 files)
git clone https://github.com/eddyflores100-lang/recall-mcp.git
cd recall-mcp
pip install -e ".[dev]"
python -m pytest tests/ -v
# Expected: 43 passed

# Option B β€” single-file smoke test (no pytest needed, 14 tests)
python test_recall.py
# Expected: === 14 passed, 0 failed ===

CI: GitHub Actions runs the full suite on Python 3.10–3.13 across Ubuntu, macOS, and Windows on every push and PR.

The test suite covers:

  • Protocol (9 tests): initialize, ping, notifications/initialized, tools/list, invalid method, invalid tool, malformed JSON, resources/list, prompts/list

  • Memory CRUD (13 tests): remember, duplicate detection, empty/long content, importance clamping, recall with filters, forget by id/query, access count bumping

  • Secrets (11 tests): GitHub classic + fine-grained tokens, OpenAI, Anthropic, AWS, JWT, Stripe, connection strings, password assignments, private keys, on-disk verification

  • Session & Export (10 tests): summarize_session extraction + capping, get_stats, export/import round-trip, invalid input handling, list ordering, tag filters

πŸ—ΊοΈ Roadmap

  • Optional vector embeddings (with OPENAI_API_KEY or local sentence-transformers) for true semantic search beyond FTS5

  • Multi-agent memory sharing (memory namespaces)

  • Web UI for browsing / searching / editing memories

  • Backup to S3 / Dropbox / gists

  • MCP resources endpoint (expose memories as browsable resources)

  • Auto-tagging (extract dates, URLs, file paths from content)

  • CLI tool (recall search "query", recall add "text")

  • Plugin SDK for custom extractors in summarize_session

🀝 Why I built this

I ship MCP servers for a living (see also: context-pruner-mcp). After using agents for months, the single biggest quality boost came not from better models or bigger context windows β€” it came from giving the agent a way to not forget. Context pruning squeezes more juice out of the current session; long-term memory means the next session starts ahead instead of from zero.

If this saves you 10 minutes of re-explaining per session, that's roughly 40 hours a year for a daily user. Open source it so everyone gets those hours back.

πŸ“„ License

MIT β€” see LICENSE.

⭐ Star History

If this saved you time, please ⭐ the repo β€” it helps others discover it.


Author: Eddy Flores (eddyflores100-lang)

Issues / feature requests: GitHub Issues

Available Tools

8 tools
export_memoriesA

Export all memories (or one project) as a JSON dict.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does state the output type and the all-versus-one-project scoping, which is useful. However, it does not mention side effects, read-only nature, error behavior, or what happens when an invalid project is specified.

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, front-loaded sentence with no filler. Every word adds meaning: the action, the scope alternatives, and the output format are all present.

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?

For a simple export tool with one optional parameter and no output schema, the description covers the main behavior and output format. It remains incomplete regarding return value details, error conditions, and any limitations (e.g., large exports), which an agent would benefit from knowing.

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?

Schema coverage is 0%, so the description must clarify the 'project' parameter. It does: 'or one project' indicates that the parameter is optional and scopes the export to a single project. It does not explain what format the project value should take (name, id), but it adds meaning beyond the bare 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 a specific action ('Export') applied to a specific resource ('memories') and specifies the output format ('JSON dict'). It also clarifies the optional project scoping, distinguishing it from related tools like import_memories or list_memories.

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 guidance on when to choose this tool over siblings such as recall, list_memories, or import_memories. There is no mention of use cases, prerequisites, or scenarios where export is preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forgetA

Delete a memory by id or by content match (FTS query).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
queryNoFTS query; deletes all matches.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden. It does disclose that the tool deletes and that a query deletes all matches (via schema description). However, it omits important traits like irreversibility, permission requirements, or potential side effects on related data. For a destructive operation, this 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that leads with the core action. There is no redundant information, and it efficiently conveys the two invocation modes.

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 tool is simple (2 optional params, no output schema), but the description does not clarify interaction between id and query (e.g., exclusive or additive), nor does it mention return behavior. While not critical for a basic delete, the lack of such details leaves some ambiguity for an agent.

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?

Schema coverage is only 50% (query has a description, id does not). The description partially compensates by clarifying that id is an identifier and query is an FTS match, but it does not specify id format or FTS syntax. It adds meaning beyond the schema but not enough to fully bridge the coverage gap.

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 states a specific verb ('Delete'), a resource ('memory'), and two distinct methods (by id or by FTS content match). This clearly differentiates it from siblings like remember, recall, and list_memories, leaving no ambiguity about the tool's role.

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 provides no guidance on when to use this tool versus alternatives. While the destructive nature is implied by 'Delete', it does not explicitly state conditions like 'use when you want to permanently remove a memory' or warn against using it for reversible operations. Sibling tools exist for creation and retrieval, but no routing logic is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_statsB

Return aggregate stats: total, per-project, per-tag, oldest/newest, most-accessed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral transparency burden. The verb 'Return' weakly signals a read-only operation overshadowed by no param dependencies, but it does not disclose whether stats are scoped to all data, whether results are deterministic, or whether any side effects occur. Basic behavior is clear, but deeper transparency is limited.

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 front-loaded sentence: the verb and resource appear first, followed by a compact list of concrete stats. Every word adds value and there is no filler or repetition.

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 tool has no params and no output schema, so the description must clarify what the caller receives. It lists stat categories but not their exact structure, ordering, or labeling, leaving some ambiguity about the response shape and the overall scope of the stats.

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 input schema is empty and parameter count is zero, so the schema coverage is vacuously 100%. Per the baseline for a zero-parameter tool, no additional parameter semantics are needed; the description's aggregate dimensions are not tied to any args.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a clear verb and resource ('Return aggregate stats') and enumerates meaningful dimensions (total, per-project, per-tag, oldest/newest, most-accessed). It is distinguishable from sibling tools like list_memories, though it never explicitly names the memory domain, which is only implied by the sibling context.

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?

No guidance is given about when to choose get_stats over list_memories, summarize_session, or other siblings. The aggregation purpose is implicit, but there is no explicit scenario or exclusion to help an agent decide between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_memoriesA

Import memories from JSON. on_duplicate: skip | bump | replace.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesEither a JSON object {version, memories:[...]} or a JSON string.
on_duplicateNoskip

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries the full burden, and it does add the duplicate-handling behavior (skip/bump/replace), which is relevant context. It does not define what "bump" means, whether the import merges with existing memories or replaces the whole store, or what happens on invalid JSON.

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?

Two short sentences with no filler: the verb, resource, and source format are front-loaded, and the on_duplicate line is compact. Every phrase earns its place.

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 only two parameters and a reasonable schema, this is close to adequate, but the lack of annotations and output schema makes the missing details more costly. An agent still doesn't know whether the import is additive or destructive, what counts as a duplicate, or what the tool returns.

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 schema already describes the data parameter's shape, and the description only restates on_duplicate's allowed values without explaining their semantics, especially "bump." With 50% schema coverage, the description adds modest value but doesn't fully compensate for the missing parameter-level explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (import), resource (memories), and source format (JSON), and mentions the on_duplicate policy, which gives useful differentiation from related tools. It doesn't explicitly contrast with sibling tools like remember or export_memories, but the import-from-JSON framing makes the core purpose clear.

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 phrase "Import memories from JSON" implies this is the tool to use when you have memory data in JSON format to load, and the on_duplicate options give situational choices. However, there is no explicit statement of when to prefer this over remember or export_memories, nor any exclusionary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_memoriesC

List memories with optional filters and ordering.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo
limitNo
orderNorecent
projectNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, but it only restates that listing is possible. It does not mention read-only behavior, response format, filtering semantics, pagination, or ordering behavior beyond what the schema already shows.

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?

One tight sentence with the main action and capabilities front-loaded, and no filler. It is concise, though it could include more useful detail without becoming bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With four parameters, no output schema, no annotations, and no schema coverage, a one-sentence description is inadequate. An agent cannot determine how filters interact, what each ordering mode means, or how this tool relates to recall.

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?

Schema description coverage is 0%, so the description must compensate, but it only vaguely mentions 'filters and ordering' without identifying tag or project filters or clarifying the order enum values. It adds little meaning beyond the property names in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('list') and resource ('memories'), and signals optional filters and ordering. It is clear enough to be distinguished from siblings like remember and forget, though it does not explicitly contrast with recall.

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?

No guidance on when to use list_memories versus alternatives like recall or get_stats. The description implies a batch read operation but provides no exclusions, use cases, or conditions for choosing this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recallA

Semantic search across all stored memories. Use this at the start of a session to recover context from prior sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter by tags (any-match).
limitNo
queryYesNatural language query.
projectNoRestrict to a project.
min_importanceNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries a higher disclosure burden. It conveys that recall is a non-mutating semantic search across all memories, which is useful. However, it does not describe the result format, ordering, or the approximate nature of semantic matching.

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 sentences with no filler. The primary action and the suggested usage context are both front-loaded and every sentence earns its place.

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 main call path is clear for a search tool, but the lack of an output schema and any behavioral annotations means the agent must infer return shape and filtering semantics. It is adequate but not fully complete for confident invocation.

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 description adds no parameter-level meaning. It does not clarify how query, tags, project, limit, or min_importance interact, and schema coverage is only 60%, leaving limit and min_importance without descriptive text. The description needed to compensate for this gap but did not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Semantic search across all stored memories.' This clearly identifies the operation and differentiates it from sibling tools like remember or forget, though it does not name an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an actionable use case: 'Use this at the start of a session to recover context from prior sessions.' It provides clear context but does not explicitly state when not to use it or point to alternatives like list_memories or get_stats.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rememberA

Store a long-term memory. Use this whenever the user states a preference, decision, fact, or piece of context worth recalling in future sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoOptional tags for categorization.
sourceNoWho created the memory. Default: user.
contentYesThe memory text to store.
projectNoOptional project name to scope this memory.
importanceNo0..1 importance score. Default: 0.5.

TDQS

A4/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 behavioral burden. It does establish the key trait β€” durable, long-term persistence across sessions β€” which separates this from ephemeral context. However, it does not disclose side behaviors an agent would benefit from knowing before storing overlapping or repeated memories, such as deduplication policy, overwrite behavior for identical content, or any storage limits.

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?

Two sentences with zero filler. The core action is front-loaded ('Store a long-term memory') and the usage guidance follows immediately. Every word earns its place, giving the agent maximum signal per token.

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 store operation with a fully-documented 5-parameter schema and no output schema, the description plus schema gives an agent everything needed to call it correctly: what to store, when, and how to configure optional fields. The only gap is the absence of any note about what the operation returns or whether duplicates are handled, which is a minor omission given the simplicity of the 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?

Schema description coverage is 100%, so all five parameters (content, tags, source, project, importance) are already fully documented with defaults, ranges, and enums in the input schema. The description adds no param-level detail beyond the schema, but at full coverage the baseline 3 applies β€” the schema does the heavy lifting.

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 opens with a specific verb+resource pair ('Store a long-term memory') and immediately distinguishes this write operation from its sibling retrieval and management tools (recall, forget, list_memories) by stating the persistence goal β€” 'worth recalling in future sessions.' An agent can tell exactly what this tool does and what content belongs in it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence provides explicit triggering conditions β€” use it when the user states a preference, decision, fact, or piece of context worth recalling. This is clear, concrete context for when to invoke. However, it never names alternatives or states when not to use it (e.g., transient details that belong in session context rather than long-term memory), so it stops short of the explicit exclusions that would earn a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_sessionA

Auto-extract memorable facts/preferences/decisions from a list of conversation messages and store them as memories.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo
messagesYesList of {role, content} messages, or a JSON string.
max_memoriesNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the core mutation (storing memories) but does not mention side effects like duplication, overwriting, or the impact on existing memories. It also omits details about the max_memories limit and whether the operation is deterministic. The description is honest about the main action but lacks depth.

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, efficient sentence that front-loads the purpose with no unnecessary words. It is highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that extracts and stores memories from a message list, the description is too sparse. It does not explain the 'project' parameter, the 'max_memories' limit, or what the tool returns (e.g., whether it returns the created memories). An agent would need to inspect the schema further and make assumptions about side effects. The description is incomplete for reliable invocation.

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?

Schema description coverage is only 33% (only 'messages' has a description). The tool description adds nothing about 'project' or 'max_memories', leaving the agent without any guidance on how to set these parameters or what they control. The description fails to compensate for the low schema coverage.

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 states a specific action ('extract'), a specific resource ('conversation messages'), and a clear outcome ('store them as memories'). This clearly differentiates it from sibling tools like remember (direct storage) and recall (retrieval), making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: use this tool when you have a list of conversation messages and want to extract memories from them. However, it does not explicitly contrast with alternatives like remember or state when not to use it, though the context is clear enough for most agents.

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. 8 tool updatesv1.0.0
    • First observedexport_memories
    • First observedforget
    • First observedget_stats
    • First observedimport_memories
    • First observedlist_memories
    • First observedrecall
    • First observedremember
    • First observedsummarize_session

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a distinct purpose: remember stores, recall searches, forget deletes, list_memories enumerates, summarize_session derives memories from conversation, get_stats aggregates statistics, and export/import handle data transfer. No two tools overlap in their core function, making misselection unlikely.

Naming Consistency5/5

Tool names follow a consistent imperative verb pattern: either bare verbs (remember, recall, forget) or verb_noun pairs (list_memories, summarize_session, get_stats, export_memories, import_memories). The convention is uniform and predictable, with no mixed casing or inconsistent verb styles.

Tool Count5/5

Eight tools is a well-scoped set for a memory management server. Each tool addresses a core need (store, search, delete, list, auto-summarize, stats, export, import) without redundancy or bloat, fitting comfortably in the ideal 3–15 range.

Completeness5/5

The tool surface covers the full memory lifecycle: creating (remember, summarize_session, import_memories), reading (recall, list_memories, get_stats, export_memories), updating (import_memories with replace/bump), and deleting (forget). No critical operations are missing for managing persisted memories.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Provides AI agents with persistent long-term memory capabilities using semantic search. Enables storing, retrieving, and searching memories through three core tools integrated with Mem0 and vector storage.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides persistent, shared memory for AI agents by capturing conversations verbatim, distilling facts and summaries, and enabling retrieval through search, timeline, details, and explicit remember tools.
    MIT