Thoth-Mem
Thoth-Mem
面向 AI 编码智能体的持久内存
为编码智能体提供跨会话、上下文压缩和上下文重置的持久项目记忆。
Thoth-Mem 是一个本地优先的 MCP 服务器,后端由 SQLite 和 FTS5 提供支持。它保存有用的决策、问题修复、约定和会话连续性,然后只检索智能体所需的证据。同一个安装还提供 CLI、可选的 HTTP API,以及对受支持编码工具(coding harnesses)的原生生命周期集成。
全局作用域管理当前用户的工具配置;项目作用域是显式的,并且仅限定在所选项目及其回执树(receipt tree)内。Engram、thoth-agents 或其他记忆集成可能存在重叠;请仅将其视为一个警告:thoth-mem 不会编辑、禁用、移除或写入外部仓库。
快速开始
需要 Node.js 18 或更高版本。原生设置是可选的:手动 MCP 连接只需要 mcp 命令。
运行已发布版本
无需安装全局命令即可启动最新发布的 MCP 服务器:
npx -y thoth-mem@latest mcp这会启动 MCP 服务器及其本地 HTTP 桥接。当只需要 MCP 传输时,请添加 --no-http。新的客户端配置应使用显式的 mcp 子命令。
原生集成在设置完成之后会调用持久化的 thoth-mem 命令,因此在配置某个工具之前,请先在全局安装或更新该命令。使用 npx 从最新发布版本运行 setup 的实现、检查其零写入计划,然后应用它:
npx -y thoth-mem@latest setup codex --scope global --plan --json
npx -y thoth-mem@latest setup codex --scope global --json对于其他受支持的工具,请将 codex 替换为 opencode 或 claude,然后重启该工具。单独运行 setup 不会安装或更新 npm 包。
安装此仓库
请使用仓库流程来测试尚未发布的提交:
pnpm install
pnpm run build
pnpm add -g .
thoth-mem version
thoth-mem setup codex --scope global --plan --json
thoth-mem setup codex --scope global --jsonthoth-mem@latest 只包含最新的已发布版本。拉取较新的未发布提交后,请重新构建并重新运行 pnpm add -g .。
更新现有安装
先更新包。如果之前安装了原生集成,请重新运行其设置,使已复制的资源、技能、钩子和受管声明与新的包版本保持一致:
pnpm add -g thoth-mem@latest
npx -y thoth-mem@latest setup codex --scope global --plan --json
npx -y thoth-mem@latest setup codex --scope global --json然后重启工具或 MCP 进程。手动 MCP 用户不需要 setup;重启 npx -y thoth-mem@latest mcp 即可。
设置会保留记忆数据库和用户拥有的配置。启动时,缺失的配置字段可能会被回填,但显式的值(例如 LM Studio 模型)仍然是订阅的一项配置。配置格式保持为 "version": 1。对于某次发布安装,请将较旧的 $schema 手动更新为该发布版本的 URL,以获得当前编辑器校验和自动补全。未发布的工作副本必须使用本仓库的 config.schema.json,因为 unpkg 在版本发布前无法公开该变更。schema URL 不会影响运行时迁移。
更改嵌入模型属于模型操作,而不是设置操作。请根据调整调整 embedding.provider、model、baseUrl 和原生 dimensions;profile: "auto" 会解析支持的模型家族。请重启 thoth-mem,并让变更新的嵌入谱系(embedding lineage)将幂等的语义索引重建编入待处理队列。
Related MCP server: LumenCore
记忆循环
一个有效的智能体工作流应当简单且可重复:
保存有持久价值的经验。 使用
mem_save保存决策、根本原因、约定,或其他在当前上下文之外仍应存在的不显而易见的经验。收窄召回。 使用
mem_recall(mode="compact")开始,用mode="context"扩展强候选,再使用mem_get获取一条完整记录。以身份继续。 保持相同的稳定
session_id和project;使用mem_context读取最近的连续性,使用mem_session读取 root 拥有的生命周期事件。
示例观察:
{
"kind": "observation",
"title": "Retry SQLite writes in a new transaction",
"type": "bugfix",
"project": "my-project",
"topic_key": "sqlite/busy-retry",
"content": "**What**: Roll back after SQLITE_BUSY and retry in a new transaction.\n**Why**: Retrying inside the failed transaction repeats the failure.\n**Where**: write transaction helper.\n**Learned**: Use bounded backoff before opening the new transaction."
}在持久化之前先移除 <private>...</private> 内的内容。请勿存储凭据、完整转录内容、被当作用户意图的生成式智能体提示词,或在没有可复用经验的情况下存储原始日志。
六个 MCP 工具
工具 | 用途 |
| 持久化一条观察、真实用户提示词、root 拥有的摘要,或被动学习的结果。 |
| 运行有界融合召回;先使用紧凑结果,再决定是否展开上下文。 |
| 读取最近的会话、提示词、观察以及可选的已召回连续性。 |
| 按 ID 获取一条观察或提示词,并提供有界分页或时间线上下文。 |
| 浏览项目、主题、图谱视图和运行情况。 |
| 开始、检查点化或总结一个 root 拥有的记忆会话。 |
Setup、sync、migration、rebuild 和维护命令是 CLI / HTTP 管理能力,不会新增更多 MCP 工具。
检查图谱社区
社区来自一个项目知识图谱的摘要。操作者通过 CLI 构建或刷新这些已提交的摘要:
thoth-mem rebuild-communities --project my-project然后智能体通过 mem_project 获取它们:
{
"action": "graph",
"project": "my-project",
"navigation": "community",
"limit": 5,
"max_chars": 2000
}响应会报告社区状态和新鲜度,然后返回结果,例如 community=<id>、graph coverage、confidence、degradation state、一个 bounded summary 和 sources=obs:<id>。社区检查要求提供项目,但不要求 focus node 或 observation ID。如果没有已提交的摘要,它会直接提示,而不会合成一个全局视图。
若要检查某个社区的原始证据,请从其 sources 取一个 obs:<id>,然后调用 mem_get(kind="observation", id=<id>)。observation ID 也会出现在召回结果中。在穷尽的 graph 邻域内,将相同 ID 作为 focus_node_id="obs:<id>",配合 navigation="neighborhood" 使用。
原生代码集成
原生安装会在工具支持的情况下安装包自带的 MCP 声明、记忆技能和生命周期钩子。先查看零写入计划,然后删除 --plan 重新运行以应用:
工具 | 计划 | 应用 |
OpenCode |
|
|
Codex |
|
|
Claude Code |
|
|
OpenCode 的默认 setup 命令是 thoth-mem setup opencode;对于指定的项目,可以加上
thoth-mem setup opencode --scope project --project /path/to/project --force,
或使用 thoth-mem setup codex --rollback /path/to/receipt.json 进行按回执限定的加载。
这些状态和退出码是稳定的:
状态 | 退出码 |
|
|
|
|
|
|
|
|
项目本机设置是显式的:
thoth-mem setup opencode --scope project --project /path/to/project --plan --json应用前请先检查冲突位置。只有已证明归 thoth-mem 所有的冲突位置,才使用 --force。Codex 0.144.x、0.146.x 和 0.147.x 属于已测试兼容集,无需 --force。对于其他 Codex 版本,当所选的 working scope 仍然会暴露完整的、可独立验证的插件管理器能力时,可以不应用验证版本号,这时会返回 requires_user_action,并在状态中输出警告。它不会绕过状态验证、所有权验证、包含检查、调和或清理保护,也不会授权任何与 thoth-mem 无关的配置。
Claude Code 还支持原生 marketplace 流程:
claude plugin marketplace add EremesNG/thoth-mem
claude plugin install thoth-mem原生集成是可选的。现有的记忆条目和六个工具的 MCP 服务器在手动连接下仍然全部运行。
手动 MCP 备用
原生钩子是可选的。如果不想采用受管设置或原生插件,请继续使用一个普通的 MCP 六工具连接;现有记忆仍然需要。
迁移到原生工具集成
原生设置是可选加入:先查看零写入计划,检查冲突,然后运行针对该 bar 的工具命令。对于 Codex,请在 /plugins 中安装 EremesNG/thoth-mem 并验证 marketplace 插件状态。外部 Codex 注册无法原子回滚,因此请先确认外部状态再重试或还原本地设置。
受管安装约定:Plan 模式执行零写入,而最终还可支持对 thoth-mem 拥有的位置进行修改。在首次修改之前会创建备份;OpenCode 接受 opencode.json 或 opencode.jsonc。每次会写一条带有状态 in_progress 的回执,然后才进行写入:
全局回执:
<thoth-data-dir>/setup/receipts/<receipt-id>/receipt.json项目回执:
<project>/.thoth/setup/receipts/<receipt-id>/receipt.json
回执缺失或被篡改会失败并生效。已验证的回滚只影响彼此无关的部分,而状态不一致或不可用的能力会返回 requires_user_action。如果已验证的状态已经匹配,重复设置且未回滚会变成无操作。
Gemini CLI:手动 MCP
Gemini CLI 是手动 MCP 的客户端路径,不是可管理的原生 thoth-mem 集成。将它添加到 ~/.gemini/settings.json:
{
"mcpServers": {
"thoth": {
"command": "npx",
"args": ["-y", "thoth-mem@latest", "mcp"]
}
}
}评估检索与图谱质量
仓库包含确定性评估命令:
pnpm run eval:retrieval
pnpm run eval:kg
pnpm run eval:embedding-models -- --helpeval:retrieval 会注入信号观察以及三种干扰,并测量期望到的记忆是否排在顶。请将其报告作为一组 Signals 来阅读:
召回与排名显示是否正确发现证据,以及证据有多早出现。
噪声与混合情况显示了直接、改写和来自仓库的示例之间的鲁棒性。
压缩显示在交付上下文之前移除了多少证据;它是效率指标,并不是剩余原文正确性的证据。
Lane 和新款证明词语、语义词向量/HyDE 以及 KG 的参与率,包括未出版或已降级的语义行为。
谱系与溯源显示返回的证据是否仍然可以归属到最初源。
eval:kg 会衡量 subject-relation-object 召回、禁止的三元组泄漏、确定性提取行为以及可选 LLM 已人工确认的增强。缺失预期事实表示由覆盖的缺口,禁止列表命中表示存在表示不安全的结论不create。
这些评测属于确定的开发 gate,覆盖已筛选的合成 fixture。它不是生产语料总体的预测、也不可替代人工抽查、不代表原生工具集成正确,更无法单独证明可选的社区读取路径是安全的。请阅读各具体示例与失败详情,而不要把某个总数当成代表整体质量的数字。
嵌入配置与模型比较
Semantic embedding 输入由带版本的 model profile 格式化。auto 可认识 Nomic、EmbeddingGemma 和 Qwen3-Embedding 的 model-family 别名;调用未知模型 raw 则不会得到推断的非对称格式。配置工程有意不配置全局 task 字段:检索意图和 query/document 角色是为每个输入在内部确定的,包括按 document-role 生成的 HyDE answers。
{
"embedding": {
"provider": "lmstudio",
"model": "text-embedding-embeddinggemma-300m",
"baseUrl": "http://127.0.0.1:1234",
"dimensions": 768,
"profile": "auto",
"normalize": true
}
}支持的 profile 值为 auto、nomic、embeddinggemma、qwen3 和 raw。THOTH_EMBEDDING_PROFILE 和 THOTH_EMBEDDING_NORMALIZE 会覆盖持久化值。解析后的 profile 版本和归一化标志是语义索引谱系的一部分,因此更改它们会将先前的向量标记为过期,并使用现有的幂等重建队列。
本地 Transformers.js 推理可以选择特定的 ONNX 执行设备:
{
"embedding": {
"provider": "transformers_local",
"model": "onnx-community/embeddinggemma-300m-ONNX",
"device": "dml",
"dimensions": 768,
"profile": "auto",
"normalize": true
}
}支持的设备值为 auto、cpu、dml、cuda 和 coreml;默认值为 cpu。THOTH_EMBEDDING_DEVICE 会覆盖持久化的 embedding.device 值。对于 Transformers.js 使用的预构建 Node ONNX Runtime,dml 针对 Windows 上的 DirectML,cuda 针对受支持的 Linux x64 CUDA 安装,coreml 针对 macOS。显式指定不可用的设备会导致模型初始化失败,而不是静默回退到 CPU。auto 将特定于平台的提供程序排序和回退委托给 Transformers.js,因此其有效后端可能因主机或依赖版本而异。
设备选择仅影响 transformers_local;远程 Ollama 和 LM Studio 请求会忽略它。GPU 后端的冷启动可能明显更慢,因此它们对持久化 MCP 进程或较大的嵌入批次最有用。设备被有意排除在语义索引谱系之外:仅更改 embedding.device 不会将现有向量标记为过期,也不会排队重建。
提供者模型示例:
Profile | LM Studio 模型 ID | Transformers.js 模型 ID | 原生维度 |
Nomic | 使用 |
| 768 |
EmbeddingGemma |
|
| 768 |
Qwen3-Embedding-0.6B |
|
| 1024 |
EmbeddingGemma 本地执行使用 sentence_embedding。Qwen 本地执行仅对查询应用检索指令,并使用最后关注的隐藏状态 token 进行池化。所有提供者都拒绝不完整、非有限、零值或维度不一致的批次。LM Studio 响应索引会经过验证,有效的乱序行会恢复为输入顺序;缺失、重复或无效的索引会被拒绝。在召回期间,这些错误会明确降级语义检索,而词法和知识图谱检索会继续。
使用显式模型 ID 和持久输出路径运行三模型质量门:
pnpm run eval:embedding-models -- --provider lmstudio --base-url http://127.0.0.1:1234 --nomic-model <nomic-id> --embeddinggemma-model <gemma-id> --qwen3-model <qwen-id> --output <result.json>该门要求所有三次执行都完成,并且至少一个候选者满足 Recall@1/Recall@5/MRR 阈值,且不使任何 Nomic 指标回归。Nomic 是相对比较器,不是受绝对阈值约束的候选者。如果两个候选者都合格,则显式质量分数和稳定的平局决胜顺序会选出获胜者。模型缺失、向量无效、没有合格候选者或报告写入失败都会以非零状态退出,并保留当前默认值。
记录的 2026-08-08 LM Studio 运行选择了 EmbeddingGemma 作为发布的本地默认值。EmbeddingGemma 和 Qwen3 均以 Recall@1 1.00、Recall@5 1.00 和 MRR 1.00 完成,而 Nomic 为 0.50、1.00 和 0.7167;两个候选者都合格,EmbeddingGemma 通过稳定的词法 profile-ID 规则赢得了它们完全相同的质量平局。持久化决策运行中的中位延迟为:Nomic 190.5 毫秒,EmbeddingGemma 195 毫秒,Qwen3 320.5 毫秒。
Qwen3 文件大小取决于运行时工件:
Qwen3 工件 | 量化 | 字节 | MiB |
原始 Transformers | BF16 | 1,191,586,416 | 1,136.39 |
Transformers.js | Q8 | 613,527,631 | 585.11 |
LM Studio | Q8_0 | 639,150,592 | 609.54 |
Qwen3 Q8 模型在 Transformers.js 中比 EmbeddingGemma Q8 大 304,069,133 字节,在 LM Studio 中大 305,559,648 字节。它还使用原生 1024 维向量,而不是 EmbeddingGemma 的 768 维。运行器不会代表操作员安装或发现提供者模型。
当您想要更严格的本地运行时,可以缩放检索噪声:
$env:THOTH_RETRIEVAL_EVAL_NOISE='250'
pnpm run eval:retrieval高级操作
运行
thoth-mem help获取完整的 CLI 命令和选项列表。在
http://localhost:7438/打开本地仪表板,在http://localhost:7438/docs打开 OpenAPI 文档。使用
thoth-mem sync --dir=.thoth-sync和thoth-mem sync-import --dir=.thoth-sync进行 Git 友好的可移植性。repair-sync-journal (--project <name> | --all) --apply在内部预览并绑定其修复批次。当外部工作流已有预览绑定时,可选的--expected-fingerprint仍然可用。prune-operation-traces (--project <name> | --all) --apply同样在内部绑定一个保留批次。添加--until-complete以使用一个固定的有效瞬间和新的后续指纹处理初始有界积压。外部提供的绑定必须同时包含--expected-fingerprint和--effective-now。compact-database [--data-dir <path>]执行只读预览。仅在查看其可回收空间和容量估算后添加--apply。应用可能需要物理和逻辑数据库大小中较大者的两倍,可能被其他 SQLite 客户端阻止,并且仅在完整性、外键、模式、持久计数和 WAL 检查后报告成功。它使用 SQLite 管理的检查点和VACUUM;它不承诺在提交压缩后回滚。压缩永远不会自动进行。对实时数据运行它需要单独的操作员授权;仓库测试仅使用一次性数据库。
查看
config.schema.json以了解持久化配置和环境支持的设置。数据默认位于
~/.thoth/thoth.db;使用THOTH_DATA_DIR或--data-dir覆盖数据目录。
语义索引是非阻塞的。如果嵌入或 sqlite-vec 不可用,召回仍可通过受支持的词法和图证据使用,并报告降级通道,而不是静默声称语义成功。
开发
pnpm install
pnpm run integration:verify
pnpm run build
pnpm test许可证
Available Tools
6 toolsmem_contextC
Build bounded handoff-first continuity. project_key required; root_session_key and harness together for session context, neither for project context.
| Name | Required | Description | Default |
|---|---|---|---|
| harness | No | Verified native harness. | |
| project_key | Yes | Verified project_key, copied verbatim; never derived. | |
| budget_chars | No | ||
| correlation_id | No | ||
| finalize_answer | No | ||
| root_session_key | No | Verified root session key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden. It implies a build/continuity operation but does not state whether it writes data, what side effects or permissions exist, whether it is idempotent, or what the result contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences with no filler, and the required-parameter guidance is front-loaded. The only weakness is that the opening sentence is so terse and jargon-heavy that it obscures meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter tool with no annotations and no output schema, the description is too thin. It explains the session/project context split but omits behavioral details, output expectations, and several parameter meanings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds important conditional semantics for project_key, root_session_key, and harness, including the session-vs-project mode distinction. However, with only 50% schema description coverage, it leaves budget_chars, correlation_id, and finalize_answer unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says it builds 'bounded handoff-first continuity,' which gestures at context creation but is vague jargon rather than a clear verb+resource statement. It also does not distinguish this tool from siblings such as mem_recall, mem_session, or mem_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It specifies project_key is required and explains that root_session_key plus harness together select session context while neither selects project context. That is useful conditional guidance, but it gives no explicit when-to-use-this-tool-vs-alternatives guidance or exclusions relative to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_getB
Expand one selected record from a prior tool result.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Memory, summary, observation, or evidence id. | |
| history | No | Include predecessors; evidence has none. | |
| correlation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not state that this is a read-only retrieval, does not explain what expansion returns, does not mention the optional history behavior, and gives no permission or side-effect context. The word 'expand' hints at non-destructive retrieval but that is the only signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single focused sentence with no wasted words, front-loading the core action. It is perhaps too terse for the gaps it leaves, but structurally it is efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description is the only source of behavioral context, and it says nothing about return shape, history semantics, or the undocumented correlation_id. For a retrieval tool that may return variable content, this leaves the agent without enough to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: the schema documents 'id' and 'history' with useful detail, while 'correlation_id' is undocumented. The description's only contribution is that 'id' refers to a record from a prior tool result, which adds marginal context beyond the schema. Baseline 3 fits given the partial coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'expand' plus the object 'one selected record from a prior tool result' makes the purpose reasonably clear: fetch the full detail of a single record referenced by a previous result. It does not differentiate itself from the sibling mem_recall, so an agent cannot tell from the text alone which retrieval tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from a prior tool result' implies the context of use — after another tool has returned a record stub — which gives some usage guidance. However, it never states when to use this vs. mem_recall or mem_context, and offers 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.
mem_projectC
Read-only project views. list: no fields required; returns at most 256 exact aliases/project with aliasCount/aliasesTruncated. timeline: project_key required; accepts only since, until, cursor, limit, budget_chars. briefing/summaries/observations: project_key required; optional session filter selects summaries/observations, not briefing's project-wide memories. history: id required from a prior result.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| limit | No | Timeline/observations: 1-100 items. | |
| since | No | Inclusive lower ISO-8601 instant; <= until. | |
| state | No | ||
| until | No | Inclusive upper ISO-8601 instant. | |
| action | Yes | ||
| cursor | No | Unchanged nextCursor; preserve project_key, since, until. | |
| harness | No | ||
| temporal | No | Summaries/observations: current=latest summaries/correction leaves; history=predecessors. | |
| project_key | No | Verified project_key, copied verbatim; never derived. | |
| budget_chars | No | Aggregate chars; timeline: positive integer clamped to 1024-20000. | |
| root_session_key | No | Session filter; pair with harness. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It does disclose read-only behavior and several useful constraints: list returns at most 256 aliases with aliasCount/aliasesTruncated, timeline accepts only a specific set of filters, and a session filter affects summaries/observations but not briefing. However, permissions, return shapes for most actions, and error behavior are not described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the read-only nature. It is dense and semicolon-delimited, making it harder to scan than a bulleted structure, but every clause conveys actionable information with little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has six actions and twelve parameters with no output schema, yet the description explains return values only for list. It does not explain when to use briefing versus summaries or observations, what those actions return, or how temporal/state/harness parameters affect behavior. Significant gaps remain for an agent to invoke the tool correctly across all actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so the schema already documents many parameters. The description adds action-specific constraints not obvious from the schema: timeline accepts only since/until/cursor/limit/budget_chars, list requires no fields and returns a capped alias set, history id must come from a prior result, and the session filter behavior varies by action. It leaves state, harness, temporal, and root_session_key semantics largely unaddressed beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with 'Read-only project views,' which is a vague resource description, then lists action names and parameter requirements. The action list gives some clarity about what the tool can do, but the overall purpose ('project views') is not concretely defined and the tool is not distinguished from siblings like mem_context or mem_recall.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides per-action parameter requirements (e.g., timeline requires project_key and accepts only certain filters), but gives no guidance on when to use this tool versus alternatives or which action to choose for a given intent. There are no exclusions or alternative-tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_recallB
Call at the start of non-trivial repository work before exploring, with task key terms, unprompted. Search promoted project memory before expanding selected records.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | compact (default): snippets; context: selected content. | |
| limit | No | ||
| query | Yes | Non-empty task search terms. | |
| temporal | No | current (default) or historical guidance. | |
| project_key | Yes | Verified project_key, copied verbatim; never derived. | |
| budget_chars | No | ||
| correlation_id | No | ||
| finalize_answer | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose a two-stage retrieval workflow (search snippets, then expand selected records) and that results are pre-promoted memory. However, it says nothing about what finalize_answer, correlation_id, or budget_chars do, what the response looks like, or whether the operation has any side effects. Useful workflow context, but not enough for an 8-parameter tool without annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the imperative and timing front-loaded; nothing is filler. The phrase 'with task key terms, unprompted' is slightly awkward but still parses as useful guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters, no annotations, and no output schema, the description covers purpose and timing but omits the semantics of most parameters and the shape of results. An agent would need to open the schema and still lack clarity on finalize_answer and correlation_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 50% schema coverage, the description must compensate, and it only hints at 'query' ('with task key terms') and implicitly at mode via 'expanding selected records'. The remaining parameters (project_key, limit, temporal, budget_chars, correlation_id, finalize_answer) get no explanation in the description beyond the schema's own text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action (search promoted project memory) and adds scope ('promoted', 'project memory') that is more than a restatement of the tool name. It doesn't explicitly contrast with siblings like mem_context or mem_get, leaving the agent to 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger ('at the start of non-trivial repository work, before exploring') and says to call it unprompted, plus a follow-up step ('before expanding selected records'). It stops short of naming which sibling to use instead when the task isn't repository work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_saveA
Save unprompted as soon as decisions, root causes, failed approaches, or non-obvious conventions are verified. Save durable discoveries and continuation handoffs. Direct promoted memory (not handoff): memory.content uses labeled Result, Rationale, Scope, Caveat / safe action lines; omit inapplicable Scope/Caveat and never invent details. Handoffs: Objective, Completed, First pending action, Blockers, Key files/checks; require a stable workstream topic_key; close a finished handoff by saving its outcome under the same topic_key. Send exactly one branch: evidence, observation, observation_review, or observation_promotion. Supply root_session_key and harness together or omit both.
| Name | Required | Description | Default |
|---|---|---|---|
| memory | No | Direct promoted memory; requires evidence without metadata. | |
| harness | No | Verified native harness. | |
| evidence | No | Compact factual evidence; metadata requires event_key + session pair and forbids memory. | |
| event_key | No | Stable idempotency key. | |
| observation | No | Supported candidate, not promoted; requires event_key. Session scope needs session pair + coverage; project scope forbids coverage. | |
| project_key | Yes | Copy opaque project_key verbatim from verified native identity; never derive from names, paths, remotes, branches, worktrees, host IDs, listings, or recalled content. | |
| project_name | Yes | Display/creation name, not identity; prefer persisted lifecycle/project name. | |
| root_session_key | No | Verified root session key; blank is absent. | |
| observation_review | No | Review supported observation; requires event_key + session pair. | |
| observation_promotion | No | Promote accepted observation without new prose; requires event_key + session pair. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses branch mutual exclusivity, the root_session_key/harness all-or-nothing pairing constraint, and the requirement of a stable topic_key to close a handoff. It does not say what happens on supersede/dedup or what the call returns, leaving those gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition, and every clause carries a rule rather than filler. Density is high and semicolon-chained, with terse terms like 'safe action lines' that take re-reading, but nothing is expendable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, deeply nested write tool with no annotations and no output schema, the description covers branch selection and the session-pair constraint but omits return behavior, supersede semantics, and how the four branches relate to each other downstream. Adequate to make a correct call, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning the schema cannot express: the labeled Result/Rationale/Scope/Caveat shape of memory.content and the Objective/Completed/First pending action/Blockers structure of a handoff. It leaves supersedes_id, outcome, and the memory-vs-evidence relationship to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The imperative verb 'Save' plus enumerated resource types (decisions, root causes, failed approaches, conventions, handoffs) makes clear this tool persists memory. It does not explicitly contrast itself with the read-oriented siblings (mem_get, mem_recall, mem_context), but the write framing is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong trigger guidance: 'Save unprompted as soon as... verified', plus durable discoveries and continuation handoffs. It also gives branch-selection rules ('Send exactly one branch'). It never names a sibling tool as an alternative or states a when-not-to-save condition, which keeps it off a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mem_sessionB
Record verified root lifecycle events, never ordinary saves. guide_post_compact content carries host compaction text.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | ||
| harness | Yes | Verified native harness. | |
| summary | No | Session summary. | |
| event_key | Yes | Stable lifecycle key; retries must resend identical content/summary. | |
| operation | Yes | Root lifecycle operation. | |
| project_key | Yes | Verified project_key, copied verbatim; never derived. | |
| project_name | Yes | Display/creation name, not identity; prefer persisted lifecycle/project name. | |
| root_session_key | Yes | Stable verified root session key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, but it only says these are lifecycle events and that guide_post_compact content carries host compaction text. It does not disclose mutation semantics, idempotency expectations, permission/auth requirements, or what happens for each lifecycle operation beyond what the schema implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loads the core action, and contains no filler. It is efficient, though its brevity contributes to gaps elsewhere rather than being a structural flaw itself.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with eight parameters, nested summary objects, six lifecycle operations, and no annotations or output schema. The description does not explain the lifecycle operations, what is recorded or changed, retry behavior, or the relationship between required fields, leaving too much for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 88%, so the schema already documents most parameters. The description adds one valuable clarification: content for guide_post_compact carries host compaction text, but it does not add meaning for the other parameters or nested summary fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Record verified root lifecycle events,' and explicitly distinguishes this from 'ordinary saves,' which helps separate it from mem_save. It is less clear about what a root lifecycle event is, but the operation enum and sibling contrast keep the purpose identifiable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one useful exclusion, 'never ordinary saves,' which points agents away from mem_save for normal persistence. However, it does not explain when to use enroll, recover, capture_root, checkpoint_pre_compact, guide_post_compact, or finalize, so operation selection remains implied by the schema rather than guided.
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.
6 tool updates
v0.6.2- Changed
mem_context2 fields changed- removed
Input schema / properties / project_key / minLengthRemoved value: -1 - removed
Input schema / properties / root_session_key / minLengthRemoved value: -1
- Changed
mem_get1 field changed- changed
Input schema / properties / history / descriptionPrevious value: -"true: include predecessor lineage; evidence has no lineage."New value: +"Include predecessors; evidence has none."
- Changed
mem_project20 fields changed- removed
Input schema / properties / action / descriptionRemoved value: -"Project view." - changed
Input schema / properties / budget_chars / descriptionPrevious value: -"Aggregate character budget for timeline/briefing/summaries/observations; timeline clamps positive integers to 1024-20000."New value: +"Aggregate chars; timeline: positive integer clamped to 1024-20000." - changed
Input schema / properties / cursor / descriptionPrevious value: -"Timeline nextCursor, unchanged; keep project_key, since, until unchanged."New value: +"Unchanged nextCursor; preserve project_key, since, until." - removed
Input schema / properties / cursor / maxLengthRemoved value: -4096 - removed
Input schema / properties / cursor / minLengthRemoved value: -1 - removed
Input schema / properties / harness / descriptionRemoved value: -"Native harness for session filter." - removed
Input schema / properties / id / descriptionRemoved value: -"Prior-result record id." - removed
Input schema / properties / id / minLengthRemoved value: -1 - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum items for timeline/observations."New value: +"Timeline/observations: 1-100 items." - removed
Input schema / properties / limit / exclusiveMinimumRemoved value: -0 - removed
Input schema / properties / limit / maximumRemoved value: -100 - removed
Input schema / properties / project_key / minLengthRemoved value: -1 - changed
Input schema / properties / root_session_key / descriptionPrevious value: -"Verified session filter; pair with harness or omit both."New value: +"Session filter; pair with harness." - removed
Input schema / properties / root_session_key / minLengthRemoved value: -1 - changed
Input schema / properties / since / descriptionPrevious value: -"Timeline inclusive lower ISO-8601 instant; <= until."New value: +"Inclusive lower ISO-8601 instant; <= until." - removed
Input schema / properties / since / minLengthRemoved value: -1 - removed
Input schema / properties / state / descriptionRemoved value: -"Observations state filter." - changed
Input schema / properties / temporal / descriptionPrevious value: -"Summaries/observations only: current=latest summaries/correction leaves; history=older summaries/observation predecessors."New value: +"Summaries/observations: current=latest summaries/correction leaves; history=predecessors." - changed
Input schema / properties / until / descriptionPrevious value: -"Timeline inclusive upper ISO-8601 instant."New value: +"Inclusive upper ISO-8601 instant." - removed
Input schema / properties / until / minLengthRemoved value: -1
- Changed
mem_recall4 fields changed- changed
Input schema / properties / mode / descriptionPrevious value: -"compact (default): bounded snippets; context: selected content."New value: +"compact (default): snippets; context: selected content." - removed
Input schema / properties / project_key / minLengthRemoved value: -1 - removed
Input schema / properties / query / minLengthRemoved value: -1 - changed
Input schema / properties / temporal / descriptionPrevious value: -"current (default): current guidance; history: historical records."New value: +"current (default) or historical guidance."
- Changed
mem_save58 fields changed- removed
Input schema / properties / evidence / anyOfRemoved value: -[ - { - "additionalProperties": false, - "properties": { - "content": { - "minLength": 1, - "type": "string" - }, - "kind": { - "enum": [ - "root_prompt", - "explicit_save", - "checkpoint", - "handoff", - "legacy_prompt", - "legacy_observation", - "session_summary" - ], - "type": "string" - }, - "source_ref": { - "type": "string" - } - }, - "required": [ - "kind", - "content" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "content": { - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "explicit_save", - "type": "string" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "observation_validation": { - "additionalProperties": false, - "properties": { - "method": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "observation_id": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "result": { - "enum": [ - "passed", - "failed" - ], - "type": "string" - } - }, - "required": [ - "observation_id", - "result", - "method" - ], - "type": "object" - } - }, - "required": [ - "observation_validation" - ], - "type": "object" - }, - "source_ref": { - "type": "string" - } - }, - "required": [ - "kind", - "content", - "metadata" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "content": { - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "handoff", - "type": "string" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "observation_review_attestation": { - "additionalProperties": false, - "properties": { - "method": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "observation_id": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "reviewer": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "verdict": { - "enum": [ - "accepted", - "rejected" - ], - "type": "string" - } - }, - "required": [ - "observation_id", - "verdict", - "reviewer", - "method" - ], - "type": "object" - } - }, - "required": [ - "observation_review_attestation" - ], - "type": "object" - }, - "source_ref": { - "type": "string" - } - }, - "required": [ - "kind", - "content", - "metadata" - ], - "type": "object" - } -] - added
Input schema / properties / evidence / propertiesAdded value: +{ + "content": { + "type": "string" + }, + "kind": { + "enum": [ + "root_prompt", + "explicit_save", + "checkpoint", + "handoff", + "legacy_prompt", + "legacy_observation", + "session_summary" + ], + "type": "string" + }, + "metadata": { + "properties": { + "observation_review_attestation": { + "properties": { + "method": { + "type": "string" + }, + "observation_id": { + "type": "string" + }, + "reviewer": { + "type": "string" + }, + "verdict": { + "enum": [ + "accepted", + "rejected" + ], + "type": "string" + } + }, + "required": [ + "observation_id", + "verdict", + "reviewer", + "method" + ], + "type": "object" + }, + "observation_validation": { + "properties": { + "method": { + "type": "string" + }, + "observation_id": { + "type": "string" + }, + "result": { + "enum": [ + "passed", + "failed" + ], + "type": "string" + } + }, + "required": [ + "observation_id", + "result", + "method" + ], + "type": "object" + } + }, + "type": "object" + }, + "source_ref": { + "type": "string" + } +} - added
Input schema / properties / evidence / requiredAdded value: +[ + "kind", + "content" +] - added
Input schema / properties / evidence / typeAdded value: +"object" - removed
Input schema / properties / memory / additionalPropertiesRemoved value: -false - removed
Input schema / properties / memory / properties / content / minLengthRemoved value: -1 - removed
Input schema / properties / memory / properties / title / minLengthRemoved value: -1 - removed
Input schema / properties / observation / additionalPropertiesRemoved value: -false - removed
Input schema / properties / observation / properties / claim / maxLengthRemoved value: -4000 - removed
Input schema / properties / observation / properties / claim / minLengthRemoved value: -1 - removed
Input schema / properties / observation / properties / concepts / items / maxLengthRemoved value: -200 - removed
Input schema / properties / observation / properties / concepts / items / minLengthRemoved value: -1 - removed
Input schema / properties / observation / properties / concepts / maxItemsRemoved value: -16 - removed
Input schema / properties / observation / properties / coverage / additionalPropertiesRemoved value: -false - removed
Input schema / properties / observation / properties / coverage / properties / from_sequence / exclusiveMinimumRemoved value: -0 - removed
Input schema / properties / observation / properties / coverage / properties / from_sequence / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / observation / properties / coverage / properties / to_sequence / exclusiveMinimumRemoved value: -0 - removed
Input schema / properties / observation / properties / coverage / properties / to_sequence / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / observation / properties / files / items / maxLengthRemoved value: -500 - removed
Input schema / properties / observation / properties / files / items / minLengthRemoved value: -1 - removed
Input schema / properties / observation / properties / files / maxItemsRemoved value: -16 - removed
Input schema / properties / observation / properties / generator / additionalPropertiesRemoved value: -false - removed
Input schema / properties / observation / properties / generator / properties / config_hash / patternRemoved value: -"^[0-9a-f]{64}$" - removed
Input schema / properties / observation / properties / generator / properties / name / maxLengthRemoved value: -200 - removed
Input schema / properties / observation / properties / generator / properties / name / minLengthRemoved value: -1 - removed
Input schema / properties / observation / properties / generator / properties / version / maxLengthRemoved value: -200 - removed
Input schema / properties / observation / properties / generator / properties / version / minLengthRemoved value: -1 - removed
Input schema / properties / observation / properties / predecessor_id / maxLengthRemoved value: -200 - removed
Input schema / properties / observation / properties / predecessor_id / minLengthRemoved value: -1 - removed
Input schema / properties / observation / properties / proposed_memory / additionalPropertiesRemoved value: -false - removed
Input schema / properties / observation / properties / proposed_memory / properties / content / minLengthRemoved value: -1 - removed
Input schema / properties / observation / properties / proposed_memory / properties / title / minLengthRemoved value: -1 - removed
Input schema / properties / observation / properties / support_ids / items / maxLengthRemoved value: -200 - removed
Input schema / properties / observation / properties / support_ids / items / minLengthRemoved value: -1 - removed
Input schema / properties / observation / properties / support_ids / maxItemsRemoved value: -16 - removed
Input schema / properties / observation / properties / support_ids / minItemsRemoved value: -1 - removed
Input schema / properties / observation / properties / title / maxLengthRemoved value: -500 - removed
Input schema / properties / observation / properties / title / minLengthRemoved value: -1 - removed
Input schema / properties / observation_promotion / additionalPropertiesRemoved value: -false - removed
Input schema / properties / observation_promotion / properties / observation_id / maxLengthRemoved value: -200 - removed
Input schema / properties / observation_promotion / properties / observation_id / minLengthRemoved value: -1 - removed
Input schema / properties / observation_review / additionalPropertiesRemoved value: -false - removed
Input schema / properties / observation_review / properties / observation_id / maxLengthRemoved value: -200 - removed
Input schema / properties / observation_review / properties / observation_id / minLengthRemoved value: -1 - removed
Input schema / properties / observation_review / properties / policy / additionalPropertiesRemoved value: -false - removed
Input schema / properties / observation_review / properties / policy / properties / id / maxLengthRemoved value: -200 - removed
Input schema / properties / observation_review / properties / policy / properties / id / minLengthRemoved value: -1 - removed
Input schema / properties / observation_review / properties / policy / properties / version / maxLengthRemoved value: -200 - removed
Input schema / properties / observation_review / properties / policy / properties / version / minLengthRemoved value: -1 - removed
Input schema / properties / observation_review / properties / reason / maxLengthRemoved value: -1000 - removed
Input schema / properties / observation_review / properties / reason / minLengthRemoved value: -1 - removed
Input schema / properties / observation_review / properties / support_ids / items / maxLengthRemoved value: -200 - removed
Input schema / properties / observation_review / properties / support_ids / items / minLengthRemoved value: -1 - removed
Input schema / properties / observation_review / properties / support_ids / maxItemsRemoved value: -16 - removed
Input schema / properties / observation_review / properties / support_ids / minItemsRemoved value: -1 - removed
Input schema / properties / project_key / minLengthRemoved value: -1 - changed
Input schema / properties / project_name / descriptionPrevious value: -"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output."New value: +"Display/creation name, not identity; prefer persisted lifecycle/project name." - removed
Input schema / properties / project_name / minLengthRemoved value: -1
- Changed
mem_session27 fields changed- removed
Input schema / properties / event_key / minLengthRemoved value: -1 - removed
Input schema / properties / project_key / minLengthRemoved value: -1 - changed
Input schema / properties / project_name / descriptionPrevious value: -"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output."New value: +"Display/creation name, not identity; prefer persisted lifecycle/project name." - removed
Input schema / properties / project_name / minLengthRemoved value: -1 - removed
Input schema / properties / root_session_key / minLengthRemoved value: -1 - removed
Input schema / properties / summary / additionalPropertiesRemoved value: -false - removed
Input schema / properties / summary / properties / claims / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / summary / properties / claims / items / properties / content / minLengthRemoved value: -1 - changed
Input schema / properties / summary / properties / claims / items / properties / support_ids / descriptionPrevious value: -"Distinct evidence ids inside coverage from this project_key + root_session_key/harness session; never memory, summary, or observation ids."New value: +"Distinct same-session evidence ids within coverage; no memory/summary/observation ids." - removed
Input schema / properties / summary / properties / claims / items / properties / support_ids / items / maxLengthRemoved value: -200 - removed
Input schema / properties / summary / properties / claims / items / properties / support_ids / items / minLengthRemoved value: -1 - removed
Input schema / properties / summary / properties / claims / items / properties / support_ids / maxItemsRemoved value: -16 - removed
Input schema / properties / summary / properties / claims / items / properties / support_ids / minItemsRemoved value: -1 - removed
Input schema / properties / summary / properties / claims / maxItemsRemoved value: -32 - removed
Input schema / properties / summary / properties / claims / minItemsRemoved value: -1 - removed
Input schema / properties / summary / properties / coverage / additionalPropertiesRemoved value: -false - removed
Input schema / properties / summary / properties / coverage / properties / from_sequence / exclusiveMinimumRemoved value: -0 - removed
Input schema / properties / summary / properties / coverage / properties / from_sequence / maximumRemoved value: -9007199254740991 - changed
Input schema / properties / summary / properties / coverage / properties / to_sequence / descriptionPrevious value: -"Last sequence: >= from_sequence and >= the current summary's ending sequence for this session."New value: +">= from_sequence and the previous summary end." - removed
Input schema / properties / summary / properties / coverage / properties / to_sequence / exclusiveMinimumRemoved value: -0 - removed
Input schema / properties / summary / properties / coverage / properties / to_sequence / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / summary / properties / generator / additionalPropertiesRemoved value: -false - removed
Input schema / properties / summary / properties / generator / properties / config_hash / patternRemoved value: -"^[0-9a-f]{64}$" - removed
Input schema / properties / summary / properties / generator / properties / name / maxLengthRemoved value: -200 - removed
Input schema / properties / summary / properties / generator / properties / name / minLengthRemoved value: -1 - removed
Input schema / properties / summary / properties / generator / properties / version / maxLengthRemoved value: -200 - removed
Input schema / properties / summary / properties / generator / properties / version / minLengthRemoved value: -1
6 tool updates
v0.6.1- Changed
mem_context3 fields changed- changed
Input schema / properties / harness / descriptionPrevious value: -"Native harness for root_session_key; supply both for session context, or omit both for project context."New value: +"Verified native harness." - changed
Input schema / properties / project_key / descriptionPrevious value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content."New value: +"Verified project_key, copied verbatim; never derived." - changed
Input schema / properties / root_session_key / descriptionPrevious value: -"Optional verified root session key; supply with harness for session context, or omit both for project context."New value: +"Verified root session key."
- Changed
mem_get2 fields changed- changed
Input schema / properties / history / descriptionPrevious value: -"Set true to expand predecessor lineage for memory, summary, or observation records; evidence ids have no lineage."New value: +"true: include predecessor lineage; evidence has no lineage." - changed
Input schema / properties / id / descriptionPrevious value: -"Memory, summary, observation, or evidence id returned by a prior tool result."New value: +"Memory, summary, observation, or evidence id."
- Changed
mem_project12 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Inspect project views without mutation. action=\"list\": no fields required. action=\"timeline\": project_key required; optionally since, until, cursor, limit, and budget_chars. action=\"briefing\", \"summaries\", or \"observations\": project_key required; optionally supply both root_session_key and harness to select that session's summaries/observations (briefing still includes project-wide memories). action=\"history\": id required from a prior result. temporal filters summaries/observations, not timeline. list returns at most 256 exact aliases per project plus aliasCount and aliasesTruncated metadata."New value: +"Project view." - changed
Input schema / properties / budget_chars / descriptionPrevious value: -"Optional aggregate character budget for timeline, briefing, summaries, or observations; timeline clamps a positive integer to 1024-20000 characters."New value: +"Aggregate character budget for timeline/briefing/summaries/observations; timeline clamps positive integers to 1024-20000." - changed
Input schema / properties / cursor / descriptionPrevious value: -"Unchanged nextCursor from a prior mem_project action=\"timeline\" result; keep project_key, since, and until unchanged."New value: +"Timeline nextCursor, unchanged; keep project_key, since, until unchanged." - changed
Input schema / properties / harness / descriptionPrevious value: -"Native harness for the optional root_session_key filter; supply both or omit both. Not accepted for action=\"timeline\"."New value: +"Native harness for session filter." - changed
Input schema / properties / id / descriptionPrevious value: -"Required for action=\"history\"; send a record id returned by a prior tool result."New value: +"Prior-result record id." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum items (1-100) for action=\"timeline\" or \"observations\"."New value: +"Maximum items for timeline/observations." - changed
Input schema / properties / project_key / descriptionPrevious value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content. Required for action=\"timeline\", \"briefing\", \"summaries\", or \"observations\"; not required for \"list\" or \"history\"."New value: +"Verified project_key, copied verbatim; never derived." - changed
Input schema / properties / root_session_key / descriptionPrevious value: -"Optional session filter for action=\"briefing\", \"summaries\", or \"observations\"; supply with harness or omit both."New value: +"Verified session filter; pair with harness or omit both." - changed
Input schema / properties / since / descriptionPrevious value: -"Optional inclusive lower ISO-8601 instant for action=\"timeline\" only; must be <= until."New value: +"Timeline inclusive lower ISO-8601 instant; <= until." - changed
Input schema / properties / state / descriptionPrevious value: -"Optional state filter for action=\"observations\"."New value: +"Observations state filter." - changed
Input schema / properties / temporal / descriptionPrevious value: -"Filter summaries/observations: current selects current summary versions or observation correction-chain leaves; history includes older summary versions or selects observation predecessors. Not accepted for action=\"timeline\"."New value: +"Summaries/observations only: current=latest summaries/correction leaves; history=older summaries/observation predecessors." - changed
Input schema / properties / until / descriptionPrevious value: -"Optional inclusive upper ISO-8601 instant for action=\"timeline\" only; must be >= since."New value: +"Timeline inclusive upper ISO-8601 instant."
- Changed
mem_recall4 fields changed- changed
Input schema / properties / mode / descriptionPrevious value: -"compact (default) returns bounded snippets; context adds selected memory content."New value: +"compact (default): bounded snippets; context: selected content." - changed
Input schema / properties / project_key / descriptionPrevious value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content."New value: +"Verified project_key, copied verbatim; never derived." - changed
Input schema / properties / query / descriptionPrevious value: -"Non-empty search string for promoted project memory."New value: +"Non-empty task search terms." - changed
Input schema / properties / temporal / descriptionPrevious value: -"current (default) searches current guidance; history includes historical records."New value: +"current (default): current guidance; history: historical records."
- Changed
mem_save10 fields changed- changed
Input schema / properties / event_key / descriptionPrevious value: -"Stable event key for idempotency; required for observation, observation_review, observation_promotion, and evidence with metadata."New value: +"Stable idempotency key." - changed
Input schema / properties / evidence / descriptionPrevious value: -"Direct evidence { kind, content }; optionally add memory for a promoted save. Structured metadata forbids memory and requires event_key, root_session_key, and harness."New value: +"Compact factual evidence; metadata requires event_key + session pair and forbids memory." - changed
Input schema / properties / harness / descriptionPrevious value: -"Native harness for root_session_key; supply both or omit both. Required wherever root_session_key is required."New value: +"Verified native harness." - changed
Input schema / properties / memory / descriptionPrevious value: -"Promoted memory for direct evidence only; requires evidence without metadata. Do not combine with observation, observation_review, or observation_promotion."New value: +"Direct promoted memory; requires evidence without metadata." - changed
Input schema / properties / observation / descriptionPrevious value: -"Submit a supported candidate without promotion; requires event_key. Session scope also requires root_session_key, harness, and coverage."New value: +"Supported candidate, not promoted; requires event_key. Session scope needs session pair + coverage; project scope forbids coverage." - changed
Input schema / properties / observation_promotion / descriptionPrevious value: -"Promote one accepted observation without new prose; requires event_key, root_session_key, and harness. Send no other operation branch or memory."New value: +"Promote accepted observation without new prose; requires event_key + session pair." - changed
Input schema / properties / observation_review / descriptionPrevious value: -"Review one supported observation; requires event_key, root_session_key, and harness. Send no other operation branch or memory."New value: +"Review supported observation; requires event_key + session pair." - changed
Input schema / properties / project_key / descriptionPrevious value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content."New value: +"Copy opaque project_key verbatim from verified native identity; never derive from names, paths, remotes, branches, worktrees, host IDs, listings, or recalled content." - changed
Input schema / properties / project_name / descriptionPrevious value: -"Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output."New value: +"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output." - changed
Input schema / properties / root_session_key / descriptionPrevious value: -"Verified root session key; supply with harness or omit both. Required for session-scoped observations, observation_review, observation_promotion, and evidence with metadata; blank counts as absent."New value: +"Verified root session key; blank is absent."
- Changed
mem_session15 fields changed- changed
Input schema / properties / event_key / descriptionPrevious value: -"Stable lifecycle event key; retries for the same operation must resend identical content/summary."New value: +"Stable lifecycle key; retries must resend identical content/summary." - changed
Input schema / properties / harness / descriptionPrevious value: -"Verified native harness for root_session_key in project_key."New value: +"Verified native harness." - changed
Input schema / properties / operation / descriptionPrevious value: -"Lifecycle operation; summary is allowed only for checkpoint_pre_compact (checkpoint) or finalize (final)."New value: +"Root lifecycle operation." - changed
Input schema / properties / project_key / descriptionPrevious value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content."New value: +"Verified project_key, copied verbatim; never derived." - changed
Input schema / properties / project_name / descriptionPrevious value: -"Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output."New value: +"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output." - changed
Input schema / properties / root_session_key / descriptionPrevious value: -"Stable verified root session key; required with harness for every operation."New value: +"Stable verified root session key." - changed
Input schema / properties / summary / descriptionPrevious value: -"Optional only for operation=\"checkpoint_pre_compact\" (kind=\"checkpoint\") or operation=\"finalize\" (kind=\"final\"). coverage starts at 1 and to_sequence must advance the current summary for this session and kind. support_ids must be evidence ids from this project_key + root_session_key/harness session inside coverage. Canonical submission limit: 20000 UTF-16 units."New value: +"Session summary." - changed
Input schema / properties / summary / properties / claims / descriptionPrevious value: -"1-32 atomic supported claims; keep the canonical summary within 20000 UTF-16 units."New value: +"Supported claims; canonical summary <=20000 UTF-16 units." - changed
Input schema / properties / summary / properties / claims / items / properties / content / descriptionPrevious value: -"Atomic claim content; at most 2000 code points after privacy filtering."New value: +"Atomic claim; <=2000 code points after privacy filtering." - changed
Input schema / properties / summary / properties / claims / items / properties / support_ids / descriptionPrevious value: -"1-16 distinct evidence ids from this project_key + root_session_key/harness session inside summary.coverage; never memory, summary, or observation ids."New value: +"Distinct evidence ids inside coverage from this project_key + root_session_key/harness session; never memory, summary, or observation ids." - changed
Input schema / properties / summary / properties / coverage / descriptionPrevious value: -"Inclusive session evidence coverage; start at 1 and advance to_sequence for this session and summary kind."New value: +"Inclusive session evidence range." - changed
Input schema / properties / summary / properties / coverage / properties / from_sequence / descriptionPrevious value: -"Inclusive first session event sequence; must start at 1."New value: +"First event sequence: 1." - changed
Input schema / properties / summary / properties / coverage / properties / to_sequence / descriptionPrevious value: -"Inclusive last session event sequence; must be >= from_sequence and exceed the current summary ending sequence for this session and kind."New value: +"Last sequence: >= from_sequence and >= the current summary's ending sequence for this session." - removed
Input schema / properties / summary / properties / kindRemoved value: -{ - "description": "Send checkpoint for operation=\"checkpoint_pre_compact\" or final for operation=\"finalize\".", - "enum": [ - "checkpoint", - "final" - ], - "type": "string" -} - changed
Input schema / properties / summary / requiredPrevious value: -[ - "kind", - "coverage", - "generator", - "claims" -]New value: +[ + "coverage", + "generator", + "claims" +]
6 tool updates
v0.5.6- Changed
mem_context13 fields changed- added
Input schema / properties / budget_charsAdded value: +{ + "type": "number" +} - added
Input schema / properties / correlation_idAdded value: +{ + "type": "string" +} - added
Input schema / properties / finalize_answerAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / harnessAdded value: +{ + "description": "Native harness for root_session_key; supply both for session context, or omit both for project context.", + "enum": [ + "opencode", + "codex", + "claude", + "pi", + "mcp", + "cli", + "import" + ], + "type": "string" +} - removed
Input schema / properties / limitRemoved value: -{ - "description": "Number of observations to retrieve (default: 20)", - "type": "number" -} - removed
Input schema / properties / max_charsRemoved value: -{ - "description": "Output character budget; 0 disables the context cap", - "minimum": 0, - "type": "number" -} - removed
Input schema / properties / projectRemoved value: -{ - "description": "Filter by project name", - "type": "string" -} - added
Input schema / properties / project_keyAdded value: +{ + "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content.", + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / recall_queryRemoved value: -{ - "description": "Optional query to append fused recall evidence without changing base context sections", - "type": "string" -} - added
Input schema / properties / root_session_keyAdded value: +{ + "description": "Optional verified root session key; supply with harness for session context, or omit both for project context.", + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / scopeRemoved value: -{ - "description": "Filter by scope", - "enum": [ - "project", - "personal" - ], - "type": "string" -} - removed
Input schema / properties / session_idRemoved value: -{ - "description": "Filter to a specific session", - "type": "string" -} - added
Input schema / requiredAdded value: +[ + "project_key" +]
- Changed
mem_get10 fields changed- removed
Input schema / properties / afterRemoved value: -{ - "description": "Timeline observations after the focus item (default: 5)", - "maximum": 20, - "minimum": 0, - "type": "number" -} - removed
Input schema / properties / beforeRemoved value: -{ - "description": "Timeline observations before the focus item (default: 5)", - "maximum": 20, - "minimum": 0, - "type": "number" -} - added
Input schema / properties / correlation_idAdded value: +{ + "type": "string" +} - added
Input schema / properties / historyAdded value: +{ + "description": "Set true to expand predecessor lineage for memory, summary, or observation records; evidence ids have no lineage.", + "type": "boolean" +} - changed
Input schema / properties / id / descriptionPrevious value: -"Record ID to retrieve, interpreted according to kind"New value: +"Memory, summary, observation, or evidence id returned by a prior tool result." - changed
Input schema / properties / id / typePrevious value: -"number"New value: +"string" - removed
Input schema / properties / include_timelineRemoved value: -{ - "description": "Include surrounding observations in the same session", - "type": "boolean" -} - removed
Input schema / properties / kindRemoved value: -{ - "description": "Memory kind to retrieve (defaults to observation)", - "enum": [ - "observation", - "prompt" - ], - "type": "string" -} - removed
Input schema / properties / max_lengthRemoved value: -{ - "description": "Max characters to return (default: 50000)", - "minimum": 100, - "type": "number" -} - removed
Input schema / properties / offsetRemoved value: -{ - "description": "Character offset for large content (default: 0)", - "minimum": 0, - "type": "number" -}
- Changed
mem_project26 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Project view to return"New value: +"Inspect project views without mutation. action=\"list\": no fields required. action=\"timeline\": project_key required; optionally since, until, cursor, limit, and budget_chars. action=\"briefing\", \"summaries\", or \"observations\": project_key required; optionally supply both root_session_key and harness to select that session's summaries/observations (briefing still includes project-wide memories). action=\"history\": id required from a prior result. temporal filters summaries/observations, not timeline. list returns at most 256 exact aliases per project plus aliasCount and aliasesTruncated metadata." - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "summary", - "graph", - "topics", - "topic", - "health" -]New value: +[ + "list", + "timeline", + "briefing", + "history", + "summaries", + "observations" +] - added
Input schema / properties / budget_charsAdded value: +{ + "description": "Optional aggregate character budget for timeline, briefing, summaries, or observations; timeline clamps a positive integer to 1024-20000 characters.", + "type": "number" +} - removed
Input schema / properties / continuationRemoved value: -{ - "description": "Opaque continuation token returned by graph navigation views", - "type": "string" -} - added
Input schema / properties / cursorAdded value: +{ + "description": "Unchanged nextCursor from a prior mem_project action=\"timeline\" result; keep project_key, since, and until unchanged.", + "maxLength": 4096, + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / focus_node_idRemoved value: -{ - "description": "Graph focus node id for navigation=neighborhood, currently obs:<id>", - "type": "string" -} - added
Input schema / properties / harnessAdded value: +{ + "description": "Native harness for the optional root_session_key filter; supply both or omit both. Not accepted for action=\"timeline\".", + "enum": [ + "opencode", + "codex", + "claude", + "pi", + "mcp", + "cli", + "import" + ], + "type": "string" +} - added
Input schema / properties / idAdded value: +{ + "description": "Required for action=\"history\"; send a record id returned by a prior tool result.", + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / include_supersededRemoved value: -{ - "description": "Explicit history opt-in; honored by navigation=superseded only", - "type": "boolean" -} - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum items to return"New value: +"Maximum items (1-100) for action=\"timeline\" or \"observations\"." - added
Input schema / properties / limit / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / limit / maximumPrevious value: -500New value: +100 - removed
Input schema / properties / limit / minimumRemoved value: -1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - removed
Input schema / properties / max_charsRemoved value: -{ - "description": "Response character budget; 0 is supported for action=summary only", - "maximum": 20000, - "minimum": 0, - "type": "integer" -} - removed
Input schema / properties / navigationRemoved value: -{ - "description": "Graph navigation mode for action=graph; defaults to ledger", - "enum": [ - "ledger", - "neighborhood", - "lineage", - "community", - "superseded" - ], - "type": "string" -} - removed
Input schema / properties / observation_idRemoved value: -{ - "description": "Observation id for lineage or superseded graph navigation", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" -} - removed
Input schema / properties / projectRemoved value: -{ - "description": "Project name. Required except action=list and optional for action=topics or health", - "type": "string" -} - added
Input schema / properties / project_keyAdded value: +{ + "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content. Required for action=\"timeline\", \"briefing\", \"summaries\", or \"observations\"; not required for \"list\" or \"history\".", + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / relationRemoved value: -{ - "description": "Graph relation filter for action=graph", - "enum": [ - "HAS_TYPE", - "IN_PROJECT", - "HAS_TOPIC_KEY", - "HAS_WHAT", - "HAS_WHY", - "HAS_WHERE", - "HAS_LEARNED" - ], - "type": "string" -} - added
Input schema / properties / root_session_keyAdded value: +{ + "description": "Optional session filter for action=\"briefing\", \"summaries\", or \"observations\"; supply with harness or omit both.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / sinceAdded value: +{ + "description": "Optional inclusive lower ISO-8601 instant for action=\"timeline\" only; must be <= until.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / stateAdded value: +{ + "description": "Optional state filter for action=\"observations\".", + "enum": [ + "pending", + "accepted", + "rejected", + "promoted" + ], + "type": "string" +} - added
Input schema / properties / temporalAdded value: +{ + "description": "Filter summaries/observations: current selects current summary versions or observation correction-chain leaves; history includes older summary versions or selects observation predecessors. Not accepted for action=\"timeline\".", + "enum": [ + "current", + "history" + ], + "type": "string" +} - removed
Input schema / properties / topic_keyRemoved value: -{ - "description": "Topic key for action=topic or graph filtering", - "type": "string" -} - added
Input schema / properties / untilAdded value: +{ + "description": "Optional inclusive upper ISO-8601 instant for action=\"timeline\" only; must be >= since.", + "minLength": 1, + "type": "string" +}
- Changed
mem_recall20 fields changed- added
Input schema / properties / budget_charsAdded value: +{ + "type": "number" +} - added
Input schema / properties / correlation_idAdded value: +{ + "type": "string" +} - removed
Input schema / properties / debugRemoved value: -{ - "description": "Include retrieval defaults and semantic input sources", - "type": "boolean" -} - added
Input schema / properties / finalize_answerAdded value: +{ + "type": "boolean" +} - removed
Input schema / properties / hydeRemoved value: -{ - "description": "Request HyDE query expansion when configured", - "type": "boolean" -} - removed
Input schema / properties / limit / descriptionRemoved value: -"Maximum evidence items (default: 5)" - removed
Input schema / properties / limit / maximumRemoved value: -20 - removed
Input schema / properties / limit / minimumRemoved value: -1 - changed
Input schema / properties / mode / descriptionPrevious value: -"compact returns evidence lines; context includes retrieved text"New value: +"compact (default) returns bounded snippets; context adds selected memory content." - removed
Input schema / properties / projectRemoved value: -{ - "description": "Optional project filter", - "type": "string" -} - added
Input schema / properties / project_keyAdded value: +{ + "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content.", + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Recall/search query"New value: +"Non-empty search string for promoted project memory." - removed
Input schema / properties / scopeRemoved value: -{ - "description": "Optional scope filter", - "enum": [ - "project", - "personal" - ], - "type": "string" -} - removed
Input schema / properties / session_idRemoved value: -{ - "description": "Optional session filter", - "type": "string" -} - added
Input schema / properties / temporalAdded value: +{ + "description": "current (default) searches current guidance; history includes historical records.", + "enum": [ + "current", + "history" + ], + "type": "string" +} - removed
Input schema / properties / time_fromRemoved value: -{ - "description": "Optional inclusive created_at lower bound", - "type": "string" -} - removed
Input schema / properties / time_toRemoved value: -{ - "description": "Optional inclusive created_at upper bound", - "type": "string" -} - removed
Input schema / properties / topic_keyRemoved value: -{ - "description": "Optional exact topic_key filter", - "type": "string" -} - removed
Input schema / properties / typeRemoved value: -{ - "description": "Optional observation type filter", - "enum": [ - "decision", - "architecture", - "bugfix", - "pattern", - "config", - "discovery", - "learning", - "session_summary", - "manual" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "query" -]New value: +[ + "project_key", + "query" +]
- Changed
mem_save19 fields changed- removed
Input schema / properties / contentRemoved value: -{ - "description": "Memory content, prompt text, session summary, or text containing a Key Learnings section", - "type": "string" -} - added
Input schema / properties / event_keyAdded value: +{ + "description": "Stable event key for idempotency; required for observation, observation_review, observation_promotion, and evidence with metadata.", + "type": "string" +} - added
Input schema / properties / evidenceAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "content": { + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "root_prompt", + "explicit_save", + "checkpoint", + "handoff", + "legacy_prompt", + "legacy_observation", + "session_summary" + ], + "type": "string" + }, + "source_ref": { + "type": "string" + } + }, + "required": [ + "kind", + "content" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "content": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "explicit_save", + "type": "string" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "observation_validation": { + "additionalProperties": false, + "properties": { + "method": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "observation_id": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "result": { + "enum": [ + "passed", + "failed" + ], + "type": "string" + } + }, + "required": [ + "observation_id", + "result", + "method" + ], + "type": "object" + } + }, + "required": [ + "observation_validation" + ], + "type": "object" + }, + "source_ref": { + "type": "string" + } + }, + "required": [ + "kind", + "content", + "metadata" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "content": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "handoff", + "type": "string" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "observation_review_attestation": { + "additionalProperties": false, + "properties": { + "method": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "observation_id": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "reviewer": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "verdict": { + "enum": [ + "accepted", + "rejected" + ], + "type": "string" + } + }, + "required": [ + "observation_id", + "verdict", + "reviewer", + "method" + ], + "type": "object" + } + }, + "required": [ + "observation_review_attestation" + ], + "type": "object" + }, + "source_ref": { + "type": "string" + } + }, + "required": [ + "kind", + "content", + "metadata" + ], + "type": "object" + } + ], + "description": "Direct evidence { kind, content }; optionally add memory for a promoted save. Structured metadata forbids memory and requires event_key, root_session_key, and harness." +} - added
Input schema / properties / harnessAdded value: +{ + "description": "Native harness for root_session_key; supply both or omit both. Required wherever root_session_key is required.", + "enum": [ + "opencode", + "codex", + "claude", + "pi", + "mcp", + "cli", + "import" + ], + "type": "string" +} - removed
Input schema / properties / kindRemoved value: -{ - "description": "Write mode. Defaults to observation", - "enum": [ - "observation", - "prompt", - "session_summary", - "passive_learnings" - ], - "type": "string" -} - added
Input schema / properties / memoryAdded value: +{ + "additionalProperties": false, + "description": "Promoted memory for direct evidence only; requires evidence without metadata. Do not combine with observation, observation_review, or observation_promotion.", + "properties": { + "content": { + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "decision", + "convention", + "architecture", + "discovery", + "failure", + "project_structure", + "handoff", + "preference" + ], + "type": "string" + }, + "outcome": { + "enum": [ + "unknown", + "succeeded", + "failed", + "mixed" + ], + "type": "string" + }, + "supersedes_id": { + "type": "string" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "topic_key": { + "type": "string" + } + }, + "required": [ + "kind", + "title", + "content" + ], + "type": "object" +} - added
Input schema / properties / observationAdded value: +{ + "additionalProperties": false, + "description": "Submit a supported candidate without promotion; requires event_key. Session scope also requires root_session_key, harness, and coverage.", + "properties": { + "claim": { + "maxLength": 4000, + "minLength": 1, + "type": "string" + }, + "concepts": { + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "type": "array" + }, + "coverage": { + "additionalProperties": false, + "properties": { + "from_sequence": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "to_sequence": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "from_sequence", + "to_sequence" + ], + "type": "object" + }, + "files": { + "items": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "type": "array" + }, + "generator": { + "additionalProperties": false, + "properties": { + "config_hash": { + "pattern": "^[0-9a-f]{64}$", + "type": "string" + }, + "kind": { + "enum": [ + "root_agent", + "harness", + "model" + ], + "type": "string" + }, + "name": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "version": { + "maxLength": 200, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind", + "name" + ], + "type": "object" + }, + "kind": { + "enum": [ + "decision", + "constraint", + "fact", + "procedure", + "result", + "failure", + "preference" + ], + "type": "string" + }, + "predecessor_id": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "proposed_memory": { + "additionalProperties": false, + "properties": { + "content": { + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "decision", + "convention", + "architecture", + "discovery", + "failure", + "project_structure", + "handoff", + "preference" + ], + "type": "string" + }, + "outcome": { + "enum": [ + "unknown", + "succeeded", + "failed", + "mixed" + ], + "type": "string" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "topic_key": { + "type": "string" + } + }, + "required": [ + "kind", + "title", + "content" + ], + "type": "object" + }, + "scope": { + "enum": [ + "session", + "project" + ], + "type": "string" + }, + "support_ids": { + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "maxLength": 500, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind", + "scope", + "title", + "claim", + "proposed_memory", + "support_ids", + "generator" + ], + "type": "object" +} - added
Input schema / properties / observation_promotionAdded value: +{ + "additionalProperties": false, + "description": "Promote one accepted observation without new prose; requires event_key, root_session_key, and harness. Send no other operation branch or memory.", + "properties": { + "observation_id": { + "maxLength": 200, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "observation_id" + ], + "type": "object" +} - added
Input schema / properties / observation_reviewAdded value: +{ + "additionalProperties": false, + "description": "Review one supported observation; requires event_key, root_session_key, and harness. Send no other operation branch or memory.", + "properties": { + "basis": { + "enum": [ + "root_user_confirmed", + "observable_validation", + "independent_review" + ], + "type": "string" + }, + "observation_id": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "policy": { + "additionalProperties": false, + "properties": { + "id": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "version": { + "maxLength": 200, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "version" + ], + "type": "object" + }, + "reason": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + "support_ids": { + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "verdict": { + "enum": [ + "accepted", + "rejected" + ], + "type": "string" + } + }, + "required": [ + "observation_id", + "verdict", + "basis", + "policy", + "reason", + "support_ids" + ], + "type": "object" +} - removed
Input schema / properties / projectRemoved value: -{ - "description": "Project name", - "type": "string" -} - added
Input schema / properties / project_keyAdded value: +{ + "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / project_nameAdded value: +{ + "description": "Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / root_session_keyAdded value: +{ + "description": "Verified root session key; supply with harness or omit both. Required for session-scoped observations, observation_review, observation_promotion, and evidence with metadata; blank counts as absent.", + "type": "string" +} - removed
Input schema / properties / scopeRemoved value: -{ - "description": "Observation scope", - "enum": [ - "project", - "personal" - ], - "type": "string" -} - removed
Input schema / properties / session_idRemoved value: -{ - "description": "Session ID (default: manual-save-{project})", - "type": "string" -} - removed
Input schema / properties / titleRemoved value: -{ - "description": "Short searchable title. Required for kind=observation", - "type": "string" -} - removed
Input schema / properties / topic_keyRemoved value: -{ - "description": "Stable key for observation upserts", - "type": "string" -} - removed
Input schema / properties / typeRemoved value: -{ - "description": "Observation category for kind=observation", - "enum": [ - "decision", - "architecture", - "bugfix", - "pattern", - "config", - "discovery", - "learning", - "session_summary", - "manual" - ], - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "content" -]New value: +[ + "project_key", + "project_name" +]
- Changed
mem_session17 fields changed- removed
Input schema / properties / actionRemoved value: -{ - "description": "Session action", - "enum": [ - "start", - "summary", - "checkpoint" - ], - "type": "string" -} - removed
Input schema / properties / content / descriptionRemoved value: -"Full session summary for action=summary" - removed
Input schema / properties / directoryRemoved value: -{ - "description": "Working directory for action=start", - "type": "string" -} - added
Input schema / properties / event_keyAdded value: +{ + "description": "Stable lifecycle event key; retries for the same operation must resend identical content/summary.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / harnessAdded value: +{ + "description": "Verified native harness for root_session_key in project_key.", + "enum": [ + "opencode", + "codex", + "claude", + "pi", + "mcp", + "cli", + "import" + ], + "type": "string" +} - removed
Input schema / properties / idRemoved value: -{ - "description": "Session ID. Required for action=start; defaults to manual-save-{project} for summary/checkpoint", - "type": "string" -} - added
Input schema / properties / operationAdded value: +{ + "description": "Lifecycle operation; summary is allowed only for checkpoint_pre_compact (checkpoint) or finalize (final).", + "enum": [ + "enroll", + "recover", + "capture_root", + "checkpoint_pre_compact", + "guide_post_compact", + "finalize" + ], + "type": "string" +} - removed
Input schema / properties / projectRemoved value: -{ - "description": "Project name", - "type": "string" -} - added
Input schema / properties / project_keyAdded value: +{ + "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / project_nameAdded value: +{ + "description": "Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / root_session_keyAdded value: +{ + "description": "Stable verified root session key; required with harness for every operation.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / summary / additionalPropertiesAdded value: +false - changed
Input schema / properties / summary / descriptionPrevious value: -"Short checkpoint summary for action=checkpoint"New value: +"Optional only for operation=\"checkpoint_pre_compact\" (kind=\"checkpoint\") or operation=\"finalize\" (kind=\"final\"). coverage starts at 1 and to_sequence must advance the current summary for this session and kind. support_ids must be evidence ids from this project_key + root_session_key/harness session inside coverage. Canonical submission limit: 20000 UTF-16 units." - added
Input schema / properties / summary / propertiesAdded value: +{ + "claims": { + "description": "1-32 atomic supported claims; keep the canonical summary within 20000 UTF-16 units.", + "items": { + "additionalProperties": false, + "properties": { + "content": { + "description": "Atomic claim content; at most 2000 code points after privacy filtering.", + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "objective", + "completed", + "decision", + "changed_surface", + "verification", + "pending", + "blocker", + "next_action" + ], + "type": "string" + }, + "outcome": { + "enum": [ + "unknown", + "succeeded", + "failed", + "mixed" + ], + "type": "string" + }, + "support_ids": { + "description": "1-16 distinct evidence ids from this project_key + root_session_key/harness session inside summary.coverage; never memory, summary, or observation ids.", + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "kind", + "content", + "support_ids" + ], + "type": "object" + }, + "maxItems": 32, + "minItems": 1, + "type": "array" + }, + "coverage": { + "additionalProperties": false, + "description": "Inclusive session evidence coverage; start at 1 and advance to_sequence for this session and summary kind.", + "properties": { + "from_sequence": { + "description": "Inclusive first session event sequence; must start at 1.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "to_sequence": { + "description": "Inclusive last session event sequence; must be >= from_sequence and exceed the current summary ending sequence for this session and kind.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "from_sequence", + "to_sequence" + ], + "type": "object" + }, + "generator": { + "additionalProperties": false, + "properties": { + "config_hash": { + "pattern": "^[0-9a-f]{64}$", + "type": "string" + }, + "kind": { + "enum": [ + "root_agent", + "harness", + "model" + ], + "type": "string" + }, + "name": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "version": { + "maxLength": 200, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind", + "name" + ], + "type": "object" + }, + "kind": { + "description": "Send checkpoint for operation=\"checkpoint_pre_compact\" or final for operation=\"finalize\".", + "enum": [ + "checkpoint", + "final" + ], + "type": "string" + } +} - added
Input schema / properties / summary / requiredAdded value: +[ + "kind", + "coverage", + "generator", + "claims" +] - changed
Input schema / properties / summary / typePrevious value: -"string"New value: +"object" - changed
Input schema / requiredPrevious value: -[ - "action", - "project" -]New value: +[ + "operation", + "harness", + "project_key", + "project_name", + "root_session_key", + "event_key" +]
5 tool updates
v0.4.13- Added
mem_context - Added
mem_get - Added
mem_project - Added
mem_save - Added
mem_session
5 tool updates
v0.4.1- Removed
mem_context - Removed
mem_get - Removed
mem_project - Removed
mem_save - Removed
mem_session
6 tool updates
v0.3.7- First observed
mem_context - First observed
mem_get - First observed
mem_project - First observed
mem_recall - First observed
mem_save - First observed
mem_session
TDQS
Scored across 6 tools
mem_save and mem_session both persist information, but mem_session is explicitly limited to lifecycle events. The read-side tools (mem_recall, mem_context, mem_project) have overlapping search/context/view roles, which could cause misselection, though descriptions provide clear trigger guidance.
All tools use a consistent mem_ prefix in snake_case, making names predictable and readable. Minor inconsistency exists because some names are verbs (save, get, recall) and others are nouns (context, project, session), but the pattern is still coherent.
Six tools is well within the ideal range for a focused memory server. Each tool maps to a distinct stage of the memory lifecycle—save, recall, expand, context building, project inspection, and session events—without obvious redundancy.
The surface covers saving, searching, retrieval, context building, project views, and session lifecycle. However, there is no explicit update or delete/forget operation for memories, and listing memories beyond search results or project views is limited, which may hinder correcting or pruning stored knowledge.
Maintenance
Related MCP Connectors
Persistent memory for AI agents. Search, store, and recall across sessions.
Shared memory for coding agents. Stop re-explaining your codebase every session.
Persistent engineering memory designed to follow developers across coding agents.
Persistent memory for AI agents. Search and store durable facts, preferences and decisions.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceProvides 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
- AlicenseNot gradedqualityDmaintenanceProvides AI coding assistants with persistent project memory to retain architectural decisions, code patterns, and domain knowledge across sessions. It stores data locally in a SQLite database, allowing agents to remember, recall, and manage project-specific context using full-text search.0Apache 2.0
- AlicenseNot gradedqualityCmaintenanceGives AI coding agents persistent memory by storing observations, decisions, and learnings in a local SQLite database with vector search, full-text search, and a rules engine.4MIT
- AlicenseAqualityBmaintenanceLocal-first memory for AI coding agents using SQLite, enabling persistent recall of decisions, lessons, and project context without cloud or API keys.10136 PyPI288Apache 2.0