Skip to main content
Glama

memtomem

Markdown-first long-term memory for AI coding agents β€” your files stay yours, and core usage is hook-free by default.

PyPI Downloads GitHub stars Python 3.12+ License: Apache 2.0 CLA Safety

πŸ§ͺ Beta β€” 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. 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 .md files are the source of truth. The DB is a rebuildable cache

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 --version shows an older version than the latest release right after installing, uv is likely serving cached PyPI metadata β€” re-run with uv tool install 'memtomem[all]' --refresh, or clear the cache first: uv cache clean memtomem. To upgrade an existing uv tool install, use mm upgrade rather than re-running uv tool install; see the CLI reference for what it preserves and stops.

mm: command not found? uv tool install drops the shim into ~/.local/bin, which isn't on $PATH in fresh shells on macOS/Linux. Run uv tool update-shell, then open a new shell and re-run mm --version.

2. Setup

After upgrading the Claude plugin: re-check /mcp after reloading. The plugin launches memtomem[onnx]==0.7.2. A manual registration whose launch differs β€” base-only memtomem, 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 + MCP

The 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 wizard

See 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/notes

mm 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 work

Opt 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` prefix

No install (uvx on demand):

claude mcp add memtomem -s user -- uvx --isolated --from "memtomem[all]==0.7.2" memtomem-server

See 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 --dev for 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_do meta-tool routes all non-core actions in core mode for minimal context usage

  • Predictable 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: --json on mm status, the write commands (mm add / mm reset / mm purge), mm session start / end / list / events, mm schedule list, mm watchdog status / run and mm doctor, and --json (or --format json) on mm search and mm recall; mm warmup pre-loads local models so the first query skips the cold-start cost

  • Scheduled jobs β€” mm schedule add/list/run-now/delete (or mem_do(action="schedule_*")) for cron-driven compaction, importance decay, dead-link cleanup, and dedup scans

  • Pinned Context β€” keep small user/project/agent Markdown blocks ahead of retrieved results with mm pinned compose

  • LangGraph Store β€” optional MemtomemBaseStore implements LangGraph's tuple-namespace long-term-memory contract

  • Hybrid LangGraph Store β€” MemtomemHybridStore adds 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_share and per-agent session scopes (mem_session_start with agent_id). Open decisions: #1477, #1478.

  • Memory export and import bundles β€” mem_export / mem_import and 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/headings expansion, 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

memtomem

Core β€” MCP server, CLI, Web UI, hybrid search, storage

Claude Code plugin

Exact-pinned MCP server and nine slash-command workflows

Claude Code automation plugin

Optional hooks for prompt-time search and write-time indexing

Codex plugin

Exact-pinned MCP server and nine workflows for Codex CLI

opencode-memtomem

OpenCode β€” exact-pinned MCP, commands, read skills, safe permissions

Kimi Code skills

Skill bundle for Kimi Code (not a plugin)

Hermes Agent plugin

Exact-pinned MCP server and six workflow skills for Hermes Agent

Hermes memory provider

Recall-only Hermes memory provider that adds relevant notes to each turn

Antigravity CLI plugin

Exact-pinned MCP server and nine workflow skills for agy β€” experimental

memtomem-stm

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

Getting Started

Install, configure, save and find your first memory

ν•œκ΅­μ–΄ λ°”μ΄λΈŒμ½”λ”© λΉ λ₯Έ μ‹œμž‘

Claude CodeΒ·Codex CLIμ—μ„œ 10~15λΆ„ μ•ˆμ— κΈ°μ–΅ μ €μž₯·검색

MCP Client Setup

Editor-specific configuration

Cross-runtime handoff

Claude CodeΒ·Codex CLIΒ·Kimi Code 순차 곡동 개발

Use cases

Nine runnable scenarios for multi-tool developers, personal knowledge bases, and teams

ν”„λ‘œμ νŠΈ 업무별 μ²΄ν—˜

개발 μž‘μ—… μΈκ³„Β·μ œν’ˆ μ˜μ‚¬κ²°μ •Β·μ˜¨λ³΄λ”©: λͺ¨λΈ μ—†λŠ” μ²΄ν—˜, 기둝 양식, 2μ£Ό 파일럿

Example notebooks and coding-agent sample

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

Core memory tools

Index existing notes, search, and manage memories

Data, config & CLI

Export and import, importers, mm config, and the full CLI reference

Organization & maintenance

Namespaces, deduplication, decay, tagging, orphan cleanup, and mm doctor

Automation

Policies and scheduled jobs

Pinned Context

Pinned-first composition, the approval queue, and LangGraph stores

Embeddings

ONNX, Ollama, and OpenAI embedding providers

LLM Providers

Ollama, OpenAI, Anthropic, and compatible endpoints

Configuration

Supported config files, precedence, and MEMTOMEM_* variables

Context Gateway

Share Skills, Commands, and Subagents across your AI tools from one Store

Multi-device sync

Sync markdown memories across personal devices via a private git repo

Operations & troubleshooting

Web UI, privacy audits, diagnostics, and recovery

Uninstalling memtomem

Clean removal steps

Reference

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 tools
mem_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.
NameRequiredDescriptionDefault
fileNo
tagsNo
scopeNouser
titleNo
contentYes
templateNo
namespaceNo
force_unsafeNo
idempotency_keyNo
allow_namespace_mixNo
confirm_project_sharedNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate 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.

Purpose4/5

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.

Usage Guidelines4/5

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
NameRequiredDescriptionDefault
actionYes
paramsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate; it explains 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.

Purpose4/5

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.

Usage Guidelines4/5

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
NameRequiredDescriptionDefault
pathNo.
forceNo
auto_tagNo
namespaceNo
recursiveNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must 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.

Purpose4/5

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.

Usage Guidelines3/5

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
NameRequiredDescriptionDefault
limitNo
cursorNo
namespaceNo
source_filterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate 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.

Purpose4/5

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.

Usage Guidelines4/5

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)
NameRequiredDescriptionDefault
chunk_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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)
NameRequiredDescriptionDefault
limitNo
scopeNo
sinceNo
untilNo
namespaceNo
tag_filterNo
output_formatNocompact
source_filterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_statsA

Return current memory index statistics: total chunks, sources, and storage backend.

Use this to quickly assess how many memories are indexed before searching.
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 9 tool updatesv0.1.0
    • First observedmem_add
    • First observedmem_do
    • First observedmem_index
    • First observedmem_list
    • First observedmem_read
    • First observedmem_recall
    • First observedmem_search
    • First observedmem_stats
    • First observedmem_status

TDQS

A3.9/5.0

Scored across 9 tools

Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Personal 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.
    1
    MIT
  • F
    license
    Not graded
    quality
    F
    maintenance
    Persistent memory for MCP-powered coding agents, allowing LLMs to remember preferences, project context, and decisions across sessions via Markdown files.
    29 npm
    -