Skip to main content
Glama

ai-memory-mcp

English | 繁體中文

Local, Markdown-first shared memory for AI coding agents, served over MCP.

Every session of every tool (Claude Code, Codex CLI, Copilot CLI, ...) starts with amnesia. This gives them one shared place to record decisions, dead ends and handoffs, and to look them up next time, so you stop re-explaining your project.

Status: feature-complete, provided as-is. This is a small tool I use myself. I do not offer support and I am not taking feature requests. Bug reports may go unanswered. Fork it freely (MIT).

Why this one

  • Plain Markdown is the source of truth. One .md file per memory: readable, greppable, diffable, committable.

  • The index is disposable. SQLite only accelerates search. Delete index.db and it is rebuilt from your notes.

  • Local and private. No cloud, no account. Optional semantic search uses a local Ollama model.

  • Any language. Substring search works for Chinese/Japanese/Korean text, not just space-separated words.

  • Auditable. Every read is logged (who, when, what query; never the results).

Related MCP server: mcp-chest-memory

Install

Requires Python 3.10+.

git clone https://github.com/bargisula/ai-memory-mcp.git
cd ai-memory-mcp
pipx install .          # or: pip install .
ai-memory doctor        # checks your setup

Then register the server with your MCP client. The command is ai-memory-mcp (stdio transport):

# Claude Code
claude mcp add -s user ai-memory -- ai-memory-mcp

# Codex CLI
codex mcp add ai-memory -- ai-memory-mcp

Any client that takes a JSON config (for example ~/.copilot/mcp-config.json):

{ "mcpServers": { "ai-memory": { "command": "ai-memory-mcp" } } }

If you use uv, you can skip the install and point the client at uvx --from git+https://github.com/bargisula/ai-memory-mcp ai-memory-mcp instead.

The server ships usage instructions to the client automatically (check the handoff first, record decisions and failures as you go), so no extra prompt file is required.

Tools

Tool

What it does

record_memory(project, type, title, content, llm, tags)

Save a note. type is decision, progress, failure or handoff.

search_memory(query, project, type, limit)

Substring search; every word must match. Returns short snippets.

search_memory_semantic(query, project, limit)

Meaning-based search (needs Ollama, see below).

read_memory(path)

Full text of one note.

get_handoff(project, limit)

Newest handoff notes with full text. Call first when resuming work.

recent(project, limit)

Latest notes of any type.

list_projects()

Projects that have notes.

audit_usage(tool, llm, project, limit)

Read audit log.

Pass your own name in llm (for example "Claude") so entries and reads can be attributed.

Where your data lives

Default: ~/.ai-memory/ (override with AI_MEMORY_HOME).

~/.ai-memory/
  notes/<project>/2026-01-05-choose-database.md   <- the truth. Back this up / put it in git.
  index.db                                        <- disposable search index + audit log

A note looks like this, and you can write or edit them by hand:

---
project: my-app
type: decision
llm: Claude
tags: database
ts: 2026-01-05T10:20:00+08:00
---

# Use SQLite

Single file, zero setup. Rejected Postgres: no concurrent writers needed.

After hand edits, deletions or copying notes from another machine, run ai-memory reindex. (A missing index.db is rebuilt automatically the first time the server starts.)

Configuration

All optional, all environment variables:

Variable

Default

Meaning

AI_MEMORY_HOME

~/.ai-memory

Data directory

AI_MEMORY_TYPES

decision,progress,failure,handoff

Allowed note types, comma separated

AI_MEMORY_EMBEDDINGS

on

off disables semantic search entirely

AI_MEMORY_EMBED_URL

http://localhost:11434/api/embeddings

Ollama embeddings endpoint

AI_MEMORY_EMBED_MODEL

nomic-embed-text

Embedding model

Semantic search (optional)

ollama pull nomic-embed-text
ai-memory reindex --embed     # embed notes written before Ollama was available

Without Ollama everything else works; search_memory_semantic simply reports that it is unavailable. Vectors are compared by brute force in Python, which is fine up to a few thousand notes.

Command line

ai-memory doctor                  check the installation
ai-memory reindex [--embed]       rebuild the index from notes/
ai-memory handoff <project>       print the newest handoff (see hook below)
ai-memory search "<words>"        keyword search, JSON output
ai-memory audit                   read audit log, JSON output
ai-memory web [--port N]          open the read-only audit page in your browser

Audit page

ai-memory web serves a small page at http://127.0.0.1:8765 showing who read what and when, with filters for caller, project, tool, status and query text. It is read-only, listens on 127.0.0.1 only, refuses requests whose Host header is not loopback (DNS-rebinding protection), and follows your browser language (English or 繁體中文).

Make handoffs load automatically (Claude Code)

Relying on the model to remember to call get_handoff is fragile. A SessionStart hook guarantees it. In .claude/settings.json of your project:

{
  "hooks": {
    "SessionStart": [
      { "hooks": [ { "type": "command", "command": "ai-memory handoff my-app" } ] }
    ]
  }
}

Security notes

  • Project names are restricted to letters, digits, _, -, .; anything path-like is rejected, so a prompt-injected agent cannot write outside notes/. read_memory is likewise confined to notes/*.md.

  • Notes are plain text on disk. Do not store secrets in memories.

  • The audit log stores tool, caller, project and the query text (first 500 characters), never result contents.

Limits (by design)

  • Single user, single machine. Concurrent writers are safe (files are created exclusively, SQLite runs in WAL mode), but there is no access control and no built-in sync. To sync, keep notes/ in a git repository.

  • No edit or delete tool. Edit or delete the Markdown file, then ai-memory reindex.

  • Search is substring matching, not fuzzy or ranked by meaning (use the semantic tool for that).

Coming from a private predecessor?

The note format is unchanged: copy your old notes/ folder into AI_MEMORY_HOME and start the server. The index builds itself.

Development

pip install -e ".[dev]"
pytest

License

MIT. See LICENSE.

Available Tools

8 tools
audit_usageB

Who read what and when (newest first). Search result contents are not logged.

ParametersJSON Schema
NameRequiredDescriptionDefault
llmNo
toolNo
limitNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that search result contents are not logged and that results are newest first, which is useful. However, it doesn't state that the operation is read-only, doesn't mention pagination or limits, and doesn't clarify what happens when filters are empty. Some transparency is present but not comprehensive.

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 description is two short sentences with no redundancy. The core purpose is front-loaded, and the caveat about search contents is a useful addition. It is concise and to the point, though it could be slightly more informative without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, return values are covered. However, the description does not explain the four parameters (all optional with defaults), nor does it provide usage guidance or prerequisites. It also doesn't mention any limitations beyond the content logging caveat. For a tool with no annotations and four parameters, this is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the parameters. It does not mention 'llm', 'tool', 'limit', or 'project' at all. The phrase 'who read what and when' hints at filtering by user/tool, but it doesn't map to specific parameters or explain their effects (e.g., limit is a count, tool filters by tool name). The description adds no value for parameter comprehension.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear purpose: reporting who read what and when, with newest-first ordering. It implicitly distinguishes itself from siblings like read_memory or search_memory by focusing on an audit log rather than content retrieval. However, it doesn't explicitly say 'audit log' or mention that it returns a list, though the name and phrase 'who read what and when' make the intent clear.

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?

No guidance is given on when to use this tool versus alternatives like search_memory or recent. It doesn't state whether to use it for access history, compliance checks, or filtering by user/tool/project. The description only describes what the tool does, not the conditions that select it.

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

get_handoffA

Newest handoff summaries for a project, with full content. Call this first when resuming work.

project: project name limit: max summaries (default 3, newest first) llm: your name, for the usage audit log

ParametersJSON Schema
NameRequiredDescriptionDefault
llmNo
limitNo
projectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the disclosure burden and it does disclose ordering ('newest first'), content ('full content'), the default limit, and the llm parameter's audit-log purpose. It stops short of describing edge cases or whether the call has side effects beyond audit logging, but the core behavior is transparent.

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

Conciseness5/5

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

The description is compact and front-loaded: the key use instruction appears immediately after the one-line purpose, followed by a tight parameter legend. Every line adds information, with no filler or redundant restatement of the schema.

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 simple read-style tool with an output schema, the description covers the trigger context ('resuming work'), the required parameter, the optional parameters, and ordering/default behavior. Nothing an agent needs to decide whether and how to call this tool 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 description coverage is 0%, yet the description compensates for all three parameters: project is identified as the project name, limit is documented with a default and ordering, and llm is explained as the agent name for the audit log. The project explanation is minimal and mostly restates the property title, so this is not a 5.

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 'Newest handoff summaries for a project, with full content' clearly identifies the resource (project handoffs) and the scope (newest, full content), and it is readily distinguishable from memory/search siblings. It lacks an explicit verb and does not name a sibling it is not, so it stops short of a perfect 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?

'Call this first when resuming work' is a direct, actionable usage instruction that tells the agent when to invoke this tool. It does not spell out when to prefer alternatives or what would disqualify this tool, but it provides clear contextual guidance.

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

list_projectsB

List every project that has at least one memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
llmNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden for behavioral disclosure. It does state the filtering behavior ('at least one memory'), which is useful, but it says nothing about ordering, pagination, performance, or how inclusive 'every' is. This is adequate but not rich.

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?

A single sentence with no filler. The key scoping condition is front-loaded, and every word earns its place.

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?

For a simple listing tool with an output schema, the description covers the core selection logic. However, the unexplained optional 'llm' parameter and the lack of any guidance beyond the one-liner leave the agent with a meaningful gap in understanding how to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

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

Schema description coverage is 0%, and the description does not mention the single 'llm' parameter at all. An agent cannot tell whether, when, or how to set it. The description was responsible for compensating for the schema gap and did not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List'), a clear resource ('projects'), and a precise inclusion criterion ('has at least one memory'). This clearly differentiates it from the memory-focused sibling tools, though it does not explicitly name any alternative.

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 intended use case is implied: call this when you need an enumeration of projects that have associated memories. However, there is no explicit when-to-use or when-not-to-use guidance, and no alternatives are mentioned.

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

read_memoryA

Read one memory in full. path is the value returned by other tools, e.g. "my-app/2026-01-05-choose-db.md".

ParametersJSON Schema
NameRequiredDescriptionDefault
llmNo
pathYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the burden of disclosing behavior. It clearly indicates a non-mutating read operation that returns full memory content, but it does not describe failure modes, response format, or any side effects. There is no contradiction with the (absent) annotations.

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

Conciseness5/5

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

Two tight sentences, no filler, with the core behavior front-loaded. Every sentence adds value: the first defines the operation, the second defines the critical parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-by-path tool, the description is largely complete: it states the operation, the provenance of the required parameter, and gives an example. It would benefit from stating the return format explicitly and explaining the optional `llm` parameter, but these are minor gaps given the absence of an output schema.

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 thoroughly explains `path` by stating it is the value returned by other tools and giving an example, but it completely ignores the `llm` parameter, which has a default and is optional but still undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Read one memory in full." This clearly distinguishes it from sibling search tools that return partial or multiple results, and the example path grounds exactly what the agent receives.

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?

It gives useful context by saying `path` is the value returned by other tools, implying 'use after obtaining a path from another tool.' However, it does not explicitly say when to prefer this over search_memory or search_memory_semantic, and it offers no exclusion criteria or alternative guidance.

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

recentA

Latest memories of any type, newest first.

project: restrict to one project; empty means all limit: max results (default 10) llm: your name, for the usage audit log

ParametersJSON Schema
NameRequiredDescriptionDefault
llmNo
limitNo
projectNo

Output Schema

ParametersJSON 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, so the description carries the full disclosure burden. It does disclose the 'newest first' ordering and the audit-log behavior of the llm parameter, which is genuinely useful. However, it omits pagination behavior beyond limit, response composition, and whether this is a pure read operation. Decent but not rich for a tool with zero annotation coverage.

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 is front-loaded in a single opening sentence, followed by a compact, tabular parameter list with zero filler. Every line earns its place. Slightly more could be said about ordering semantics, but the structure is appropriately efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and complexity is low (3 optional params). It covers purpose, sorting, filtering, and limits. Minor gaps like pagination beyond limit and tie-breaking on equal timestamps exist, but the tool is simple enough that the current description is largely sufficient.

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 does. Each parameter is explained: project (restrict to one; empty means all), limit (max results, default 10), and llm (name for audit log). This adds real meaning beyond the bare schema titles and defaults, fully compensating for the coverage gap.

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: 'Latest memories of any type, newest first.' This is clear about what it does and implies ordering. It doesn't explicitly name the sibling alternatives it differs from, but the read-oriented listing purpose is distinguishable from search_memory and read_memory by the word 'Latest'.

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: the tool lists recent memories, which an agent would infer for 'what happened recently' queries. However, it gives no explicit when-to-use versus alternatives, no exclusions, and no mention of search_memory or search_memory_semantic for finding specific items. Acceptable but relies on inference.

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

record_memoryA

Save one memory: a decision, progress update, failure, or handoff summary.

project: project name; letters, digits, '_', '-', '.' only (e.g. "my-app") type: one of decision / progress / failure / handoff (configurable via AI_MEMORY_TYPES) title: one-line title content: the details; multi-paragraph Markdown is fine llm: who is writing this (e.g. "Claude", "Codex"); strongly recommended tags: comma-separated keywords, optional

ParametersJSON Schema
NameRequiredDescriptionDefault
llmNo
tagsNo
typeYes
titleYes
contentYes
projectYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral burden. It indicates a persistent write action, notes that 'type' is configurable via AI_MEMORY_TYPES, and recommends the llm parameter, but it does not disclose return behavior, error conditions, or side effects beyond saving.

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

Conciseness5/5

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

The purpose sentence is front-loaded, followed by a compact, scannable per-parameter list. Every line adds necessary information with no filler or repetition.

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 6-parameter mutation tool with no schema coverage and no output schema, the description covers all inputs, required fields, formatting, and one configuration dependency. It could add what happens on save or any duplicate-handling behavior, but nothing essential is missing for invoking the tool.

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 fully compensates: every parameter gets a concrete explanation, format constraints for project, allowed type values, Markdown support for content, and examples. This is far above typical parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Save one memory' and enumerates the content kinds (decision, progress update, failure, handoff summary), giving a specific verb, resource, and scope. It is clearly distinct from the read/search-oriented sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

The context is clear: this is the write-side tool among read/search siblings, so an agent can infer when to use it. It does not explicitly state when not to use it or name alternatives, but the sibling list makes the distinction nearly self-evident.

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

search_memoryA

Keyword search over titles, content and tags. Every space-separated word must appear. Works for any language, including Chinese/Japanese substrings. Not FTS syntax: quotes and operators are treated as plain text.

query: words to look for project: restrict to one project; empty searches all type: restrict to decision/progress/failure/handoff; empty searches all limit: max results (default 10, capped at 100) llm: your name, for the usage audit log

ParametersJSON Schema
NameRequiredDescriptionDefault
llmNo
typeNo
limitNo
queryYes
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses that all space-separated words must appear, that quotes and operators are treated as plain text (not FTS), and that it works with CJK substrings. It also mentions the llm parameter is for the usage audit log, adding operational context. It does not discuss result format or potential side effects, but for a read-only search this is sufficient.

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 description is efficient and well-structured: a two-sentence behavioral summary followed by a compact parameter list. It front-loads the key matching semantics and then documents each parameter without redundancy. It is slightly longer than strictly necessary but every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema (not shown but present), the description need not explain return values. It covers the search behavior, language support, syntax limitations, and all parameter semantics. An agent has everything needed to call the tool correctly, including the audit log requirement for llm.

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%, meaning the schema provides no field-level guidance. The description compensates fully by explaining each parameter in the bulleted list: query, project, type, limit, and llm. It adds concrete semantics (e.g., 'restrict to one project', 'max results', 'your name for the usage audit log') that the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific verb-resource statement: 'Keyword search over titles, content and tags.' It explicitly distinguishes itself from semantic search by noting it is not FTS syntax and that every word must appear, which differentiates it from the sibling search_memory_semantic without needing to inspect the sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

The description explains when to use this tool by defining its exact matching behavior and noting it handles CJK substrings. It does not explicitly name alternative tools or state when NOT to use it (e.g., for fuzzy/meaning-based search), but the contrast with semantic search is implied. The behavior is clear enough for an agent to infer the appropriate context.

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

search_memory_semanticA

Meaning-based search using local Ollama embeddings; finds related notes that share no keywords. Requires Ollama running with the nomic-embed-text model (see README); otherwise returns an error and you should use search_memory instead.

query: a natural-language description project: restrict to one project; empty searches all limit: max results (default 5) llm: your name, for the usage audit log

ParametersJSON Schema
NameRequiredDescriptionDefault
llmNo
limitNo
queryYes
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations available, the description carries the full behavioral burden and does it well: it discloses the external dependency on Ollama and nomic-embed-text, the failure mode when unavailable, the semantic behavior ('no keywords'), and the audit-log purpose of the llm parameter. This is substantial non-obvious context beyond the tool name.

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

Conciseness5/5

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

The description is compact and well-structured: the core behavior and prerequisite are front-loaded, the fallback is stated immediately, and the parameter list is scannable. No sentences are wasted; each 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 4-parameter tool with no annotations, the description covers prerequisites, failure behavior, fallback, parameter semantics, and scope handling. Since an output schema exists, the lack of explicit return-format details is not a gap. The description leaves an agent with everything needed to invoke 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?

Even though the JSON schema has no property descriptions (0% coverage), the tool description fully documents all four parameters: query as a natural-language description, project as an optional scope with empty meaning all, limit as a max-results count with default 5, and llm as the audit-log name. This fully compensates for the missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool as a meaning-based semantic search over notes, explicitly distinguishing it from keyword search by stating it 'finds related notes that share no keywords.' This makes it easy to differentiate from siblings like search_memory and read_memory without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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

It gives explicit when-to-use guidance: semantic search is appropriate when a natural-language query is needed, and if Ollama/model prerequisites are not met, the description directly instructs to 'use search_memory instead.' This is a clear, actionable fallback with no ambiguity.

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. 8 tool updatesv0.1.0
    • First observedaudit_usage
    • First observedget_handoff
    • First observedlist_projects
    • First observedread_memory
    • First observedrecent
    • First observedrecord_memory
    • First observedsearch_memory
    • First observedsearch_memory_semantic

TDQS

A3.8/5.0

Scored across 8 tools

Disambiguation4/5

The retrieval tools (search_memory, search_memory_semantic, get_handoff, recent) overlap in that they all return memories, but each has a clearly described purpose: keyword search, semantic search, handoff-specific retrieval, and recency-based listing. read_memory is distinct because it loads one exact memory by path. Some confusion is possible between the two search tools, but the descriptions draw a clear boundary.

Naming Consistency4/5

Most tools follow a verb_object pattern: record_memory, read_memory, search_memory, get_handoff, list_projects, audit_usage. search_memory_semantic adds a modifier and 'recent' breaks the pattern by being a bare adjective rather than verb_noun. Overall the convention is consistent enough to be predictable.

Tool Count5/5

Eight tools is well-scoped for a personal/agent memory server. Each tool covers a distinct aspect: writing, reading, searching, semantic search, handoff retrieval, recent activity, project listing, and audit. No tool feels redundant or bloated.

Completeness4/5

The server covers the core memory lifecycle well: recording, reading, searching, retrieving handoffs, and auditing usage. The main gaps are the lack of update/delete operations and no way to browse tags, though these may be intentional for an append-only memory store. Agents can complete typical workflows without hitting dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides a persistent, local-first memory for coding agents over MCP, enabling automatic recall and recording of past work, failures, and decisions to reduce repetition and token usage.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides persistent, local-first memory for coding agents with Markdown as the source of truth, exposed via CLI, loopback API, MCP, and Codex hooks for context retrieval and durable writes.
    MIT