Skip to main content
Glama

LocalMCP

One local memory store for your coding agents. Save a decision in Claude Code, retrieve it in Codex, and carry useful context into the next session.

LocalMCP is a self-hosted Model Context Protocol server backed by PostgreSQL, pgvector and Ollama. Each client starts a small stdio process; all processes use the same database. There is no hosted account or embedding API key.

Русский README · Client setup · Architecture · Credentials · Contributing

This shares saved knowledge. A second session sees a new memory when it next calls a tool. The MCP host decides when to call memory tools; full chat transcripts and hidden agent context are not synchronized.

Capabilities

Checked items describe the implementation. Verify your client connection and operating system after setup.

  • Share one persistent store across multiple MCP clients and sessions.

  • Save facts, decisions, incidents, preferences, references and snippets.

  • Search by meaning and words, with project, kind and tag filters.

  • Return short search excerpts and retrieve complete memories separately.

  • Update, supersede with history retained, and delete memories.

  • Detect near-duplicate writes when embeddings are available.

  • Import Markdown incrementally from configured directories, with a change preview.

  • Continue lexical search while Ollama is unavailable and fill missing vectors after recovery.

  • Provide optional prompt-time recall for Claude Code through manually configured hooks.

  • Diagnose database connectivity and embedding availability.

  • Prepare and publish user-approved bug reports, feature requests and help requests to the project's GitHub Issues.

Related MCP server: Sugar

Technical requirements

Component

Requirement

OS

macOS, Linux or Windows; see the compatibility status below

Runtime

Node.js 22+ and npm; Git to clone the repository

Database

Running Docker with Compose and Linux-container support; the project supplies PostgreSQL + pgvector configuration

Embeddings

Running Ollama with bge-m3 downloaded (1024 dimensions)

Client

Codex or Claude Code supporting local stdio MCP servers

Local ports

5446 for PostgreSQL, 11434 for Ollama; 5447 for integration tests only

Internet

Required to download code, packages, the database image and model; GitHub connectivity is needed to submit issues

Issue submission — optional

GitHub CLI (gh), the user's GitHub login and permission to create issues in the project repository

Minimum RAM, CPU and disk space have not been measured; budget for Docker, the embedding model and your corpus. Normal storage and embedding operations use the configured local services; your agent provider has its own connectivity requirements.

Install with Codex or Claude Code

Give your agent this request:

Install LocalMCP from https://github.com/al-mighty/localmcp. Read the README and the instructions for my OS. Check Node.js 22+, Git, Docker Compose and Ollama; tell me if anything is missing. Clone the project, create the configuration, install dependencies, build the service, pull bge-m3, start the database and run diagnostics. Register the MCP server with the client I am using, preserving existing settings. After reconnecting, verify saving and finding a memory under project demo. Suggest memory-use instructions for my working projects; configure note import and hooks according to my preferences.

The agent needs permission to access files, run commands, use the network and reach Docker. OS prompts and client reconnection may require your participation. LocalMCP itself needs no external API keys. See client setup for registration details and a cross-client sharing example.

Manual setup

Prerequisites: Node.js 22+, npm, Docker with Compose, and Ollama running locally. The default embedding model is bge-m3 (1024 dimensions).

git clone https://github.com/al-mighty/localmcp.git
cd localmcp
npm run setup          # creates local config, random DB password; preserves existing files
npm ci
npm run build
ollama pull bge-m3
npm run db:up          # PostgreSQL on 127.0.0.1:5446; waits for readiness
npm run migrate
npm run doctor

If Ollama is not already running, start it using the Ollama app or ollama serve in another terminal. The database volume persists across container restarts. docker compose down -v deletes it; use npm run db:down to stop without deleting data.

Connect both clients

Run from this checkout after building:

claude mcp add --scope user localmcp -- node "$PWD/dist/index.js"
codex mcp add localmcp -- node "$PWD/dist/index.js"

Restart or reconnect your clients. Ask one to save a decision under project demo, then ask the other to find that decision under the same project. memory_stats verifies connectivity.

See client setup for explicit configurations, suggested agent instructions and optional Claude Code hooks. Client registration changes your local configuration; LocalMCP does not install hooks or modify agent settings automatically.

Memory tools

Tool

Purpose

memory_write

Save a durable fact with an explicit project slug

memory_search

Search excerpts, optionally filtered by project, kind and tags

memory_get

Retrieve one complete memory by ID

memory_update

Correct or expand an existing memory

memory_supersede

Replace outdated knowledge while retaining the old version

memory_list

Browse saved memories

memory_stats

Inspect counts and embedding health

memory_delete

Permanently remove an entry

Kinds: fact, decision, incident, preference, reference, snippet. Use consistent project slugs across clients; global is a convention for cross-project knowledge. Project filters organize retrieval and are not access controls.

Optional Markdown import

Edit the generated, gitignored sources.json:

{
  "claudeProjectsDir": null,
  "projectRoots": [
    { "path": "~/code/my-app", "project": "my-app" }
  ]
}

Each root imports memory/*.md (except MEMORY.md) and dated entries from INCIDENTS.md. Paths may be absolute, ~/…, or relative to sources.json. Set claudeProjectsDir to ~/.claude/projects only if you want to import all local Claude project memory directories as well. Configured project paths map matching Claude directory keys to the same project slug; unknown paths use a best-effort slug.

npm run ingest                  # preview record changes
npm run ingest -- --apply        # apply explicitly

Import tracks files by source and content hash: edits update the existing memory. Missing files are reported, not deleted. Known secret patterns are redacted from imported titles and bodies before embedding and storage; this is a best-effort filter, not a guarantee. Direct MCP writes are not automatically redacted. Import details and note format.

Compatibility

Setup targets macOS, Linux and Windows. Native Windows 11 with Node.js 22.23.4 passed 135 tests and a real-embedding MCP smoke check, using PostgreSQL and Ollama on a Mac through SSH tunnels. Windows Docker Desktop and real assistant sessions remain unverified. See the PowerShell guide for details.

Development and test commands are in CONTRIBUTING.md.

Feedback from your agent

Ask: "Prepare a LocalMCP issue: note import fails" or "I want to suggest a LocalMCP feature." The agent calls feedback_prepare, shows the repository, title and body, then uses feedback_submit after your explicit approval. It returns the created issue URL. Categories are bug, feature and help.

Install GitHub CLI and run gh auth login --hostname github.com in your terminal to enable submission. Credentials are not stored in shared memory. Files and logs are never attached automatically. See feedback setup and limitations.

Privacy and limitations

  • Stored knowledge and embeddings remain on your configured database and embedding endpoints. Retrieved memories are passed to the MCP client and may be sent to its model provider. Agent providers' data policies still apply.

  • This is a local, single-user service. There is no HTTP listener, authentication layer, tenant isolation or encryption at rest. PostgreSQL is bound to loopback; do not expose it publicly.

  • No conversation-history crawler is included. Markdown import and optional hooks are opt-in.

  • Full-text stemming is currently Russian; English identifiers also use exact/fuzzy matching and multilingual embeddings. Search quality depends on your corpus and model.

  • Keep one embedding model and dimension for a database. Dimension mismatches fail without erasing vectors. A same-dimension model change cannot currently be detected; use a separate database for model experiments.

Further reading

License

MIT.

Available Tools

10 tools
feedback_preparePrepare a LocalMCP GitHub issueA

Prepare a bug report, feature request or help request for al-mighty/localmcp. Use only when the user wants to report a LocalMCP problem or suggestion. No network request or automatic log/file collection. Show the complete preview and ask for approval before publishing. Do not use public issues for vulnerabilities or credentials; use SECURITY.md.

NameRequiredDescriptionDefault
kindYes
stepsNo
titleYes
actualNo
expectedNo
descriptionYes
environmentNo

TDQS

A4.2/5.0
Behavior4/5

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

Adds real behavioral context beyond the annotations: no network request, no automatic log/file collection, and a mandatory preview-and-approval gate, which softens the readOnlyHint=false mutation signal. It never says what the non-read-only action actually produces (a draft file, a held payload), so the side-effect profile is incomplete.

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?

Four short sentences, front-loaded with the purpose followed by scope, safety and routing constraints. No filler and nothing repeated from the schema.

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 7-parameter tool with no output schema and no parameter descriptions, the description should explain which fields matter for which report kind and what the 'prepared' result looks like. It covers scope and safety well but leaves those gaps.

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?

Zero schema description coverage across 7 parameters, and the description only gestures at the kind enum via 'bug report, feature request or help request'. It gives no guidance on when the optional steps/actual/expected/environment fields are required per kind, leaving the agent to guess.

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?

States a specific verb (Prepare) plus the exact artifact types (bug report, feature request, help request) and the target repo (al-mighty/localmcp). The verb 'prepare' plus the later 'before publishing' distinguishes it from the feedback_submit sibling without ambiguity.

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?

Explicit inclusion criterion (only when the user wants to report a LocalMCP problem or suggestion), explicit workflow requirement (show the full preview and ask for approval before publishing), and an explicit exclusion with an alternative route (vulnerabilities/credentials go to SECURITY.md, not public issues).

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

feedback_submitPublish an approved LocalMCP GitHub issueA
Idempotent

Publish a feedback_prepare draft under the user's existing gh login. Call only after explicit user approval of that draft's repository, title and body. Never submit automatically after an error or upload private context. Returns the created issue URL. Drafts expire in 15 minutes and belong to this MCP process; do not automatically retry uncertain results.

NameRequiredDescriptionDefault
draft_idYes
confirmationYes

TDQS

A4.3/5.0
Behavior4/5

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

Goes well beyond the annotations by disclosing draft TTL (15 minutes), process ownership, the returned issue URL, and the no-auto-retry policy — none of which the hints convey. There is mild tension with idempotentHint=true, since the description warns against retrying uncertain results, which limits the practical value of that hint; a reader could be confused about whether a retry is safe.

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?

Dense and front-loaded: the approval precondition arrives in sentence two, before any operational caveats. Slight redundancy between 'never submit automatically after an error' and 'do not automatically retry uncertain results' keeps it off a perfect score.

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 two-parameter mutation with no output schema, the description supplies the return value, the safety precondition, the draft lifecycle (15-minute expiry, process-scoped), and the failure-handling policy. Nothing an agent needs to call it correctly is missing apart from parameter mapping.

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

Parameters2/5

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

Schema description coverage is 0% and the description compensates only indirectly by referencing the feedback_prepare draft. It never explains that draft_id is the UUID returned by feedback_prepare, nor that confirmation must be the literal string 'publish' — the most likely source of a malformed call.

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?

States a specific verb and resource ('Publish a feedback_prepare draft') and names the sibling tool that produces the input, making the prepare/publish pairing unambiguous. Adds the auth context ('under the user's existing gh login') which no structured field carries.

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

Usage Guidelines5/5

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

Explicitly states the precondition ('Call only after explicit user approval of that draft's repository, title and body') and two hard exclusions ('Never submit automatically after an error' and 'do not automatically retry uncertain results'). An agent knows exactly when it may and may not invoke this tool.

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

memory_deleteDelete memoryA
Destructive

Permanently remove a memory. Only for entries that were wrong to record at all (secrets, noise, mistakes). For facts that merely became stale, use memory_supersede.

NameRequiredDescriptionDefault
idYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is structured. The description still adds real value by stating the removal is permanent and by constraining the legitimate deletion cases, though it says nothing about whether the record is recoverable or whether a confirmation/lookup step is expected.

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

Conciseness5/5

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

Two sentences, zero filler, with the permanence warning and the primary use case front-loaded before the alternative routing. Every clause earns its place.

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 one-parameter destructive tool with annotations carrying the safety profile and no output schema, the description covers purpose, permanence, and the sibling split. Only the identifier semantics and post-delete recoverability are left unaddressed.

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

Parameters2/5

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

Schema description coverage is 0% and the description never mentions the single parameter. The agent must infer from the bare property name 'id' (uuid) that it identifies the memory to delete — obvious in practice, but the description compensates for none of the coverage gap on a destructive call.

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?

States a specific verb and resource ('Permanently remove a memory') and immediately scopes it against a named sibling. An agent can distinguish it from memory_supersede or memory_update without opening any schema.

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?

Gives an explicit when-to-use ('entries that were wrong to record at all: secrets, noise, mistakes') and an explicit when-not with the alternative named ('For facts that merely became stale, use memory_supersede'). This is exactly the routing guidance a destructive tool needs.

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

memory_getGet memoryA
Read-only

Fetch one memory in full by id. memory_search returns only the matching excerpt; call this when the excerpt is not enough and you need the whole text.

NameRequiredDescriptionDefault
idYes

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already declares the safety profile, so the description's job is supplementary — and it does add real value by disclosing the return granularity (full text vs. search excerpt). It omits behavior for a missing/invalid id (error vs. empty result), which for a mutation-free read is a modest gap.

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 short sentences, verb-and-resource first, alternative second. No filler and no restatement of the title.

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 single-param read tool with no output schema, the description covers the essential unknowns: what comes back (the whole text) and when to prefer it over search. Only not-found/error semantics are unaddressed.

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%, but the schema itself constrains id tightly (uuid format plus an explicit pattern), so the agent knows the expected shape. The description only says "by id" and adds no hint about where to obtain it or whether missing ids error out, so it does not compensate for the coverage gap.

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

Purpose5/5

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

States a specific verb and resource ("Fetch one memory in full by id") with unambiguous scope — single record, full content. It also names the sibling memory_search and distinguishes the two by what each returns (excerpt vs. whole text).

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

Usage Guidelines5/5

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

Explicitly states the selection condition: call this "when the excerpt is not enough and you need the whole text," contrasting with memory_search. That is a concrete when-to-use rule plus the alternative, not just implied context.

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

memory_listList memoriesA
Read-only

Browse memories by project/kind/tags without a query. Use to audit what is stored or to load a project's context at the start of a session.

NameRequiredDescriptionDefault
kindNo
tagsNo
limitNo
projectNoProject slug, e.g. 'my-app', 'api', 'website', 'tools', or 'global' for cross-project knowledge.
include_supersededNo

TDQS

A3.5/5.0
Behavior3/5

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

readOnlyHint=true already establishes this is a safe read operation. The description adds the query-free browse behavior, but does not disclose ordering, default limit, whether superseded memories appear by default, or the shape of returned 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?

Two sentences, front-loaded with the core capability and immediately followed by use cases. No filler; every phrase contributes to selection or invocation.

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 read-only list tool with five optional parameters and no output schema, the description makes the basic call clear. However, it omits how include_superseded works, whether results are paginated or ordered, and what a returned memory entry looks like, leaving meaningful gaps.

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 only 20%, with only 'project' documented. The description merely names project/kind/tags and leaves 'include_superseded' and 'limit' unexplained; 'include_superseded' in particular is an important filter whose default behavior is unclear, so the description does not compensate 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?

States a specific action (Browse/List) and resource (memories), names three filter dimensions, and distinguishes itself from query-based retrieval by saying 'without a query.' It does not explicitly name memory_search as the alternative, 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 Guidelines4/5

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

Gives two concrete use cases: auditing stored memories and loading a project's context at session start. It also implies the alternative path by contrasting with query-based browsing, though no explicit when-not or prerequisite is stated.

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

memory_statsMemory statsA
Read-only

Counts per project and kind, plus embedder and database health. Use to verify the store is reachable and to see what knowledge exists before searching blindly.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real context beyond that: this is a lightweight reachability/health probe with zero parameters and no mutation, which tells the agent it can call it cheaply as a pre-flight check.

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

Conciseness5/5

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

Two sentences, both load-bearing: the first defines the output, the second the use case. Front-loaded and free of 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 a no-parameter, read-only tool with no output schema, the description supplies exactly the missing pieces: what the counts are grouped by (project, kind) and that health/embedder status is included. Nothing an agent needs to call it correctly is absent.

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 there is nothing for the description to disambiguate. Baseline of 4 applies; the description correctly avoids inventing parameter semantics that don't exist.

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?

States a concrete verb and result set: 'Counts per project and kind, plus embedder and database health.' An agent can tell immediately that this is a diagnostic/aggregate tool, distinct from the record-level siblings like memory_get, memory_list, and memory_search.

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?

'Use to verify the store is reachable and to see what knowledge exists before searching blindly' gives clear when-to-use conditions and implicitly points at memory_search as the alternative that shouldn't be invoked blindly. It stops short of an explicit when-not or a named alternative tool, so not a full 5.

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

memory_supersedeSupersede memoryA

Replace an outdated memory with a new one, keeping the old version queryable so the history of the belief survives. Prefer this over delete whenever a fact changed.

NameRequiredDescriptionDefault
idYesThe memory being replaced.
bodyYes
kindYes
tagsNo
titleYes
sourceNo
projectYes
importanceNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the description's real job is the retention semantics, and it delivers: the old record remains queryable. It still omits whether the new memory receives a new id, what the call returns, and what happens when the referenced id doesn't exist.

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

Conciseness5/5

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

Two sentences, zero filler, with the action first and the selection preference second. Every clause carries information the agent needs.

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

Completeness3/5

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

The retention model is covered, but this is an 8-parameter mutation with 5 required fields, 13% schema coverage, and no output schema telling the agent what to expect back. The identity of the new record, optional-field behavior, and failure modes are left unaddressed.

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?

Only 13% of the 8 parameters have schema descriptions, so the description must carry meaning — and it does not. It never clarifies the critical split between the old record's id and the new memory's fields (title, body, kind, project), nor what happens to omitted optional fields like tags, source, or importance.

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?

States a specific verb and resource ("Replace an outdated memory with a new one") plus the distinguishing behavior: the old version survives and stays queryable. That contrast with plain deletion makes it immediately separable from memory_delete and memory_update without opening a schema.

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?

Explicit routing rule: "Prefer this over delete whenever a fact changed" — a clear when-to-use with a named alternative. It never addresses memory_update, the closest sibling, leaving the update-vs-supersede choice to inference.

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

memory_updateUpdate memoryA

Amend an existing memory in place. Use for corrections and additions that do not change what the memory is about; use memory_supersede when the belief itself changed.

NameRequiredDescriptionDefault
idYes
bodyNo
tagsNo
titleNo
sourceNo
importanceNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, and 'in place' is consistent with that non-destructive profile, so no contradiction. However the description never states the key behavioral question for an update tool: whether omitted fields are preserved (patch) or cleared, and whether the original revision is retained. With annotations covering the safety profile, the bar is lower, but this is a meaningful gap.

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 with zero waste; the core purpose is front-loaded and the alternative follows immediately. Nothing could be cut without losing a routing decision.

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?

Purpose and sibling routing are fully covered, but with no output schema and 0% schema description coverage, the definition leaves an agent unable to predict update semantics (partial vs full replacement) or parameter meaning. Adequate for selection, thin for correct invocation.

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% across 6 parameters, so the description carries the full burden and provides nothing: no mention of id being the required key, no indication that body/title/tags/source/importance are optional partial updates, no note on importance's 1-5 range or tag replacement semantics. This is a clear miss for a 6-param tool.

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?

States a specific verb and resource ('Amend an existing memory in place') and immediately distinguishes itself from the sibling memory_supersede. An agent can tell which of the two mutation tools to reach for without opening either schema.

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

Usage Guidelines5/5

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

Explicitly gives the selection rule: corrections/additions that don't change the memory's subject use this tool, while a changed belief routes to memory_supersede. Both the when and the alternative are named.

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

memory_writeWrite memoryA

Persist one durable fact. Use for: non-trivial fixes and their root cause (kind=incident), architectural choices and why (decision), stable project facts (fact), how the user wants to be worked with (preference), external URLs/dashboards/tickets (reference), reusable code patterns (snippet). Do NOT store what the repo or git history already records. Near-duplicates are rejected with the existing id — update or supersede that instead.

NameRequiredDescriptionDefault
bodyYesThe fact itself. For incident/decision include the why and how to apply it. Use absolute dates, never 'yesterday'.
kindYes
tagsNo
forceNoWrite even if a near-duplicate exists.
titleYesOne line, specific enough to recognise later.
sourceNoFile path, URL, or session reference.
projectYesProject slug, e.g. 'my-app', 'api', 'website', 'tools', or 'global' for cross-project knowledge.
importanceNoDefault 3.

TDQS

A4.6/5.0
Behavior4/5

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

Goes well beyond the annotations by disclosing the de-duplication contract: near-duplicates are rejected and the existing id is returned, which is non-obvious write behavior an agent must anticipate. It stops short of stating what a successful write returns or how the write interacts with later memory_search, so it is strong but not exhaustive.

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?

Four sentences, all load-bearing: purpose first, then the taxonomy, then the exclusion rule, then the duplicate-handling consequence. No restatement of the name or title and no filler.

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

Completeness4/5

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

For an 8-parameter write tool with no output schema, the description covers the highest-risk ambiguity (what belongs here, what happens on duplicates) and the schema carries the rest. Minor gap: the `force` override is documented only in the schema, so the agent must combine both sources to understand bypassing the duplicate check.

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 75%, and the description compensates by giving each `kind` enum value a concrete meaning tied to a real situation, which the bare enum list in the schema does not. It does not explain `force`, `importance`, or `tags` beyond what the schema already says, so it adds meaning but not for every parameter.

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?

"Persist one durable fact" is a precise verb+resource, and the following sentence enumerates exactly which classes of knowledge qualify (incident, decision, fact, preference, reference, snippet). This makes it immediately distinguishable from memory_update, memory_supersede, and memory_search among the siblings.

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?

Explicit when-to-use list, an explicit negative rule ("Do NOT store what the repo or git history already records"), and explicit routing to alternatives when a near-duplicate is rejected ("update or supersede that instead"). Both the inclusion and exclusion criteria are stated, not inferred.

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. 10 tool updatesv0.1.0
    • First observedfeedback_prepare
    • First observedfeedback_submit
    • First observedmemory_delete
    • First observedmemory_get
    • First observedmemory_list
    • First observedmemory_search
    • First observedmemory_stats
    • First observedmemory_supersede
    • First observedmemory_update
    • First observedmemory_write

TDQS

A4.2/5.0

Scored across 10 tools

Disambiguation5/5

Each tool has a clearly distinct role: memory search/get/list cover retrieval, write/update/supersede/delete cover mutation with explicit guidance on when to use which, and feedback prepare/submit form a clear staged workflow. The descriptions explicitly contrast easily confused operations such as update vs supersede and delete vs supersede.

Naming Consistency5/5

All tools follow a consistent snake_case resource_action pattern: memory_* for memory operations and feedback_* for feedback operations. The naming is predictable and readable throughout.

Tool Count5/5

Ten tools is well-scoped for a local memory server with a small feedback path. The eight memory tools each cover a distinct lifecycle operation, and the two feedback tools are appropriately minimal.

Completeness4/5

The memory surface is strong, covering search, retrieval, listing, stats, creation, correction, supersession, and deletion. The feedback path covers preparation and submission but lacks status tracking, listing, or follow-up operations, which is a minor gap for the stated reporting purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    Provides AI coding agents with a local-first persistent memory layer they can read and write during sessions, storing decisions, preferences, error patterns, and research per project or globally. Enables semantic and keyword search, formatted context recall, and cross-project guideline surfacing without API keys or cloud storage.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Gives AI coding agents a local-first persistent memory they can read and write directly during sessions, storing decisions, preferences, error patterns, and guidelines in per-project and global SQLite stores. Enables semantic and keyword retrieval of relevant context across sessions so agents start work already knowing a codebase's conventions and history.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI coding agents to store and retrieve persistent project and cross-project memories via semantic search, so decisions, preferences, error patterns, and guidelines survive across sessions. Optionally supports autonomous task execution built on the same local-first knowledge store.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI coding agents to read and write persistent memory directly during sessions, storing decisions, preferences, error patterns, research, and cross-project guidelines in local SQLite databases. Supports semantic search so relevant project and global context can be recalled by meaning, fully offline and without API keys.
    -