Skip to main content
Glama
n24q02m

Mnemo - Persistent AI Memory

by n24q02m

Mnemo MCP Server

Renamed (2026-09-13): repo is now mnemo — CLI-first (mnemo command). PyPI package stays mnemo-mcp; MCP server remains a secondary surface.

mcp-name: io.github.n24q02m/mnemo

Persistent AI memory with hybrid search. Open, free, unlimited.

Mode CI codecov PyPI License: Apache-2.0 SafeSkill 91/100

Python SQLite MCP semantic-release Renovate

Project

Tagline

Tag

agent-chat-plugin

Peer AI agents chat in a shared folder — no human relay, no orchestrator, wor...

Tooling

better-code-review-graph

Knowledge graph for token-efficient code reviews -- semantic search and call-...

MCP

better-drive

2-way Google Drive sync with .driveignore filter — rclone engine, Windows tray

Tooling

better-email-mcp

IMAP/SMTP email for AI agents -- read, send, organize folders, and manage att...

MCP

better-godot-mcp

Composite MCP server for Godot Engine -- 17 composite tools for AI-assisted g...

MCP

better-notion-mcp

Markdown-first Notion for AI agents -- pages, databases, blocks, and comments...

MCP

better-semantic-release

Drop-in python-semantic-release fork with built-in release-safety guards (orp...

Tooling

better-telegram-mcp

Telegram for AI agents -- messages, chats, media, and contacts across both bo...

MCP

better-workspace-mcp

Google Workspace MCP server (Docs/Drive/Calendar/Gmail/Sheets/Slides/Tasks/Ch...

MCP

claude-plugins

Claude Code plugin marketplace for the n24q02m MCP servers -- install web sea...

Marketplace

imagine-mcp

Image and video understanding + generation for AI agents -- across Gemini, Op...

MCP

jules-task-archiver

Chrome Extension for bulk operations on Jules tasks via batchexecute API -- a...

Tooling

mcp-core

Shared foundation for building MCP servers -- Streamable HTTP transport, OAut...

MCP

mnemo

Persistent AI memory with hybrid search and embedded sync. Open, free, unlimi...

MCP

fastretrieval

Multi-model retrieval runtime for ONNX/GGUF embeddings and reranking

Library

skret

Secrets without the server.

CLI

tacet

A self-distilling neuro-symbolic cascade that amortises LLM cost across knowl...

Tooling

web-core

Shared web infrastructure package for search, scraping, HTTP security, and st...

Library

wet-mcp

Open-source MCP server for AI agents: web search, content extraction, and lib...

MCP

Table of contents

Related MCP server: Better Notion MCP

Roadmap (current = Phase 3 / v2.x)

Phase rows below describe the pre-de-host design history (v1.x / early v2): multi-provider LLM dispatch, GDrive/S3 passport sync, and Cloudflare deployment were removed in the 2026-09 de-host. Current architecture: one local SQLite store (WAL), per-task [models.*] provider cells (OpenRouter pre-wired default), no embedded sync (backup = rclone).

Phase

Version

Status

Highlights

Phase 1

v1.x

Shipped

Typed memory(action="capture") (6 context_types + dedup) -- RRF (k=60) hybrid fusion + cross-encoder rerank + temporal decay -- importance x recency archive policy + restore -- Alembic migrations -- multi-provider LLM dispatch (pre-de-host) -- plugin trinity (recall-context + memory-commit skills, SessionStart + opt-in PostToolUse hooks)

Phase 2

v1.x+1

Shipped, partially removed

LLM-driven compression of older memories (kept, now via [models.chat] cell) + Passport sync (encrypted import/export bundle; removed 2026-09)

Phase 3

v2.0.0

Shipped (BREAKING)

Temporal knowledge graph -- bitemporal valid_from / valid_to columns -- entity resolution via embedding KNN -- entity_search / entity_graph / history actions -- KG_AUTO_ENABLED opt-in auto-extract on capture

Features

  • Hybrid retrieval -- FTS5 + vector search (sqlite-vec), fused via Reciprocal Rank Fusion (k=60), then re-ranked via the [models.rerank] provider cell (OpenRouter pre-wired default) with the local Fastretrieval Qwen3 cross-encoder as fallback, plus temporal decay and importance boost

  • Typed capture -- memory(action="capture") with 6 context_types (conversation/fact/preference/skill/task/decision), embedding-based dedup, and optional [models.chat]-cell compression + importance scoring

  • Knowledge graph -- Automatic entity extraction and relation tracking; top results boosted by graph proximity

  • Importance scoring + archive policy -- LLM-scored 0.0-1.0 importance; soft-archive when recency_factor * (1 - importance) > 1.0; restore action available

  • Auto-archive trigger -- Background sweep every Nth capture (default 100) -- no cron required

  • STM-to-LTM consolidation -- LLM summarization of related memories in a category

  • Duplicate detection -- Warns before adding semantically similar memories

  • Zero config -- Fastretrieval's built-in local registry resolves Qwen3 ONNX embedding + reranking, no API keys needed. Optional cloud calls go through per-task [models.<task>] provider cells (OpenAI-spec; OpenRouter pre-wired default)

  • Local-first storage -- one SQLite file (WAL) under ~/.mnemo/; backup and cross-machine migration = rclone outside the server (no embedded sync)

  • Plugin trinity -- Ships /recall-context + /memory-commit skills and SessionStart + opt-in PostToolUse hooks (see docs/ARCHITECTURE.md)

  • Proactive memory -- Tool descriptions and skills guide AI to save preferences, decisions, facts at the right moment

  • LLM compression -- Per-turn compression through the [models.chat] provider cell targets ~3x token reduction at >=0.9 fact retention; graceful skip when the cell is unconfigured (see docs/compression.md)

  • Temporal knowledge graph -- Bitemporal columns (valid_from / valid_to / superseded_by) on every memory + entity-resolution dedup (embedding KNN at default 0.85 cosine threshold) + audit trail (memory_audit table with prev/new state hashes) + new actions (entity_search / entity_graph / history / as_of) + opt-in KG_AUTO_ENABLED auto-extract on capture. BREAKING for clients that called memory.get expecting historical-inclusive results: pass as_of for time-travel; default now filters to current-state (valid_to IS NULL).

Quick install

# Method 1: Claude Code plugin (skills + hooks; connects to a running
# mnemo HTTP instance -- start one per "Self-hosting" below)
/plugin marketplace add n24q02m/claude-plugins
/plugin install mnemo-mcp@n24q02m-plugins

# Method 2: run the HTTP server yourself and register the endpoint
uvx --from mnemo-mcp mnemo-mcp            # serves http://127.0.0.1:8000/mcp by default
claude mcp add --transport http mnemo http://127.0.0.1:8000/mcp

# Method 3 (remote): point a client at an existing HTTP deployment
claude mcp add --transport http mnemo https://<your-host>/mcp

Install matrix (the server speaks Streamable HTTP only — there is no stdio transport post-de-host; see the Setup page for full steps):

Client

Install

Claude Code (plugin)

/plugin marketplace add n24q02m/claude-plugins then /plugin install mnemo-mcp@n24q02m-plugins (requires a running instance; see Self-hosting)

Claude Code (HTTP)

start the server (uvx --from mnemo-mcp mnemo-mcp or docker compose), then claude mcp add --transport http mnemo http://127.0.0.1:8000/mcp

Codex / Gemini CLI / Cursor / Windsurf

start the server, then register the http://<host>:<port>/mcp HTTP endpoint in the client's MCP settings

Any MCP client

point it at the /mcp endpoint of a running instance (Streamable HTTP)

With auth = "token" or "multi" configured in mnemo-config/config.toml, send the token as a Bearer credential (--header "Authorization: Bearer <token>" or the client's equivalent).

Comparison vs. peers

Feature

mnemo

Mem0

Letta

OpenMemory

Hybrid retrieval (FTS + vec)

yes (FTS5 + RRF + sqlite-vec)

yes

partial

yes

Cross-encoder rerank

yes (Fastretrieval Qwen3 local + [models.rerank] cell)

partial (Cohere only)

no

no

Temporal decay scoring

yes (exp half-life)

no

no

no

Importance boost in rank

yes (LLM 0.0-1.0)

no

no

no

Soft-archive + restore policy

yes (importance x recency)

no

no

no

Self-hostable (single SQLite file)

yes (zero ext deps)

partial (cloud-first)

yes (Postgres)

yes (Postgres + Qdrant)

LLM dispatch

yes ([models.chat] cell, any OpenAI-spec endpoint)

partial

yes

partial

Plugin trinity (skills + hooks)

yes (recall-context + memory-commit)

n/a

n/a

n/a

Cross-machine migration

yes (rclone backup/restore outside the server)

yes (cloud)

n/a

n/a

LLM compression on capture

yes ([models.chat] cell, ~3x at >=0.90 retention)

no

no

no

Bitemporal valid_from / valid_to queries

yes (as_of time-travel)

no

partial (events only)

no

Entity resolution via embedding KNN

yes (cosine threshold tunable)

no

no

no

Audit trail with state hashes

yes (memory_audit table)

no

no

no

Status

2026-09 -- De-host update

The Cloudflare D1/Vectorize/KV deployment mode, embedded GDrive/S3 passport sync, multi-provider key dispatch (per-provider API-key env vars + model chains), and the stdio transport were removed. mnemo now runs one HTTP MCP endpoint on a local SQLite (WAL) store, and all cloud calls go through per-task [models.*] provider cells (OpenRouter pre-wired default). Backup across machines = rclone outside the server.

If you encountered issues with prior versions, update to the latest release and follow the current setup docs.

MCP registry note (2026-10): registry version 2.20.0 was published with a stdio PyPI package claim (uvx mnemo-mcp) that no longer reflects the product: post-de-host, mnemo speaks Streamable HTTP only — self-hosted, no public URL. Registry versions are immutable, so the stale stdio claim cannot be edited in place; the registry entry stays wrong until the owner de-lists it or republishes as 2.20.1. server.json in this repo now declares the package's true transport (streamable-http, default local endpoint), so the next publish carries correct metadata.

Related plugins from the same author:

All plugins share the same architecture -- install once, learn pattern transfers.

Documentation

Full docs at mcp.n24q02m.com/servers/mnemo-mcp/setup/:

  • Setup -- install methods for Claude Code, Codex, Gemini CLI, Cursor, Windsurf, mcp.json

  • Modes overview -- stdio / local-relay / remote-relay / remote-oauth

  • Multi-user setup -- per-JWT-sub credential model

Install with AI agent -- paste this to your AI coding agent:

Install MCP server mnemo-mcp following the steps at https://raw.githubusercontent.com/n24q02m/claude-plugins/main/plugins/mnemo-mcp/setup-with-agent.md

Smithery

mnemo-mcp was previously packaged for Smithery via a local stdio start command. Post-de-host the server is HTTP-only, so the local smithery.yaml was removed; publish a running instance's https://<host>/mcp endpoint to Smithery as a remote server instead.

Tools

13 MCP tools, 18 memory actions. The memory surface is exposed as 11 specialized single-purpose tools, the deprecated legacy memory dispatcher (same actions), and config:

Tool

Actions

Description

add_memory, search_memory, list_memories, update_memory, delete_memory, export_memories, import_memories, memory_stats, restore_memory, archived_memories, consolidate_memories

(one action each)

Specialized single-purpose memory tools -- the recommended surface

memory (legacy dispatcher, DEPRECATED -- use the granular tools above instead; will be removed in a future release)

add, capture, search, list, as_of, update, delete, export, import, stats, restore, archived, archive_now, consolidate, compress, entity_search, entity_graph, history

Core CRUD + typed capture (6 context_types) + hybrid search (RRF + rerank + temporal decay) + import/export + soft-archive + restore + on-demand archive sweep + LLM consolidation + LLM compression + temporal KG (entity search / graph / history / as_of)

config

status, set, warmup, backfill_embeddings

Server status, update runtime settings, pre-download embedding model, backfill missing embedding vectors

Plugin trinity (Claude Code marketplace install):

Component

Trigger

Purpose

mnemo:recall-context skill

session start, before significant decisions, "what do I know about X?"

Pulls cwd / topic-relevant memories with context_type filtering

mnemo:memory-commit skill

"remember this" / "save this" / "ghi nho" / "luu lai"

Typed manual capture with context_type decision tree

mnemo:knowledge-audit skill

periodic / "audit memory"

Find duplicates, contradictions, stale entries; consolidate

mnemo:session-handoff skill

end of session

Capture decisions / preferences / corrections / conventions / open questions

mnemo:temporal-query skill

"as of" / "back in" / "history of" / "what did I think then"

Point-in-time snapshots via action="as_of" and version-chain tracing via superseded_by

SessionStart hook

every session init

Non-blocking nudge to invoke recall-context

PostToolUse hook (opt-in)

CAPTURE_AUTO_ENABLED=true

Hint memory-commit after Write/Edit of CLAUDE.md / AGENTS.md / ARCHITECTURE.md / docs/*.md

MCP Resources

URI

Description

mnemo://stats

Database statistics and server status

MCP Prompts

Prompt

Parameters

Description

save_summary

summary

Generate prompt to save a conversation summary as memory

recall_context

topic

Generate prompt to recall relevant memories about a topic

Security

  • Graceful fallbacks -- cloud provider cells degrade to local ONNX; an unconfigured cell never silently selects a paid provider

  • Host-only credentials -- provider keys live in the host-owned config.toml or HULL_<TASK>_API_KEY env vars; end users never see them

  • Auth-gated HTTP -- auth = "no-auth" refuses non-loopback binds; token / multi require credential checks

  • Error sanitization -- No credentials in error messages

Build from Source

git clone https://github.com/n24q02m/mnemo.git
cd mnemo
uv sync
uv run mnemo-mcp

CLI

The package ships two distinct console scripts:

  • mnemo -- CLI-first memory surface (primary for scripts/agents; it never starts a server): capture, recall, reflect, fetch, and the standing-* family operate directly on a SQLite memory DB. mnemo-pilot is a legacy alias of the same entry point.

  • mnemo-mcp -- the MCP server plus one-shot operator subcommands. A bare invocation starts the HTTP server; a leading subcommand (config-init, warmup, token-hash, token-verify) runs an action and exits.

CLI-first memory surface (mnemo; every subcommand takes --db <path>, prints a JSON envelope, and exits with a taxonomy-mapped code):

uvx --from mnemo-mcp mnemo recall --db ./mem.db "package naming" --k 3   # try without a persistent install

mnemo capture --db ./mem.db "keep PyPI name mnemo-mcp; repo is mnemo" --tags decision --category decision
mnemo recall --db ./mem.db "release ladder" --k 5        # search a subject's memories
mnemo reflect --db ./mem.db "why keep the alias?" --k 5  # bounded cited reflect over retrieval
mnemo fetch --db ./mem.db <memory_id>                    # fetch one memory by id
mnemo standing-refresh --db ./mem.db onboarding "how do releases cut?" --k 5   # materialize a standing page
mnemo standing-read --db ./mem.db onboarding             # cheap read with staleness info

Server operator CLI (mnemo-mcp; a bare invocation starts the HTTP server):

mnemo-mcp                       # start the Streamable HTTP MCP server
                                # (bind host/port from config.toml or MNEMO_HOST/MNEMO_PORT)

mnemo-mcp config-init [--force] # write ~/.mnemo/config.toml from the template
mnemo-mcp warmup                # pre-download local embedding model / probe cells
mnemo-mcp token-hash            # print a scrypt$ hash for [server] token_hash
                                # (reads MNEMO_AUTH_TOKEN or prompts)
mnemo-mcp token-verify <token> <scrypt$...>   # verify a token against a hash

Subcommand

Purpose

config-init [--force]

Write the default instance config.toml (server auth + [models.*] provider cells)

warmup

Pre-download the Fastretrieval-managed local ONNX embedding model so first use works offline

token-hash

Mint a scrypt$ hash for [server] token_hash (shared-token auth)

token-verify

Verify a candidate token against a stored scrypt$ hash

Self-hosting (local HTTP instance)

Two ways to run the server for MCP clients on your machine.

Dev: start with uv (no-auth, loopback only)

uv run mnemo-mcp               # binds 127.0.0.1:8000, auth = "no-auth" by default

no-auth refuses non-loopback binds, so this is localhost-only by construction — fine for trying the server locally. The MCP endpoint is http://127.0.0.1:8000/mcp. For a real config, bootstrap one and edit it:

uv run mnemo-mcp config-init   # writes ~/.mnemo/config.toml from the template

Always-on: docker compose (token auth, loopback-published port)

docker-compose.http.yml is self-contained (builds the image, persists state in the mnemo-data volume) and publishes only on loopback:

cp mnemo-config/config.example.toml mnemo-config/config.toml   # then edit:
#   auth = "token"; set token_hash per the comments at the top of the example
docker compose -f docker-compose.http.yml up --build -d
# MCP endpoint: http://127.0.0.1:8771/mcp   (override the host port: MNEMO_PORT=9000 ...)

Token setup (also documented in the example config):

python -c "import secrets; print(secrets.token_urlsafe(32))"     # 1. mint token
MNEMO_AUTH_TOKEN=<token> uv run mnemo-mcp token-hash              # 2. print scrypt$ hash
# 3. paste the hash into token_hash in mnemo-config/config.toml; give clients the token

For auth = "multi" (per-user namespaces) also mount users.toml — see the commented line in docker-compose.http.yml.

CLI consumer (no server needed)

The mnemo surface talks straight to the memory DB — handy for scripts and agents:

mnemo capture --db ./mem.db "keep PyPI name mnemo-mcp; repo is mnemo" --tags decision --category decision
mnemo recall  --db ./mem.db "release ladder" --k 5
mnemo fetch   --db ./mem.db <memory_id>

Every subcommand prints a JSON envelope and takes --db <path>. See CLI for the full surface (reflect, standing-*, …).

Pointing an MCP client at the instance

Register the HTTP endpoint (Streamable HTTP transport):

  • Claude Code: claude mcp add --transport http mnemo http://127.0.0.1:8771/mcp

  • Any OpenAI-spec MCP client: server URL http://127.0.0.1:8771/mcp; with auth = "token" send the shared token as the Bearer credential.

Config: local vs cloud, per task

Each task cell in mnemo-config/config.toml ([models.embed], rerank, chat, jev_score) is independent: base_url + api_key + model, OpenAI-spec HTTP. Mix freely — e.g. cloud OpenRouter for chat while embed/rerank point at a local OpenAI-spec server, or all cloud. Keys are host-only (end users never see them) and may alternatively come from the HULL_<TASK>_API_KEY env vars.

Remote (HTTP mode)

mnemo speaks Streamable HTTP on a single /mcp endpoint — remote access is a self-hosted instance on a reachable host, fronted by whatever TLS proxy you choose (the server itself binds plain HTTP). Auth is configured in mnemo-config/config.toml under [server]: auth = "token" (one shared Bearer token) or auth = "multi" (per-user tokens + namespaces via users.toml). auth = "no-auth" refuses non-loopback binds.

Public OCI image publication is discontinued. Existing historical registry tags remain untouched; new container deployments build from source (docker build --target http) or use docker-compose.http.yml.

Trust Model

mnemo is TC-Local (machine-bound): every storage artifact lives under ~/.mnemo/ owned by your OS user, and provider keys are host-only config (config.toml / HULL_<TASK>_API_KEY), never visible to MCP clients.

[server] auth

Bind allowed

Storage

Who can read your data?

no-auth (default)

loopback only (non-loopback bind refused)

~/.mnemo/memories.db + config.toml

Only your OS user

token

any

same, one shared default namespace

Anyone holding the shared token

multi

any

per-namespace ~/.mnemo/subs/<ns>/memories.db (via users.toml)

Each token holder sees only their own namespace

License

Apache-2.0 -- See LICENSE.

Available Tools

15 tools
add_memoryA

Store NEW information. Use for preferences, decisions, facts.

ACTION GUIDE — when to use:

  • Use when saving new information for the first time. Example: content='User prefers dark mode', category='preference', tags=['ui']

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
contentYes
categoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already indicate non-read-only and non-destructive. The description adds that it stores new information, but does not detail side effects, limits, or whether it appends or overwrites. Moderate value added.

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, front-loaded with purpose, and includes a structured action guide. No unnecessary words.

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 create tool with 3 parameters and an existing output schema, the description covers when to use and gives an example. Could mention return value or limits, but overall adequate.

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%, but the description includes an example with content, category, and tags, giving semantic hints. However, it does not explain parameter types, requiredness, or constraints fully.

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 'Store NEW information' and provides examples (preferences, decisions, facts), distinguishing it from siblings like update_memory, delete_memory, and search_memory.

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 ACTION GUIDE explicitly says 'Use when saving new information for the first time' and gives an example. It could mention when not to use (e.g., for updates use update_memory), but it's still clear.

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

archived_memoriesB

List archived memories.

ACTION GUIDE — when to use:

  • Use to view memories that have been soft-deleted or automatically archived due to low importance/recency.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior1/5

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

The description states 'List archived memories', implying a read-only operation, but annotations set `readOnlyHint` to `false`, suggesting potential side effects. This contradiction is severe. The description provides no additional behavioral details (e.g., auth requirements, state changes) beyond the basic listing, so transparency is critically lacking.

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 extremely concise: two clear sentences with an explicit action guide. It is front-loaded and contains no unnecessary words or repetitions.

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 explains what 'archived' means and the intended use case, and an output schema exists. However, it lacks behavioral context (e.g., whether listing alters state) and does not mention related tools like `restore_memory`. This makes it adequate but not fully complete.

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 input schema has a single optional parameter `limit` with no description (0% schema coverage). The tool description does not mention this parameter or its purpose, failing to add meaning beyond the raw schema. Given the simplicity of the parameter, a score of 2 reflects the minimal 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 clearly states the verb 'List' and the resource 'archived memories'. It further differentiates from siblings like 'list_memories' by explaining that this tool shows soft-deleted or automatically archived memories, making the purpose specific and distinct.

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 includes an explicit 'ACTION GUIDE — when to use' section that specifies the context (soft-deleted or low-importance/recency memories). While it does not explicitly list when not to use or mention alternatives, the guidance is clear and sufficient for the intended scenario.

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

configA
Idempotent

Server config, sync, setup, and bounded vector backfill. Actions: status|sync|set|warmup|setup_sync|backfill_embeddings.

ACTION GUIDE — when to use each:

  • status: Show current configuration, setup status, and database stats.

  • sync: Trigger manual sync (requires sync_enabled=true + google_drive_client_id).

  • set: Update a setting. Requires 'key' and 'value'. Valid keys: 'sync_enabled' (true/false), 'sync_interval' (int), 'log_level' (str). Example: action='set', key='sync_enabled', value='true'

  • warmup: Pre-download embedding model (~570 MB) to avoid delays later.

  • backfill_embeddings: Embed active rows missing a current Vectorize ledger entry; optional batch_size is bounded to 100.

  • setup_sync: Authenticate Google Drive via Device Code OAuth flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNo
valueNo
actionYes
batch_sizeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already signal mutability and idempotency; the description adds substantial behavior: sync requires sync_enabled and google_drive_client_id, warmup downloads ~570 MB, backfill is bounded to 100, and setup_sync uses Device Code OAuth. No contradiction with annotations, and side effects are disclosed in useful detail.

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 compact, front-loaded with a summary, and uses a scannable bullet list. Every line adds a decision-relevant fact; no filler or repetition of schema fields.

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?

For a six-action polymorphic tool with zero schema descriptions, the description covers all actions, their prerequisites, parameters, valid keys, an example, and a safety-relevant bound. Outputs are not described, but an output schema exists, so the description is complete enough for correct invocation.

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?

Schema description coverage is 0%, so the description must carry parameter meaning. It enumerates all action values, documents key/value valid values with an example, and explains batch_size's bound. Minor ambiguity remains around how integer values are encoded in the string-typed value parameter, so it is not a perfect 5.

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 the domain ('Server config, sync, setup, and bounded vector backfill') and then enumerates every action. This clearly identifies the tool's operations and separates it from the memory-focused sibling tools; the only near-relative config__open_relay is excluded by the explicit action list.

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 ACTION GUIDE gives clear per-action context, including prerequisites for sync, valid keys for set, and scope for backfill. It does not explicitly name alternative tools or say 'use config__open_relay instead', so it lacks formal exclusion guidance, but the context is strong enough for an agent to choose correctly.

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

config__open_relayA

Get the relay configuration URL for mnemo-mcp, opening it in the user's browser when possible. Returns the relay URL, whether the browser launched, and the current status.

ParametersJSON Schema
NameRequiredDescriptionDefault
ctxYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It transparently reveals the browser-opening side effect, qualifies it with 'when possible', and lists the return contents. It does not detail failure modes or status semantics, but the core behavior is clearly disclosed.

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 front-loads the main purpose and then covers side effects and return values. Every clause earns its place with no repetition or filler.

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 presence of an output schema and the lack of meaningful user parameters, the description covers the action, side effect, and returned information sufficiently. A small gap is that it does not elaborate on what 'current status' means or what happens when the browser cannot be launched, but these are minor given the output schema.

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 only parameter is 'ctx', an injected Context object rather than a domain-specific parameter. The schema itself provides extensive documentation for Context, and the description does not need to explain it. Adding parameter detail would add little value, so the baseline for effectively no user-facing parameters is appropriate.

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 ('Get'), a specific resource ('the relay configuration URL for mnemo-mcp'), and an additional behavior ('opening it in the user's browser when possible'). This clearly differentiates it from the sibling tools such as the generic 'config' and all memory-related tools.

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: this tool is for retrieving the relay configuration URL and attempting to open it in the browser. It does not name alternatives or exclusions, but the intended use case is readily inferable and no misleading guidance is present.

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

consolidate_memoriesA

Summarize similar memories in a category (requires LLM API keys).

ACTION GUIDE — when to use:

  • Use when a category has too many redundant or closely related memories and needs cleanup. Example: category='preference'

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, indicating modification but not destruction. The description mentions the requirement for LLM API keys, which is helpful, but does not detail what happens to original memories (e.g., deletion or merging). There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is very concise: two sentences plus a short usage guide. It is front-loaded with the core purpose and contains no unnecessary words.

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 output schema exists, return values need not be explained. However, the description lacks details about process side effects (e.g., whether original memories are removed or just summarized) and error conditions, which are relevant for a modification tool.

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 only parameter 'category' has no description in the schema (0% coverage). The description provides an example usage but does not explain what values are valid or how the parameter is used beyond that.

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 uses specific verb 'Summarize' and resource 'memories in a category', clearly distinguishing from siblings like add_memory or delete_memory. The example further clarifies the purpose.

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 explicitly states when to use: when a category has too many redundant memories and needs cleanup. It gives a concrete example. However, it does not mention when not to use or compare with other tools.

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

delete_memoryA
Destructive

Remove a memory by ID.

ACTION GUIDE — when to use:

  • Use when a memory is completely outdated, incorrect, or explicitly requested to be forgotten. Example: memory_id='abc123'

ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already signal destructiveHint=true, so the description's 'Remove' is consistent. It adds no further behavioral details (e.g., irreversibility or side effects). Since annotations cover the destructive nature, a score of 3 is appropriate.

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 extremely concise: two short sentences plus an example. Every sentence serves a purpose with no redundancy.

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?

Given the tool's low complexity (single required parameter, destructive, with output schema available), the description covers purpose, usage context, and a concrete example. No essential information is missing.

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 only parameter, memory_id, has no schema description (0% coverage). The description provides a usage example (memory_id='abc123') but no semantic explanation beyond the parameter name. The name itself is clear, so marginal added value.

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 'Remove a memory by ID', clearly indicating the action (remove) and resource (memory). This directly distinguishes it from sibling tools like add_memory, update_memory, and 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 Guidelines4/5

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

The ACTION GUIDE explicitly advises use when a memory is outdated, incorrect, or to be forgotten. It includes an example. While it does not mention alternatives or when not to use it, it provides sufficient context for proper selection among sibling tools.

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

export_memoriesA

Export all memories as JSONL.

ACTION GUIDE — when to use:

  • Use when the user requests a backup or raw dump of their memory database.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, meaning the tool is not read-only nor destructive. The description adds that it exports all memories as JSONL, which implies a safe, non-destructive read-like operation. However, it does not disclose potential performance impacts or database locking behavior, which would be useful for low-latency scenarios.

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 very concise: two sentences, no extraneous information. The first sentence states the core functionality, and the second provides usage guidance. Information is front-loaded and each sentence earns its place.

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?

Given the tool has 0 parameters, an output schema, and annotations, the description is complete. It explains the output format (JSONL), the scope (all memories), and the use case (backup or raw dump). No additional information is necessary for an agent to correctly invoke this tool.

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 has 0 parameters with 100% schema coverage, so the description does not need to explain parameters. Baseline for 0 parameters is 4, and the description adds no extra parameter info, which is appropriate.

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 exports all memories as JSONL, specifying the verb, resource, and output format. It distinguishes from siblings like import_memories and list_memories by explicitly calling it an export for backup or raw dump.

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 includes an 'ACTION GUIDE' that explicitly states when to use: when the user requests a backup or raw dump. It does not explicitly state when not to use, but the context is clear, and the sibling tools cover other operations.

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

helpA
Read-onlyIdempotent

Full documentation for memory and config tools. topic: 'memory' | 'config'

ACTION GUIDE — when to use:

  • Use when you need detailed instructions on how to use specific server tools or features.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNomemory

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?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the description's claim of providing 'documentation' is consistent but adds no new behavioral insight beyond the structured data. The description does not disclose additional traits like response size or caching behavior.

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 extremely concise: one sentence plus a one-line action guide. It is front-loaded with the key purpose and provides a clear call-to-action, with no redundant or irrelevant content.

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 simplicity and the presence of annotations and an output schema (not shown), the description covers the basic usage context. However, it could be more complete by listing all supported topics or providing examples of what the documentation contains.

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%, yet the description only vaguely mentions 'topic: 'memory' | 'config'' without explaining the parameter's meaning, allowed values, or default behavior. This adds minimal value over the schema, leaving the agent unsure about possible or valid topics.

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 that the tool provides 'Full documentation for memory and config tools' and gives detailed instructions, which unambiguously defines its purpose as a help/reference tool. This distinguishes it from sibling tools like add_memory or config, which are the actual tools being documented.

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 action guide explicitly says 'Use when you need detailed instructions on how to use specific server tools or features,' providing clear context for when to invoke this tool. However, it does not explicitly state when not to use it or list alternatives, though the sibling tools themselves imply the alternative of directly using them.

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 JSONL data or a list of objects.

ACTION GUIDE — when to use:

  • Use when restoring from a backup or migrating data into the memory system. Example: data='[{"content": "example"}]', mode='merge'

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYes
modeNomerge

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/5

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

Annotations indicate it's not read-only and not destructive, but the description lacks details on behavioral traits such as whether the import overwrites existing data, what the 'merge' mode entails, or any error handling. It adds minimal value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is extremely concise: two sentences plus an action guide with an example. It is front-loaded with the main action and structured efficiently.

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 2 parameters and 0% schema coverage, the description provides a usage example but misses behavioral details like what the tool returns (despite an output schema existing) and how modes other than 'merge' behave. It is adequate but not thorough.

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?

With 0% schema description coverage, the description provides an example showing 'data' as a JSON string and 'mode' as 'merge', adding some meaning. However, it doesn't explain other possible values for 'mode' or the format of the data array, so the compensation is partial.

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 'Import memories from JSONL data or a list of objects', specifying the verb 'import' and the resource 'memories', which distinguishes it from siblings like 'add_memory' or 'export_memories'.

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 includes an explicit 'ACTION GUIDE — when to use' section: 'Use when restoring from a backup or migrating data into the memory system', providing clear context for usage. It does not mention when not to use, but the guidance is strong.

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

list_memoriesA
Read-only

Browse all memories, optionally filtered by category.

ACTION GUIDE — when to use:

  • Use when you want to view a broad set of memories, or see what's in a specific category. Example: category='preference', limit=10

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
categoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds filter behavior but does not disclose pagination, ordering, or other operational details.

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 the purpose in the first sentence and an example. Every sentence adds value, no redundancy.

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?

With an output schema present and good annotations, the description covers key aspects. Missing ordering or default behavior, but adequate for a simple list 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 0%, so the description must compensate. It explains 'category' and 'limit' through example but does not detail valid values or constraints.

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 clearly states the tool browses memories with optional category filtering. It implies a broad listing, distinguishing it from siblings like search_memory, but does not explicitly name alternatives.

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 ACTION GUIDE explicitly advises when to use: for broad views or category-specific listings, with an example. It lacks exclusionary guidance (when not to use) but provides clear context.

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

memoryA
Destructive

[DEPRECATED — use the granular tools (add_memory, search_memory, ...) instead; this composite tool will be removed in a future release]

Legacy dispatcher for backward compatibility. Use specialized tools (add_memory, search_memory, etc.) instead.

Persistent memory store. Actions: add|search|list|update|delete|export|import|stats|restore|archived|consolidate.

ACTION GUIDE — when to use each:

  • add: Store NEW information. Requires 'content'. Use when saving preferences, decisions, facts for the first time. Example: action='add', content='User prefers dark mode', category='preference', tags=['ui']

  • search: Find existing memories by natural language query. Requires 'query'. Use BEFORE add to avoid duplicates. Example: action='search', query='dark mode preference'

  • update: Modify an EXISTING memory by ID. Requires 'memory_id' (from search/list results). Use when a fact changes. Example: action='update', memory_id='abc123', content='User now prefers light mode'

  • list: Browse all memories, optionally filtered by category. No query needed.

  • delete: Remove a memory by ID. Requires 'memory_id'.

  • stats: Show database statistics (total memories, categories, embedding status).

  • export: Export all memories to JSONL format.

  • import: Import memories from JSONL data. Requires 'data'.

  • archived: List archived memories. Optionally filter by limit.

  • restore: Restore an archived memory by ID. Requires 'memory_id'.

  • consolidate: Summarize and consolidate similar memories in a category using LLM. Requires 'category'.

WORKFLOW: search -> not found? -> add. Found outdated? -> update (with memory_id from results). PROACTIVE: save user preferences, decisions, corrections, project conventions.

ParametersJSON Schema
NameRequiredDescriptionDefault
autoNo
dataNo
modeNomerge
nameNo
tagsNo
textNo
as_ofNo
depthNo
limitNo
queryNo
sinceNo
untilNo
actionYes
sourceNo
contentNo
categoryNo
entity_idNo
memory_idNo
importanceNo
context_typeNoconversation
min_importanceNo
include_archivedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already set destructiveHint=true, but the description adds rich behavioral context: requirements per action (e.g., 'Requires content' for add), side effects (archived, restore), and the fact that it is a persistent store. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

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

The description is structured with sections (deprecation notice, action guide, workflow) and front-loaded with the deprecation warning. However, it is verbose and contains some repetition (e.g., 'Use specialized tools ... instead' appears twice). Could be more concise while retaining all information.

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 tool's complexity (22 params, many actions, deprecation) and the presence of an output schema (so return values need not be described), the description covers the primary use cases well. It also explains the deprecation context and recommends granular alternatives. Missing details on less common parameters slightly reduce completeness.

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 0%, so the description must compensate. The action guide explains key parameters for main actions (e.g., action, content, memory_id, query, category), but 22 total parameters exist, and many optional ones (auto, mode, as_of, depth, etc.) are not explained. The description adds value for the most common parameters but is incomplete.

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 it is a legacy dispatcher for backward compatibility and lists all supported actions. It distinguishes itself from siblings by explicitly naming granular tools (e.g., add_memory, search_memory) and advising their use instead.

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?

The description provides an explicit 'ACTION GUIDE' detailing when to use each action (e.g., 'Use BEFORE add to avoid duplicates' for search) and includes a workflow (search -> not found? -> add). It also directs users to use specialized tools instead of this composite one.

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

memory_statsA
Read-only

Show database statistics (total memories, categories, embedding status).

ACTION GUIDE — when to use:

  • Use when you need to understand the scale or health of the memory database, or check if embeddings are enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false, so the description adds value by specifying the exact statistics shown. It does not contradict annotations and provides useful behavioral context beyond the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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

The description is concise: two sentences plus a header. It front-loads the action and then provides usage conditions. No wasted words.

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?

Given the tool's simplicity (0 parameters, read-only, output schema exists), the description is complete. It explains the tool's function and when to use it, and the output schema covers return values.

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 has zero parameters, so schema description coverage is 100% by default. The description logically adds no parameter information, which is appropriate. Baseline 4 for no 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 tool's purpose: 'Show database statistics (total memories, categories, embedding status).' It uses specific verbs and resources, and it distinguishes from siblings like list_memories which returns individual records.

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 includes an explicit usage guide: 'Use when you need to understand the scale or health of the memory database, or check if embeddings are enabled.' This provides clear context, though it does not mention when NOT to use the tool or alternatives.

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

restore_memoryA

Restore an archived memory by ID.

ACTION GUIDE — when to use:

  • Use to bring a previously archived memory back into the active search pool. Example: memory_id='abc123'

ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations indicate non-read-only and non-destructive. Description adds that it restores to 'active search pool' but lacks details on idempotency, error behavior, or preconditions. Adds some value beyond annotations.

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?

Short, uses bullet list for guidance. No redundant sentences. Could be slightly more front-loaded but efficient 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?

Output schema exists so return values not needed. Covers basic purpose and usage. Missing details like preconditions or error cases, but for a simple restore operation it is fairly complete.

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?

Single parameter 'memory_id' has 0% schema coverage. Description only gives an example value but does not explain format or constraints. Minimal addition over 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?

Description clearly states verb 'restore' with resource 'archived memory' and method 'by ID'. Distinguishes from sibling tools like add_memory, delete_memory, etc.

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?

Explicitly says when to use ('bring a previously archived memory back into the active search pool') and provides an example. Missing explicit when-not-to-use or alternatives, but context is clear.

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

search_memoryA
Read-only

Find existing memories by natural language query. Always search before adding.

ACTION GUIDE — when to use:

  • Use BEFORE adding new information to avoid duplicates. Example: query='dark mode preference'

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
limitNo
queryYes
categoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. Description adds that it uses natural language query and is for pre-addition search, but doesn't detail other behavioral aspects.

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, front-loaded with purpose and usage guidance, no wasted words. Every part earns its place.

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 4 parameters and 0% schema description coverage, the description does not address parameter details or output structure (though output schema exists). Lacks completeness for a search tool with multiple optional fields.

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%, and the description does not explain any parameters (e.g., tags, limit, category format). The only reference is to 'query' implicitly. Fails to compensate for minimal schema documentation.

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?

Description clearly states 'Find existing memories by natural language query', specifying verb and resource. It distinguishes itself from siblings like add_memory by emphasizing search before adding.

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?

Explicitly instructs to use 'BEFORE adding new information to avoid duplicates', with an example. Does not explicitly name alternatives but provides clear contextual guidance.

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

update_memoryA

Modify an EXISTING memory by ID. Get memory_id from search results.

ACTION GUIDE — when to use:

  • Use when an existing fact or preference changes. Example: memory_id='abc123', content='User now prefers light mode'

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
sourceNo
contentNo
categoryNo
memory_idYes
importanceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false (write) and destructiveHint=false (not destructive). The description adds that it modifies an existing memory and requires memory_id, providing useful behavioral context beyond 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, front-loaded, and includes a structured 'ACTION GUIDE' section. Every sentence is necessary and adds value without redundancy.

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?

Despite having an output schema and good guidance on when to use, the description lacks detail on the meaning of optional parameters. For a tool with 6 parameters and 0% schema coverage, this leaves gaps for the agent.

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%, but the description only mentions memory_id and content in the example, ignoring other parameters (tags, source, category, importance). It adds minimal meaning beyond the schema structure.

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 it modifies an existing memory by ID, distinguishing it from add_memory (create) and delete_memory. It provides an example and specifies that memory_id should come from search results.

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?

Explicitly states 'Use when an existing fact or preference changes' and instructs to get memory_id from search results, giving clear context for when to use this tool over alternatives.

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. 1 tool updatev2.8.0
    • Changedconfig1 field changed
      • addedInput schema / properties / batch_size
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Batch Size"
        +}
  2. 14 tool updatesv2.6.0
    • Changedadd_memory4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"add_memoryOutput"New value: +"add_memoryDictOutput"
    • Changedarchived_memories4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"archived_memoriesOutput"New value: +"archived_memoriesDictOutput"
    • Changedconfig4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"configOutput"New value: +"configDictOutput"
    • Changedconfig__open_relay3 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "Context": {
        +    "description": "Context object providing access to MCP capabilities.\n\nThis provides a cleaner interface to MCP's RequestContext functionality.\nIt gets injected into tool and resource functions that request it via type hints.\n\nTo use context in a tool function, add a parameter with the Context type annotation:\n\n```python\n@server.tool\nasync def my_tool(x: int, ctx: Context) -> str:\n    # Log messages to the client\n    await ctx.info(f\"Processing {x}\")\n    await ctx.debug(\"Debug info\")\n    await ctx.warning(\"Warning message\")\n    await ctx.error(\"Error message\")\n\n    # Report progress\n    await ctx.report_progress(50, 100, \"Processing\")\n\n    # Access resources\n    data = await ctx.read_resource(\"resource://data\")\n\n    # Get request info\n    request_id = ctx.request_id\n    client_id = ctx.client_id\n\n    # Manage state across the session (persists across requests)\n    await ctx.set_state(\"key\", \"value\")\n    value = await ctx.get_state(\"key\")\n\n    # Store non-serializable values for the current request only\n    await ctx.set_state(\"client\", http_client, serializable=False)\n\n    return str(x)\n```\n\nState Management:\nContext provides session-scoped state that persists across requests within\nthe same MCP session. State is automatically keyed by session, ensuring\nisolation between different clients.\n\nState set during `on_initialize` middleware will persist to subsequent tool\ncalls when using the same session object (STDIO, SSE, single-server HTTP).\nFor distributed/serverless HTTP deployments where different machines handle\nthe init and tool calls, state is isolated by the mcp-session-id header.\n\nThe context parameter name can be anything as long as it's annotated with Context.\nThe context is optional - tools that don't need it can omit the parameter.",
        +    "properties": {
        +      "_STATE_TTL_SECONDS": {
        +        "default": 86400,
        +        "title": "State Ttl Seconds",
        +        "type": "integer"
        +      }
        +    },
        +    "title": "Context",
        +    "type": "object"
        +  }
        +}
      • addedInput schema / properties / ctx
        Added value: +{
        +  "$ref": "#/$defs/Context"
        +}
      • addedInput schema / required
        Added value: +[
        +  "ctx"
        +]
    • Changedconsolidate_memories4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"consolidate_memoriesOutput"New value: +"consolidate_memoriesDictOutput"
    • Changeddelete_memory4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"delete_memoryOutput"New value: +"delete_memoryDictOutput"
    • Changedexport_memories4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"export_memoriesOutput"New value: +"export_memoriesDictOutput"
    • Changedimport_memories4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"import_memoriesOutput"New value: +"import_memoriesDictOutput"
    • Changedlist_memories4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"list_memoriesOutput"New value: +"list_memoriesDictOutput"
    • Changedmemory4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"memoryOutput"New value: +"memoryDictOutput"
    • Changedmemory_stats4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"memory_statsOutput"New value: +"memory_statsDictOutput"
    • Changedrestore_memory4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"restore_memoryOutput"New value: +"restore_memoryDictOutput"
    • Changedsearch_memory4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"search_memoryOutput"New value: +"search_memoryDictOutput"
    • Changedupdate_memory4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"update_memoryOutput"New value: +"update_memoryDictOutput"

TDQS

A3.7/5.0

Scored across 15 tools

Disambiguation3/5

Most granular memory tools are clearly distinct, but the deprecated 'memory' composite tool overlaps with nearly all of them, and 'config' status overlaps with 'memory_stats' by also reporting database statistics. The detailed action guides help, but the presence of overlapping dispatchers creates avoidable ambiguity.

Naming Consistency3/5

The core tools mostly follow a verb_noun pattern (add_memory, search_memory, update_memory), but 'archived_memories', 'memory_stats', 'config', 'memory', and 'config__open_relay' break the pattern. The naming is readable and all snake_case, but the mix of bare nouns, noun_noun, and a double-underscore tool prevents it from being highly consistent.

Tool Count4/5

At 15 tools, the server is at the upper bound of a well-scoped set, and the deprecated 'memory' tool plus the composite 'config' dispatcher make it feel slightly heavier than necessary. Excluding deprecated/helper tools, the remaining surface is reasonable for a persistent memory system with configuration and sync features.

Completeness4/5

The memory lifecycle is well covered: add, search, list, update, delete, archive listing, restore, import, export, stats, and consolidation are all present. Minor gaps exist, such as no direct get-by-ID tool and no explicit user-facing archive action beyond soft-delete/automatic archiving, but these are workable through existing tools.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Provides persistent local memory functionality for AI assistants, enabling them to store, retrieve, and search contextual information across conversations with SQLite-based full-text search. All data stays private on your machine while dramatically improving context retention and personalized assistance.
    3
    -