M3 Memory
This server provides a persistent, local-first memory layer for AI agents, offering hybrid search, chat log capture, file indexing, and agent/task management through MCP tools.
Memory management: Write, search (hybrid BM25 + vector), retrieve, and supersede memories with automatic contradiction detection and bitemporal history.
Chat log subsystem: Append and search conversation turns, plus health/status checks.
File ingestion: Search, index, fetch, and manage file-based memories across corpora, with stats and health checks.
Agent & task coordination: List registered agents and tasks for multi-agent workflows.
Dynamic tool discovery: List/load tool domains, query capabilities, and invoke any tool via
m3_callwithout loading its domain.Local and privacy-first: Runs offline with SQLite/PostgreSQL backends, no external services required.
Optionally uses Ollama to load a small chat model for auto-classification, summarization, and consolidation of memories.
Enables syncing memory data across devices using PostgreSQL, allowing seamless continuation between different machines.
Uses local SQLite databases as the primary storage for memories, chat logs, files, and knowledge graph, ensuring sovereign data storage.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@M3 Memorysave this conversation about project requirements"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
๐ง m3 Memory
A memory layer that outlives your agents. You switch from Claude Code to Cursor, upgrade your model, start fresh next week โ and everything your tools learned about your project is gone. You re-explain the same decisions, the same preferences, the same hard-won context, over and over.
m3 fixes that. It's a private, local-first memory your agents share and build on โ so your project's knowledge accumulates instead of resetting every time the agent does. One memory store, on your machine, that your tools and agents read from and write to โ whether that's Claude Code, Cursor, Gemini CLI, or any MCP-compatible agent.
Building something yourself? m3 is a memory backend, not a framework, and MCP is optional โ every tool is a JSON-in/JSON-out CLI call, scriptable from any language, hook or CI job. Jump to the developer section โ
Under the hood, m3 treats agent memory as a distributed-systems infrastructure problem, not a simple retrieval feature โ a shared, evolving, bitemporal, contradiction-aware knowledge base that multiple heterogeneous agents and machines read and write, built to stay consistent over months and years.
The memory improves without being asked. m3 is not only a store you write to and read back. An autonomous Cognitive Loop (m3_cognitive_loop.py) runs in the background and keeps working on what you already saved: deferred enrichment โ classification, embedding, and entity extraction โ runs off the hot path, so a write stays fast while the understanding of it deepens afterwards, and the loop builds an entity relationship graph from memories that arrived as plain text. Curation is m3's own work, not an LLM's. Near-duplicate detection is cosine similarity over embeddings against a threshold; decay and pruning are age-and-signal rules; and applying a curation plan โ bulk deletes, merges, supersessions โ is one deterministic function issuing direct SQL, with no model in the loop. That is deliberate: the apply step used to be an LLM agent, and it failed by looping single-row deletes across hundreds of IDs until it ran out of budget. An agent's judgement is still welcome for the genuinely subjective calls ("is this worth keeping?"), but it emits a plan and m3 executes it โ one round-trip instead of N, and no model needed for the mechanical part.
Contradictions are caught on three paths, not one: deterministically on the write path (cosine similarity against a threshold, no model), by the loop's Reflector pass during enrichment (which writes supersedes edges), and by an explicit curation plan. Promotion of chat turns into long-term memory is the one thing that stays deliberate โ nothing promotes on your behalf.
It runs where your data has to stay. A single pip install with no account, no
API key, and no outbound calls โ at home in a homelab, on a corporate or
government network, or fully air-gapped. Embedding runs on your own hardware
via a shared local embed server โ one model in RAM that every m3 process
reuses, rather than a copy per process โ the store is a file you own, and
installation works with no internet at all.
On the metric that isolates the memory layer โ retrieval accuracy, no answer model
or judge involved โ m3 reaches 99.2% session-hit-rate @ k=10 and 100% @ k=20 on
LongMemEval-S.
๐ฌ Quick video overview
One decision saved from a conversation, then recalled by a different agent in a new session, on a different machine. Captioned throughout, so it reads fine muted.
https://github.com/user-attachments/assets/09ab194a-d2a0-4fe5-a7db-69ae8225e39b
Player not loading? Download the video to play locally.
Related MCP server: memento
โก Quickstart
pip install m3-memory # or: pipx install m3-memory โ pick ONE and stay with it
m3 setup # detects your agents, wires the MCP server, provisions the local embedder
m3 doctor # verify: health, memory count, embedder, and which agents got wiredThat's the whole install. No cloud account, no API key, no external embedding service.
What it does, in four lines
Save a decision โ your AI agent, or you from the shell:
$ m3 memory memory_write --type decision --title "auth-jwt-algorithm" \
--content "The auth service uses RS256 JWTs. HS256 was rejected because we need asymmetric verification at the edge."
"Created: 84a944fb-ef3e-403b-9240-f53ab3c015f7"Next week, in a different agent, on a different model โ ask in your own words:
$ m3 memory memory_search --query "which signing algorithm did we pick for tokens?" --k 3
{
"count": 1,
"items": [
{
"id": "84a944fb-ef3e-403b-9240-f53ab3c015f7",
"score": 0.7501,
"type": "decision",
"title": "auth-jwt-algorithm",
"content": "The auth service uses RS256 JWTs. HS256 was rejected because we need asymmetric verification at the edge."
}
]
}Prefer the rendered form for reading? Add --no-as_records.
The query shares no keywords with the stored text โ no "RS256", no "JWT" โ and still finds it. That's the hybrid engine: BM25 for exact terms, local BGE-M3 vectors for meaning, MMR for diversity. Your agent calls the same tools over MCP, so it recalls this automatically instead of asking you again.
New here? The 5-Minute Getting Started Guide walks the same path with more context, and Core Tools lists the five you'll use most.
๐ ๏ธ For developers: a memory backend, not a framework
MCP is optional. m3 is a memory layer โ it owns durable, searchable, multi-agent memory and stops there, so it drops into whatever you already have instead of asking you to adopt a stack.
Every tool in the catalog reads JSON on stdin and writes JSON on stdout, so m3 is scriptable from any language or runtime โ and from hooks, CI, and cron. No SDK, no client library, no MCP server required:
echo '{"query":"auth","k":3}' | m3 memory memory_search --json-file - | jq '.items[].id'Results compose, so one tool's output drives the next:
# Pin everything matching a query โ search, transform, bulk-update.
m3 memory memory_search --query "deployment runbook" --k 20 \
| jq '{updates: [.items[] | {memory_id: .id, pinned: 1}]}' \
| m3 memory memory_update_bulk --json-file -Language-specific work stays on your side of the boundary โ by design. Code parsing and VCS watching are integrations, not missing features, and each is a few lines of your own code:
# AST indexing with any parser you already trust โ ast, tree-sitter, ts-morph.
symbols = [n.name for n in ast.walk(ast.parse(src))
if isinstance(n, (ast.FunctionDef, ast.ClassDef))]
subprocess.run(["m3", "memory", "memory_write", "--json-file", "-"],
input=json.dumps({"type": "reference", "title": path,
"content": "\n".join(symbols)}), text=True)That is what keeps one memory layer serving a Python monorepo, a Rust service and a TypeScript frontend without forking it.
Using m3 for coding work โ โ the full integration guide: composing tools, git hooks, CI steps, and where the layer boundary sits.
(jq is not a dependency โ it just reads well in examples. m3 emits plain
JSON, so any parser works.)
๐งฉ Beyond the core
The Quickstart above is the whole product for most people: shared memory, wired into your agents, working offline. Everything below is optional surface you can ignore until you want it โ each row says what it costs to turn on.
Also a drop-in memory backend for LangChain / LangGraph, CrewAI, and PydanticAI โ see the framework guides.
Every path gains automatic contradiction supersession, bitemporal historical queries, local sovereign embedding, and the full 100+ MCP tool set.
โ๏ธ How m3 Compares
A full, feature-by-feature comparison table โ m3 vs Mem0, Letta, Zep, Graphiti, LangChain Memory / LangMem, agentmemory, Chronos, Hindsight, Mastra OM, Memento, and more โ with sourced benchmarks and honest "when to choose the other tool" guidance, lives in COMPARISON.md.
Short version: m3 is the local-first, MCP-native option that stays yours and works across every agent โ where cloud services (Mem0), full agent runtimes (Letta), and graph-database systems (Zep, Graphiti) each ask you to adopt their infrastructure. See the comparison guide for the row-by-row detail.
๐ Quick Links & Badges
๐ก Get Started Quickly:
๐ฅ๏ธ OS Installation: Windows Setup ยท macOS Setup ยท Linux Setup
๐ Table of Contents
โก m3 at a Glance
Feature | Details |
Works With | Claude Code ยท Cursor ยท Cline ยท Gemini CLI ยท Aider ยท Google Antigravity ยท OpenCode ยท OpenClaw ยท Hermes ยท LangChain/LangGraph ยท CrewAI ยท PydanticAI ยท Any MCP Agent |
m3 Is | A persistent memory layer ยท An MCP server ยท A hybrid retrieval engine ยท A bitemporal knowledge base |
m3 Is Not | An LLM ยท A chatbot ยท A plain vector database ยท A RAG framework ยท An IDE |
Core Promise | Private, offline-capable, locally owned memory shared securely across all your developer tools โ with FIPS 140-3-ready crypto and atomic multi-agent writes for regulated and multi-agent environments. |
Deploys In | Homelabs and self-hosted stacks ยท corporate and government networks ยท air-gapped and classified environments ยท regulated industries (FIPS 140-3-ready, GDPR tooling, audit logs). No account, no API key, no outbound calls. See Sovereign & Air-Gapped Deployments. |
Speed | A deferred write โ which includes validation, bitemporal logic, contradiction checking, hashing, and storing to SQLite with WAL โ takes just ~2.16 ms (p50) / 3.66 ms (p95). To ensure the caller never waits, m3 intentionally defers the heavy vector embedding to a background cognitive loop. The memory is immediately full-text searchable (hybrid search takes ~45 ms p50 / ~48 ms p95), and vector search picks it up as soon as the background pass completes. Warehouse sync upserts 3,000 rows in 25 ms. Measured on a stock Windows desktop; see Performance for the hardware, the CPU-only numbers, and the caveats. |
Retrieval Accuracy | State-of-the-art for a local-first substrate โ 99.2% session-hit-rate @ k=10, 100% @ k=20 on LongMemEval-S (no oracle routing), with a gold session as the #1 result for 91.8% of questions. SHR measures the memory layer alone โ no answer model, no judge โ which is why it, not end-to-end QA, is the like-for-like comparison between memory systems. See Benchmarks. |
Entity & Relationship Enrichment | Yes. m3 includes LLM-based entity extraction and relationship enrichment (Observer + Reflector), running as background cognitive passes over raw text โ automatic once a local or cloud LLM endpoint is configured. Observer emits entities, facts and typed relationships from unstructured text; Reflector resolves contradictions and writes |
Context Efficiency | Exposes 100+ tools but occupies just ~2% of a 200K context window at startup โ the 10 registered schemas absorb 95% of real tool calls; lazy domain-gating loads the rest on demand. |
Maturity | Stable, battle-tested core engine (3,600+ tests) that's safe to build on today; new features and integrations are added actively. SQLite by default; PostgreSQL as a first-class primary backend ( |
๐ง Memory Model at a Glance
m3 is a typed, bitemporal, confidence-scored, self-maintaining knowledge base. Every feature listed below is implemented natively (see Memory Model Details):
Structured Metadata: Every memory contains a
type,source,confidence,scope, provenance (change_agent), and salience (importance,decay_rate).Verbatim, Non-Destructive Storage: Memory content is stored exactly as written and never altered in place โ the raw text is always retrievable byte-for-byte. Corrections don't overwrite: a superseded fact is closed (its validity interval ends) and the new fact is linked to it, so both the original wording and its full edit history stay queryable. You get true verbatim recall and an audit trail, not one or the other.
Bitemporal History: Distinguishes valid-time from transaction-time. Because superseded facts are closed rather than deleted, you can query what the agent believed at any specific point in time.
Contradiction Management: Conflicting facts are resolved automatically on write. The stale fact is marked as superseded, and confidence values are updated dynamically via Bayesian confidence posteriors. Supersession fires above a deliberately conservative cosine bar (
CONTRADICTION_THRESHOLD, default 0.92), so near-restatements of a claim close the old fact while genuinely different-but-related facts are both kept โ usememory_supersedeto close one explicitly. (See Technical Details.)Self-Maintaining Lifecycle: Implements memory decay, deduplication, automatic consolidation into higher-order beliefs, TTL expiry, and GDPR erasure.
Procedural Memory: A first-class
proceduretype (skill / runbook / how-to / checklist) that is auto-distilled from successful task runs โ the background loop rolls up a completed task and its step/result memories into a reusable, step-by-step procedure, preserved withdistills_fromprovenance back to its sources. A "how do Iโฆ" query surfaces it via a procedural retrieval boost.Write-Gating & Content Safety: Filters out low-signal noise via an enrichment queue and content safety guardrails before storage.
Explainable Retrieval: Hybrid engine combining vector similarity, BM25 (FTS5), MMR diversity, and reranking.
memory_suggestreturns the exact score breakdown per result. (See Confidence and Trust Guide).Proven Accuracy: On LongMemEval-S, m3 delivers state-of-the-art retrieval for a local-first substrate โ 99.2% session-hit-rate @ k=10 and 100% @ k=20 (no oracle routing), with a gold session as the #1 result for 91.8% of questions. End-to-end QA accuracy is 92.0% with no oracle metadata (see Benchmarking Report).
๐ฆ Installation
โ ๏ธ Python 3.12+ required (changed in
2026.9.13.0)m3 now requires Python 3.12 or newer. Releases up to and including
2026.9.12.0supported Python 3.11; from2026.9.13.0onward,pipwill refuse to install m3 on 3.11 and will silently keep you on the last 3.11-era release instead of upgrading.On Python 3.11? Check with
python --version. To upgrade:
macOS:
brew install python@3.14 && brew link --overwrite python@3.14Windows:
winget install -e --id Python.Python.3.14Debian/Ubuntu: use deadsnakes or a distro release shipping 3.14.
After a Python minor-version bump, recreate your virtualenv (
rm -rf .venv && python3 -m venv .venv) โ see HOW-TO-UPGRADE.md. Your memories are unaffected: the databases live outside the venv under~/.m3/engine.We recommend 3.14 or newer for new installs. Python 3.13 enters security-fix-only maintenance upstream on October 1st (no further bug fixes), so a future m3 release will raise the floor again โ announced at least one minor release in advance.
The Quickstart above covers the common path (pip install m3-memory โ m3 setup). This section adds the alternatives: the shell installer, per-agent wiring, and manual MCP configuration.
The One-Liner (macOS & Linux)
curl -fsSL https://raw.githubusercontent.com/skynetcmd/m3-memory/main/install.sh | bashFor Windows, please follow the Windows Manual Installation Guide.
To install manually on any platform, refer to the OS-Specific Install Instructions or examine the installer script.
Developer Setup Wizard
If you are developing inside python environments:
pip install m3-memory
m3 setupThe m3 setup wizard automatically detects your installed agents โ Claude Code, Cursor, Cline, Gemini CLI, OpenCode, Antigravity, OpenClaw, Hermes โ and wires the m3 memory MCP server into each, installs settings files/hooks, provisions the sovereign CPU embedder, and performs a system diagnostic. Detection and wiring re-run on every m3 update/m3 setup, and m3 doctor --fix repoints any config whose paths have moved โ so an agent you install later gets picked up automatically the next time you run setup or update.
Integrating with AI Coding Tools
๐ค Claude Code
Install as a plugin to unlock /m3:* slash commands, curation subagents, and automatic hooks:
/plugin marketplace add skynetcmd/m3-memory
/plugin install m3@skynetcmdSee Claude Code Plugin Reference and Claude.ai Connector Guide.
โท Cursor
Auto-detected and wired by the setup wizard โ it writes the m3 memory MCP server into ~/.cursor/mcp.json:
m3 setupRe-run after installing Cursor and it's picked up automatically; m3 doctor --fix repoints the entry if paths move. See MCP Client Install Guide.
โง Cline (VS Code)
Auto-detected and wired by the setup wizard โ it writes the m3 memory MCP server into Cline's cline_mcp_settings.json:
m3 setupAlso available from Cline's MCP marketplace (see llms-install.md). See MCP Client Install Guide.
๐ช Google Antigravity
Install the plugin directly:
agy plugin install https://github.com/skynetcmd/m3-memorySee Antigravity Plugin Reference.
๐ฆ Hermes Agent
Run the wizard to automatically wire up optimal memory providers:
m3 setupSee Hermes Plugin Integration Guide.
๐ Python / LangChain & LangGraph
Use m3 as a drop-in Mem0 replacement or LangMem backend:
pip install m3-memory[langchain]See LangChain Integration Guide.
๐ฅ CrewAI (v1.x)
A drop-in StorageBackend for CrewAI's unified memory:
pip install m3-memory[crewai] # crewai>=1.10,<2 ยท Python 3.12โ3.13 (a 3.14 escape hatch is documented)๐งฉ PydanticAI
m3 tools + auto-recall, or a formal M3MemoryToolset. Built on Pydantic v2 โ runs natively on Python 3.14:
pip install m3-memory[pydantic-ai] # pydantic-ai-slim>=2,<3See PydanticAI Integration Guide.
โจ๏ธ The m3 CLI โ the same memory, without an agent
MCP is not the only way in. The m3 CLI and the MCP server are two front doors
to the same database, so anything an agent can do over MCP you can do from a
shell โ the whole tool catalog, grouped as memory, files, chatlog, tasks,
agent, admin, conversations, diagnostics and entity:
m3 memory memory_search --query "which signing algorithm did we pick?" --k 5
m3 memory memory_write --content "..." --type belief --title "..."
m3 memory memory_write_from_file --path notes.md --type belief --title "..."
m3 chatlog statusContent comes from a command-line argument (--content) or from a file
(--path) โ handy when the body is long enough that shell quoting would mangle
it.
Results go to stdout and logs to stderr, so output pipes cleanly into
jq, grep or a script:
m3 memory memory_search --query "postgres" --k 20 2>/dev/null | jq '.'This matters when your MCP client drops the connection: that is not a memory
outage. A dropped stdio session only the client can respawn leaves the store
completely intact and fully usable from the CLI until you reconnect (/mcp in
Claude Code). Check with m3 --version; if the CLI answers, m3 is up.
See the CLI Reference for the full command surface.
Manual MCP Server Configuration
To expose m3 to any Model Context Protocol host, add it to your configuration file:
{
"mcpServers": {
"memory": {
"command": "m3"
}
}
}๐๏ธ Domain Gating: the Full Catalog Without the Context Cost
m3 gives you the full 100+ tool surface while occupying just 2% of a 200K context window at startup โ most MCP servers make you pay for every tool in every prompt. Tools are grouped into 9 domains (memory, chatlog, files, entity, agent, tasks, conversations, diagnostics, admin) and loaded lazily.
Only 10 schemas register at startup (~3,929 tokens). That set is chosen by measurement rather than judgement: across real-world multi-agent development sessions it absorbed 95% of all observed tool calls, so gating the rest costs almost nothing in practice. When your agent needs more, it calls tools_load_domain(domain="...") to fetch a domain on demand โ or invokes any single tool by name through m3_call, with no domain load at all.
Gating Mode | Registered Tools | Tokens in Schema | % of 200K Window |
Lazy (Default) | 10 | ~3,929 | 2.0% |
Typical Active Session (+ | 56 | ~17,548 | 8.8% |
Eager Mode ( | 115 | ~29,658 | 14.8% |
๐ ๏ธ Note: If your client does not support dynamic tool registration, set the environment variable
M3_TOOLS_LAZY=0to register all tools eagerly.
๐ก๏ธ Sovereign & Air-Gapped Deployments
m3 operates completely offline by default.
Sovereign Local Embedder
A high-performance BGE-M3 embedder runs locally after installation.
Default: one shared local embed server on
127.0.0.1:8082, running them3-embed-serverbinary that ships inside them3-core-rswheel. CPU execution using GGUF format (_assets/models/bge-m3-Q4_K_M.gguf). Every m3 process reuses that single server โ one model in host RAM โ and one GPU context when a GPU wheel is installed โ instead of each loading its own copy. It is local-only and never leaves the machine.Optional (opt-in at
m3 setup): additionally embed in-process via them3-core-rsnative module (llama.cpp linked in-process, zero IPC). On measured real text it is faster than the shared server โ ~1.9ร on short chunks, ~1.75ร on medium โ so the reason to prefer shared is memory, not latency: in-process loads one model copy per process, and a typical setup runs several (MCP server, cognitive loop, CLI), while the shared server keeps one model in RAM for all of them. Choose in-process when you have RAM to spare and a short-text workload. (measurements and caveats)Hardware Acceleration (GPU): Execute
m3 embedder install-gputo compile with CUDA, Vulkan, or Metal.External Provider Fallback: Set
M3_EMBED_URLto point at any OpenAI-compatible/v1/embeddingsendpoint (Ollama, LM Studio, vLLM, or another machine's m3 embed server), andM3_EMBED_FALLBACK_URLfor a second endpoint to try if the first is unreachable.
Rust-Oxidized Performance Core
m3 ships a Rust compute core (m3_core_rs) that speeds up MMR re-ranking, batch cosine distance calculations, and FTS compilations by 90ร to 800ร. It is installed by default (the installer's --no-native-wheel is the opt-out), not an optional add-on. A pure-Python fallback covers every code path and is results-equivalent โ exact for FTS compilation and graph traversal, and within float tolerance for vector math, enforced by tests/test_oxidation_parity.py, test_fts_parity.py and test_graph_neighbor_parity.py. So the core changes speed, never answers: if the wheel is absent, or you set M3_CORE_RS_DISABLE=1, m3 falls back automatically and returns the same results more slowly. (See Oxidation Benchmarks).
Enterprise Security & Compliance
FIPS 140-3 Ready: Standardized encryption pathways allow routing through validated cryptographic modules (e.g., wolfSSL via
M3_FIPS_MODE=1).Air-Gapped Install: Supports installation without internet access via pre-compiled python wheels. (See Sovereign Deployment Guide & FIPS Boundary Reference).
Storage Location: State lives under three roots, so databases and configuration can be relocated and secured independently:
Root
Default
Holds
M3_ENGINE_ROOT~/.m3/engineDatabases + runtime state (
agent_memory.db,agent_chatlog.db,files_database.db)M3_CONFIG_ROOT~/.m3/configConfiguration (chatlog config, salt)
M3_MEMORY_ROOT~/.m3-memoryPayload / repo clone
All three are overridable. Set any of them to relocate that root.
M3_MEMORY_ROOTalso acts as a master override โ if set and the other two are unset, engine and config derive from it as<root>/engineand<root>/config. Precedence isM3_ENGINE_ROOT/M3_CONFIG_ROOTโM3_MEMORY_ROOT/โฆโ the~/.m3/โฆdefault, so a specific root always wins over the master. (See Architecture.)
๐ฎ What m3 Does
Memory Persistence: Saves system architecture, project decisions, and preferences across tool boundaries using a local SQLite database.
Autonomous Cognitive Loop: Background worker (
m3_cognitive_loop.py) that periodically sweeps chat logs to extract facts, reconcile contradictions, and construct an entity relationship graph.LLM-Based Entity Extraction & Relationship Enrichment: m3 includes LLM-based entity extraction and relationship enrichment (Observer + Reflector), running as background cognitive passes over raw text โ automatic once a local or cloud LLM endpoint is configured. The Observer pass reads unstructured text and emits entities, facts and typed relationships; the Reflector pass re-reads what is already stored, resolves contradictions and writes
supersedesedges. Both run off the hot path, so a write stays fast while the understanding of it deepens afterwards. Any OpenAI-compatible endpoint works โ point it at a local server (LM Studio, Ollama, llama.cpp โ auto-probed on:1234/:11434) to keep every token on your machine, or at a cloud model if you prefer. (See Enrichment Guide)Hybrid Vector & Keyword Search: Seamlessly merges vector space, Full-Text Search (FTS5 BM25), and MMR diversity.
Hierarchical File Ingestion: A dedicated 26-tool files domain reads directories, chunks files, extracts facts, and reviews staleness โ with ~4ร faster incremental re-ingest (unchanged sections reuse cached embeddings).
Verbatim Chatlog Capture: A dedicated 10-tool chatlog domain records conversation turns before compaction, so prior Claude/Gemini sessions stay searchable and nothing is lost to context-window truncation.
Pluggable Storage Backend: SQLite by default; select PostgreSQL as a first-class primary store with
M3_DB_BACKEND=postgres. Same semantics on either backend โ the choice doesn't change behavior.Cross-Device Sync: Optionally sync/federate to a PostgreSQL warehouse tier. Access the same memories on your laptop, desktop, or cloud environments.
๐ Documentation Index
Start here, in this order: Getting Started โ Memory Model (what a memory is, and how supersession works) โ Agent Instructions (how to make your agent use it well). Everything else below is reference โ reach for it when you hit the specific thing it covers.
Quick & Core | Advanced & Architecture | Integrations & Compliance |
๐๏ธ System Architecture | ๐งฉ LangChain/LangGraph | |
โจ Core Features | ๐งฉ Hermes Agent | |
โ๏ธ Environment Variables | ๐ก๏ธ Compliance Guide (GDPR, FISMA) | |
๐ ๏ธ Operations Playbook | ๐ก๏ธ FIPS Cryptographic Boundary | |
๐ Myths & Facts Guide | ๐ Homelab Patterns | |
More Documentation
Guide | Guide | Guide |
๐บ๏ธ Roadmap | ๐ Cross-Device Sync | |
โ๏ธ Comparison vs Alternatives | โ FAQ | ๐ Security Policy |
๐ง Memory Model | ๐งช Myths and Facts | |
๐ฉน Troubleshooting | โจ๏ธ CLI Reference | ๐ API Reference |
๐ Files Memory | ๐ฌ Chat Log Subsystem | โจ Enrichment Guide |
โฌ๏ธ Upgrade Guide | ๐ฉบ Health FAQ | ๐งฌ Dual Embedding |
๐ Changelog | ๐ค Code of Conduct | ๐๏ธ Build Wheels |
๐ Web Dashboard | ๐งฐ Underlying Tools | ๐ PostgreSQL Sync |
โก Performance |
๐ฏ Who This Is For
m3 is a great fit if...
You run a homelab or self-hosted stack: m3 is a single
pip installwith no account, no API key, and no outbound calls โ it runs on the hardware you already own, alongside your other self-hosted services. SQLite by default (zero infrastructure); PostgreSQL when you want a shared store across machines.You operate under sovereignty or data-residency requirements โ corporate, government, defence, healthcare, or any regulated environment: memory and embeddings never leave your boundary. The embedder runs on your own hardware, the store is a file you control, and installation works fully air-gapped from pre-compiled wheels. FIPS 140-3-ready crypto (
M3_FIPS_MODE=1), GDPRgdpr_forget/gdpr_export, audit logs, and relocatable storage roots so databases and configuration can be secured independently.You want the freedom to switch or add agents without losing what they know: change tools on the fly or down the road โ Claude Code, Gemini, OpenClaw, Hermes, whatever comes next โ and your project's knowledge carries over instead of disappearing with the switch.
You build with LangChain/LangGraph: An advanced replacement for standard memory models, adding bitemporal queries, contradiction management, and local embeddings.
You build with CrewAI (v1.10โ1.x): A drop-in
StorageBackend(Memory(storage=M3StorageBackend(user_id="crew-alpha"))) that gives CrewAI bitemporal recall, contradiction-aware supersession, and local embeddings โ plus the thing single-vector stores can't do: a CrewAI-written memory can also be searchable by every other m3 agent (Claude Code, Gemini, LangChain) if you want.pip install m3-memory[crewai]. See the CrewAI integration guide.You build with PydanticAI: m3-backed memory as either drop-in tools + auto-recall (
register_m3_tools,m3_recall_processor) or a formalM3MemoryToolset(a real PydanticAIAbstractToolset). Built on Pydantic v2, so it runs on Python 3.14 with a plainpip install m3-memory[pydantic-ai]. See the PydanticAI integration guide.You need security and compliance: Built-in
gdpr_forgetandgdpr_exporttools, air-gapped support, and audit logs.You value privacy: Zero external cloud requests or subscriptions required.
m3 is NOT a fit if...
You need a hosted SaaS dashboard with managed infrastructure (use Letta).
You don't want persistent memory: you want each session to start fresh, with no ability to retrieve prior sessions' knowledge โ m3 exists to do the opposite, so your agent's built-in defaults are the simpler fit.
๐ก๏ธ Why Trust This
Benchmarked Retrieval: State-of-the-art for a local-first substrate โ 99.2% session-hit-rate @ k=10, 100% @ k=20 on LongMemEval-S โ with a published, reproducible methodology and no oracle routing. See Benchmarks.
Robust Coverage: Over 3,600 tests guarding that your memories survive upgrades and schema migrations, that capture never silently stops, and that behavior is identical on SQLite and PostgreSQL. Every release runs the full suite on every lane โ Linux, macOS and Windows ร every supported Python version, each lane independent of the others. No subsets, no shortcuts. Warnings are treated as errors: a release does not pass until every warning is addressed, not just every failure.
Measured, Not Asserted: Latency for the write, search, sync and embed paths is published with its method, its hardware, and its limits โ including what the numbers look like without a GPU (~7ร slower on embedding). See Performance.
Audit Reports: Regular vulnerability reports (Bandit, secrets scans, pip-audit) published directly under
docs/audits/.Explainable Retrieval: No black-box queries; retrieval math is open, readable, and scoring parameters are outputted directly.
Open Source: Apache 2.0 licensed, free, with no SaaS walls or usage limits.
๐ Benchmarks
Read retrieval accuracy first โ it is the only number that measures the memory layer.
Session Hit-Rate (SHR) asks one question: did the system surface the evidence that answers the query? No answer model is involved, so the score reflects the memory layer and nothing else. It is the like-for-like metric across memory systems.
End-to-end QA accuracy runs that retrieved context through an LLM and has a judge model grade the answer. Both choices move the score independently of retrieval: a stronger answerer lifts a weaker memory layer, a lenient judge lifts everyone, and neither is held constant across published comparisons. Two systems quoting QA numbers are usually not measuring the same thing.
Both are reported below. SHR is the headline; QA is context.
Retrieval Accuracy โ Session Hit-Rate @ k (the memory-layer metric)
Evaluated on the 500-question LongMemEval-S dataset under default server configurations:
Retrieve Depth (k) | Session Hit-Rate (SHR) โ | Success Count | vs. Prior Version |
1 | 91.8% | 459 / 500 | First Report โ |
5 | 98.2% | 491 / 500 | +2.0pp |
10 (Default) | 99.2% | 496 / 500 | +2.4pp |
20 | 100.0% | 500 / 500 | First Report โก |
โ SHR@1 is the strictest cut โ a gold session as the single top-ranked result. m3 operates at k=10 (its default), where a gold session is present for 99.2% of questions; k=1 is reported here for completeness, not as the headline. Cross-system SHR/recall figures are usually quoted at k=5, k=10, k=20, or k=50, so comparing another system's k=10+ number against this k=1 figure is not a like-for-like comparison.
โ Which aggregation. These are binary per-question
recall_any@kvalues โ the convention adjacent LongMemEval submissions report. The benchmarking report's per-question-type table aggregates slightly differently and reads marginally higher at shallow depth (98.8% at k=5, 99.4% at k=10); k=20 is 100.0% either way. The table above quotes the more conservative figures.
โก v3 improvement โ the v3 engine reaches 100% SHR at k=20, exceeding the prior version's 97.8% measured at the deeper k=30 (LongMemEval issue #43) โ higher recall at shallower depth. Both figures are retrieval-only SHR (no answerer). The "vs. Prior Version" deltas at k=5/k=10 compare v3 against the prior version's 96.2% / 96.8% at the same k.
End-to-End QA Accuracy (answer-model and judge dependent โ not a memory-layer comparison)
92.0% accuracy (460/500 correct responses) with zero oracle metadata routing. Reported for completeness; see the note above on why this number is not comparable across systems the way SHR is:
Question Domain | Count (n) | Accuracy |
single-session-user | 70 | 94.3% |
single-session-assistant | 56 | 96.4% |
single-session-preference | 30 | 80.0% |
multi-session | 133 | 87.2% |
temporal-reasoning | 133 | 95.5% |
knowledge-update | 78 | 93.6% |
Overall Summary | 500 | 92.0% |
Methodology and reproducibility details are located in the LongMemEval-S Benchmarking Report.
๐งฐ Core Tools
While m3 features 100+ tools, these five serve as your primary interface:
Tool Name | Operation Description |
| Save a specific fact, project preference, or technical configuration. |
| Run hybrid keyword (BM25) and semantic vector search. |
| Edit existing facts to keep memory accurate. |
| Query memories alongside a mathematically explicit score breakdown. |
| Fetch details of a single memory using its unique ID. |
Refer to the Agent Instructions Guide and Full MCP Tool Catalog for complete parameter definitions.
๐ค For AI Agents
You can drop the agent ruleset file examples/AGENT_RULES.md into your workspace to teach your agent best practices (e.g., query before writing, update existing records instead of duplicating).
Command Installation Prompts
Copy and paste these prompts into your terminal client to let your agent set up m3 for you:
Claude Code Prompt
Install m3-memory for persistent memory. Run: pip install m3-memory
Then run: m3 setup
That wires the m3 "memory" MCP server into my agents and provisions the
local BGE-M3 embedder โ no external embedding service is needed. If it
doesn't detect Claude Code, add {"mcpServers":{"memory":{"command":"m3"}}}
to my ~/.claude/settings.json under "mcpServers". Then use /mcp to verify
the memory server loaded.Gemini CLI Prompt
Install m3-memory for persistent memory. Run: pip install m3-memory
Then run: m3 setup
That wires the m3 "memory" MCP server into my agents and provisions the
local BGE-M3 embedder โ no external embedding service is needed. If it
doesn't detect Gemini CLI, add {"mcpServers":{"memory":{"command":"m3"}}}
to my ~/.gemini/settings.json under "mcpServers".Active Chatlog Capture Plugin
To configure instant conversation logging and backup, tell your active coding agent:
Install the m3-memory chat log subsystem.The agent executes bin/chatlog_init.py and configures execution triggers (see Chat Log Architecture Guide).
๐ฌ See it in action
Contradiction Detection & Automatic Resolution
Hybrid Search Scoring Details
Multi-Device Database Sync
๐ฌ Community
How to Contribute ยท FAQ for Developers ยท Good First Issues
๐ License & Attributions
This project is licensed under the Apache License 2.0. See LICENSE for details.
Built with
m3 Memory is authored and maintained by skynetCMD. It was built with the help of AI coding assistants โ Gemini CLI, Claude Code, and Google Antigravity โ which contributed code under the author's direction. (They are tools that assisted; they are not maintainers, sponsors, or co-owners of the project.)
Asset & Icon Credits
The provider badges under docs/badges/ embed small logo glyphs:
OpenClaw & OpenCode icons are from the MIT-licensed LobeHub icon set (
lobe-icons).The Hermes badge uses a generic caduceus glyph.
See NOTICE for the full third-party attribution list.
โญ Star History
Chart regenerated on a schedule by .github/workflows/star-history.yml using the repo's own token โ no third-party embed. Click through for the live interactive version.
Available Tools
20 toolsagent_listB
List registered agents, optionally filtered by status and/or role.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | ||
| status | No | ||
| timeout | No | ||
| database | No | ||
| as_records | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'List,' which implies a read operation, but it does not disclose whether the operation is read-only, expensive, requires authentication, or has side effects. For a tool with no annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that immediately states the primary action and the optional filters. There is no fluff or redundant information, and the core purpose is front-loaded. It earns a perfect score for efficiency and clarity of structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters, no output schema, and no annotations, the description is severely under-specified. It does not explain return format, behavior of the extra parameters, or any edge cases. An agent would have to rely on the schema alone, which lacks descriptions, leaving many unknowns. The description is not complete enough for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all 5 parameters. It explicitly explains 'status' and 'role' as filters, but leaves 'timeout', 'database', and 'as_records' completely unexplained. The description adds minimal value beyond what the schema already provides for those two parameters, and fails to cover the majority.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('registered agents'), making the core purpose clear. It also mentions optional filters for status and role, which adds specificity. However, it does not distinguish this tool from siblings like tools_list_domains or task_list, though the resource name is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving agents and mentions optional filters, giving some context on when to apply them. But it provides no explicit guidance on when not to use this tool or alternatives. Since there are no obvious competing listing tools among siblings, the lack of exclusion is a minor gap, but no when-to-use vs. alternatives is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chatlog_searchB
Search chat_log rows. FTS5 keyword when query is non-empty; filter-only when empty.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| query | Yes | ||
| since | No | ||
| until | No | ||
| timeout | No | ||
| agent_id | No | ||
| database | No | ||
| model_id | No | ||
| provider | No | ||
| host_agent | No | ||
| search_mode | No | hybrid | |
| conversation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description reveals the behavioral change based on query emptiness and mentions FTS5. But it omits other aspects like pagination, sorting, permissions, or output format, leaving gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that front-loads the core behavior. Every word contributes value, though more detail could be added without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, no output schema, and no annotations, the description is incomplete. It doesn't explain return format, defaults beyond the schema, or how to use parameters like since/until or search_mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description only addresses the query parameter's effect. The other 11 parameters (k, since, until, timeout, agent_id, etc.) are not explained, failing to compensate for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches chat_log rows and distinguishes behavior based on query emptiness (FTS5 keyword vs. filter-only). This is specific and differentiates from sibling tools like files_search or memory_search by resource type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It describes two modes (keyword vs. filter-only) based on query, giving context on when to use each. However, it lacks explicit when-not-to-use instructions or comparisons to alternatives like other search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chatlog_statusB
One-call health summary of the chat log subsystem: mode, DB paths, row counts, queue depth, spill files, embed backlog, hook timestamps, redaction state, warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It states what is returned but does not clarify if the tool is read-only, requires permissions, or has side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the core purpose, though it lists many items which reduces readability slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description lists the summary contents but fails to describe parameter behavior or return format, which is insufficient for a health tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description does not mention the timeout or database parameters at all, leaving the agent to infer their meaning from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides a health summary of the chat log subsystem and lists specific metrics included. However, it does not explicitly differentiate from sibling health tools like files_health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for checking chat log health but provides no guidance on when to use this tool vs alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chatlog_writeB
Append one chat turn to the chat log DB. Provenance (host_agent, provider, model_id, conversation_id) is required. Writes are async-queued โ returns the row id immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | ||
| content | Yes | ||
| timeout | No | ||
| user_id | No | ||
| agent_id | No | ||
| cost_usd | No | ||
| database | No | ||
| metadata | No | {} | |
| model_id | Yes | ||
| provider | Yes | ||
| tokens_in | No | ||
| host_agent | Yes | ||
| latency_ms | No | ||
| tokens_out | No | ||
| turn_index | No | ||
| conversation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that writes are async-queued and returns the row id immediately, but lacks further behavioral details (e.g., error handling, idempotency, rate limits). With no annotations, the description carries the burden but is only partially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and resource. No wasted words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 16 parameters and no output schema or annotations, the description is insufficient. It does not describe key parameters like role, content, or optional fields, and provides minimal return value information beyond 'row id'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must add meaning. It only names required provenance fields (host_agent, provider, model_id, conversation_id) but does not explain other required or optional parameters, leaving many parameters undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('append') and resource ('chat log DB'), with a specific verb-object pair. It distinguishes itself from sibling tools like chatlog_search and chatlog_status by being a write operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool over alternatives or when not to use it. The description only states what it does, not the context or prerequisites for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_corpus_listC
Enumerate corpora with row counts.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavioral traits. It only says 'Enumerate corpora with row counts,' lacking disclosure on whether it is read-only, whether authentication is needed, or any side effects. This is insufficient for safe agent usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
At 4 words, the description is too short to be useful. While concise, it sacrifices necessary detail; it does not earn its place as it fails to inform adequately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (listing corpora with counts), the description covers the basic output. However, it omits context about what 'corpora' are, which database is used, and how results are structured, making it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate by explaining the parameters. It does not mention 'timeout' or 'database' at all, leaving agents without context for these fields beyond the schema defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states 'Enumerate corpora with row counts,' which gives a basic verb and resource but fails to specify what 'corpora' refers to in context. It does not clearly distinguish from sibling tools like files_stats or files_search, leaving ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, typical use cases, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_getA
Fetch one record by UUID. Tries file_nodes then leaves.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | ||
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the lookup strategy (file_nodes then leaves), which is a key behavioral trait, but omits details on error handling, return format, or idempotency, especially important since no annotations exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at one sentence, front-loading the core action and key behavioral detail without superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and three parameters, the description is too minimalโit lacks info on return values, error states, parameter constraints, and practical usage context, leaving the agent underinformed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description only semantically enriches the required 'uuid' parameter by indicating it identifies the record; the 'timeout' and 'database' parameters are entirely unspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches one record by UUID and specifies the lookup order across file_nodes and leaves, distinguishing it from sibling tools like files_search which search or files_index which index.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fetching a single record by UUID but does not explicitly guide when to use this tool over alternatives like files_search or when the fallback behavior matters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_healthC
DB integrity + FTS5 sync check. Set rebuild=True to fix drift.
| Name | Required | Description | Default |
|---|---|---|---|
| rebuild | No | ||
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behaviors. It mentions a check and a rebuild action, but does not describe potential side effects (e.g., time consumption, data modification during rebuild), failure modes, or the effect of timeout and database parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with one sentence, which is efficient, but it omits essential information about parameters and usage, making it under-specified rather than effectively concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and annotations, the description is insufficient. It does not explain return values, how rebuild works, the effect of database selection, or timeout behavior. It fails to provide a complete understanding of the tool's capabilities and constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain all parameters. Only 'rebuild' is mentioned. 'timeout' and 'database' have no description, leaving their purpose and acceptable values unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs a DB integrity and FTS5 sync check, and mentions the rebuild capability. It distinguishes itself from sibling tools like files_search and files_index by focusing on health rather than data retrieval or indexing, though it does not explicitly contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool over alternatives, or any prerequisites or conditions. The description implies using rebuild to fix drift but does not explain when that is appropriate or what the default behavior is.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_indexA
Return file-level summaries for triage (wiki-index primitive). Cheap-first retrieval -- no leaf content. Use BEFORE files_search to decide which files are worth deep-reading.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| corpus | No | ||
| corpora | No | ||
| timeout | No | ||
| database | No | ||
| filetype | No | ||
| directory | No | ||
| filename_glob | No | ||
| include_history | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notes 'no leaf content' and 'cheap-first retrieval', indicating the tool returns summaries only and is low cost. Since no annotations are provided, the description carries the full burden; it does not contradict any annotations. However, it omits details about rate limits, authentication, or side effects, though these are not critical for a read-only index tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences that are front-loaded with the core purpose and usage recommendation. Every sentence adds value, with no redundancy or unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 9 parameters and no output schema, the description is minimalist. It captures the high-level intent but lacks details on output format, parameter usage, and behavioral boundaries. It is adequate for a simple index tool but incomplete for fully autonomous use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 9 parameters and zero schema description coverage, the description provides no explanation of parameters like limit, corpus, corpora, database, filetype, etc. This is a significant gap, as the agent would need to infer parameter meanings from names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns file-level summaries for triage as a cheap-first retrieval primitive, distinguishing it from file_search and file_get. It explicitly says 'Use BEFORE files_search to decide which files are worth deep-reading', differentiating among sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance on when to use: 'Use BEFORE files_search to decide which files are worth deep-reading'. It also characterizes the tool as 'cheap-first retrieval', implying it should be used before more expensive operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_searchA
Hybrid FTS5 + vector search over file-ingestion leaves. Default: current versions only. Set include_history=True for time-travel queries. Use corpora for fan-out across multiple corpora.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| corpus | No | ||
| corpora | No | ||
| timeout | No | ||
| database | No | ||
| filetype | No | ||
| include_history | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It discloses the hybrid search nature, defaults, and parameter effects. However, it omits response format, pagination, and potential performance implications, lacking full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and each sentence adds value. No extraneous information, perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers key parameter behaviors but lacks return value description and prerequisites. With no output schema, completeness is moderate. It adequately addresses the main use case but leaves gaps for new users.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It covers include_history and corpora, but ignores limit, timeout, database, filetype, and corpus. This leaves 6 of 8 parameters undocumented, insufficient for a parameter-heavy tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Hybrid FTS5 + vector search over file-ingestion leaves,' clearly identifying the tool's purpose as a search function. It distinguishes from siblings like files_get (retrieve) and files_index (index) by focusing on search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage guidance for key parameters: default current versions, include_history for time-travel, and corpora for multi-corpus fan-out. It does not explicitly contrast with alternatives, but siblings are distinct operations, so no exclusion is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_statsC
Corpus-level counters: file_nodes, leaves, embed coverage, by-filetype.
| Name | Required | Description | Default |
|---|---|---|---|
| corpus | No | ||
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It does not disclose whether the tool is read-only, destructive, requires authentication, or has any limitations. Only the output type is hinted but not detailed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise (one phrase) but lacks structure and completeness. While it has no wasted words, it is too minimal to be fully useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description should provide more context about what the counters represent, how to use parameters, and expected behavior. It only gives a high-level list of outputs, leaving significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the tool description does not explain any of the parameters (corpus, timeout, database). The description adds no meaning beyond the bare schema names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides corpus-level counters such as file_nodes, leaves, embed coverage, and by-filetype. This specific verb and resource combination distinguishes it from sibling tools like files_health (health check) or files_search (search).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. The description does not mention prerequisites, context, or when not to use it. Usage is only implied by its purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
m3_callA
Invoke ANY m3 catalog tool by name without loading its domain โ the low-token path to the full tool surface. Single call: pass tool (e.g. 'files_stats') and args (an object). Batch: pass batch, a list of {tool, args} (each isolated โ one failure won't abort the rest; capped at 100). Set dry_run to validate args + check the destructive gate WITHOUT executing. Returns JSON. Call m3_index first if you don't know a tool's args. Destructive tools require MCP_PROXY_ALLOW_DESTRUCTIVE=1.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| tool | No | ||
| batch | No | ||
| dry_run | No | ||
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully discloses batch isolation, cap at 100, dry_run validation, destructive gate requirement, and JSON return. This is comprehensive behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured and front-loaded with purpose. Every sentence adds value, though could be slightly tighter for the batch and dry_run explanations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given tool complexity and no output schema, description covers invocation modes, error isolation, and destructive gate. Could expand on error handling or response format, but sufficient for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, description explains tool, args, batch, and dry_run but omits timeout and database parameters. Provides meaningful context for key parameters but not complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool invokes any m3 catalog tool by name without loading its domain. It distinguishes itself from siblings like m3_index by advising to call it first if args are unknown.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides guidance on when to use m3_index for unknown args, batch vs single call, and dry_run behavior. Missing explicit when-not-to-use scenarios but sufficiently covers common use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
m3_help_capabilitiesB
Discover m3-memory tool capabilities, parameters, and availability. Allows filtering by a logical domain (memory, chatlog, files, entity, agent, tasks, conversations, admin, diagnostics) or searching by keywords.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| domain | No | ||
| timeout | No | ||
| database | No | ||
| as_records | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It doesn't mention any side effects, whether it's a read-only operation, any required authentication, or what happens when no filters are applied. It doesn't describe the output format or any limitations. Given the lack of annotations, this is a significant gap. However, it doesn't contradict any annotations since none exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with two sentences. It front-loads the primary purpose (discover capabilities) and then adds filtering options. Every sentence earns its place. The only minor issue is that it could be more explicit about the parameters, but overall it's well-structured and succinct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters but zero schema coverage and no output schema, the description is incomplete. It explains the high-level purpose but leaves out critical details like how to use 'query' and 'domain' together, what 'database' refers to, and what 'as_records' does. For a discovery tool that an agent might use to understand other tools, this is a moderate gap. The complexity is moderate, but the description could do more to fill the schema void.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the schema provides no descriptions for the parameters. The description mentions 'query' and 'domain' indirectly (filtering by domain or keywords) and implies 'as_records' might affect output, but it doesn't explain 'timeout', 'database', or the exact format for 'query' and 'domain'. This leaves the agent with significant ambiguity, especially for a tool with 5 parameters and zero schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to discover m3-memory tool capabilities, parameters, and availability. It specifies the resource (m3-memory tools) and the actions (discover, filter). It distinguishes itself by mentioning filtering by domain or keyword search, which differentiates it from siblings like tools_list_domains or memory_search. However, it doesn't explicitly distinguish from all siblings, so it's not a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it's for discovering tool capabilities and availability, with options to filter by domain or search by keywords. It implies when to use this tool (when needing to understand m3-memory tools), but does not explicitly state when not to use it or mention alternatives. Since it's a metadata/discovery tool, the context is clear enough, but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
m3_indexA
List m3 catalog tools (optionally one domain) as structured rows: name, domain, one-line summary, destructive flag, and arg specs (name/type/required). Use this to discover the exact args for any tool before calling it via m3_call โ cheaper than a failed call. Read-only catalog metadata; never returns tool output. Domains: memory, chatlog, files, entity, agent, tasks, conversations, diagnostics, admin.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | ||
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It states 'Read-only catalog metadata; never returns tool output', clearly indicating safety and no side effects. This is sufficient for a catalog tool, though it lacks details on rate limits or auth, which are less critical here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise at 4 sentences, each serving a clear purpose: stating output, providing usage advice, declaring read-only behavior, and listing domains. It is front-loaded with the core function and highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 0% schema description coverage, the description is mostly adequate but misses details on the timeout and database parameters. It covers purpose, usage, behavior, and domains well, but the parameter gap reduces completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must explain all parameters. It partially explains the domain parameter with 'optionally one domain', but completely omits the timeout and database parameters, leaving them unexplained. This is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List m3 catalog tools (optionally one domain) as structured rows'. It specifies the output fields and distinguishes itself from the sibling m3_call by advising to use this tool before calling m3_call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use this to discover the exact args for any tool before calling it via m3_call โ cheaper than a failed call'. It also lists the available domains for filtering. However, it does not specify when not to use it or mention alternatives beyond m3_call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_getA
Retrieves a full MemoryItem; accepts full UUID or 8-char prefix; ambiguous prefixes return an error.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses error behavior for ambiguous prefixes, which adds value beyond a simple 'retrieve'. However, no annotations exist, so the description carries full burden, but it omits details like idempotency or side effects, though implied by 'get'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no filler, all essential information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 3 parameters and no output schema, the description is incomplete: it fails to explain 'timeout' and 'database' parameters, and does not describe the return value structure beyond 'full MemoryItem'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. Only the 'id' parameter is partially described (accepts UUID or prefix), while 'timeout' and 'database' are entirely unmentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it retrieves a full MemoryItem by full UUID or 8-char prefix, distinguishing it from sibling tools like memory_search and memory_write.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the acceptable ID formats and error on ambiguous prefixes, but does not explicitly mention when not to use or provide alternatives like memory_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_searchC
Search across memory items using semantic similarity or keyword matching. Filter by user_id and scope for isolation.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| as_of | No | ||
| query | Yes | ||
| scope | No | ||
| explain | No | ||
| timeout | No | ||
| user_id | No | ||
| variant | No | ||
| database | No | ||
| adaptive_k | No | ||
| as_records | No | ||
| search_mode | No | hybrid | |
| type_filter | No | ||
| agent_filter | No | ||
| recency_bias | No | ||
| conversation_id | No | ||
| requesting_agent | No | ||
| include_bench_data | No | ||
| include_scratchpad | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions search modes but does not disclose side effects (presumably read-only), limitations, or consequences of omitted filters (e.g., potential cross-user exposure). It does not clarify the return format or behavior like pagination or result count.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core action. However, it is too brief to be considered appropriately sized given the tool's complexity; it sacrifices necessary detail for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (19 parameters, no output schema, no annotations), the description is far from complete. It lacks any explanation of return values, parameter usage, search modes, or configuration options. An agent would struggle to invoke this tool correctly with only this description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining parameters. It only mentions user_id and scope, leaving 17 other parameters (k, search_mode, recency_bias, adaptive_k, etc.) entirely unexplained. This is a severe gap for a tool with 19 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: searching memory items via semantic similarity or keyword matching. It also mentions filtering by user_id and scope, which conveys the resource and scope. While it doesn't explicitly differentiate from siblings like memory_get, the verb 'search' and mention of multiple matching modes imply a query-based retrieval tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers minimal guidance on when to use this tool versus alternatives. It hints at isolation filtering but does not explicitly state when to use this over memory_get (retrieval by ID) or memory_write (creation). No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_supersedeA
Explicitly supersede an existing memory with a new one. Use this to record an intentional update โ 'this fact replaces that specific memory' โ when you know the old memory's id. Unlike memory_write's automatic contradiction detection (a cosine + title heuristic that may link the wrong prior memory or none at all), this targets the given old_id deterministically. Non-destructive: the old memory is retained, its validity interval is closed (is_deleted=1, valid_to set), and a 'supersedes' edge is recorded new -> old. The old memory stays retrievable by id and via memory_history, and as_of-filtered search still sees it valid before the supersession point โ it is only dropped from default search. Fields you omit (type, title, importance, scope) are inherited from the old memory, so pass only what changed. To hard-delete instead, that is a separate gated tool (memory_delete). old_id MUST be the full UUID โ a prefix is rejected (full UUID required for mutation safety; memory_get accepts a prefix, this does not). Note: each supersede creates a NEW successor memory; call it once with the full id, do not chain supersedes.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| embed | No | ||
| scope | No | ||
| title | No | ||
| old_id | Yes | ||
| source | No | agent | |
| content | Yes | ||
| timeout | No | ||
| user_id | No | ||
| variant | No | ||
| agent_id | No | ||
| database | No | ||
| metadata | No | {} | |
| model_id | No | ||
| embed_text | No | ||
| importance | No | ||
| valid_from | No | ||
| change_agent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden. It discloses key behaviors: non-destructive operation, retention of old memory, closure of validity interval, recording of 'supersedes' edge, inheritance of omitted fields, requirement for full UUID, and prohibition of chaining. However, it does not explain the many other parameters (e.g., embed, timeout, user_id, etc.) and their effects, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but somewhat lengthy, covering multiple aspects. It is front-loaded with purpose and usage, then behavioral details and parameter notes. While informative, it could be more concise by reducing redundancy (e.g., repeating 'non-destructive' and 'full UUID' points). Still, it is well-structured and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (18 parameters, no output schema, no annotations), the description explains the core functionality well but leaves many parameters (embed, timeout, source, etc.) unexplained. An agent may struggle to use these parameters correctly without additional information. The description is incomplete for fully autonomous use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains only a few parameters: old_id (full UUID required), content (required), and mentions type, title, importance, scope as inheritable. The other 13 parameters (embed, source, timeout, user_id, etc.) are not described, leaving the agent without guidance for their purpose or usage. This is insufficient for a schema with 18 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to explicitly supersede an existing memory with a new one. It contrasts with memory_write's automatic detection, provides specifics on the operation (non-destructive, validity interval closed, supersedes edge), and distinguishes from a hard-delete tool. This is specific and helps differentiate from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool: when the old memory's ID is known and an intentional update is needed. It contrasts with memory_write's automatic detection, advising against using this tool when that automatic linking is sufficient. It also warns not to chain supersedes. This provides clear guidance on usage vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_writeA
Creates a MemoryItem and optionally embeds it for semantic search. Contradiction detection is automatic โ if new content conflicts with an existing memory of the same type/title, the old one is superseded. Use type='auto' to let the LLM decide the best category.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| embed | No | ||
| scope | No | agent | |
| title | No | ||
| source | No | agent | |
| content | Yes | ||
| timeout | No | ||
| user_id | No | ||
| variant | No | ||
| agent_id | No | ||
| database | No | ||
| metadata | No | {} | |
| model_id | No | ||
| valid_to | No | ||
| embed_text | No | ||
| importance | No | ||
| refresh_on | No | ||
| valid_from | No | ||
| change_agent | No | ||
| auto_classify | No | ||
| refresh_reason | No | ||
| conversation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It discloses automatic contradiction detection and superseding behavior, but does not detail side effects or return values for the 22 parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences efficiently convey the primary purpose and a key usage hint. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (22 parameters, no output schema, no annotations), the description is too brief. It fails to cover optional parameters and their effects, making it incomplete for reliable agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description only explains 'type' and 'content' implicitly; the other 20 parameters (e.g., scope, metadata, importance) are undocumented, leaving the agent uninformed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Creates a MemoryItem' with specific verb and resource. It distinguishes from siblings like memory_search and memory_get by indicating creation and embedding for semantic search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description suggests using type='auto' but does not explicitly guide when to use this tool versus alternatives like memory_supersede. Usage context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_listC
List tasks with optional filters. Newest updated first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| state | No | ||
| timeout | No | ||
| database | No | ||
| as_records | No | ||
| owner_agent | No | ||
| parent_task_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for disclosing behavior. It does state 'Newest updated first', which is a useful behavioral detail, but it omits critical aspects like whether the operation is read-only, any side effects, permission requirements, or what happens with filter combinations. For a list operation, the description gives minimal transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, consisting of a single sentence with no fluff. The primary verb and resource are front-loaded. However, the structure is minimal and does not provide any breakdown of filters or usage context, which is acceptable given its brevity but could be improved with a second sentence explaining the filter options.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 7 parameters, no output schema, and no annotations. The description is severely incomplete: it does not explain what the output looks like, how filters interact, what each parameter means, or when to use this tool over siblings. An agent would be left guessing about the semantics of the parameters and the expected result format, making the description insufficient for effective tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% โ the schema provides no descriptions for the 7 parameters. The description only says 'optional filters' without explaining any of the parameters (limit, state, timeout, database, as_records, owner_agent, parent_task_id). This is a critical gap; the description must compensate but fails to provide any semantic meaning for the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'List tasks' with optional filters. It is not a tautology and distinguishes itself from siblings like agent_list or memory_get by focusing on tasks. However, it does not explicitly differentiate itself from other list-type tools or clarify the scope of 'tasks', so it is slightly below a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions 'optional filters' but provides no guidance on when to use this tool versus alternatives such as agent_list or memory_get. There are no explicit exclusions or contextual cues. The only implied usage is that it is for tasks, but no reasoning or selection criteria are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tools_list_domainsA
List m3 tool domains (memory, chatlog, files, entity, agent, tasks, conversations, diagnostics, admin) and their tool counts. Call tools_load_domain to expose a domain's full tool surface.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the full burden. It implies a read-only list operation but does not explicitly state safety, side effects, or permission requirements. Adequate for a simple read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with purpose. No wasted words; each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward list tool with no output schema and simple optional parameters, the description provides the needed domain names and links to the follow-up tool. It does not detail output format or parameter usage, but given the simplicity, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not mention or explain any of the two parameters (timeout, database). It adds no meaning beyond the schema, which is insufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists m3 tool domains and their tool counts, providing specific domain names. It also distinguishes the sibling 'tools_load_domain' by explaining what that tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool (to list domains with counts) and points to an alternative (tools_load_domain) for exposing full tool surface. However, it does not explicitly state when not to use it or list other alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tools_load_domainC
Register a tool domain's full surface for the current MCP session. Use when you need tools beyond the essentials (memory_search, memory_write, memory_get, chatlog_search, chatlog_write, files_search). Valid domains: memory, chatlog, files, entity, agent, tasks, conversations, diagnostics, admin.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | ||
| timeout | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must fully disclose behavioral traits. It does not mention side effects, permissions, session-level impact, or whether loading is additive vs. replacement. Only states 'for the current MCP session' but no further details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences are concise and front-loaded with purpose, but missing parameter info and behavioral details means it is incomplete rather than efficiently written. Could be restructured to include parameter hints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters, no output schema, and no annotations, the description should fully explain usage. It does not mention parameters, return values, or implications of loading a domain. Incomplete for effective tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and description adds no information about any of the three parameters (domain, timeout, database). The required 'domain' parameter is not mentioned, making it impossible for an agent to understand how to invoke correctly from description alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool registers a tool domain's full surface, and the use case distinguishes it from siblings like tools_list_domains. The verb 'register' and noun 'tool domain' are specific, though 'full surface' is slightly jargon.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when you need tools beyond the essentials' and lists those essentials, providing clear context. Lacks explicit when-not-to-use or alternatives but adequate.
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.
4 tool updates
v0.1.20- Changed
agent_list1 field changed- added
Input schema / properties / as_recordsAdded value: +{ + "default": false, + "title": "As Records", + "type": "boolean" +}
- Changed
m3_help_capabilities1 field changed- added
Input schema / properties / as_recordsAdded value: +{ + "default": false, + "title": "As Records", + "type": "boolean" +}
- Changed
memory_search1 field changed- added
Input schema / properties / as_recordsAdded value: +{ + "default": false, + "title": "As Records", + "type": "boolean" +}
- Changed
task_list1 field changed- added
Input schema / properties / as_recordsAdded value: +{ + "default": false, + "title": "As Records", + "type": "boolean" +}
20 tool updates
v0.1.9- Added
agent_list - Added
chatlog_search - Added
chatlog_status - Added
chatlog_write - Added
files_corpus_list - Added
files_get - Added
files_health - Added
files_index - Added
files_search - Added
files_stats - Added
m3_call - Added
m3_help_capabilities - Added
m3_index - Added
memory_get - Added
memory_search - Added
memory_supersede - Added
memory_write - Added
task_list - Added
tools_list_domains - Added
tools_load_domain
11 tool updates
v0.1.7- Removed
agent_list - Removed
files_corpus_list - Removed
files_get - Removed
files_health - Removed
files_index - Removed
files_stats - Removed
memory_search - Removed
memory_supersede - Removed
memory_write - Removed
task_list - Removed
tools_list_domains
9 tool updates
v0.1.6- Removed
chatlog_search - Removed
chatlog_status - Removed
chatlog_write - Removed
files_search - Removed
m3_call - Removed
m3_help_capabilities - Removed
m3_index - Removed
memory_get - Removed
tools_load_domain
20 tool updates
v0.1.2- Changed
agent_list1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
chatlog_search1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
chatlog_status1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
chatlog_write1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
files_corpus_list1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
files_get1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
files_health1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
files_index1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
files_search1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
files_stats1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
m3_call1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
m3_help_capabilities1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
m3_index1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
memory_get1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
memory_search3 fields changed- added
Input schema / properties / explainAdded value: +{ + "default": false, + "title": "Explain", + "type": "boolean" +} - added
Input schema / properties / requesting_agentAdded value: +{ + "default": "", + "title": "Requesting Agent", + "type": "string" +} - added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
memory_supersede1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
memory_write1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
task_list1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
tools_list_domains1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
- Changed
tools_load_domain1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "default": 30, + "title": "Timeout", + "type": "number" +}
20 tool updates
v0.1.0- First observed
agent_list - First observed
chatlog_search - First observed
chatlog_status - First observed
chatlog_write - First observed
files_corpus_list - First observed
files_get - First observed
files_health - First observed
files_index - First observed
files_search - First observed
files_stats - First observed
m3_call - First observed
m3_help_capabilities - First observed
m3_index - First observed
memory_get - First observed
memory_search - First observed
memory_supersede - First observed
memory_write - First observed
task_list - First observed
tools_list_domains - First observed
tools_load_domain
TDQS
Scored across 20 tools
Several meta-tools (tools_list_domains, m3_help_capabilities, m3_index, tools_load_domain, and m3_call) all occupy the discovery/loading/calling space, making their boundaries unclear at a glance. While the core memory/chatlog/files tools are mostly distinct, an agent could easily pick the wrong meta-tool for a given task.
The vast majority of tools follow a consistent `{domain}_{action}` snake_case pattern, e.g. memory_get, chatlog_write, files_search, task_list. The m3_* and tools_* meta-tools deviate slightly but still use lowercase underscore naming and are readable.
At 20 tools, the set sits in the 16-25 range that feels heavy, especially with five meta-tools that could be consolidated. However, the multi-domain scope (memory, chatlog, files, agents, tasks, admin, etc.) provides some justification for the count.
Core memory workflows are well covered with get, search, write, and supersede, and chatlog/files have solid read/search/status surfaces. Minor gaps remain, such as no direct memory_delete or explicit entity/conversation/admin tools, though the m3_index/m3_call meta-layer can reach those catalog tools if needed.
Maintenance
Related MCP Connectors
Persistent memory for AI agents across Claude, ChatGPT and any MCP client.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Persistent memory for AI agents. EU-hosted, privacy-first, hybrid recall, contradiction detection.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceLocal-first persistent memory for AI agents via MCP, enabling semantic search and memory sharing across agents with zero cloud cost and full privacy.12 npm1MIT
- AlicenseNot gradedqualityAmaintenanceProvides persistent memory for AI coding agents via MCP, enabling agents to store and semantically recall facts, events, and lessons across sessions, all running locally without cloud dependencies.Apache 2.0
- AlicenseNot gradedqualityDmaintenanceLocal-first AI memory layer with hybrid retrieval and brain-inspired namespaces. Enables agents to save, search, and manage memories directly via MCP tools.3 npmMIT
- AlicenseAqualityAmaintenanceEmbedded memory and retrieval engine for AI agents, providing local-first memory with MCP support for multi-agent access control.32MIT