Skip to main content
Glama

Shared Agent Memory:像素风标题,多个 AI 客户端通过 MCP 共用本地 SQLite 记忆

让不同的 AI 助手,接着记得你的偏好。

Version CI Node.js JavaScript SQLite MCP

Codex Claude Code macOS Platform License: MIT

快速开始 · 日常怎么用 · 适用平台 · 查看记忆 · 常见问题 · 许可证

让 Codex、Claude Code 和其他支持 MCP 的 AI 客户端,在同一台电脑上共用一份长期记忆。使用 Node.js + SQLite,支持中文关键词检索、项目范围、版本历史和 Markdown 阅读副本。

Shared Agent Memory is a local MCP server that lets multiple AI clients share preferences and project decisions in one SQLite database. It provides keyword search, revision history, and a Markdown reading copy. It does not automatically capture conversations or synchronize devices.

项目信息

说明

当前状态

开发维护中 · v0.2.0,支持通过本地 MCP 接入使用

维护者

@Piao-2024

主要用途

开发者工具与 Agent 记忆基础设施;主要分类为“研究工具与基础设施”

许可证

MIT;第三方依赖见来源与许可

参与和反馈

贡献指南 · Issues

例如,你在 Claude Code 中说“请记住,我习惯用中文回答”,它保存后,你可以在新的 Codex 会话中让 Codex 查询并沿用这个偏好。项目的技术选择、已经确认的约定,也可以这样保存和查找。

它是一个在本机运行的 MCP 服务。MCP 可以理解为 AI 调用外部工具的接口:你负责连接一次,之后通过对话让 AI 保存、查询或修改记忆。

目前推荐先按下面的 MCP 方式使用。 仓库也提供 Codex 插件清单,但从 GitHub 安装插件、自动准备依赖并启动的完整流程尚未验证。

适用平台与客户端

环境

当前情况

macOS 本机

已在本机使用,适合按本文步骤配置

Linux 本机

Ubuntu CI 核心测试已通过;真实客户端安装仍待独立验证

Windows

尚未验证,本文不提供 Windows 安装步骤

Codex、Claude Code、rcode-cli

通过各自的本地 stdio MCP 配置接入

其他 AI 客户端

需要支持启动本地 stdio MCP 服务;具体兼容性需验证

云端或移动端

本文的本地配置不代表这些环境可以直接使用

多个客户端需要能访问同一份本地数据库。项目不需要独立数据库服务器,也不提供跨设备自动同步。

Related MCP server: SharedMemory MCP Server

快速开始

以下命令适用于 macOS / Linux 的终端。选择自己使用的客户端配置即可;要跨客户端共享,就分别配置这些客户端。

1. 准备环境

需要 Git、Node.js 24 或更高版本及 npm。先检查版本:

node --version
npm --version

如果 Node.js 低于 24,请先升级;项目使用 Node.js 自带的 SQLite,不需要另外安装数据库服务。

2. 下载并安装

git clone https://github.com/Infinite-Monkey-Lab/shared-agent-memory.git
cd shared-agent-memory
npm ci

已经下载过的用户直接进入原目录,不需要再次克隆。

安装目录需要长期保留:客户端会从这里启动服务,移动或删除目录后需要更新客户端配置。

3. 连接你的 AI 客户端

下面的配置命令都在刚才的 shared-agent-memory 目录中执行。 它们会记录 Node 和 start.mjs 的绝对路径,避免客户端找不到程序。

Codex

已安装 Codex CLI 的用户执行:

codex mcp add shared-memory -- "$(command -v node)" "$PWD/start.mjs"
codex mcp list

这会把 MCP 配置写入 Codex 的用户配置。配置后重新打开会话,在支持的界面中可用 /mcp 查看连接状态。

如果没有 Codex CLI,可以手动编辑 ~/.codex/config.toml,添加以下内容;两个示例路径都要换成你机器上的真实绝对路径:

[mcp_servers.shared-memory]
command = "/absolute/path/to/node"
args = ["/absolute/path/to/shared-agent-memory/start.mjs"]

在终端执行 command -v node 可以查看 Node 路径,在项目目录执行 pwd 可以查看项目路径。命令行配置和手动配置二选一即可。参见 Codex 官方 MCP 文档。

Claude Code

已安装 Claude Code CLI 的用户执行:

claude mcp add --scope user --transport stdio shared-memory -- "$(command -v node)" "$PWD/start.mjs"
claude mcp list

--scope user 表示该用户的不同项目都可以使用。配置后重新打开 Claude Code 会话。

rcode-cli 和其他支持 stdio MCP 的客户端

在客户端的 MCP 配置中添加以下服务;配置文件位置以该客户端文档为准,两个路径都要替换:

{
  "mcpServers": {
    "shared-memory": {
      "command": "/absolute/path/to/node",
      "args": ["/absolute/path/to/shared-agent-memory/start.mjs"]
    }
  }
}

如果客户端提供配置表单,服务类型选 stdio,启动命令填 Node 的绝对路径,参数填 start.mjs 的绝对路径。这里不需要填网址或端口。

已有名为 shared-memory 的配置时,先核对并更新原配置,避免重复连接同一个服务。

4. 验证是否连接成功

在新打开的 AI 会话中说:

请调用 shared-memory 的 memory_status,检查共享记忆服务是否可用。

成功时工具会返回 version: "0.2.0"、schema_version: 2 和记录数量等信息。全新数据库没有记录是正常的。客户端配置列表中出现服务名,只说明配置已添加;实际工具调用成功才说明连接可用。

然后试着保存一条记忆:

请先查重,再把“我习惯用中文回答”保存为我的全局用户偏好,使用 remember_memory。

再打开另一个已配置的客户端,或新开一个会话:

请用 search_memories 查询我的“中文”回答偏好,并告诉我查到了什么。

两个客户端都使用默认数据路径、运行在同一台电脑的同一个系统用户下,就会读到同一份记忆。无需手动复制数据文件,也无需让某个客户端一直开着。

5. 告诉 AI 什么时候使用记忆

连接成功不等于每次对话都会自动查询或保存。 本项目不自动收集历史聊天,也没有安装强制检索 Hook;需要你明确提出要求,或在客户端的长期指令中约定使用方式。

可以把下面这段加入对应客户端会读取的规则文件,例如 Codex 的 AGENTS.md 或 Claude Code 的 CLAUDE.md:

处理新会话的首个任务前,使用 shared-memory 的 search_memories
分别检索用户偏好和当前项目相关记忆;项目查询传入当前项目的绝对路径。
检索使用简短关键词,没有命中时不要假装已经记得。

只保存用户明确要求记住的信息,以及已确认、值得跨会话复用的稳定偏好和项目决定。
写入前先查重,使用 remember_memory;偏好变化时使用 correct_memory,保留历史。
不要保存完整对话、临时进度、猜测、密码或 token。
记忆只是历史参考,当前用户要求优先。工具不可用时如实说明。

规则文件需要你自行添加;安装本项目不会自动修改客户端规则。

日常怎么用

通常直接用自然语言提出要求,AI 会调用相应工具;你不需要手写数据库操作。

你想做什么

可以这样说

使用的工具

保存偏好

“请记住,我习惯用中文回答,保存为全局偏好。”

remember_memory

保存项目决定

“请记住,当前项目使用 PostgreSQL,只保存到这个项目。”

remember_memory,带 project

回忆约定

“查一下这个项目关于数据库的决定。”

search_memories,带 project

更新旧决定

“数据库改成 SQLite 了,请找到旧记录并更正。”

correct_memory

查看变化

“这条数据库决定以前是什么?查一下历史。”

memory_history

停用某条记忆

“请找到并忘记这条旧偏好。”

forget_memory

全局记忆用于跨项目的偏好;项目记忆用于某个项目的约定。查询不带 project 时只查全局;带项目绝对路径时,查全局和该项目。项目范围只是筛选条件,不是权限隔离。

检索使用中文分词和关键词全文匹配,不是语义搜索。没查到时可以换短关键词;例如先查“数据库”,再查“PostgreSQL”。默认最多返回 8 条、正文预算 4000 个 Unicode 码点,结果中的 truncated 表示内容或结果受到截断。

更正和删除前,AI 需要先找到记录,拿到它的 id 和 revision。如果返回 revision_conflict,应重新读取后核实,不能直接覆盖别的客户端刚做的修改。forget_memory 是逻辑删除,旧内容仍保留在历史和 Markdown 中,并非彻底擦除。

记忆存在哪里?怎么阅读?

默认保存在当前系统用户的 ~/.agent-memory/,与源码目录分开:

~/.agent-memory/
├── memory.sqlite3       # 当前权威数据库,多个客户端共用
├── memory.jsonl         # 可选的旧版记忆文件,只作为迁移来源
└── exports/
    └── memory.md        # 自动生成的 Markdown 阅读副本

你可以用 Typora 或其他 Markdown 阅读器打开 ~/.agent-memory/exports/memory.md。服务启动、记忆变化后会自动生成或刷新它;其中包含当前记忆及标注状态的历史记录。

编辑 Markdown 不会改回数据库,而且下次导出会覆盖编辑。 修改记忆请让 AI 调用 MCP 工具,不要直接改 SQLite、旧 JSONL 或锁文件。

这里的“共享”指同一台电脑、同一系统用户下的本地共享。本项目不提供多台电脑之间的自动同步。数据保存在本机,但 AI 查询到的内容进入上下文后,会发送给你正在使用的模型服务商。

更新、检查和备份

以下命令都在源码目录中执行。

更新程序后,重连 MCP 或重启客户端,使其加载新代码:

git pull --ff-only
npm ci

检查数据库状态或手动重新生成阅读副本:

npm run status
npm run export

status 返回的 integrity: "ok" 表示 SQLite 完整性检查通过。数据库尚不存在时,这些维护命令也会创建数据库;它们不用于证明客户端已连接。

备份数据库:

npm run backup -- "$HOME/shared-memory-backups/memory-$(date +%Y%m%d-%H%M%S).sqlite3"

备份目标必须是尚不存在的绝对路径,已有文件不会被覆盖。此命令通过 SQLite 的备份接口生成副本;不要只复制正在运行的 memory.sqlite3,否则可能漏掉尚在 WAL 中的数据。

开发或修改代码时可以运行 npm test。项目直接运行 JavaScript 源码,没有额外的构建步骤。

开发与协作

欢迎改进文档、补充平台验证、报告问题或完善客户端接入。首次参与可以从复核一条安装命令、用虚构数据验证跨客户端查询开始,具体流程见 CONTRIBUTING.md。仓库已公开,欢迎通过 Issues 反馈问题或通过 PR 参与改进。

GitHub Actions 在推送和 PR 时分别使用 Ubuntu、macOS 与 Node.js 24 执行 npm ci 和 npm test,并在 Ubuntu 检查高危及以上的依赖漏洞。测试使用临时目录与虚构数据,不读取正式记忆库。这些检查不等于完整客户端安装或插件安装验证;各次远程结果以 Actions 页面为准。

Dependabot 配置 每月检查 npm 依赖和 GitHub Actions 更新。分支保护、漏洞提醒及其他仓库安全功能属于 GitHub 后台设置,提交配置文件并不会自动开启它们。

项目由维护者借助 Codex 辅助实现和整理文档;现有检查覆盖存储、迁移、并发、更正历史、Markdown 导出与 MCP 协议交互。自动测试不代表已由另一位维护者独立复核,客户端及平台支持范围以本文说明为准。参与者应在 PR 中说明重要的 AI 辅助内容和实际做过的核验。

常见问题

需要先运行 npm start,再打开客户端吗?

不需要。客户端会按配置自动启动服务;断开连接后进程可以退出。每个客户端可以启动自己的进程,它们共用同一个数据库。手动运行 node start.mjs 后没有聊天界面、一直等待输入是正常的,因为它等待的是 MCP 协议消息。

客户端找不到 Node,或提示 ERR_MODULE_NOT_FOUND?

确认 Node 至少为 24,配置使用真实绝对路径,并且在该 start.mjs 所在目录运行过 npm ci。如果移动了源码目录或更换了 Node 安装位置,需要更新客户端配置。

为什么一个客户端记住了,另一个查不到?

先确认保存操作实际成功,再检查两个客户端是否使用同一系统用户、同一数据库路径,以及查询是否带了正确的项目路径。项目记录默认不出现在不带 project 的查询中。旧会话也可能尚未加载新工具,需要重连或新开会话。

能直接作为 Codex 插件安装吗?

仓库包含 plugin.json、mcp.json 和 .agents/plugins/marketplace.json,但插件安装及依赖准备的完整流程尚未实测。目前请先按上面的 MCP 方式接入。源码目录安装过依赖,不代表客户端缓存的插件副本也已经安装依赖。插件入口和手动 MCP 入口同时启用可能出现重复工具。

已有 v1 的 memory.jsonl,需要手工迁移吗?

默认目录存在旧文件时,服务启动会读取并导入,保留原文件。v2 还能读取旧版进程后续写入的内容;旧版进程不会读到 v2 新增的记忆,因此升级后应让所有客户端重连到 v2。

高级配置:使用独立的数据目录

正常共享使用不需要配置环境变量。要做隔离测试,或为不同用途使用不同的库,可以在各客户端的 MCP 环境变量设置中指定以下三个路径:

环境变量

用途

默认路径(未设置任何覆盖时)

MEMORY_DB_PATH

SQLite 数据库

~/.agent-memory/memory.sqlite3

MEMORY_FILE_PATH

可选的旧 JSONL 导入来源

~/.agent-memory/memory.jsonl

MEMORY_EXPORT_PATH

Markdown 阅读副本

~/.agent-memory/exports/memory.md

例如,在前面的通用 JSON 配置中,将 shared-memory 服务项替换为:

{
  "command": "/absolute/path/to/node",
  "args": ["/absolute/path/to/shared-agent-memory/start.mjs"],
  "env": {
    "MEMORY_DB_PATH": "/absolute/path/to/test-memory/memory.sqlite3",
    "MEMORY_FILE_PATH": "/absolute/path/to/test-memory/memory.jsonl",
    "MEMORY_EXPORT_PATH": "/absolute/path/to/test-memory/exports/memory.md"
  }
}

三个路径必须互不相同。做全新隔离测试时请同时指定三个路径,避免导入默认目录里的旧记忆。只设置 MEMORY_FILE_PATH 时,数据库路径会从该文件名推导;只更改数据库路径时,导出默认跟随数据库目录,旧 JSONL 来源仍可能是默认目录。

自定义目录后,维护命令也需要使用同样的环境变量,否则会操作默认库。仓库只保存程序与虚构的测试数据,不应提交真实数据库、JSONL、Markdown 阅读副本、备份或客户端凭据。

许可证

本项目的源码、文档与横幅采用 MIT 许可证。你可以使用、修改和分发,也可以用于商业用途;分发时需保留版权声明和许可文本。软件按原样提供,不附带担保。

第三方依赖遵循各自的许可证,来源、版本和已知许可信息见 THIRD_PARTY_NOTICES.md;记忆数据库、备份和个人配置不属于仓库分发内容。

Available Tools

15 tools
add_observationsC

Compatibility tool backed by the same v2 SQLite store. New callers should prefer versioned native memory tools. Legacy deletion is logical and retained in history.

NameRequiredDescriptionDefault
observationsYes

TDQS

C2.1/5.0
Behavior2/5

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

Annotations already declare the write/safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description's main remaining job is to disclose edge behavior — duplicate handling, what entityName must match, what happens on unknown entities. None of that appears. Worse, the one behavioral claim present ("Legacy deletion is logical and retained in history") describes deletion on a tool that adds observations, which misdirects rather than informs; it is consistent with destructiveHint=false but irrelevant here.

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

Conciseness2/5

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

The text is short but badly front-loaded: the leading sentence is about the storage backend rather than the operation. The final sentence concerns deletion, which does not belong in an add tool's description and consumes one-third of the available space with off-target content.

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

Completeness2/5

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

For a mutation tool with a nested-object array parameter, no output schema, and no parameter descriptions, the description needs to carry substantial weight — and it does not. The only genuinely useful information (shared v2 SQLite store, prefer native tools) is swamped by an unexplained deletion clause that raises more questions than it answers.

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

Parameters1/5

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

Schema description coverage is 0% and the description adds nothing about the single `observations` array parameter — not its shape, the entityName/contents pairing, the 100-item and 20000-char bounds, nor whether entities must pre-exist. The definition entirely abandons the agent to reading the raw schema, and the key ambiguity (does add_observations create the entity or fail if missing?) is left unanswered.

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

Purpose2/5

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

The description never states what the tool does — the name 'add_observations' is the only clue that observations are being added, and the text never confirms it. It spends its sentences on implementation provenance ("backed by the same v2 SQLite store") and deprecation framing instead of a verb+resource statement. An agent cannot tell from the text alone whether this reads, writes, or deletes.

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?

"New callers should prefer versioned native memory tools" is real steering away from this tool, which is more than most definitions offer. But it names no specific alternative among the many siblings (remember_memory, create_entities, etc.), and it gives no condition under which this legacy path IS the right call. The exclusion is implied rather than actionable.

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

correct_memoryB

Replace an active memory with a new revision. Use the returned id and revision for subsequent corrections; stale writers are rejected. Old content stays in history.

NameRequiredDescriptionDefault
idYes
reasonNo
contentYes
attributionNo
occurred_atNo
request_keyNo
source_agentNo
source_sessionNo
expected_revisionYes

TDQS

B3.4/5.0
Behavior4/5

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

Adds substantive behavior beyond the annotations: corrections are revision-checked and stale writes are rejected (optimistic concurrency), and prior content is preserved in history. The history-retention note is consistent with destructiveHint=false and the verb is consistent with readOnlyHint=false and idempotentHint=false. Missing only what the rejection failure looks like to the caller.

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 the action, then outcome and side effect. No filler; the only thing not earning its place is the slightly redundant second clause about subsequent corrections.

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 core correction semantics well, but for a 9-parameter mutation with no output schema and no parameter descriptions, the agent still cannot infer what attribution, occurred_at, request_key or source_* are for, or what a successful response contains.

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

Parameters2/5

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

Schema description coverage is 0% across 9 parameters, so the description carries the full burden. It explains `id` and `expected_revision` only indirectly via "returned id and revision", and says nothing about content, reason, attribution, occurred_at, request_key, or the two source_* parameters.

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

Purpose4/5

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

States a specific verb and resource: replace an active memory with a new revision. It clearly reads as an update/correction operation rather than a create, which implicitly separates it from remember_memory, but it never names a sibling or scopes itself explicitly against forget_memory or memory_history.

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 guidance on the correction workflow (reuse the returned id and revision, stale writers rejected), which tells the agent how to chain calls. It does not say when to choose this over remember_memory or forget_memory, nor what preconditions must hold beyond "active memory".

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

create_entitiesC

Compatibility tool backed by the same v2 SQLite store. New callers should prefer versioned native memory tools. Legacy deletion is logical and retained in history.

NameRequiredDescriptionDefault
entitiesYes

TDQS

C2.5/5.0
Behavior3/5

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

Annotations already declare this is a non-idempotent write that is not destructive; the description adds useful context that the tool is legacy/compatibility and writes to the same v2 SQLite store, which tells an agent its data is not isolated. The sentence about logical, history-retained deletion is off-topic for a create tool and muddies rather than clarifies creation semantics (e.g. duplicate handling).

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

Conciseness3/5

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

Three short sentences with no padding, but they are front-loaded on deprecation status rather than the operation, and the deletion sentence does not earn its place in a create tool's description.

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

Completeness2/5

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

For a write tool with a nested, undocumented parameter and no output schema, the description should explain what gets persisted and what happens on name collisions. It omits both, and its mention of deletion history is irrelevant to this operation.

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 single `entities` parameter is a nested array of objects with required name/entityType/observations. The description says nothing about these fields, their meaning, the 100-item caps, or whether observations are appended or replaced, so it fails to compensate for the coverage gap.

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

Purpose2/5

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

The description never states what the tool does. It talks about being a 'compatibility tool backed by the same v2 SQLite store' and about legacy deletion, but never says it creates entities, observations, or anything at all. An agent must infer the operation from the name 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?

'New callers should prefer versioned native memory tools' is a genuine when-not-to-use signal that steers agents toward alternatives. However, it never names the specific replacement among the many siblings (remember_memory, create_relations, etc.) and never says when this tool IS the right choice.

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

create_relationsC

Compatibility tool backed by the same v2 SQLite store. New callers should prefer versioned native memory tools. Legacy deletion is logical and retained in history.

NameRequiredDescriptionDefault
relationsYes

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already declare readOnly=false, idempotent=false, destructive=false, so the description need not restate the safety profile. What it adds instead is mostly non-actionable ('backed by the same v2 SQLite store') or off-topic — the sentence about logical deletion and retained history describes delete_relations behavior, not a create operation. Nothing is said about what happens on duplicate or conflicting relations, or about partial failure in a batch, which is the real behavioral risk here.

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

Conciseness3/5

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

Three short sentences with little padding, so it is not bloated. But it is poorly front-loaded: the leading sentence is provenance trivia rather than the operation, and the final sentence concerns a different tool family entirely. Structure wastes the position of highest attention.

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

Completeness2/5

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

This is a mutating batch tool with no output schema, no annotation coverage of semantics, and a fully undocumented nested parameter. The definition should at minimum say what a relation is, whether endpoints must pre-exist, and what a successful response confirms; it says none of that. An agent could call it, but could not call it correctly with confidence.

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 single parameter is a nested array of objects with from/to/relationType, none of which is explained in the description. The description provides no meaning for these fields, no note that up to 100 relations can be submitted per call, and no guidance on valid relationType values. With zero coverage in the schema, the description had the full burden and did not carry it.

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

Purpose2/5

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

The description never states that this tool creates relations between entities; it only labels itself a 'compatibility tool backed by the same v2 SQLite store'. The actual verb+resource pairing exists only in the name, so an agent must infer the purpose rather than read it. It does hint at being a legacy analog of newer memory tools, but that is context, not a statement of what it does.

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?

'New callers should prefer versioned native memory tools' is a genuine when-not-to-use signal, which is more than most definitions offer. However, it never names the concrete alternative among the many siblings (create_entities, remember_memory, add_observations), so the agent cannot route deterministically. There is also no statement of prerequisites, such as whether the referenced entities must already exist.

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

delete_entitiesB
Destructive

Compatibility tool backed by the same v2 SQLite store. New callers should prefer versioned native memory tools. Legacy deletion is logical and retained in history.

NameRequiredDescriptionDefault
entityNamesYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description doesn't need to re-establish that it mutates. It does add real value beyond them: the deletion is logical rather than physical and remains in history, which materially changes how an agent reasons about recoverability.

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, no filler, with the compatibility status front-loaded so the agent learns the routing rule before the behavioral caveat. Slightly better ordering would put the soft-delete semantics first for anyone who has already decided to call it.

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 and zero parameter documentation, the description covers the two highest-value facts (soft delete, prefer alternatives) but is silent on return values, behavior for nonexistent names, and batch semantics. Adequate to avoid misuse, not complete to call confidently.

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% for the single required parameter, so the description carries the full burden and provides nothing: no mention of entity names, the 100-item cap, or per-item length limits. The agent gets no guidance on what to pass or how failures on unknown names behave.

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

Purpose3/5

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

The description signals deletion and identifies the tool as a legacy compatibility shim over the v2 SQLite store, but it never states the resource being deleted (entities) or that the operation targets a list of names. An agent knows it's 'a deletion' but must infer what it deletes from the tool name alone.

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?

"New callers should prefer versioned native memory tools" is an explicit when-not-to-use signal with a named alternative direction. It stops short of naming a specific sibling (e.g. forget_memory), so the routing is clear but not fully concrete.

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

delete_observationsB
Destructive

Compatibility tool backed by the same v2 SQLite store. New callers should prefer versioned native memory tools. Legacy deletion is logical and retained in history.

NameRequiredDescriptionDefault
deletionsYes

TDQS

B3.4/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 description earns credit for adding that deletion is logical and retained in history — a crucial nuance for an otherwise destructive-looking operation. It does not add auth, limits, or output detail, but it meaningfully explains the destruction model.

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 with no filler; the compatibility context, the preference rule, and the logical-deletion behavior are each stated once. Slightly better front-loading of what the tool does would help, but it is compact.

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 legacy mutation tool with no output schema, the description covers deprecation status and deletion semantics but leaves the complex deletions payload entirely unexplained. An agent can decide whether to use it but not how to call it correctly without reading the schema.

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 single parameter is a nested array of entityName plus observations with per-item limits. The description says nothing about this structure, so an agent must open the schema to learn what to pass.

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

Purpose3/5

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

The description frames the tool as a legacy compatibility path for deletion but never states plainly that it deletes observations for an entity; the resource is only inferred from the tool name. It does distinguish itself from newer native memory tools, which helps, but the core verb+resource statement is left implicit.

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?

"New callers should prefer versioned native memory tools" is a clear routing rule that steers agents away from this tool toward siblings like forget_memory. What is missing is a positive statement of when legacy callers should still use it, but the alternative is named explicitly.

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

delete_relationsB
Destructive

Compatibility tool backed by the same v2 SQLite store. New callers should prefer versioned native memory tools. Legacy deletion is logical and retained in history.

NameRequiredDescriptionDefault
relationsYes

TDQS

B3.1/5.0
Behavior4/5

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

Adds real context beyond the annotations: deletion is logical rather than physical, records are retained in history, and the store is shared with v2 tooling. That materially changes how an agent should reason about reversibility and auditability, which annotations (destructiveHint=true) alone would obscure. It still omits failure behavior and whether the batch is atomic.

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 with no filler, and the migration warning is placed early so an agent reads it before deciding to call. The opening clause about the SQLite backend is slightly less useful than a statement of what the tool does, but overall it is tight.

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

Completeness2/5

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

For a destructive, non-idempotent batch mutation with no output schema and zero parameter documentation, the description is under-specified: no statement of the operation itself, no all-or-nothing semantics, no mention of how partial or missing relations are handled, and no indication of what the call returns.

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 single `relations` parameter is a nested array of {from, to, relationType} triples capped at 100 items. The description says nothing about this structure, the batch limit, what happens to triples that don't exist, or whether the whole array is applied atomically.

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

Purpose3/5

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

The description never states the actual operation; the agent has to infer 'deletes relations' from the tool name plus the phrase 'legacy deletion.' It frames the tool as a compatibility shim rather than describing the verb+resource, and it does not distinguish it from siblings like forget_memory or delete_entities.

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?

There is a genuine routing hint — 'new callers should prefer versioned native memory tools' — which tells the agent this is a fallback. However, it never names which sibling to prefer, nor states the condition under which this tool remains the right choice (legacy callers, existing relation triples).

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

forget_memoryB
Destructive

Logically delete the active revision. Historical content remains in SQLite and the Markdown history; this is not physical erasure.

NameRequiredDescriptionDefault
idYes
reasonNo
request_keyNo
expected_revisionYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, readOnlyHint=false; the description usefully adds that content persists in SQLite and Markdown history, which is real context about what is and isn't destroyed. However, the significant behavioral risk of this tool — that a required expected_revision can cause the call to fail on a stale revision, and that request_key affects retry deduplication — is never mentioned.

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 clauses, front-loaded with the core action followed immediately by the crucial retention caveat. Every phrase earns its place and nothing is padded.

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?

With no output schema and 0% parameter documentation, the description covers the semantics of the deletion well but leaves the agent without the concurrency/idempotency model needed to call it reliably. Adequate for understanding the effect, incomplete for executing the call.

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

Parameters2/5

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

Schema description coverage is 0% across four parameters, so the description must carry the load, and it explains none of them. 'Active revision' loosely gestures at expected_revision, but reason, request_key (deduplication) and id are entirely unexplained, leaving the two non-obvious parameters opaque.

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+scope: logically delete the active revision, which clearly separates 'forget' (soft delete) from physical deletion. It does not name the sibling tools it competes with (correct_memory, delete_entities, forget vs. history), so it stops short of full sibling differentiation.

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

Usage Guidelines2/5

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

There is no statement of when to choose this over correct_memory (fix a value) or memory_history (inspect) or delete_entities, which is exactly the ambiguity a 'forget' tool creates in this sibling set. The only guidance is an implied contrast with physical erasure, not a selection rule.

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

memory_historyA
Read-onlyIdempotent

Read up to 100 revisions of a memory chain, including deleted and superseded records.

NameRequiredDescriptionDefault
idYes
limitNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real context beyond them: a hard cap of 100 revisions and the fact that soft-deleted/superseded entries are still returned, which affects how an agent interprets results. It stops short of describing ordering or pagination.

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

Conciseness5/5

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

A single front-loaded sentence with no filler; the most decision-relevant detail (including deleted and superseded records) comes before the read completes.

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?

With only two parameters and no output schema, the definition is serviceable but leaves gaps: return ordering, whether deleted records are flagged in the response, and how the caller should interpret a truncated result at the 100 cap are all unaddressed.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry the load. 'Up to 100 revisions' implicitly explains the limit parameter's maximum, but neither the purpose of 'id' (memory id vs. chain id) nor the meaning of limit as a narrowing control is spelled out.

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 ('Read ... revisions of a memory chain') plus the notable scope that deleted and superseded records are included. This clearly separates it from retrieval siblings like search_memories or memory_status, though it never names a sibling 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 implied rather than stated: the mention of deleted and superseded records signals an audit/version-history use case. There is no explicit when-to-use, when-not-to-use, or pointer to alternatives such as memory_status or read_graph for current state.

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

memory_statusB
Read-onlyIdempotent

Read non-secret store status and counts; does not expose memory content or paths.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds useful value by clarifying that no memory content or filesystem paths are revealed, which is real behavioral context. However, it does not describe what 'status' comprises or whether counts are approximate or scoped.

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?

A single compact sentence with the core purpose front-loaded. Every clause earns its place. Slightly penalized only because the brevity comes at the cost of any usage or return-value detail.

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?

With no output schema, the description must carry the burden of explaining what comes back, and 'status and counts' is vague. It is complete on safety scope and inputs but leaves the return shape underspecified for a tool whose only output is status information.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. There is no parameter ambiguity to resolve, and the description correctly implies no input is required.

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: reading non-secret store status and counts, with an explicit scope exclusion ('does not expose memory content or paths'). This clearly distinguishes it from siblings like read_graph, search_memories, and memory_history. It stops short of 5 because 'store status and counts' remains slightly abstract about what is actually reported.

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

Usage Guidelines2/5

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

No indication of when an agent should call this versus alternatives such as read_graph or memory_history. There are no prerequisites, triggers, or exclusions stated beyond the content-exposure caveat.

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

open_nodesC
Read-onlyIdempotent

Compatibility tool backed by the same v2 SQLite store. Explicit graph reads may be large; prefer search_memories for bounded project-aware retrieval.

NameRequiredDescriptionDefault
namesYes

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the bar is lower. The description adds a useful performance warning ("may be large") and storage backing, but does not disclose what happens to names that don't exist, whether results preserve input order, or any truncation behavior — relevant here since the schema caps names at 100 items.

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

Conciseness3/5

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

It is short (two sentences) but front-loads the vague "Compatibility tool" rather than the operation, and "backed by the same v2 SQLite store" consumes a clause without helping an agent decide to call it.

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

Completeness2/5

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

With no output schema and no parameter descriptions, the description must explain what a call returns and what input shape is expected; it does neither, leaving an agent unable to predict results or name format beyond the raw array-of-strings schema.

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?

The sole parameter, "names", has 0% schema description coverage, so the description carries the full burden — yet it says nothing about what a name is (entity name, node ID, fully-qualified identifier) or how matching behaves. With one undocumented parameter and no compensating prose, this falls below baseline.

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

Purpose2/5

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

The description calls itself a "Compatibility tool" and alludes to "explicit graph reads," but never states plainly that it retrieves/fetches nodes by name, nor how it differs from search_nodes or read_graph. The word "open" in the name is never expanded on, so an agent must infer the primary verb+resource from structured fields alone.

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

Usage Guidelines4/5

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

It explicitly discourages the tool for large explicit graph reads and names the alternative: "prefer search_memories for bounded project-aware retrieval." That is a concrete when-not condition plus the replacement, though it never states the positive case for using open_nodes itself.

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

read_graphA
Read-onlyIdempotent

Compatibility tool backed by the same v2 SQLite store. Explicit graph reads may be large; prefer search_memories for bounded project-aware retrieval.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuine context beyond that — a compatibility layer over the v2 SQLite store and a warning that results may be large — but it does not say what the payload looks like (full graph vs. summary), which matters for a no-parameter read with no output schema.

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 compatibility caveat first and the redirect second; nothing is wasted. The phrase 'the same v2 SQLite store' leans on unstated context, but it is compact and front-loaded.

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?

Annotations cover safety and there are no parameters, but with no output schema the description should clarify what a 'graph read' actually returns and roughly how large it can get. The size warning gestures at this without resolving 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?

Zero parameters and 100% schema coverage, so there is nothing for the description to disambiguate. Baseline applies.

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

Purpose3/5

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

It labels itself a 'compatibility tool' and refers to 'explicit graph reads', implying it returns the full knowledge graph, but never states outright that it returns all entities and relations. An agent can infer the scope only from the absence of parameters plus the size warning, not from an explicit verb+resource statement.

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

Usage Guidelines4/5

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

It explicitly routes the agent away: 'prefer search_memories for bounded project-aware retrieval', naming the sibling and the condition that selects it. It stops short of saying when read_graph itself is the right choice (i.e., when a complete dump is actually wanted).

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

remember_memoryB

Save a confirmed useful memory with provenance; request_key makes retries safe. Unknown sources stay unknown. Same entity/content is deduplicated.

NameRequiredDescriptionDefault
kindNo
contentYes
projectNo
attributionNo
entity_nameYes
occurred_atNo
request_keyNo
source_agentNo
source_sessionNo

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare non-read-only, non-destructive, closed-world, and idempotentHint=false, so the safety profile is largely carried by structured data. The description adds real value with dedup behavior ("same entity/content is deduplicated") and attribution preservation, but it does not say whether a duplicate returns the existing record or an error, nor what permissions or side effects apply.

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 clauses, no filler, with the retry-safety guarantee front-loaded after the core action. It is efficient, though the density borders on under-specification given the parameter surface.

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

Completeness2/5

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

For a 9-parameter write tool with no output schema and zero schema description coverage, the definition is too thin: return shape, duplicate-handling semantics, and most parameter meanings are unstated. An agent can call it, but cannot confidently predict the outcome.

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

Parameters2/5

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

Schema description coverage is 0% across 9 parameters, so the description must compensate and largely does not. Only request_key (retry safety) and attribution ("unknown sources stay unknown") get any treatment; entity_name, content, kind, project, occurred_at, source_agent, and source_session are left entirely to bare type constraints.

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 concrete verb and resource ("Save a confirmed useful memory with provenance") and adds distinguishing traits (retry safety, dedup) that separate it from correct_memory and forget_memory. "Confirmed useful" is a judgment call left unexplained, but the core action is unambiguous.

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?

Implies this is the path for durable facts and tells the agent to pass request_key for safe retries, but never says when to prefer it over correct_memory, add_observations, or create_entities in the sibling set. The agent must infer the routing decision.

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

search_memoriesB
Read-onlyIdempotent

Bounded lexical/full-text recall. With project, returns global and that exact project; without project, global only. Project selection is a relevance filter, not authorization.

NameRequiredDescriptionDefault
limitNo
queryYes
projectNo
include_historyNo
character_budgetNo

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description still adds real value: it discloses that results are bounded, that project scoping includes global plus the exact project, and crucially that project is a relevance filter rather than an authorization boundary — a behavioral/security trait not in the schema.

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 retrieval mode followed by the scoping rule and the authorization clarification. No filler.

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

Completeness2/5

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

With 5 parameters, 0% schema coverage, and no output schema, the description should carry the load but omits include_history and character_budget entirely and says nothing about result ordering or return shape. It is complete for the project parameter only.

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

Parameters2/5

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

Schema description coverage is 0% across 5 parameters, so the description must compensate and largely does not. It explains the semantics of project well but leaves query, limit, include_history, and character_budget undocumented; "bounded" only faintly gestures at the budget/limit parameters.

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

Purpose3/5

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

"Bounded lexical/full-text recall" states the retrieval mechanism, which is more specific than a bare verb, but it never names the resource (memories) or distinguishes this from the sibling search_nodes. An agent must infer the target corpus from the tool name 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?

The description clearly explains the project-filter scoping rule, which is genuine usage guidance. However, it offers no when-to-use-vs-alternatives guidance against search_nodes, read_graph, or open_nodes, so the agent gets scope semantics but no routing signal.

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

search_nodesB
Read-onlyIdempotent

Compatibility tool backed by the same v2 SQLite store. Explicit graph reads may be large; prefer search_memories for bounded project-aware retrieval.

NameRequiredDescriptionDefault
queryYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive traits, and the description adds two traits not in structured data: it is a compatibility shim over the v2 SQLite store, and results may be large. It does not describe return shape or pagination, but for a read-only compat alias the added context is substantive.

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, no repetition, and the compatibility caveat precedes the routing advice. The phrase 'Explicit graph reads' has a slightly unclear referent, but nothing is wasted.

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

Completeness2/5

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

With no output schema and an undocumented lone parameter, the description should explain what a node match is and roughly what comes back. It only warns that results may be large, which does not let an agent predict or handle the response.

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?

There is one parameter with 0% schema description coverage, so the description carries the full burden — yet it never mentions `query`, what it matches against, or whether it is a name, full-text, or fuzzy search. This is the biggest gap in an otherwise reasonable definition.

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

Purpose3/5

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

The description frames the tool as a 'Compatibility tool backed by the same v2 SQLite store' and hints at graph reads, but never states the actual operation (searching nodes) or what the query matches. An agent can infer it is a legacy alias for graph node retrieval, but the verb+resource pairing is never made explicit.

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?

'prefer search_memories for bounded project-aware retrieval' explicitly names the sibling and the condition that selects it, which is exactly the routing guidance an agent needs. It stops short of saying when this tool is the right choice (only for legacy compatibility?), leaving that implicit.

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 updatesv0.2.0
    • First observedadd_observations
    • First observedcorrect_memory
    • First observedcreate_entities
    • First observedcreate_relations
    • First observeddelete_entities
    • First observeddelete_observations
    • First observeddelete_relations
    • First observedforget_memory
    • First observedmemory_history
    • First observedmemory_status
    • First observedopen_nodes
    • First observedread_graph
    • First observedremember_memory
    • First observedsearch_memories
    • First observedsearch_nodes

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Persistent memory for Claude Code. Automatically indexes every conversation and provides production-grade hybrid search (BM25 + vectors + reranker) via MCP tools. 100% local, zero config, zero API keys, zero invoice.
    16
    30 npm
    7
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Persistent memory for AI agents across Claude Code, Cowork, Codex, Cursor and Hermes Agent. Saves, searches and recalls sessions from a local SQLite store through 40+ MCP tools, with auto-save and auto-load hooks, project tagging and export/import. Also a Hermes Agent memory provider plugin in the official catalog. Free: keyword search, 50 sessions. Pro ($8/mo): semantic search and team memory.
    33
    349 PyPI
    12
    Business Source 1.1
  • A
    license
    Not graded
    quality
    B
    maintenance
    Centralizes verbatim local AI conversation history into a SQLite database and exposes it via an MCP server, enabling tools like Claude Code and Codex to retrieve exact context from other tools.
    1 npm
    MIT