Skip to main content
Glama
n24q02m

Mnemo - Persistent AI Memory

by n24q02m

Mnemo MCP Server

mcp-name: io.github.n24q02m/mnemo-mcp

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

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

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

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 -- plugin trinity (recall-context + memory-commit skills, SessionStart + opt-in PostToolUse hooks)

Phase 2

v1.x+1

Shipped

LLM-driven compression of older memories + Passport sync (encrypted import/export bundle for cross-machine bootstrap) -- AES-256-GCM + Argon2id, S3 / R2 / B2 / MinIO + GDrive backends, delta-sync with LWW per row

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-aware passport bundle sections -- KG_AUTO_ENABLED opt-in auto-extract on capture

Features

  • Hybrid retrieval -- FTS5 + vector search (sqlite-vec locally, Vectorize on Cloudflare), fused via Reciprocal Rank Fusion (k=60), then re-ranked by a configurable rerank chain (RERANK_MODELS, order = litellm fallback; empty -> Fastretrieval's local Qwen3 reranker) with temporal decay and importance boost

  • Typed capture -- memory(action="capture") with 6 context_types (conversation/fact/preference/skill/task/decision), embedding-based dedup, and a configurable LLM chain (LLM_MODELS, order = litellm fallback)

  • 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 providers (Jina AI, Gemini, OpenAI, Cohere)

  • Multi-machine sync -- JSONL-based merge sync via Google Drive (bundled Desktop OAuth public client)

  • 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 via the multi-provider dispatcher targets ~3x token reduction at >=0.9 fact retention; graceful skip when no provider configured (see docs/compression.md)

  • Encrypted passport sync -- AES-256-GCM bundles + Argon2id KDF, S3 (R2 / B2 / MinIO) and Google Drive backends, delta-sync with last-write-wins per row (see docs/passport.md). Bootstrap via the passport-bootstrap skill.

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

Comparison vs. peers

Feature

mnemo-mcp

Mem0

Letta

OpenMemory

Hybrid retrieval (FTS + vec)

yes (FTS5 + RRF; sqlite-vec local / Vectorize on Cloudflare)

yes

partial

yes

Cross-encoder rerank chain

yes (Fastretrieval Qwen3 local + Jina + Cohere)

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)

Multi-provider LLM dispatch

yes (LLM_MODELS chain, any litellm provider)

partial

yes

partial

Plugin trinity (skills + hooks)

yes (recall-context + memory-commit)

n/a

n/a

n/a

Multi-machine sync

yes (GDrive bundled OAuth)

yes (cloud)

n/a

n/a

E2E-encrypted passport sync

yes (AES-256-GCM + Argon2id, S3 + GDrive)

no

no

no

LLM compression on capture

yes (multi-provider, ~3x at >=0.90 retention)

no

no

no

Backend-pluggable sync architecture

yes (S3 / R2 / B2 / MinIO + GDrive)

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-05-02 -- Architecture stabilization update

Past months saw significant churn around credential handling and the daemon-bridge auto-spawn pattern. This caused multi-process races, browser tab spam, and inconsistent setup UX across plugins. The architecture is now stable: 2 clean modes (stdio + HTTP), no daemon-bridge layer, no auto-spawn from stdio.

Apologies for the instability period. If you encountered issues with prior versions, please update to the latest release and follow the current setup docs -- most prior workarounds are no longer needed.

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 is packaged for Smithery -- install or run it straight from the registry. It starts over stdio via uvx mnemo-mcp with no configuration required to launch; credentials are configured at runtime through the server's own config flow (see Documentation). The published start command lives in smithery.yaml.

Tools

15 MCP tools, 17 memory actions. The memory surface is exposed both as 11 specialized single-purpose tools and a deprecated legacy memory dispatcher (same actions), plus config, help, and config__open_relay:

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

config

status, sync, set, warmup, setup_sync, setup_status, setup_start, setup_skip, setup_reset, setup_complete, setup_relay, sync_now, export_passport, import_passport

Server status, trigger sync, update settings, pre-download embedding model, authenticate sync provider, manage HTTP setup form lifecycle, passport export/import

help

topic="memory" or topic="config"

Full documentation for any tool

config__open_relay

(HTTP relay mode)

Open the zero-config relay setup form (registered via mcp-core)

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 → Local embedding, no cross-mode fallback

  • Sync token security -- OAuth tokens stored at ~/.mnemo-mcp/tokens/ with 600 permissions

  • Input validation -- Sync provider, folder, remote validated against allowlists

  • Error sanitization -- No credentials in error messages

Build from Source

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

CLI

The mnemo-mcp console script both starts the server and exposes a few one-shot operator subcommands. A bare invocation (or any ---prefixed flag) starts the server; a leading subcommand runs an action and exits.

mnemo-mcp                       # start the stdio server (default transport)
mnemo-mcp --http                # start the Streamable HTTP server
                                # (also via MCP_TRANSPORT=http or TRANSPORT_MODE=http)

mnemo-mcp auth google           # authorize Google Drive sync via OAuth
mnemo-mcp auth google --client-id <ID> --client-secret <SECRET>   # bring-your-own OAuth client
mnemo-mcp logout                # clear the local Google Drive sync token
mnemo-mcp warmup                # pre-download Fastretrieval-managed local embedding + rerank models

mnemo-mcp config status         # report whether stored config exists
mnemo-mcp config delete --yes   # delete the stored (encrypted) config
mnemo-mcp relay status          # show the active browser-setup relay session
mnemo-mcp relay open            # open the relay setup form in a browser
mnemo-mcp relay reset           # clear relay session state
mnemo-mcp doctor                # environment diagnostics (Python, backend, store, mode)

Subcommand

Purpose

auth <provider>

Authorize a sync credential provider (currently google); --client-id / --client-secret supply a bring-your-own OAuth client

warmup

Pre-download the Fastretrieval-managed local Qwen3 ONNX embedding + rerank models so first use works offline

config status | config delete [--yes]

Inspect or remove the stored encrypted configuration

relay status | relay open | relay reset

Inspect, open, or clear the zero-config browser setup session

doctor

Report Python version, credential backend, store dir, config, relay session, and storage mode

Remote (HTTP mode)

Deployed over HTTP, mnemo speaks Streamable HTTP transport and is OAuth-gated. Point any MCP client that supports remote HTTP + OAuth at https://<your-host>/mcp and authenticate on first connect; each authenticated user gets an isolated per-user credential store (see Trust Model). To stand up an instance, see Deploy to Cloudflare.

Public OCI image publication is discontinued. Existing historical registry tags remain untouched; new container deployments build from source or use the Cloudflare-managed registry.

Deploy to Cloudflare

Deploy to Cloudflare

Run your own mnemo instance serverless on Cloudflare (Containers + D1 + Vectorize + KV).

Prerequisites: a Cloudflare account on the Workers Paid plan — required for Containers, D1, and Vectorize (the Cloudflare free tier does not include them) — and the wrangler CLI.

  1. git clone https://github.com/n24q02m/mnemo-mcp && cd mnemo-mcp

  2. wrangler login

  3. Provision the storage bindings mnemo uses -- the memories database, the embedding index, and the encrypted credential store:

    wrangler d1 create mnemo-memories
    wrangler vectorize create mnemo-memory-vectors-1536 --dimensions 1536 --metric cosine
    wrangler kv namespace create mnemo-kv

    Paste the returned D1 database ID and KV namespace ID into wrangler.jsonc (the Vectorize index binds by name, so no ID is needed), then create the memories schema (tables, indexes, and the FTS5 full-text index) in the database you just made:

    wrangler d1 migrations apply mnemo-memories --remote

    The SQL lives in migrations/0001_init.sql, and the D1 binding in wrangler.jsonc points at that folder via migrations_dir: "migrations". Full-text search uses FTS5, which D1 ships; vector similarity is served by Vectorize rather than by an in-database extension, because D1 cannot load one.

  4. Build the HTTP container from this checkout and push it to your Cloudflare managed registry (CF Containers cannot pull from external registries directly), then set <YOUR_ACCOUNT_ID> in wrangler.jsonc:

    docker build --target http -t mnemo-mcp:local .
    wrangler containers push mnemo-mcp:local
    # set image to registry.cloudflare.com/<YOUR_ACCOUNT_ID>/mnemo-mcp:local
  5. Set <YOUR_PUBLIC_URL> (e.g. https://mnemo.example.com) and <YOUR_WORKER_DOMAIN> (e.g. mnemo.example.com) in wrangler.jsonc, then set the secrets:

    wrangler secret put CREDENTIAL_SECRET              # per-user vault key (encrypts the cf-kv credential store)
    wrangler secret put MCP_RELAY_PASSWORD             # shared password gating the browser setup form
    wrangler secret put MCP_DCR_SERVER_SECRET          # required once PUBLIC_URL is set (multi-user, per-JWT-sub)
  6. wrangler deploy and complete setup in the browser relay form at your Worker domain. Save each subject's models, endpoints and provider keys there, not in Worker environment variables. The managed route uses Minimax-free completion and paid Cohere embedding/reranking through Cloudflare AI Gateway; see the per-task configuration.

Storage maps to Cloudflare via MCP_STORAGE_BACKEND=cf-kv (credentials / tokens, encrypted), MEMORY_DB_BACKEND=cf-d1 (the memories database + FTS5 full-text; unset or sqlite keeps the local SQLite file at DB_PATH), and Vectorize (embeddings, cosine). Cloud embedding, reranking and completion resolve per authenticated subject. Remote startup does not probe shared provider credentials or download local Fastretrieval models. Missing subject configuration never selects a process-wide provider/model fallback.

Authority & Sync Boundary

On Cloudflare deployments, Cloudflare D1 + Vectorize + KV is the sole production authority:

  • D1 (MEMORY_DB_BACKEND=cf-d1): Authoritative storage for memory rows, metadata, bitemporal valid ranges, and FTS5 search.

  • Vectorize (MCP_VECTORIZE_IDX): Dense vector index for semantic similarity search.

  • KV (MCP_STORAGE_BACKEND=cf-kv): Encrypted per-user credential and session store.

  • Sync boundary: MEMORY_DB_BACKEND=cf-d1 disables Google Drive OAuth and all external sync paths even if SYNC_ENABLED is toggled on or stale S3/Google settings remain. SYNC_ENABLED=false independently disables sync on non-CF deployments.

  • Local & self-host bootstrap: Local stdio (~/.mnemo-mcp/memories.db) and self-hosted instances retain optional passport sync (Google Drive Device Code OAuth or S3/R2/B2) for workstation migration.

Trust Model

This plugin implements TC-Local (machine-bound, single trust principal). The mode/storage/encryption breakdown below is the full classification.

Mode

Storage

Encryption

Who can read your data?

stdio (default)

~/.mnemo-mcp/config.json

AES-GCM, machine-bound key

Only your OS user (file perm 0600)

HTTP self-host

Same as stdio

Same

Only you (admin = user)

HTTP multi-user remote (PUBLIC_URL)

Per-JWT-sub credential store

AES-GCM

Only the authenticated user (per-sub isolation)

Workspace username (HTTP setup form)

The browser setup form has an optional workspace username field. Entering the same username always lands you in the same per-sub bucket, so your credentials and memories stay reachable across a re-authorization and across devices, instead of being tied to the one-off subject minted for each /authorize round-trip. Leaving it blank keeps the previous per-authorize behaviour.

Trust boundary: when the form is gated by a shared MCP_RELAY_PASSWORD, the username is a partition key, not a secret -- anyone who knows that password can type any username and reach that bucket. That is fine for a trusted group; an untrusted multi-tenant deployment needs a per-user secret or delegated OAuth instead.

One-time migration: existing users must re-enter their credentials once after this change. Nothing is deleted; credentials stored under the old random subject are simply no longer addressed.

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. Dates show when Glama detected each change.

  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"
  3. 13 tool updatesv2.1.1
    • Addedadd_memory
    • Addedarchived_memories
    • Addedconfig__open_relay
    • Addedconsolidate_memories
    • Addeddelete_memory
    • Addedexport_memories
    • Addedimport_memories
    • Addedlist_memories
    • Changedmemory13 fields changed
      • addedInput schema / properties / as_of
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "As Of"
        +}
      • addedInput schema / properties / auto
        Added value: +{
        +  "default": false,
        +  "title": "Auto",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / context_type
        Added value: +{
        +  "default": "conversation",
        +  "title": "Context Type",
        +  "type": "string"
        +}
      • addedInput schema / properties / depth
        Added value: +{
        +  "default": 2,
        +  "title": "Depth",
        +  "type": "integer"
        +}
      • addedInput schema / properties / entity_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Entity Id"
        +}
      • addedInput schema / properties / importance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Importance"
        +}
      • addedInput schema / properties / include_archived
        Added value: +{
        +  "default": false,
        +  "title": "Include Archived",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / min_importance
        Added value: +{
        +  "default": 0,
        +  "title": "Min Importance",
        +  "type": "number"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Name"
        +}
      • addedInput schema / properties / since
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Since"
        +}
      • addedInput schema / properties / source
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Source"
        +}
      • addedInput schema / properties / text
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Text"
        +}
      • addedInput schema / properties / until
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Until"
        +}
    • Addedmemory_stats
    • Addedrestore_memory
    • Addedsearch_memory
    • Addedupdate_memory
  4. 3 tool updatesv1.7.0
    • First observedconfig
    • First observedhelp
    • First observedmemory

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

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/n24q02m/mnemo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server