Skip to main content
Glama

memory-mcp

Servidor MCP de memoria a largo plazo para OpenCode: almacena preferencias, lecciones e historial de uso en un único archivo SQLite local (100% local, sin API externa) para que la IA pueda "recordar y adaptarse" al usuario mediante aprendizaje basado en contexto.

Estado: v1.1.0 — las 4 fases implementadas, pruebas que pasan 70/70 aserciones (smoke 53 + capture 8 + distill 9)

ไทย / Tailandés: README.th.md

Arquitectura

OpenCode ──┬─ Plugin learning-capture (Bun)  ── auto-captures prompts/tool/error into DB
            │                                   └─ injects profile back into context on compaction
            └─ MCP memory-mcp (Node.js stdio)  ── 9 tools read/write the same SQLite DB
                                                      ▲
                               Global instructions (memory-protocol.md) teach the AI to use the tools

Ver design.md para más detalles.

Related MCP server: MCP Vector Memory

Scripts

Comando

Descripción

npm run build

compilar TypeScript → dist/

npm start

ejecutar el servidor MCP (stdio) desde dist/index.js

npm run distill

destilación basada en reglas: interacciones → secciones de perfil + podar datos antiguos (env RETENTION_DAYS por defecto 30)

npm test

prueba de humo de extremo a extremo sobre JSON-RPC (node test/smoke.mjs)

node test/capture.test.mjs

probar capture-core (filtrar secretos, deduplicar, truncar, insertar SQL)

node test/distill.test.mjs

probar distill-core (tokenizar tailandés, estadísticas, secciones de perfil, podar)

Herramientas (9)

Herramienta

Descripción

remember

actualizar preferencia (categoría+clave) — volver a guardar la misma clave aumenta la confianza en 0.1 (máx. 1.0)

recall

buscar preferencias + lecciones (FTS5) + interacciones coincidentes recientes. Usar antes de comenzar una nueva tarea

get_profile

resumen del perfil de usuario: secciones de perfil + preferencias principales + 5 lecciones más recientes

save_lesson

registrar una lección aprendida de una corrección (situación / error / corrección)

search_history

buscar prompts de usuario anteriores por palabra clave (fragmentos de 200 caracteres por fila)

forget

eliminar una fila de memoria (preferencia/lección/interacción) por id (+tipo evita choque de id entre tablas)

memory_stats

estadísticas de memoria: recuentos por tipo, tamaño de la base de datos, interacción más antigua/nueva, secciones de perfil

get_recent_interactions

listar interacciones crudas recientes (filtrar por tipo) — materia prima para Smart Distill

export_memory

exportar memoria a JSON bajo data/exports/ solamente (nombre de archivo auto-saneado)

Instalar con OpenCode

  1. Fusiona la sección mcp de opencode.example.json en tu opencode.json (a nivel global o de proyecto)

    • Importante: establece MEMORY_DB_PATH al MISMO archivo de base de datos tanto para el servidor como para el plugin (el ejemplo usa <ABSOLUTE_PATH>/memory-mcp/data/memory.db), de lo contrario el plugin de captura automática escribe en una base de datos diferente a la que la IA lee

    • Cómo configurarlo (elige uno):

      • defínelo en el environment de mcp (ver ejemplo) — cubre solo el servidor MCP

      • o establécelo como variable de entorno a nivel de sistema/usuario (por ejemplo, setx MEMORY_DB_PATH "D:/path/to/memory.db" en Windows) — cubre tanto el servidor como el plugin, ya que el plugin se ejecuta en el mismo proceso que OpenCode

  2. Adjunta las reglas de memoria globales — agrega a opencode.json:

    "instructions": ["C:/Users/<user>/.config/opencode/memory-protocol.md"]

    (el contenido de ejemplo de las reglas está en AGENTS.memory.example.md — se puede adjuntar a nivel de proyecto en su lugar)

  3. (Opcional) Implementa el plugin de captura automática: copia src/plugin/learning-capture.ts → ~/.config/opencode/plugins/learning-capture.ts

  4. Reinicia OpenCode (la configuración se carga solo al inicio)

  5. Prueba: "Recuerda que prefiero pnpm" → abre una nueva sesión y pregunta de nuevo

Uso diario

La IA acepta tanto tailandés como inglés indistintamente — puedes cambiar de idioma en cualquier momento sin aviso.

Tailandés

Inglés

Efecto

"จำไว้ว่า..."

"Remember that..."

remember — guardar una preferencia

"สรุปความจำ" / "distill memory"

"Summarize memory" / "distill memory"

Smart Distill — la IA lee get_recent_interactions, encuentra patrones y guarda conocimientos ella misma

"ระบบความจำเป็นไงบ้าง"

"How is my memory?" / "memory status"

memory_stats

"สำรองความจำ"

"Export memory" / "backup memory"

export_memory

"ค้นประวัติ..."

"Search history..."

search_history

"ลืม..."

"Forget..."

forget

Cuidado a largo plazo: ejecuta npm run distill ocasionalmente para resumir estadísticas y podar interacciones más antiguas de 30 días.

Estructura de data/

data/
├── memory.db          # SQLite (WAL mode) — main DB (+ .db-wal, .db-shm)
└── exports/           # JSON files from export_memory (writeable only in this dir)
  • La ruta de la base de datos se puede sobrescribir mediante la variable de entorno MEMORY_DB_PATH

  • todo en data/ está ignorado por git

Available Tools

16 tools
consolidateConsolidate memoriesA

Cluster similar memories via embedding similarity and optionally create derived/consolidated memories linked via 'derived_from'. Use during periodic consolidation.

NameRequiredDescriptionDefault
deriveNoCreate a derived memory for each cluster
userIdNoScope to a user (USER scope)
projectIdNoScope to a project
sessionIdNoScope to a session (SESSION scope)
thresholdNoCosine similarity threshold for clustering (default 0.7)
minClusterSizeNoMinimum members to report a cluster (default 2)

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full behavioral burden. It does disclose the mechanism and the conditional write ('optionally create derived memories'), which is genuinely useful, but it says nothing about whether original memories are modified or deleted, whether the operation is idempotent, or what a consolidated memory's contents look like.

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 tight sentences with the core mechanism front-loaded and the optional behavior second. The closing usage sentence is somewhat vague but still occupies little space; nothing is wasted.

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?

Six optional parameters with a fully documented schema and no annotations make this a moderately complex, mutation-capable tool. The description covers the mechanism and write condition adequately, though with no output schema the return shape (a cluster report? created memories?) remains unspecified.

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 100%, so all six parameters are already documented, including threshold default 0.7 and minClusterSize default 2. The description adds only that 'derive' produces memories linked via 'derived_from'; it does not clarify scoping precedence (userId vs projectId vs sessionId) or how threshold affects output volume.

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

Purpose4/5

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

States a specific verb and resource ('Cluster similar memories') plus the mechanism ('embedding similarity') and the optional side effect ('create derived/consolidated memories linked via derived_from'). This is clear, but it never distinguishes itself from near-neighbors like merge_memory or link_memory, leaving some ambiguity about which tool produces which shape of result.

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?

'Use during periodic consolidation' implies a trigger context but gives no explicit when-to-use vs when-not rules and names no alternatives among the 15 siblings. An agent still has to infer whether to reach for this instead of merge_memory or link_memory.

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

export_memoryExport memory to JSONA

Export preferences, lessons, profile (and optionally raw interactions) to a JSON file under data/exports/. Only writes inside that directory. Returns the file path, size in bytes and a JSON preview.

NameRequiredDescriptionDefault
filenameNoOutput file name inside data/exports/ (only A-Z a-z 0-9 . _ - allowed, must end with .json). Defaults to memory-export-YYYYMMDD-HHmmss.json
includeInteractionsNoInclude raw interaction rows in the export (file gets bigger)

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description does real work: it discloses the write side effect and constrains it to data/exports/, and it states the return payload (path, byte size, JSON preview). It omits important mutation behavior such as what happens when the target filename already exists (overwrite vs error) or failure modes.

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 short sentences, front-loaded with what is exported and where, then the write constraint, then the return shape. Nothing is padded, though the parenthetical is slightly awkward.

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 two-parameter, non-annotated tool with no output schema, the description covers the side effect, its directory boundary, and the return values, which is what an agent needs. Only overwrite/error semantics are missing.

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 100%, so the schema already documents filename constraints and the includeInteractions flag with its default. The description only echoes the optional raw-interactions behavior and the directory constraint, adding little syntax or format detail beyond the 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?

The description gives a specific verb (export) and enumerates the resources (preferences, lessons, profile, optionally raw interactions) plus the destination (a JSON file under data/exports/). It implicitly separates itself from recall/import_memory by stating the result is a file, but it never names a sibling, so an agent must infer that distinction.

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 only implied: dumping memory to a file suggests backup or portability scenarios, but the description never says when to prefer this over recall or get_profile, nor any preconditions. No explicit exclusions are given.

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

extract_memoriesExtract memories from interactionsA

Scan recent captured interactions for memory-intent phrases and propose memory candidates (deterministic, no LLM). Dry-run by default; pass apply=true to create them (source=captured).

NameRequiredDescriptionDefault
kindNoInteraction kind to scan (default prompt)
applyNoCreate the proposed memories (default false = propose only)
limitNoMax recent interactions to scan (default 50)
userIdNoScope extracted memories to a user (USER scope)
sessionIdNoFilter by captured session id (default: all sessions)

TDQS

A3.8/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 behavioral burden and does well: it discloses determinism, dry-run default behavior, the mutation triggered by apply=true, and the source tag (source=captured). It does not cover authorization, rate limits, duplicate handling, or what the proposed candidates look like.

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 two sentences, front-loaded with the core action, and contains no filler. Every clause adds useful information about determinism, default mode, or the apply toggle.

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 five-parameter tool with no annotations and no output schema, the description is largely complete on purpose and mutation behavior. It does not describe the shape of proposed memory candidates or return behavior, but it covers what an agent needs to choose dry-run versus apply.

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 100%, so the schema already documents all five parameters including defaults and constraints. The description adds meaning only for apply=true, which is already described in the schema, and does not add further parameter semantics beyond that baseline.

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 specific verb and resource: scan recent captured interactions for memory-intent phrases and propose memory candidates. The phrase 'deterministic, no LLM' adds a useful distinguishing trait. It does not explicitly distinguish itself from siblings like remember or consolidate, so it falls short of a 5.

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

Usage Guidelines3/5

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

The description gives clear operational guidance for dry-run versus apply: 'Dry-run by default; pass apply=true to create them.' However, it does not explain when to use this tool instead of alternatives such as remember, save_lesson, or consolidate, nor does it state prerequisites.

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

forgetForget a memory entryA

Delete one memory row (preference, lesson or interaction) by id and sync the search index. Pass type when you know it (ids from remember are preference ids, from save_lesson are lesson ids).

NameRequiredDescriptionDefault
typeNoWhich table the id belongs to. Recommended whenever known, because numeric ids can coincide across tables.
target_idYesRow id to delete (id returned by remember/save_lesson)

TDQS

A3.9/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 disclosure burden. It does say the operation deletes a row and syncs the search index, which is real behavioral context, but it doesn't state whether the delete is permanent, whether it requires confirmation, or what happens to data created by link_memory or merge_memory when a row disappears.

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 front-loaded and free of filler. The destructive action comes first and the parameter hint follows, so an agent can read the essentials immediately.

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 tool with no annotations and no output schema, the description covers what is deleted and the index-sync effect, but it says nothing about irreversibility, recovery, or side effects on related memory links. Enough to call it, not enough to call it safely.

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 100%, so the baseline is 3. The description still adds meaning by mapping id sources to the type enum ('remember' implies preference, 'save_lesson' implies lesson), which goes beyond the schema's generic note that ids can coincide across tables.

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 specific verb and resource: 'Delete one memory row (preference, lesson or interaction) by id'. It also mentions syncing the search index, which separates it from update_memory, merge_memory and link_memory 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 Guidelines3/5

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

It gives useful calling context about id provenance ('ids from remember are preference ids, from save_lesson are lesson ids'), but that is parameter guidance rather than when-to-use guidance. Nothing says when to forget rather than update_memory, merge_memory or consolidate, and no prerequisite or irreversibility warning is given.

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

get_contextGet assembled contextB

Assemble relevant memories for the current task via hybrid retrieval (+ optional memory-graph expansion), with token budgeting. Use to load memory into context before a task.

NameRequiredDescriptionDefault
limitNoNumber of seed memories (default 10)
queryNoOptional focus query to seed hybrid retrieval
userIdNoScope context to a user (USER scope)
maxTokensNoToken budget for assembled context (default 2000)
projectIdNoScope context to a project
sessionIdNo
includeGraphNoExpand seeds with memory-graph neighbors
includeHistoryNoInclude superseded/archived memories

TDQS

B3.4/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 disclosure burden and does convey meaningful behavior: hybrid retrieval, optional graph-neighbor expansion, and a token budget that caps the assembled output. It does not state that it is a read-only operation, what the returned context looks like structurally, or what happens when the budget is exhausted or nothing matches.

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

Conciseness4/5

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

Two sentences, functional detail front-loaded, no filler words. The usage sentence is terse but earns its place by orienting the agent to the pre-task loading pattern.

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 an 8-parameter tool with no annotations and no output schema, the description covers the core concept and the budgeting behavior, but leaves gaps: no return-shape hint, no explanation of how the multiple scope parameters interact, and no coverage of the undocumented sessionId. Adequate but not complete.

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 88%, so the schema already documents nearly all parameters, making 3 the baseline. The description adds framing value by explaining that the query seeds hybrid retrieval and that graph expansion and budgeting are tunable dimensions, but it adds no detail on scoping semantics (userId/projectId precedence) or on sessionId, which the schema leaves undocumented.

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?

Uses a specific verb ('Assemble') plus a clear resource ('relevant memories') and names the mechanism (hybrid retrieval, optional graph expansion, token budgeting), which distinguishes it from plain lookups like recall or search_history. It stops short of explicitly naming the sibling tools it differs from.

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 second sentence gives a use case ('load memory into context before a task'), which implies when to call it. There is no guidance on when to prefer it over recall, search_history, or get_recent_interactions, and no exclusions or prerequisites.

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

get_profileGet user profileA

Get the distilled user profile: profile sections, top preferences by confidence (max 15), and the 5 most recent lessons. Optional userId/sessionId/projectId scope the auto-projected memories; without them only GLOBAL memories are included.

NameRequiredDescriptionDefault
userIdNoInclude GLOBAL plus this user's USER-scoped memories
projectIdNoInclude GLOBAL plus this project's PROJECT-scoped memories
sessionIdNoInclude GLOBAL plus this session's SESSION-scoped memories

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full load and it does disclose the non-obvious behavioral detail that omitting all scope parameters silently restricts results to GLOBAL memories, plus hard caps on preference and lesson counts. It does not describe authorization, error behavior, or whether the read is cheap or expensive, but the important surprise is surfaced.

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

Conciseness4/5

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

Two sentences with no filler, contents listed first and scoping second, which is the right order for an agent. Slightly dense jargon ("distilled", "auto-projected") costs a little readability.

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

Completeness4/5

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

For a zero-required-parameter read tool with no output schema and full schema coverage, the description gives enough: what comes back, how much of it, and how scoping reshapes the result. Only the absence of any return-shape detail (structure versus plain text) keeps it from being fully complete.

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 100%, so the baseline is 3, and the description earns an extra point by explaining how the three scope parameters interact with the auto-projected memory set and what happens when none are supplied. The per-parameter "GLOBAL plus X" wording is largely duplicative of the schema, but the omission default is added value.

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

Purpose4/5

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

"Get the distilled user profile" pairs a specific verb with a resource, and the description enumerates the returned contents (profile sections, top preferences by confidence capped at 15, 5 most recent lessons). It is clear on its own but never names a sibling such as get_context or recall, so an agent must infer the boundary from names alone.

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 states the default behavior when no scope is given (GLOBAL memories only), which is effectively a when-not condition and steers parameter choice. However, it offers no guidance on when to choose this over recall, get_context, or search_history, leaving the sibling routing to inference.

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

get_recent_interactionsRecent interactionsA

List recently captured raw interactions (newest first) as [id] ts [kind] content lines. Optionally filter by kind. Use for auditing history or before distilling memory.

NameRequiredDescriptionDefault
kindNoFilter by kind (prompt / tool_call / error)
limitNoMax rows (default 20, max 100)
sessionIdNoFilter by captured session id (default: all sessions)

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. It does disclose ordering and the return line format, and 'List' implies a non-mutating read, but it says nothing about volume, truncation, whether content is full or previewed, or any privacy/permission constraints on captured interaction content.

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, front-loaded with what is returned and in what format before the use case. Nothing is redundant or padded.

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 three-optional-parameter read tool with no output schema, the description usefully compensates by specifying the returned line format. The only real gap is silence on result volume and on the sessionId filter, which matters when logs can be long.

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 100%, so all three parameters (kind, limit, sessionId) are already documented in the schema, including the enum and the limit range. The description only echoes the kind filter and adds no new meaning for limit or sessionId, so the baseline of 3 applies.

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?

It states a specific verb and resource ('List recently captured raw interactions') and adds ordering ('newest first') plus the exact output line shape '[id] ts [kind] content lines'. It implicitly separates itself from the memory siblings by emphasizing 'raw' interactions, but never names search_history or get_context as the alternative.

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 for auditing history or before distilling memory' supplies a clear use context, which is more than most tools offer. It stops short of exclusions or naming which sibling to use instead when the agent wants semantic search rather than a raw chronological dump.

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

import_memoryImport memoriesA

Import memories from a JSON array or a .json file inside data/exports/. Validates type, dedupes against existing memories, and never overwrites active memory blindly. Dry-run by default; pass apply=true to insert.

NameRequiredDescriptionDefault
fileNoPath to a .json export file (must be inside data/exports/)
jsonNoInline JSON: an array of memory objects, or { memories: [...] }
applyNoActually insert memories (default false = dry run, just report)
userIdNoScope imported memories to a user (USER scope); overrides per-item userId
trustedNoTrusted import (default false). Auxiliary data (preferences/lessons/profile) is restored only when true; per-item trusted flags are ignored

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 full burden and does real work: it discloses validation of type, deduplication against existing memories, that active memory is never blindly overwritten, and that the operation is non-mutating unless apply=true. It omits what a skipped/duplicate item looks like in the result and any size or permission constraints, which keeps it below the top tier.

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 what is imported and from where, followed by behavior and then the safety/dry-run rule. Every clause carries information an agent needs; nothing is padding.

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 5-parameter mutation tool with no annotations and no output schema, the description covers inputs, validation, dedupe, overwrite safety and the dry-run gate, which is the critical surface. It leaves the result shape (counts, per-item errors) unexplained, which an agent would need to interpret the dry-run report, but the omission is narrow.

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 100%, so file, json, apply, userId and trusted are already documented, including the non-obvious trusted behavior around auxiliary data. The description restates the dry-run/apply behavior and the input shapes but adds no syntax, precedence, or edge-case meaning beyond the schema, so baseline 3 applies.

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 ('Import memories') plus the two accepted input forms ('a JSON array or a .json file inside data/exports/'). The inverse relationship to export_memory and the distinction from remember/save_lesson (bulk vs single) is implicit in the scope, and the name/schema line up 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 Guidelines4/5

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

Gives concrete operational guidance: 'Dry-run by default; pass apply=true to insert', which tells the agent the calling pattern and that a safe preview exists. It stops short of naming when to prefer remember/save_lesson over a bulk import, or what the source of the export must be, so no explicit exclusions are stated.

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

memory_statsMemory statisticsA

Summarize memory usage: interaction counts by kind, preference/lesson totals, DB file size, oldest/newest interaction timestamps, and profile sections.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/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 transparency burden. The verb 'Summarize' clearly implies a non-mutating read-style operation, but the description does not explicitly state that it makes no changes, nor does it describe any other behavioral details like cost or freshness.

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 a single concise sentence that leads with the core action and then enumerates the exact delivered statistics. Every word adds useful information, with no filler or redundancy.

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 serves as the sole source of return-value expectations, and it enumerates counts, totals, file size, timestamps, and profile sections. Some terms like 'profile sections' remain somewhat vague, but for a simple zero-parameter stats tool this is reasonably complete.

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 has zero parameters, so there is no parameter semantics to clarify. The schema coverage is trivially 100%, and the description reasonably focuses on the output content instead.

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 ('Summarize') and identifies a clear resource (memory usage) with a detailed list of metrics included in the output. It is distinct from sibling tools in content, though it does not explicitly contrast with them.

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

Usage Guidelines3/5

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

The description implies this tool is for retrieving high-level memory statistics and summaries rather than detailed records or management actions. However, it provides no explicit when-to-use or when-not-to-use guidance, nor does it name alternatives.

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

merge_memoryMerge memoriesA

Merge a duplicate/near-duplicate memory into a canonical one. The source becomes superseded and provenance is recorded in metadata.merged_from.

NameRequiredDescriptionDefault
sourceIdYesMemory to merge away (becomes superseded)
targetIdYesCanonical memory to keep (becomes active)

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, this sentence carries the behavioral burden and does disclose the key state change: the source is superseded rather than deleted, and provenance lands in metadata.merged_from. It stops short of stating reversibility, whether the merge can be undone, required preconditions (e.g., same type/workspace), or what the call returns.

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 core operation front-loaded and the side effect following. Every clause contributes information the agent needs.

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 two-parameter mutation with full schema coverage and no output schema, the definition covers purpose, direction of the merge, and the resulting state of both records. The main residual gap is the absence of any safety or reversibility note, which matters more here because no annotations supply that context.

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 100% and both parameters already state which record becomes superseded and which becomes active. The description's phrase "duplicate/near-duplicate" adds a small amount of intent framing but no syntax or format detail beyond the schema, so the baseline 3 applies.

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+resource ("Merge a duplicate/near-duplicate memory into a canonical one") and clarifies the source/target duality. It distinguishes the operation from update-style siblings implicitly, but never names the closest sibling (consolidate) so a direct comparison is left to the agent.

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?

"Duplicate/near-duplicate" implies the triggering condition for use, which is useful. However, there is no explicit when-not guidance and no routing to alternatives such as consolidate, update_memory, or forget when a memory is stale rather than duplicated.

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

recallRecall memoryA

Search preferences + lessons via full-text index, plus recent matching interactions. Use before starting a new task.

NameRequiredDescriptionDefault
limitNoMax preference/lesson matches (default 8)
topicYesTopic to recall from memory

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden; it does disclose the sources consulted (a full-text index over preferences and lessons, plus recent matching interactions), which implies a read-only lookup. It does not say how results are ranked, how 'recent' is bounded, or how the two result sets are combined, which matters for a tool that merges sources.

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 with zero filler; the resource scope is front-loaded and the usage hint follows. Nothing is repeated from the title beyond what is needed.

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 two-parameter, no-annotation, no-output-schema tool, the description covers the core purpose but omits result shape and ranking behavior, which the agent cannot learn from structured fields. Adequate, but an agent cannot predict what the returned matches look like or when 'recent' items appear.

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 100%, so both parameters are already documented in the schema. The description adds only that matching is full-text over preferences and lessons and that 'limit' caps preference/lesson matches, which is a marginal clarification rather than new meaning.

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 (search/recall) and concrete resources (preferences, lessons, recent matching interactions), which is far more informative than the bare name 'recall'. It does not explicitly contrast itself with close siblings like search_history or get_recent_interactions, so an agent must infer 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?

'Use before starting a new task' gives a concrete application context that tells the agent when to reach for this tool. However, with 15 siblings including search_history and get_recent_interactions, no alternative or when-not condition is named, leaving overlap unresolved.

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

rememberRemember preferenceA

Save or update a user preference (category+key upsert). Re-saving the same key increases confidence by 0.1 (cap 1.0). Returns the row id for forget().

NameRequiredDescriptionDefault
keyYesShort stable key, e.g. package_manager
valueYesThe preference value
categoryYesPreference category

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses upsert semantics, the confidence bump of +0.1 per re-save capped at 1.0, and the return value (row id). It does not say what happens to the previous value on a same-key write, which is the main remaining gap for a mutation tool.

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, each carrying distinct information (upsert identity, confidence behavior, return value), with the core action front-loaded. No filler or restatement of the tool name.

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 3-parameter, non-nested, annotation-free write tool with no output schema, the description covers identity semantics, side effects, and the return value. Only the overwrite/conflict behavior and any failure conditions are left unstated.

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 100%, so the baseline is 3, but the description adds genuine meaning the schema cannot express: the pair category+key is the upsert identity, so agents know re-saving with the same pair mutates rather than duplicates. That is the single most decision-relevant fact about these parameters.

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

Purpose4/5

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

Description names a specific verb (save/update) and resource (a user preference) and adds the key mechanic, a composite category+key upsert. It implicitly separates itself from siblings like save_lesson and update_memory via the term 'user preference', but never names or contrasts those siblings explicitly.

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 only implied: the mention of returning a row id 'for forget()' hints at the store-then-remove lifecycle, but nothing states when to call remember versus save_lesson, update_memory, or link_memory. An agent must infer the routing from the name alone.

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

save_lessonSave lessonA

Record a lesson learned from a correction: what situation, what mistake, what is the correct way. Call immediately after the user corrects your work.

NameRequiredDescriptionDefault
mistakeYesWhat was done wrong
situationYesThe original situation/context
correctionYesThe correct approach

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 full burden; it makes clear this is a write operation whose content is a correction-derived lesson, which is useful behavioral context. However, it says nothing about persistence, duplicate/repeat saves, whether lessons are later surfaced by recall, or any permission requirements. That is a moderate gap for an unannotated mutation tool.

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 with zero filler: the content specification comes first and the timing instruction second. Every clause earns its place and nothing is buried.

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 three-param, no-output-schema tool, the description covers both what to record and when to record it, which is enough to invoke it correctly. It leaves open what happens to saved lessons afterward (how they are retrieved or whether saves can be updated), a minor omission given the tool's simplicity.

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 100% and each of the three properties has its own description. The prose ('what situation, what mistake, what is the correct way') restates the parameters without adding format or length guidance beyond the schema's min/max constraints. Baseline 3 is appropriate.

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 gives a specific verb ('Record') and resource ('a lesson learned from a correction') and enumerates the three content components, so the agent knows exactly what gets stored. It does not name or differentiate itself from siblings like remember or update_memory, so it falls short of a 5.

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

Usage Guidelines4/5

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

The trigger is explicit and actionable: 'Call immediately after the user corrects your work.' That tells the agent the exact moment to use it. It offers no exclusions or comparison to alternatives such as remember or update_memory, which keeps it out of 5 territory.

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

search_historySearch prompt historyA

Search past user prompts (kind='prompt') by keyword. Returns timestamped snippets truncated to 200 chars each.

NameRequiredDescriptionDefault
limitNoMax results (default 10)
queryYesText to search in past prompts
sessionIdNoFilter by captured session id (default: all sessions)

TDQS

A3.7/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 alone; it does disclose two useful behaviors: snippets are truncated to 200 chars and results are timestamped. It does not state permission requirements, whether search is case-insensitive or substring vs. semantic, or what happens when nothing matches.

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, front-loaded with the core action and searchable scope, followed by the return-value note. No filler or redundancy.

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 three-parameter read tool with full schema coverage and no output schema, the description supplies the essentials: what is searched, how results are scoped, and the return snippet format. Minor gaps remain around result ordering and empty-result behavior, which matter lightly for a search tool.

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 100%, so baseline is 3, but the description adds meaning by naming the searchable field (prompts of kind='prompt') and reinforcing that it is keyword-based, which clarifies query semantics not stated in the schema. It does not elaborate on limit or sessionId beyond the 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 (search) and resource (past user prompts, kind='prompt') and discloses the return shape (timestamped snippets truncated to 200 chars). It is clearly distinct from siblings like recall or get_recent_interactions, though it doesn't explicitly name an alternative to distinguish itself.

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

Usage Guidelines3/5

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

Usage is implied by the name and by the keyword-search framing, but there is no explicit statement of when to prefer this over recall or get_recent_interactions, nor any exclusion of other memory kinds beyond the parenthetical kind='prompt'.

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

update_memoryUpdate a memoryA

Update mutable fields (summary/importance/confidence/valid_from/valid_until/metadata) in place. If content changes, a superseding memory is created by default (set supersede=false to edit in place).

NameRequiredDescriptionDefault
idYesMemory id to update
contentNoNew content. When provided, a superseding memory is created (supersede=true) unless supersede=false.
summaryNoNew summary
metadataNoNew metadata object (replaces)
supersedeNoIf content changes, create a superseding memory instead of editing in place (default true)
validFromNoISO timestamp or null to clear
confidenceNo
importanceNo
validUntilNoISO timestamp or null to clear

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. It does disclose the single most important non-obvious trait: content edits create a superseding memory by default. It does not say what happens to the original memory (retained, archived, tombstoned), whether the returned id refers to the new or old record, or any auth requirements — significant gaps for a mutation 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.

Conciseness5/5

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

Two sentences, no filler, and the highest-value detail (supersede default) is placed in the second sentence where it is easy to find. Nothing repeats the title or schema verbatim.

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 9-parameter mutation tool with no annotations and no output schema, the description covers the core semantic trap (content edit vs in-place edit). What is missing is the fate of the superseded record and the shape of the result, which an agent would want before calling it.

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

Parameters4/5

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

The description restates the mutable field set and, crucially, explains the default and override semantics of supersede, which the schema only partially conveys. With 78% schema coverage the baseline is 3, and naming the field group plus the supersede default adds meaning beyond it.

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 names a specific verb (Update) and resource (memory) and enumerates the mutable fields (summary/importance/confidence/valid_from/valid_until/metadata), which tells an agent exactly what can change. It doesn't name a sibling tool, but the supersede-vs-in-place distinction implicitly separates it from remember/merge_memory/forget.

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 one concrete usage condition — set supersede=false to edit in place — which implies the default routing for content edits. It never states when to prefer a sibling like merge_memory or forget instead, so guidance is implied rather than explicit.

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. 15 tool updatesv2.4.2
    • Changedconsolidate1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedexport_memory1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedextract_memories1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedforget2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / target_id / maximum
        Added value: +9007199254740991
    • Changedget_context1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_profile1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_recent_interactions1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedimport_memory1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlink_memory5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / sourceId / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / sourceId / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / targetId / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / targetId / minimum
        Added value: +-9007199254740991
    • Changedmerge_memory5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / sourceId / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / sourceId / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / targetId / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / targetId / minimum
        Added value: +-9007199254740991
    • Changedrecall1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedremember1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedsave_lesson1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedsearch_history1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedupdate_memory5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / id / minimum
        Added value: +-9007199254740991
      • changedInput schema / properties / validFrom / anyOf
        Previous value: -[
        -  {
        -    "format": "date-time",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / validUntil / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/properties/validFrom/anyOf/0"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  2. 3 tool updatesv2.4.0
    • Changedextract_memories1 field changed
      • addedInput schema / properties / sessionId
        Added value: +{
        +  "description": "Filter by captured session id (default: all sessions)",
        +  "maxLength": 200,
        +  "type": "string"
        +}
    • Changedget_recent_interactions1 field changed
      • addedInput schema / properties / sessionId
        Added value: +{
        +  "description": "Filter by captured session id (default: all sessions)",
        +  "maxLength": 200,
        +  "type": "string"
        +}
    • Changedsearch_history1 field changed
      • addedInput schema / properties / sessionId
        Added value: +{
        +  "description": "Filter by captured session id (default: all sessions)",
        +  "maxLength": 200,
        +  "type": "string"
        +}
  3. 2 tool updatesv2.3.5
    • Changedget_profile4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Include GLOBAL plus this project's PROJECT-scoped memories",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / sessionId
        Added value: +{
        +  "description": "Include GLOBAL plus this session's SESSION-scoped memories",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / userId
        Added value: +{
        +  "description": "Include GLOBAL plus this user's USER-scoped memories",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedimport_memory4 fields changed
      • addedInput schema / properties / file / maxLength
        Added value: +500
      • addedInput schema / properties / json / maxLength
        Added value: +8388608
      • addedInput schema / properties / trusted
        Added value: +{
        +  "description": "Trusted import (default false). Auxiliary data (preferences/lessons/profile) is restored only when true; per-item trusted flags are ignored",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / userId / description
        Previous value: -"Scope imported memories to a user (USER scope)"New value: +"Scope imported memories to a user (USER scope); overrides per-item userId"
  4. 1 tool updatev2.3.0
    • Changedconsolidate2 fields changed
      • addedInput schema / properties / sessionId
        Added value: +{
        +  "description": "Scope to a session (SESSION scope)",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / userId
        Added value: +{
        +  "description": "Scope to a user (USER scope)",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  5. 2 tool updatesv2.2.9
    • Changedforget1 field changed
      • changedInput schema / properties / type / enum
        Previous value: -[
        -  "preference",
        -  "lesson",
        -  "interaction"
        -]New value: +[
        +  "memory",
        +  "preference",
        +  "lesson",
        +  "interaction"
        +]
    • Changedupdate_memory3 fields changed
      • addedInput schema / properties / validFrom
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "ISO timestamp or null to clear"
        +}
      • addedInput schema / properties / validUntil / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/properties/validFrom/anyOf/0"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / validUntil / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
  6. 16 tool updatesv2.2.1
    • First observedconsolidate
    • First observedexport_memory
    • First observedextract_memories
    • First observedforget
    • First observedget_context
    • First observedget_profile
    • First observedget_recent_interactions
    • First observedimport_memory
    • First observedlink_memory
    • First observedmemory_stats
    • First observedmerge_memory
    • First observedrecall
    • First observedremember
    • First observedsave_lesson
    • First observedsearch_history
    • First observedupdate_memory

TDQS

A3.7/5.0

Scored across 16 tools

Disambiguation4/5

Most tools target distinct actions and memory types, but retrieval is split across recall, get_context, get_profile, and search_history, and remember vs update_memory has some conceptual overlap. The descriptions clarify these boundaries, but an agent may still hesitate over which retrieval tool to use first.

Naming Consistency4/5

Most names follow a clear snake_case verb_noun pattern such as save_lesson, get_profile, link_memory, and update_memory. A few exceptions like remember, recall, forget, consolidate, and memory_stats deviate from that pattern but remain readable and predictable enough.

Tool Count4/5

At 16 tools the set is slightly on the heavy side, but each tool covers a meaningful part of a sophisticated memory lifecycle: capture, retrieval, curation, graph operations, import/export, and stats. It does not feel padded, though a smaller surface could reduce cognitive load.

Completeness5/5

The tool surface covers the full memory lifecycle: creation via remember/save_lesson/extract/import, retrieval via recall/get_context/profile/history, updates, deletion, linking, merging, consolidation, export, and stats. No obvious CRUD or lifecycle gap remains for the stated memory-management purpose.

Maintenance

ActivityActive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Provides persistent local memory functionality for AI assistants, enabling them to store, retrieve, and search contextual information across conversations with SQLite-based full-text search. All data stays private on your machine while dramatically improving context retention and personalized assistance.
    3
    -
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Provides AI coding agents with persistent, long-term memory through local semantic search and SQLite storage. It enables agents to save and retrieve architectural decisions or project context across different conversation sessions without requiring cloud services.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides persistent cross-session memory and full-text search for AI coding assistants, storing project context, decisions, and preferences while enabling searchable access to conversation history via local SQLite.
    8
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides AI coding assistants with persistent memory storage using a local SQLite database. Enables tools to remember project details, notes, and relationships across sessions to maintain context and reduce repetitive explanations.
    17
    4
    MIT