Skip to main content
Glama

mcp-memory

Repository

Local-first memory for coding assistants over MCP stdio. A fresh SQLite database stores project/global lessons, evidence, immutable replacements, retrieval counts, and agent feedback. Keyword search works without a model; local semantic search is optional. No task tracking, transcript harvesting, background model calls, or automatic deletion based on feedback.

Version 0.2.0 is unpublished. No dependency on Pi or pi-mem and no legacy database import.

Setup

Requires Node.js 22.19+. Git is used to resolve repository/worktree identity.

npm ci --ignore-scripts
npm run build
node dist/src/cli.js --help

The executable is an MCP stdio server, not an interactive memory CLI. Let an MCP client launch it; stdout is protocol-only and diagnostics go to stderr. Example configuration (the exact wrapper depends on your client):

{
  "mcpServers": {
    "memory": {
      "command": "node",
      "args": [
        "/absolute/path/to/mcp-memory/dist/src/cli.js",
        "--db", "/absolute/path/to/private/memory.sqlite3",
        "--workspace", "/absolute/path/to/project",
        "--client", "pi",
        "--allow-write"
      ]
    }
  }
}

The existing stdio MCP gateway can launch this same entry without a Pi-specific extension. Nothing installs or changes active assistant configuration automatically. No HTTP listener or shared daemon is started.

With the gateway's Pi adapter, memory supplies a separate đź§  project|global footer (for example, đź§  12|8). Counts include only active lessons in the launch-bound project and readable global scope, not archived lessons or other projects. Disabled global reads display -, not zero. No token estimates are shown.

Click the indicator for a display-only scope/count/permission summary; /pi-services → memory opens the same overview, with Ctrl+R to refresh. The overview reads metadata only: it does not load lesson text or record retrievals. Local saves, replacements and archives notify the host; the host also refreshes after tool calls. Other processes' changes appear on the next tool call or manual refresh—there is no background polling. A disconnect clears the indicator rather than leaving stale counts.

Gateway 0.24.0+ supplies MCP_GATEWAY_WORKSPACE from its launch directory (the Pi adapter uses the session workspace). Omit --workspace in a shared gateway configuration to use that value; otherwise explicitly set the project path. --workspace takes precedence, followed by this environment variable, then the child working directory. Do not rely on the child working directory matching Pi: the gateway defaults it to the config directory.

Merge a service entry into the gateway's mcpServers map after building memory:

{
  "memory": {
    "command": "node",
    "args": [
      "/absolute/path/to/mcp-memory/dist/src/cli.js",
      "--db", "/absolute/path/to/private/memory.sqlite3",
      "--client", "pi",
      "--allow-write"
    ]
  }
}

This enables project lesson writes, not global writes. Keyword search is the default. This optional native terminal UI protocol is served over MCP resources; ordinary clients need no Pi dependency and can ignore it. There is no automatic recall, legacy import, or activation/configuration change.

Related MCP server: daruma

Permissions and scope

  • Lesson mutations are disabled by default. --allow-write enables immediate project saves, replacements, and archives. There is no pending queue or approval dialog.

  • Global lessons are readable by default; use --no-global-read to exclude them. Global mutations additionally require --allow-global-write with --allow-write and global reads enabled; combining it with --no-global-read fails at startup.

  • Retrieval telemetry and feedback still write to SQLite when lesson mutations are disabled; this is not a filesystem-read-only mode.

  • Workspace and capabilities are bound at launch, not arbitrary tool-provided paths. Tool scope selectors can only narrow the allowed scope.

  • Project scope uses the canonical main Git checkout: linked worktrees share memory; submodules remain separate. Outside Git it is the canonical workspace directory. Separate clones are separate scopes. Broken/ambiguous repository identity fails rather than guessing another scope.

  • --client, --session, and --model are trusted launcher attribution. Unknown client is unknown; absent session/model is NULL. The service does not trust model-supplied attribution or infer an issuing model from MCP.

These are application boundaries, not a sandbox or authentication system. Processes with direct access to the database bypass MCP policy. Only use trusted local clients and executables.

Agent tools

All record IDs are positive safe integers. Unknown input properties and string IDs are rejected.

Tool

Input

Behavior

memory_search

query, optional limit (1–50, default 5), scope (all, project, global)

Search active permitted memories; return content, evidence and statistics

memory_get

id

Inspect content, evidence, statistics, up to 20 recent change events and 10 recent feedback reports; archived records are accessible

memory_add

text, evidence, optional scope (project default, or global), reason

Save immediately if authorized; exact normalized active duplicates reuse the existing record without replacing evidence

memory_supersede

id, text, evidence, optional reason

Atomically archive the predecessor and create a replacement in the same scope

memory_archive

id, optional reason

Exclude from future search; preserve the record/history

memory_feedback

memory_id, verdict, optional reason

Append an assessment; no task/session requirement

Evidence is an array of 1–5 objects containing description and optional source_uri. References are stored, not fetched or verified. Maximum UTF-8 sizes: memory text 2,000 bytes; each evidence description, reason and query 1,000 bytes; source URI 2,048 bytes. The complete MCP tool-result JSON (text plus structured output) is bounded to 128 KiB; search reports truncated, and get can omit older history/feedback to fit. Search evaluates up to 100 candidates from each ranking; narrow the query rather than expecting exhaustive browsing.

{
  "text": "Run validation with npm test.",
  "evidence": [{ "description": "Executed successfully after the dependency update.", "source_uri": "package.json" }]
}

Search with {"query":"running tests","limit":5}. Get full details with {"id":1}. Later report:

{"memory_id":1,"verdict":"useful","reason":"Identified the correct validation command."}

Verdicts: useful, not_useful, incorrect, outdated. Missing feedback means unknown. Reports are subjective and can repeat; counts are reports, not independent confirmations. Feedback never automatically modifies, promotes, archives, or boosts a memory. New replacement versions start with fresh statistics.

MCP tools do not automatically inject memory or know when work finishes. The assistant chooses when to search and provide feedback. Any host-driven automatic recall or end-of-work hook is a separate integration.

Search and retrieval accounting

Keyword mode searches memories.text and linked evidence.description through SQLite FTS5 (English Porter stemming plus Unicode tokenization). Queries are treated as words, not raw FTS operators; words are combined with OR, with memory text weighted above evidence. Keyword search is not semantic understanding.

Content selected for a search/get tool response records one retrieval per memory per internal integer request ID. Metadata inspection, embedding backfill, and human database browsing do not count. Counters describe prepared deliveries—not proof the agent read or used the memory; transport failure can prevent delivery. Search/get therefore have telemetry side effects and are not marked read-only MCP tools.

UNIQUE(request_id,memory_id) prevents duplicate entries within a prepared response. A new tool call, including a retry, is a new retrieval; there is no cross-call idempotency key. Feedback retries likewise add reports. Retrieval IDs are allocated under a SQLite write transaction and work across processes.

Statistics are derived from append-only events: retrieval_count, useful_count, not_useful_count, incorrect_count, outdated_count, last_retrieved_at, last_feedback_at.

Default keyword mode never imports an embedding runtime or downloads a model. Install the optional runtime separately into this checkout:

npm install --no-save --package-lock=false @huggingface/transformers@4.3.1

Opt in to hybrid search and explicitly authorize the initial model download:

node dist/src/cli.js --workspace /path/to/project --db /private/memory.sqlite3 \
  --embeddings local --embedding-cache /private/model-cache --allow-model-download

Subsequent runs can omit --allow-model-download and reuse cached files. Cached-only loading uses the immutable revision's local directory to avoid the runtime's mutable-main tokenizer-discovery probes. Without that flag, remote model fetching is disabled. Keyword operations remain available if the optional runtime/model cannot load; search reports a fallback warning. Restart after repairing model-loading configuration.

The default is CPU q8 Xenova/bge-small-en-v1.5, pinned to commit ea104dacec62c0de699686887e3f920caeb4f3e3. Quantized weights are roughly 35 MB; runtime dependencies/cache add overhead. Text and evidence are embedded locally; long input is subject to the model's token limit. A query-specific BGE instruction prefix is applied automatically.

Custom --embedding-model requires --embedding-revision with an immutable 40-character model commit SHA, an ONNX feature-extraction export with model_quantized.onnx, and compatibility with mean pooling/normalization. Not every Hugging Face model is interchangeable. Model revision and processing settings form the vector-cache identity; changing them rebuilds vectors lazily.

On a hybrid search, accessible active memories missing current vectors are indexed first, then semantic similarity and keyword rankings are combined using reciprocal rank fusion. Work is serialized per process. This initial implementation uses a linear cosine scan: intended for small local stores, not millions of records. First-use indexing can be slow, and an in-flight native inference cannot always be interrupted immediately.

Disabling embeddings preserves all memories, vectors, and keyword search. The embedding table stays empty if embeddings have never been enabled. No hosted embedding API is used.

Database structure

All internal primary keys use INTEGER PRIMARY KEY AUTOINCREMENT; foreign keys and retrieval request IDs are INTEGER. External session references remain nullable TEXT. Timestamps are UTC Unix milliseconds.

Table

Fields supplied by the agent

Automatically supplied fields

scopes

None

id, kind, name, project_path, created_at

memories

text; replacement target as tool input

id, scope_id, text_hash, status, supersedes_id, source_client, source_session, source_model, created_at, archived_at

evidence

description, optional source_uri

id, memory_id, created_at

events

Optional reason

id, memory_id, action, actor, source_client, source_session, details_json, created_at

memory_retrievals

None

id, memory_id, request_id, method, retrieved_at

memory_feedback

memory_id, verdict, optional reason

id, source_client, source_model, created_at

memory_embeddings

None

id, memory_id, model, dimensions, vector, content_hash, created_at

memory_search_index is an additional FTS5 virtual table containing memory_id, memory_text, and combined evidence_text, maintained transactionally with writes. The schema defines constraints and indexes. Evidence, change events, retrievals and feedback are append-only. Memory content cannot be updated or deleted; use replacements/archive. Archived text remains indexed internally but is excluded from search results.

The database carries an application ID and schema version 1. Foreign or unsupported databases are rejected without resetting/importing them. Future migrations require an explicit design; there is no automatic pi-mem import or existing-database conversion.

Privacy and backups

The default database is $XDG_DATA_HOME/mcp-memory/memory.sqlite3, or ~/.local/share/mcp-memory/memory.sqlite3 when XDG data home is unset/relative. --db overrides it. Relative CLI paths resolve from the launch directory; use absolute paths in MCP configuration.

New database/backup files use mode 0600; new database parent directories use 0700. Existing parent/file permissions are not rewritten. Database-file symlinks are rejected. Use a private local directory and a filesystem supporting SQLite WAL locking—not a shared network filesystem. The database is not encrypted. Store no secrets or raw transcripts. Retrieved text/evidence may be sent to the assistant's hosted model and retained in its conversation.

Memory and evidence are untrusted data, not instructions. Scope filtering does not prevent prompt injection from recalled text; assistants must not treat stored text as authorization.

Create a manual online backup while servers remain running:

node dist/src/cli.js backup --db /private/memory.sqlite3 --output /existing/private/backup.sqlite3

This includes committed WAL data, checks integrity, and refuses existing destinations. No automatic scheduling or deletion. To restore: stop every process using the database, preserve the current database and WAL/SHM files as a recovery copy, replace the live file with the backup, remove stale live WAL/SHM sidecars, retain private permissions, then restart compatible code and inspect known records. Never copy only the live main file while writers are running.

Validation

npm ci --ignore-scripts
npm run check
npm test
npm audit
npm pack --dry-run

Tests use disposable databases and real MCP stdio clients, including concurrent writers, scope isolation, replacements, telemetry, feedback, backup recovery, and optional semantic behavior with an injected deterministic embedder. Normal tests require no models/downloads and do not touch personal memory. The optional gateway overview/count resource and read-only details action are also exercised over real stdio.

License

MIT.

Available Tools

6 tools
memory_addB
Idempotent

Save a concise reusable memory with supporting evidence. Requires launch-authorized writes; global writes need separate permission. Exact normalized active duplicates return their existing ID without changing evidence.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
scopeNoproject
reasonNo
evidenceYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare write semantics, non-open-world, and idempotence; the description adds genuinely new behavioral detail by stating the authorization model and that exact normalized active duplicates return the existing ID without altering evidence. That duplicate-handling nuance goes beyond the bare idempotentHint and is exactly what an agent needs before calling.

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?

Three tight sentences with the core action front-loaded and constraints following in order of importance; no filler. Slightly dense phrasing but every sentence carries information.

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?

Covers the essential write/auth behavioral profile and duplicate semantics, which is the most important gap to close given annotations only partially cover behavior. Still leaves the parameter contract largely unexplained with no output schema to fall back on, so an agent cannot fully infer how to construct 'evidence' or what 'reason' is for.

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 four parameters are undocumented in the schema, yet the description only clarifies that evidence is required and implies the project/global scope split. It says nothing about 'text', 'reason', or the array shape/limits of evidence, 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.

Purpose4/5

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

States a specific verb+resource ('Save a concise reusable memory') plus the evidence requirement, which is clearly distinct from read-oriented siblings like memory_search and memory_get. However, it never names an alternative (e.g., memory_supersede) for cases where an existing memory should be replaced, so differentiation is implied rather than explicit.

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?

Gives real prerequisites ('requires launch-authorized writes; global writes need separate permission') and hints at dedup behavior, which is useful context for choosing this tool. But it never says when to use memory_add versus memory_supersede or memory_archive, so routing guidance is only implied.

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

memory_archiveA
DestructiveIdempotent

Exclude a memory from future searches without deleting its content or history. Requires launch-authorized writes.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
reasonNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description nonetheless adds genuinely non-derivable context: that content and history are preserved despite the destructive hint, and that launch-authorized write permission is required. It stops short of describing effects on other queries or reversibility of the archival.

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, zero filler, with the behavioral crux ('without deleting its content or history') front-loaded. Nothing to trim.

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 mutation is safety-covered by annotations and the non-deletion guarantee is stated, but with a 0%-coverage schema and no output schema, the description leaves both parameters unexplained. Marginally adequate for a two-param tool, but an agent still guesses what to pass for 'reason'.

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 explains neither parameter. It is unclear whether 'id' is the memory id and what 'reason' is used for, so the description fails to compensate for a fully undocumented two-parameter schema.

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 ('Exclude') and resource ('a memory') plus a clarifying scope ('from future searches without deleting its content or history'). It implicitly separates itself from destructive deletes, but never names a sibling tool, so the differentiation is only partial.

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?

Gives one concrete prerequisite ('Requires launch-authorized writes'), which is real usage guidance, but says nothing about when to prefer this over memory_supersede or memory_feedback, nor any exclusion conditions. Usage is implied rather than directed.

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

memory_feedbackA

Report whether a memory was useful, not useful, incorrect, or outdated. No task ID needed. Feedback is an append-only assessment, not automatic verification or permission to modify the memory. Submit once per assessment; retries add reports.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNo
verdictYes
memory_idYes

TDQS

A4.2/5.0
Behavior4/5

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

Adds meaningful context beyond annotations: "append-only" indicates the report accumulates rather than overwrites, and "Submit once per assessment; retries add reports" discloses the non-idempotent behavior and warns against retrying. This reinforces the idempotentHint=false annotation with concrete operational meaning.

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, each earning its place: purpose, no task ID needed, append-only clarification, and the one-report-per-assessment warning. Front-loaded and free of 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 a non-mutating assessment tool with three simple parameters and no output schema, the description is sufficient: it defines the verdict space, clarifies the append-only nature, and warns against retry. Missing only an explicit statement of what happens to the memory after feedback, but the append-only note covers the essential behavior.

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 coverage is 0%, so the description must carry the load, but it only partially compensates. It describes the verdict semantics implicitly (the four categories) but never explains what memory_id refers to beyond its name, or what the optional reason field is for. Baseline 3 is appropriate given the top-level description covers the verdict but leaves other params thin.

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+resource (report feedback on a memory) and enumerates the exact verdict values, which differentiates it from siblings like memory_add or memory_archive that mutate memory state. The "not automatic verification or permission to modify the memory" clause sharpens the boundary.

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?

Clarifies that no task ID is needed and that feedback is an append-only assessment rather than a modification or verification action, which routes the agent away from mutation tools. It does not explicitly name alternative tools to use for correcting or archiving a memory, so it falls just short of 5.

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

memory_getA

Read an accessible memory by integer ID, including evidence, statistics and recent history/feedback. Records a delivery; archived memories remain inspectable.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and idempotentHint=false, and the description supplies the reason ('Records a delivery'), which is exactly the non-obvious side effect that would otherwise look contradictory for a read tool. It also notes archived memories remain inspectable, useful state information beyond the annotations.

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 dense sentences with no filler; the primary action is front-loaded and the side effect and archive note are appended. Efficient for the amount of content carried.

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 no output schema, the description usefully enumerates what is returned (evidence, statistics, recent history/feedback) and covers the notable edge case of archived records. The main remaining gap is failure behavior for an inaccessible or nonexistent ID.

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 coverage is 0% and the single parameter has no description in the schema. The description only adds 'integer ID' and the constraint that the memory must be accessible, which is marginal detail beyond the schema's type and exclusiveMinimum=0.

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 (Read) and resource (memory) with the keying mechanism (integer ID), which cleanly separates it from memory_search. It does not explicitly name a sibling alternative, but the ID-based selector makes the distinction inferable.

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: call this when you already hold a memory ID. There is no explicit when-to-use/when-not guidance and no named alternative for cases where only a query is available (memory_search), leaving the agent to infer the routing.

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

memory_supersedeA
Destructive

Atomically archive an active memory and create its corrected replacement in the same scope. Requires launch-authorized writes. The replacement starts with fresh retrieval/feedback statistics.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
textYes
reasonNo
evidenceYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: the operation is atomic (replace-vs-two-calls distinction), requires launch-authorized writes, and the replacement resets retrieval/feedback statistics. Only missing piece is failure/rollback semantics if the atomic step fails.

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?

Three short sentences, front-loaded with the core action, then the precondition, then the side effect. Every sentence adds information; nothing is redundant.

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 destructive, non-idempotent mutation with no output schema, the description covers atomicity, authorization, and stat reset, which is solid. But with 0% schema description coverage it leaves the required evidence array and reason parameter undocumented, and says nothing about what the caller receives or whether the archived memory is recoverable.

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 carry parameter meaning, and it does not. 'active memory' loosely maps to id and 'corrected replacement' to text, but evidence (1-5 items required) and reason are entirely unexplained in both the description and the schema.

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 precise compound verb ('atomically archive ... and create its corrected replacement') plus resource and scope ('same scope'). This clearly separates it from siblings memory_archive (archive only) and memory_add (create only), so an agent can pick it 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 Guidelines3/5

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

The precondition 'Requires launch-authorized writes' gives real context, and 'corrected replacement' implies it is for correcting an existing memory. However, it never says when to prefer this over memory_archive + memory_add or how it relates to memory_feedback, leaving the alternative-selection logic to inference.

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. 6 tool updatesv0.2.0
    • First observedmemory_add
    • First observedmemory_archive
    • First observedmemory_feedback
    • First observedmemory_get
    • First observedmemory_search
    • First observedmemory_supersede

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation4/5

Each tool targets a distinct operation: search (find), get (read by ID), add (create), archive (soft delete), supersede (atomic replace), feedback (rate). The main adjacency is archive vs supersede, since supersede also archives, but the descriptions clarify the atomic-replace semantics. Minor overlap only, so an agent can reliably disambiguate.

Naming Consistency5/5

Every tool follows a strict memory_<verb> pattern (memory_search, memory_get, memory_add, memory_archive, memory_supersede, memory_feedback). Verb style is consistent and snake_case is used throughout with no deviations.

Tool Count5/5

Six tools is well-scoped for a memory store, covering the full lifecycle without redundancy. Each tool earns its place and no thin or bloated surface is apparent.

Completeness4/5

The surface covers the full lifecycle: search/list, get, add, archive (soft delete), supersede (update via atomic replace), and feedback. Coverage is strong, with only minor gaps such as hard deletion or bulk operations that agents can work around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Persistent memory for AI coding agents. Enables agents to save and recall decisions, patterns, bugs, and context across sessions via an MCP server with local SQLite storage.
    21 npm
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A lightweight, local-first MCP server and CLI that helps developers and AI coding agents store and retrieve lessons learned during development, using SQLite and context-aware filtering.
    6
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides persistent, searchable memory for AI agents across any MCP-compatible client, storing project context, user preferences, and session learnings locally in SQLite with tools to save, retrieve, search, and manage them.
    12
    6 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to store and recall durable facts, decisions, and lessons over MCP using hybrid semantic and keyword search, typed memories, graph relations, sessions, and time-travel queries. Runs locally with no server process or API key, persisting everything to files that both agents and a CLI can share.
    392 npm
    MIT