memtomem
Supports LangGraph's long-term memory contract via an optional MemtomemBaseStore that implements tuple-namespace memory storage.
Integrates with local Ollama models for embedding generation, enabling semantic search without external API dependencies.
Integrates with OpenAI's embedding models for dense vector search capabilities.
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., "@memtomemsearch my notes for ideas on async Python"
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.
memtomem
Markdown-first long-term memory for AI coding agents β your files stay yours, and core usage is hook-free by default.
π§ͺ Beta β the nine core MCP tools, the
mmCLI, and the format of your memory files and config files change only with anUpgradingnote in the CHANGELOG, and behind a deprecation window where one is possible. Features marked experimental can change or go away without either β see Stability. Feedback and issue reports are especially welcome: Issues Β· Discussions.
memtomem turns your markdown notes, documents, and code into a searchable knowledge base that any AI coding agent can use. Write notes as plain .md files β memtomem indexes them and makes them searchable by both keywords and meaning.
flowchart LR
A["Your files\n.md .json .py"] -->|Index| B["memtomem"]
B -->|Search| C["AI agent\n(Claude Code, Cursor, etc.)"]First time here? Follow the Getting Started guide β you'll have a working setup in under 5 minutes. Claude Code or Codex CLI user? See the Korean vibe-coding quickstart.
Why memtomem?
Problem | How memtomem solves it |
AI forgets everything between sessions | Index your notes once, search them in every session |
Keyword search misses related content | Hybrid search: exact keywords + meaning-based similarity |
Notes scattered across tools | One searchable index for markdown, JSON, YAML, TOML, Python, JS/TS |
Vendor lock-in | Your |
Hidden automation is hard to reason about | Core memory operations run only when you call them; optional client hooks are explicit, removable integrations |
Related MCP server: agent-memory
Quick Start
1. Install
uv tool install 'memtomem[all]' # or: pipx install 'memtomem[all]'
mm --version # verify install[all] bundles the features the sections below describe β ONNX dense embeddings, Korean tokenizer, code chunker, and the Web UI. The Ollama and OpenAI embedding providers need no extra; they work on any install. For a smaller install without those downloads (about 50 MB installed instead of about 340 MB, before any model download), see the minimal install option in the Getting Started guide.
If
mm --versionshows an older version than the latest release right after installing,uvis likely serving cached PyPI metadata β re-run withuv tool install 'memtomem[all]' --refresh, or clear the cache first:uv cache clean memtomem. To upgrade an existing uv tool install, usemm upgraderather than re-runninguv tool install; see the CLI reference for what it preserves and stops.
mm: command not found?uv tool installdrops the shim into~/.local/bin, which isn't on$PATHin fresh shells on macOS/Linux. Runuv tool update-shell, then open a new shell and re-runmm --version.
2. Setup
After upgrading the Claude plugin: re-check
/mcpafter reloading. The plugin launchesmemtomem[onnx]==0.7.2. A manual registration whose launch differs β base-onlymemtomem, or the ONNX launch pinned to an earlier release β no longer matches for deduplication and may expose duplicate tools. Confirm the manual entry's name and scope, then align its launch command with the plugin or remove that redundant registration.
mm init # preset picker, then memory_dir + MCPThe interactive picker starts with three presets β Minimal (BM25, no downloads), English (Recommended) (ONNX multilingual-e5-small + auto-discover providers), Korean-optimized (ONNX multilingual-e5-small + kiwipiepy tokenizer); no preset turns on a reranker β plus an Advanced entry that opens the full 10-step wizard. Preset paths only ask about the memory directory and MCP registration; everything else is set from the preset.
Choose Minimal for the fastest no-download first proof; rerun mm init
later when you are ready to add semantic search.
Indexing vs. discovery (Claude Code): provider memory folders that setup auto-discovers (e.g.
~/.claude/projects/*/memory/) are added to the search index. That is separate from the Web UI's opt-in Context Gateway scan of~/.claude/projects/, which discovers project roots for Skills, Custom Commands, and Subagents β see Configuration β Context Gateway for the distinction and the lossy-slug caveats.
For automation / CI:
mm init --non-interactive # minimal preset, no prompts
mm init --preset korean --non-interactive # Korean-optimized bundle, no prompts
mm init --advanced # force the full 10-step wizardSee Embeddings for the full model/provider matrix.
3. Verify a complete memory round trip
The first success path does not require an existing notes directory or a connected editor:
mm status
mm add "Deployment checklist uses blue-green rollout" --tags ops
mm search "blue-green"mm add writes to your configured user memory directory and indexes the entry immediately. The final command should return the sentence you just added.
Then verify the editor connection:
"Call the mem_status tool"To bring existing notes into the same index, point mm index at a directory that already exists:
mm index /path/to/your/notesmm status --json (or --format json) provides the same status as machine-readable output for scripts and CI.
4. Open the Web UI (optional)
mm web # polished dashboard on http://127.0.0.1:8080
mm web -b # run in the background; logs go to ~/.memtomem/logs/web.log
mm web status # show pid/port/start time
mm web stop # stop the tracked Web UI process
mm web --dev # maintainer surface (adds opt-in pages)mm web shows the polished page set by default. Pass --dev (or set
MEMTOMEM_WEB__MODE=dev in your shell profile) to expose maintainer pages
like Sessions, Working Memory, and Health Report.
Minimal (no bundled model, about 50 MB):
uv tool install memtomem # no extras β no local ONNX model, Web UI or Korean tokenizer until you add them; Ollama/OpenAI embeddings still workOpt in later per-feature: uv tool install --reinstall 'memtomem[onnx,web]' (see the extras table). List every extra you want to keep, because --reinstall replaces the whole set. A plain mm upgrade keeps the extras it detects from the current install, but an explicit mm upgrade --extras list must name the complete set too.
Project-scoped (per-project isolation):
uv add 'memtomem[all]' && uv run mm init # all commands need `uv run` prefixNo install (uvx on demand):
claude mcp add memtomem -s user -- uvx --isolated --from "memtomem[all]==0.7.2" memtomem-serverSee MCP Client Setup for OpenCode / Codex / Cursor / Antigravity / Windsurf / Claude Desktop / Gemini CLI / Kimi Code.
Key Features
Hybrid search β BM25 keyword + dense vector + RRF fusion in one query
Semantic chunking β heading-aware Markdown, AST-based Python, tree-sitter JS/TS, structure-aware JSON/YAML/TOML
Incremental indexing β chunk-level SHA-256 diff; only changed chunks get re-embedded
Namespaces β organize memories into scoped groups with auto-derivation from folder names; review and label them (colour, description) from Settings β Namespaces in the Web UI
Maintenance β near-duplicate detection, time-based decay, TTL expiration, auto-tagging
Web UI β visual dashboard for search, sources, tags, timeline, dedup, and more (
mm web --devfor the full maintainer surface)Context Gateway β keep canonical Skills, Commands, and Subagents in a project or user Store, optionally install reusable assets from a separate Wiki, then push them to supported AI runtimes. See Context Gateway.
MCP tools β
mem_dometa-tool routes all non-core actions incoremode for minimal context usagePredictable core β memory operations run on explicit CLI/MCP calls (
mm add,mem_add,mem_index, etc.). Optional client hooks are installed and removed separately rather than being a hidden runtime default.Scriptable CLI β JSON output for scripts:
--jsononmm status, the write commands (mm add/mm reset/mm purge),mm session start/end/list/events,mm schedule list,mm watchdog status/runandmm doctor, and--json(or--format json) onmm searchandmm recall;mm warmuppre-loads local models so the first query skips the cold-start costScheduled jobs β
mm schedule add/list/run-now/delete(ormem_do(action="schedule_*")) for cron-driven compaction, importance decay, dead-link cleanup, and dedup scansPinned Context β keep small user/project/agent Markdown blocks ahead of retrieved results with
mm pinned composeLangGraph Store β optional
MemtomemBaseStoreimplements LangGraph's tuple-namespace long-term-memory contractHybrid LangGraph Store β
MemtomemHybridStoreadds dedicated SQLite persistence, BM25/dense/RRF retrieval, TTL, and diagnostics
Stability
memtomem is beta (0.x). The nine core MCP tools, the mm CLI, and the
format of your memory files and config files change only with an Upgrading
note in the CHANGELOG, and behind a deprecation window where
one is possible. Other features not listed below are supported β maintained,
with their changes recorded in the CHANGELOG β without that guarantee.
These are experimental β their behaviour, output or format can still change or go away without a window, because a decision that shapes them is still open or an LLM writes what they produce:
Multi-agent memory β
mem_agent_register,mem_agent_search,mem_agent_shareand per-agent session scopes (mem_session_startwithagent_id). Open decisions: #1477, #1478.Memory export and import bundles β
mem_export/mem_importand the Web export/import. How a backup made before 0.7.0 (bundle v1βv3) that holds project memories should be restored is still open.LLM-written output β anything memtomem's configured LLM (
MEMTOMEM_LLM__ENABLED=true) writes: LLM auto-tagging and entity extraction,strategy="llm"query expansion, LLM consolidation and policy summaries, session auto-summaries, source summaries (indexing.auto_summarize) and contextual chunk enrichment (indexing.enrich_chunk_context). The rule-based modes beside them β keyword auto-tagging, regex entity extraction,tags/headingsexpansion, heuristic consolidation summaries β are supported.Claude projects scan in the Context Gateway (
MEMTOMEM_CONTEXT_GATEWAY__EXPERIMENTAL_CLAUDE_PROJECTS_SCAN).Antigravity CLI plugin (
packages/memtomem-antigravity-plugin/).
Ecosystem
Package | Description |
Core β MCP server, CLI, Web UI, hybrid search, storage | |
Exact-pinned MCP server and nine slash-command workflows | |
Optional hooks for prompt-time search and write-time indexing | |
Exact-pinned MCP server and nine workflows for Codex CLI | |
OpenCode β exact-pinned MCP, commands, read skills, safe permissions | |
Skill bundle for Kimi Code (not a plugin) | |
Exact-pinned MCP server and six workflow skills for Hermes Agent | |
Recall-only Hermes memory provider that adds relevant notes to each turn | |
Exact-pinned MCP server and nine workflow skills for | |
STM proxy β proactive memory surfacing via tool interception |
Documentation
Hosted at memtomem.com β also available as Markdown in this repo. New to memtomem? The guides have a suggested reading order. The table below follows it, with the two runnable examples placed after the first-run guides:
Guide | Description |
Install, configure, save and find your first memory | |
Claude CodeΒ·Codex CLIμμ 10~15λΆ μμ κΈ°μ΅ μ μ₯Β·κ²μ | |
Editor-specific configuration | |
Claude CodeΒ·Codex CLIΒ·Kimi Code μμ°¨ 곡λ κ°λ° | |
Nine runnable scenarios for multi-tool developers, personal knowledge bases, and teams | |
κ°λ° μμ μΈκ³Β·μ ν μμ¬κ²°μ Β·μ¨λ³΄λ©: λͺ¨λΈ μλ 체ν, κΈ°λ‘ μμ, 2μ£Ό νμΌλΏ | |
Notebooks: start with 00 to recover decisions, code, and settings across 150 synthetic files without a model (Korean); 01β04 teach APIs, 05β06 teach LangGraph. Sample: recover a decision and its ADR source across sessions, with an isolated CLI proof and copyable prompts | |
Index existing notes, search, and manage memories | |
Export and import, importers, | |
Namespaces, deduplication, decay, tagging, orphan cleanup, and | |
Policies and scheduled jobs | |
Pinned-first composition, the approval queue, and LangGraph stores | |
ONNX, Ollama, and OpenAI embedding providers | |
Ollama, OpenAI, Anthropic, and compatible endpoints | |
Supported config files, precedence, and | |
Share Skills, Commands, and Subagents across your AI tools from one Store | |
Sync markdown memories across personal devices via a private git repo | |
Web UI, privacy audits, diagnostics, and recovery | |
Clean removal steps | |
Complete tool and workflow reference |
Contributing
See CONTRIBUTING.md for setup instructions and the contributor guide.
License
Apache License 2.0. Contributions are accepted under the terms of the Contributor License Agreement.
Available Tools
9 toolsmem_addA
Add a new memory entry to a markdown file and immediately index it.
The entry is appended to the target file (or a new timestamped file is
created in the first configured memory directory), then re-indexed so it
is immediately searchable.
All content is scanned for secrets before any filesystem write; a match
rejects the write. See ``force_unsafe`` below for the one escape hatch
and ``mem_add_redaction_stats`` for the outcome counters.
Args:
content: The memory content to store
title: Optional heading title for the entry
tags: Optional tags for categorisation
file: Target .md filename (relative or absolute). If omitted, a
timestamped file is created in the first memory_dir.
namespace: Assign indexed chunks to this namespace (default: config default)
template: Use a built-in template (adr, meeting, debug, decision,
procedure). Content can be JSON with field values or plain text.
force_unsafe: When True, bypass the redaction guard for this call
even when content matches a secret pattern. Use only
when matches are known false positives (e.g.,
documenting an example credential schema). The bypass
is recorded with a ``bypassed`` outcome and an audit
line, and it never applies to
``scope="project_shared"`` β that combination is
hard-refused, because git history cannot be retracted
from clones.
scope: Write tier: ``user`` (default), ``project_local``, or
``project_shared``.
confirm_project_shared: Required explicit consent for a Git-tracked
``project_shared`` write.
idempotency_key: Optional key (max 256 chars) making this write
idempotent for 24h β a retry with the same key
returns the original result and writes nothing.
Only successful writes are recorded, so a failed
call may be retried with the same key. Without a
key, semantics are at-least-once.
allow_namespace_mix: Append even if ``file`` holds another
namespace (refused by default).
Returns a confirmation message, plus a duplicate warning when a
near-identical memory already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| tags | No | ||
| scope | No | user | |
| title | No | ||
| content | Yes | ||
| template | No | ||
| namespace | No | ||
| force_unsafe | No | ||
| idempotency_key | No | ||
| allow_namespace_mix | No | ||
| confirm_project_shared | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so: content is scanned for secrets before any filesystem write, a match rejects the write, bypasses are audited as 'bypassed' and never apply to project_shared because git history cannot be retracted from clones. It also discloses idempotency semantics (24h, only successful writes recorded, at-least-once without a key) and a near-duplicate warning on return.
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 summary and return behavior are front-loaded before the Args block, and nearly every clause carries operational information. It is long, and a few parenthetical asides (e.g., the example credential schema) could be trimmed, but nothing is filler.
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 an 11-parameter mutation tool with zero annotation coverage, the description covers safety guards, escape hatches, consent requirements, idempotency, namespace conflict handling, and the confirmation-plus-duplicate-warning return, so an agent needs nothing else to call it correctly.
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 and does: every one of the 11 params gets meaning beyond its title, including file defaulting to a timestamped file in the first memory_dir, namespace defaulting to config, the five built-in templates, the 256-char/24h idempotency contract, and allow_namespace_mix overriding a default refusal.
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 first sentence pairs a specific verb with a specific resource and outcome: 'Add a new memory entry to a markdown file and immediately index it.' That distinguishes it in spirit from mem_read/mem_search/mem_index, but it never names a sibling or explicitly says when a caller should prefer mem_add over mem_do or mem_index, so it falls short of 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?
It gives concrete decision guidance inside the parameters: use force_unsafe only for known false positives, that force_unsafe is hard-refused with scope=project_shared, and that confirm_project_shared is required for Git-tracked writes. It doesn't route between this tool and its siblings, so it is clear context without explicit exclusions at the tool-selection level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_doB
Execute a memtomem action by name.
This is the gateway to all advanced memtomem features beyond the
core tools (search, add, index, recall, status, stats, list, read).
action="help" lists every action grouped by category;
params={"category": "<name>"} adds per-parameter detail and, for some
categories, usage notes.
Common aliases resolve automatically (e.g. "orphans" β
"cleanup_orphans", "health" β "eval").
Args:
action: The action name (e.g. "session_start", "tag_list", "help")
params: Optional dict of parameters for the action
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| params | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: it never says whether actions mutate data, which are destructive (e.g. "cleanup_orphans" is mentioned only as an alias example), what permissions or preconditions apply, or how failures are reported. The alias-resolution note and help behavior are genuinely useful, but for a catch-all gateway spanning many unknown operations this leaves the agent guessing at risk.
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?
Front-loaded with the purpose, then the scoping statement, then the discovery mechanism β a sensible order with no filler. The Args block largely restates the schema and the example aliases, so it is slightly padded but still short.
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?
An output schema exists, so return values need not be described, and the help/discovery path covers the missing action catalog by design. Still, for a two-parameter gateway with zero schema coverage and no annotations, the description should say more about mutation risk and about what params keys look like per category rather than deferring everything to a runtime call.
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 that action is an action name with examples and that params is an optional dict of action-specific parameters. That is a meaningful addition, but the actual keys of params remain entirely opaque and the agent must make a discovery call to learn them.
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?
States a specific verb and resource ("Execute a memtomem action by name") and positions itself as the gateway to features beyond the core tools, explicitly listing the core tools it is not (search, add, index, recall, status, stats, list, read). The one gap is that the set of valid actions is never enumerated, so the agent knows the category of the tool but not its surface.
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?
Clearly scopes use to advanced features not covered by the named core tools, which effectively routes the agent away from this tool for common operations. It also gives a concrete discovery path (action="help", plus params={"category": ...} for per-parameter detail). It stops short of explicit when-not conditions or a mapping of which advanced action to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_indexB
Index or re-index markdown files for hybrid search.
Args:
path: File or directory path to index
recursive: Whether to recurse into subdirectories (default True)
force: If True, re-index all files even if unchanged (default False)
namespace: Assign all indexed chunks to this namespace
auto_tag: If True, run keyword-based auto-tagging on newly indexed chunks
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | . | |
| force | No | ||
| auto_tag | No | ||
| namespace | No | ||
| recursive | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the entire behavioral burden for what is a write/mutation operation. It discloses the force semantics (unchanged files are normally skipped) which is genuinely useful, but says nothing about whether removed or renamed files leave stale index entries, whether deletion is possible, what 'hybrid search' entails (embeddings? keyword?), cost/duration, or concurrency behavior during re-index.
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?
Front-loaded one-sentence purpose followed by an Args block where each line adds distinct information. No filler, no restatement of the title, no redundant syntax notes.
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?
An output schema exists, so return values need not be explained, and the parameter block covers the inputs well. But for an unannotated ingestion tool whose side effects persist in a searchable store, the absence of any note on staleness, incremental-vs-full semantics beyond force, or failure/partial-index behavior leaves the agent unable to predict consequences of calling it.
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, and it largely does: all five parameters are described with meaning and defaults, and 'force: re-index all files even if unchanged' and 'auto_tag: keyword-based auto-tagging on newly indexed chunks' convey behavior not derivable from the schema titles. The namespace entry is thin β it says chunks are assigned but not what a namespace scopes or whether the search must reuse the same value.
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?
States a specific verb (index / re-index) and resource (markdown files) plus the downstream purpose (hybrid search). It is clearly distinguishable from read-oriented siblings like mem_search or mem_read, but never contrasts itself with mem_add, which also appears to ingest content β a missed differentiation rather than a clarity failure.
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?
Usage is implied by the phrase 'index or re-index' and by the force parameter ('re-index all files even if unchanged'), so an agent can infer when to use incremental vs forced runs. However, there is no explicit when-not guidance, no statement of prerequisites (does the store need to be initialized? does mem_add already cover this?), and no pointer to alternatives among the many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_listA
List indexed source files with chunk counts, one page at a time.
Args:
source_filter: Filter by source file path (substring match, or glob pattern with *, ?, [])
namespace: Only list sources containing chunks in this namespace
limit: Files per page (1-500, default 50)
cursor: Where to resume; copy it from the previous page's "More:" line
Examples:
mem_list(source_filter="*.md") β markdown files (glob)
mem_list(namespace="work") β files in the "work" namespace
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| namespace | No | ||
| source_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a solid job: it discloses pagination, the 1-500 bound with a default of 50, and that the cursor must be copied from the previous response's 'More:' line. It doesn't state permission requirements, behavior on an empty result, or ordering of results.
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?
Front-loaded one-line summary, then a compact Args block, then two illustrative examples. Every line adds information; nothing repeats the schema without adding meaning.
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?
An output schema exists, so return structure needn't be explained, and the description still usefully notes chunk counts and the 'More:' pagination line. Minor gaps remain around ordering and empty-result behavior for a list tool with no annotations.
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 entirely β and it does: source_filter semantics (substring vs glob with *, ?, []) , namespace scoping, limit range and default, and cursor provenance are all spelled out. These are details the bare schema does not convey.
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 first sentence names a specific verb and resource β 'list indexed source files with chunk counts' β and adds the pagination scope ('one page at a time'). That clearly separates it from retrieval siblings like mem_search or mem_read, though no sibling is named explicitly.
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 two examples show concrete call patterns (glob filtering, namespace filtering), which gives an agent clear use contexts. However, there is no explicit when-not guidance β nothing says to use mem_search instead when you need content matching, or that listing is the discovery step before reading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_readA
Read a chunk's content and metadata by UUID.
Inspect a chunk before editing, or see the text behind a search
preview. Ids resolve in the current project's scope; another's
reads as not found.
Args:
chunk_id: The chunk's UUID (from mem_search results)
| Name | Required | Description | Default |
|---|---|---|---|
| chunk_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses project-scoped ID resolution and the specific failure mode that out-of-scope IDs 'read as not found.' That is real behavioral information beyond the schema. It doesn't discuss permissions or limits, so not a 5.
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 purpose and the scoping caveat are front-loaded in two short paragraphs, and nothing is padded. The trailing 'Args:' block is somewhat redundant with the schema, but it carries the useful provenance hint, so it still earns its place.
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 single-parameter read tool with an output schema covering return values, everything an agent needs is present: what it returns, when to call it, how IDs resolve, and what happens on a cross-project miss. Nothing material is missing.
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 compensate, and it does: chunk_id is described as 'The chunk's UUID (from mem_search results),' telling the agent both the format and where to obtain the value. That is the key semantic the bare string schema lacks.
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 first line states a specific verb and resource β 'Read a chunk's content and metadata by UUID' β which is clearly distinct from sibling list/search tools like mem_search or mem_list. It stops short of explicitly naming a sibling it replaces, but the retrieval-by-identifier framing does the disambiguation work.
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 gives concrete call situations: 'Inspect a chunk before editing, or see the text behind a search preview.' That tells an agent exactly when this beats mem_search. No explicit when-not or prerequisite conditions are stated, keeping it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_recallA
Recall memories created within a date range.
Returns chunks ordered by creation date (newest first).
Args:
since: Inclusive start date (YYYY, YYYY-MM, YYYY-MM-DD, or ISO datetime)
until: Exclusive end date β same formats as *since*
source_filter: Filter by source file path (substring match, or glob pattern with *, ?, [])
tag_filter: Comma-separated tags, matching ANY; applied before *limit*.
namespace: Namespace scope β single, comma list, or glob ("project:*"), not both.
limit: Maximum number of chunks to return (default 20)
output_format: Output format β "compact" (default, human-readable) or "structured"
(JSON for machine parsing, includes trust-UX hints as a "hints" field).
scope: ADR-0011 scope-axis filter β single, comma list (``user,project_local``),
or glob (``project_*``), not both. Omitted, the default merge applies:
in-project recalls return ``user`` + that project's tiers, out-of-project
``user`` only.
Examples::
mem_recall(since="2025-01", until="2025-03")
mem_recall(since="2025-06-01", source_filter="notes")
mem_recall(namespace="work", limit=10)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| scope | No | ||
| since | No | ||
| until | No | ||
| namespace | No | ||
| tag_filter | No | ||
| output_format | No | compact | |
| source_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does real disclosure work: it states results are ordered newest-first, that tag_filter is applied before limit, and β critically β the default scope-merge behavior (user + project tiers in-project, user only out-of-project). It omits any permission/auth notes and doesn't say what happens when since/until are omitted.
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 one-line summary and return-ordering statement are front-loaded, followed by a clean Args list and concrete examples. It runs long, but nearly every line adds operative detail; only the ADR-0011 reference is jargon an agent can't act on.
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?
An output schema exists so return shapes needn't be spelled out, and the description still covers ordering, default limit, and scope defaults. The notable gap is behavior when all filters are null β it's unclear whether that means 'all memories' or requires since/until.
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 carries the full burden and does so: every one of the 8 parameters gets meaning beyond its name, including accepted date formats, glob/substring matching semantics, ANY-tag matching order relative to limit, mutual exclusivity of single-vs-glob for scope, and the hints field in structured output.
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?
States a specific verb and resource: 'Recall memories created within a date range', with return ordering clarified. However, it frames the tool narrowly as a date-range recall even though scope/source/tag/namespace filters make it a general listing tool, and it never distinguishes itself from siblings like mem_list or mem_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 Examples block shows three call patterns but gives no explicit when-to-use guidance or exclusions relative to mem_search, mem_list, or mem_read. An agent must infer that this is the unfiltered-by-content listing tool rather than a search tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_searchA
Search across indexed memory files using hybrid BM25 + semantic search.
Args:
query: Natural language search query
top_k: Number of results to return (default 10)
source_filter: Source path filter β substring, or glob with *, ?, []
tag_filter: Comma-separated tags; matches chunks carrying ANY of them
namespace: Namespace scope β value, comma list (``work,personal``) or
glob (``proj:*``), not both. Omitted, system namespaces are hidden;
naming one includes it.
as_of: Temporal bound for retroactive search β ``YYYY-MM-DD`` or
``YYYY-QN``, default now. Chunks whose ``valid_from`` /
``valid_to`` frontmatter excludes that point drop out; chunks
without those keys are always valid. Time decay anchors here,
not to the wall clock.
bm25_weight: RRF weight for keyword matches (default 1.0; raise to favor)
dense_weight: RRF weight for meaning matches (default 1.0). Both must be
finite and >= 0, not both zero; 0 disables that leg
context_window: Expand each result with Β±N adjacent chunks (0 = off).
Neighbours follow the namespace/scope/validity visibility rules,
not the tag/type/date filters
verbose: Deprecated β use output_format="verbose"
output_format: "compact" (default), "verbose" (adds UUID / pipeline stats),
or "structured" (JSON). A non-default value overrides ``verbose``.
scope: ADR-0011 tier filter β value, comma list (``user,project_local``)
or glob (``project_*``), not both. Omitted, the default merge
applies: inside a project ``user`` + that project's tiers, outside
one ``user`` only. Pass ``project_shared`` from outside a project to
search across projects.
rerank: ``false`` skips the cross-encoder stage and collapses the pool
to ``top_k`` β the fast path for latency-bounded callers, so it
narrows recall as well as changing the score scale. Omitted/``true``
follows server config; ``true`` cannot enable reranking a server has
disabled.
record: ``false`` = background read, for fan-out callers: no
access-count increments, no query history, caches neither read
nor filled β so results can differ from a cached answer.
A count below ``top_k`` can mean filters excluded candidates or the index
holds no more. Raising ``top_k`` widens the request; it does not promise
more results.
``output_format="structured"`` adds a top-level ``score_scale`` naming the
scale ``score`` is on: ``rerank`` (model-dependent range; ``reranker`` names
the model), ``rrf``, ``bm25``/``dense``, or ``none`` (filter-only β no
relevance scale). Compare scores only within one scale, and only across
servers with the same optional modifier stages enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ||
| query | Yes | ||
| scope | No | ||
| top_k | No | ||
| record | No | ||
| rerank | No | ||
| verbose | No | ||
| namespace | No | ||
| tag_filter | No | ||
| bm25_weight | No | ||
| dense_weight | No | ||
| output_format | No | compact | |
| source_filter | No | ||
| context_window | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: it discloses namespace/scope visibility defaults, as_of validity semantics, rerank server-config limitations, record side effects (no cache/history), and score-scale caveats.
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?
Well structured and front-loaded: the first sentence states the tool's purpose, followed by parameter details and caveats. The length is largely justified by 14 parameters and no schema descriptions, though the final scoring-scale paragraph is reference-manual depth rather than essential invocation guidance.
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, 14 parameters, no annotations, and a present output schema, the description is complete enough for correct invocation. It covers visibility rules, parameter interactions, deprecated fields, output formats, and scoring caveats without needing to duplicate the output schema.
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 there are 14 parameters, so the description must compensate. It documents every argument, including defaults, allowed forms, constraints (both weights finite and not both zero), deprecation behavior, and nuanced semantics such as glob filters and context-window neighbor rules.
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?
States a specific verb ('Search') and resource ('indexed memory files'), plus the retrieval mechanism ('hybrid BM25 + semantic search'). It does not explicitly differentiate itself from siblings such as mem_recall or mem_list, so it falls short of 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?
Provides useful usage contexts for rerank=false (latency-bounded callers), record=false (fan-out callers), namespace omission, scope defaults, and top_k expectations. However, it gives no explicit guidance on when to use this tool versus sibling tools like mem_recall or mem_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_statsA
Return current memory index statistics: total chunks, sources, and storage backend.
Use this to quickly assess how many memories are indexed before searching.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the tool takes zero parameters and has an output schema, so the behavioral surface is small. The description implies a read-only inspection and lists the returned fields, but says nothing about side effects, auth needs, or whether the index is recomputed or cached β modest but not rich disclosure.
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, zero waste, with the return contents front-loaded. The second sentence adds genuine routing value rather than restating the first, though it stops short of the differentiation that would make it fully earned.
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 zero-parameter read tool with an existing output schema, the description covers purpose and a usage moment adequately; the output schema carries the return shape. The only notable gap is disambiguation from the very similarly named mem_status sibling.
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 tool takes no parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly avoids inventing 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?
States a specific verb (Return) and resource (memory index statistics), and even enumerates the returned fields: total chunks, sources, storage backend. It does not, however, distinguish itself from the similarly named sibling mem_status, leaving ambiguity an agent must resolve on its own.
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 sentence 'Use this to quickly assess how many memories are indexed before searching' gives one clear usage context. It names no exclusions and never contrasts with mem_status, mem_list, or mem_search, so an agent cannot tell from the description alone when stats is preferable to status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_statusA
Show indexing statistics and current configuration summary.
Reports storage backend, embedding info, chunk/source counts, and warns
about orphaned source files (indexed but gone from disk β run
mem_cleanup_orphans).
Configuration drift adds a ``Warnings`` block. Each entry has ``kind``
(an open enum β tolerate unrecognised values rather than erroring),
``fix`` and an optional ``doc`` link. Some kinds add their own keys:
embedding mismatches carry ``stored``/``configured``;
``concurrent_server_writers`` may carry ``same_parent``. These keys are
stable across versions, so probes can pattern-match on them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: it discloses that configuration drift produces a Warnings block, that kind is an open enum to be tolerated rather than errored on, and that certain keys (stored/configured, same_parent) are stable across versions. It never explicitly states read-only/side-effect behavior beyond the word 'show', which keeps it from a 5.
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?
Front-loaded with the purpose and what it reports, then the warning semantics. Information-dense with no filler, though the second paragraph of key-level detail is fairly dense for a description and could be trimmed if the output schema already covers field names.
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?
An output schema exists, so return-value enumeration is not required, and the description appropriately adds only the semantics the schema can't convey (open enum tolerance, key stability, drift warnings). Combined with the mem_cleanup_orphans handoff, an agent has what it needs to call and interpret it.
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 tool takes zero parameters, so the baseline is 4. The description correctly makes no parameter claims and instead spends its budget on result semantics.
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?
States a specific verb+resource: 'Show indexing statistics and current configuration summary,' and enumerates what is reported (storage backend, embedding info, chunk/source counts, orphan warnings). It does not differentiate itself from the sibling mem_stats, which plausibly overlaps, so it stops short of 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 gives one concrete routing rule β when orphaned source files are reported, run mem_cleanup_orphans β which is genuinely actionable. However, it never says when to use mem_status versus mem_stats or mem_list, leaving the most likely ambiguity unresolved.
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.
9 tool updates
v0.1.0- First observed
mem_add - First observed
mem_do - First observed
mem_index - First observed
mem_list - First observed
mem_read - First observed
mem_recall - First observed
mem_search - First observed
mem_stats - First observed
mem_status
TDQS
Scored across 9 tools
Most core tools have clear distinct purposes, but mem_stats and mem_status overlap heavily in reporting index statistics and storage backend. mem_do is also a catch-all gateway that can blur boundaries with the explicit core tools, though its description says it covers advanced features beyond them.
All tools follow a consistent mem_ prefix with snake_case, and use recognizable verb/resource names such as mem_read, mem_search, mem_list, and mem_add. mem_do is broad but still fits the established naming pattern.
Nine tools is well-scoped for a memory indexing and retrieval server, with core operations exposed directly and advanced functionality consolidated behind mem_do. Each tool earns its place without an excessive surface.
The surface covers the main memory lifecycle: add, index, search, recall, list, read, and stats/status, plus mem_do for advanced actions. However, there are no explicit update or delete tools in the direct surface, so those workflows depend on the gateway or are minor gaps.
Maintenance
Related MCP Connectors
Hosted MCP memory for coding agents: persistent across sessions, editable markdown, team sharing.
Long-term memory for AI coding agents: durable project facts, recalled by every MCP client.
Team memory for AI coding agents and code reviews, reviewed by humans and served over MCP.
Token-efficient MCP memory for Markdown vaults. Tiered search, GraphRAG, AI memories.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenancePersonal unified memory system for AI coding agents, providing persistent memory with hybrid RAG retrieval via MCP integration, allowing agents to store, search, and manage memories locally.1MIT
- AlicenseAqualityAmaintenanceLocal, searchable project memory for AI coding agents. Markdown source of truth, MCP interface, safe structured updates315Apache 2.0
- AlicenseBqualityDmaintenanceLocal-first memory server for AI coding agents that stores work sessions, tasks, and durable memories in Markdown files, exposed through MCP tools for session management and memory retrieval.104 npm1MIT
- FlicenseNot gradedqualityFmaintenancePersistent memory for MCP-powered coding agents, allowing LLMs to remember preferences, project context, and decisions across sessions via Markdown files.29 npm-