关于 Memory MCP Server
Memory MCP Server 是为 MCP 助手提供持久记忆的 SQLite 服务。它将全文搜索、关系图遍历和按令牌预算检索整合在本地 stdio 服务中。
主要功能
- 01在 SQLite 中持久保存记忆
- 02使用 FTS5 搜索内容和标签
- 03通过 BFS 遍历记忆关系
- 04按令牌预算检索上下文
- 05批量管理记忆和关系
适用场景
- 01在助手会话之间保留信息
- 02按文本、类型或重要性查找记忆
- 03通过关系图找回关联记忆
- 04选择符合令牌上限的记忆上下文
MCP 相关
通过 stdio 提供记忆增删改查、批量操作、搜索、图谱回忆、上下文检索、关系管理和统计工具。还提供使用说明资源及记忆 URI 模板。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
13收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| tags | array | 是 | 记忆标签 |
| content | string | 是 | 记忆内容 |
| importance | integer | 否 | 优先级(0-10) |
| memory_type | enum | 否 | 记忆类别general | fact | plan | decision | reflection | lesson | error | gradient |
详细介绍
Memory MCP
基于 SQLite 的 MCP 服务,用于持久化存储记忆、全文检索和关系图遍历。
概述
Memory MCP 为启用 MCP 的助手提供本地持久化记忆层。它使用 SQLite 存储以 SHA-256 寻址的记忆条目,并提供由 FTS5 驱动的全文搜索、有向关系图、BFS 回忆遍历和感知令牌预算的上下文检索——所有功能均通过 stdio 传输访问,且无需外部依赖。
主要功能
- 13 个 MCP 工具,支持 CRUD、批量操作、FTS5 搜索、BFS 图回忆、令牌预算上下文检索、关系和统计。
- 全文搜索:通过 SQLite FTS5 搜索内容和标签,并支持重要性和类型筛选。
- 图回忆:支持 BFS 遍历、有限前沿,以及每跳发送 MCP 进度通知。
- 令牌预算检索(
retrieve_context):选择符合调用方指定令牌预算的记忆——无需手动分页。 - 严格的 Zod 输入验证,提供类型化输出信封和 SHA-256 哈希寻址。
- 资源支持:提供
internal://instructions(Markdown 指南)和带哈希自动补全的memory://memories/{hash}URI 模板。 - stdio 传输:支持干净关闭处理(
SIGINT、SIGTERM),且不提供 HTTP 端点。 |
要求
- Node.js
>=24。 - 支持 FTS5 的 SQLite(启动时验证)。
- 任何支持 stdio 命令服务的 MCP 客户端。
快速开始
直接通过 npx 使用 npm 包——无需安装:
{
"mcpServers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
提示
服务仅使用 stdio 传输;不会公开 HTTP 端点。不得让自定义日志污染 stdout。
或者使用 Docker 运行:
docker run --rm -i ghcr.io/j0hanz/memory-mcp:latest
客户端配置
在 VS Code 中安装
工作区文件 .vscode/mcp.json:
{
"servers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
命令行:
code --add-mcp '{"name":"memory-mcp","command":"npx","args":["-y","@j0hanz/memory-mcp@latest"]}'
在 VS Code Insiders 中安装
命令行:
code-insiders --add-mcp '{"name":"memory-mcp","command":"npx","args":["-y","@j0hanz/memory-mcp@latest"]}'
在 Cursor 中安装
~/.cursor/mcp.json:
{
"mcpServers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
在 Claude Desktop / Claude Code 中安装
claude_desktop_config.json:
{
"mcpServers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
命令行:
claude mcp add memory-mcp -- npx -y @j0hanz/memory-mcp@latest
在 Windsurf 中安装
MCP 配置:
{
"mcpServers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
使用 Docker 运行
# Pull and run (stdio mode)
docker run --rm -i \
-e MEMORY_DB_PATH=/data/memory.db \
-v memory-data:/data \
ghcr.io/j0hanz/memory-mcp:latest
MCP 客户端配置:
{
"mcpServers": {
"memory-mcp": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"MEMORY_DB_PATH=/data/memory.db",
"-v",
"memory-data:/data",
"ghcr.io/j0hanz/memory-mcp:latest"
]
}
}
}
文档维护
- 负责人:在
src/中更新 MCP 行为的维护者,必须在同一个 PR 中更新README.md和受影响的mcp/镜像页面。 - 链接/版本策略:协议参考链接使用固定版本的
https://modelcontextprotocol.io/specification/2025-11-25/...;避免使用latest和混杂的旧版目标。 - 漂移检查清单:
- 重新核对
src/server.ts中的能力声明。 - 将工具/资源/提示词文档与
src/tools/index.ts、src/resources/index.ts和src/prompts/index.ts对照并协调一致。 - 确认
src/instructions.md中的限制/注意事项与运行时行为一致。
- 重新核对
- 验证命令:
npm run type-check、npm run test:fast、npm run build。
MCP 接口
工具摘要
| 工具 | 类别 | 说明 |
|---|---|---|
store_memory | 写入 | 按内容和排序后的标签哈希实现幂等 |
store_memories | 写入 | 批量(1–50),由事务包装 |
get_memory | 读取 | 哈希查找 |
update_memory | 写入 | 返回 old_hash + new_hash |
delete_memory | 写入 | 级联删除关系 |
delete_memories | 写入 | 批量(1–50),由事务包装 |
search_memories | 读取 | FTS5 + 重要性/类型筛选 + 游标 |
create_relationship | 写入 | 幂等创建有向边 |
delete_relationship | 写入 | 删除指定的有向边 |
get_relationships | 读取 | 方向筛选 + 关联记忆字段 |
recall | 读取 | FTS5 种子 + BFS 遍历(深度 0–3) |
retrieve_context | 读取 | 根据 Token 预算检索上下文 |
memory_stats | 读取 | 存储聚合统计和类型细分 |
store_memory
存储一条包含内容、标签以及可选类型和重要性的新记忆。幂等——存储相同的内容和标签时,会返回现有哈希,且 created: false。
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
content | string | Yes | — | 记忆内容(1–100000 个字符) |
tags | string[] | Yes | — | 1–100 个标签,每个最多 50 个字符,不含空白字符 |
memory_type | enum | No | general | general、fact、plan、decision、reflection、lesson、error、gradient |
importance | integer | No | 0 | 优先级 0–10 |
返回:{ hash, created }
store_memories
在一个事务中存储多条记忆(最多 50 条)。
| Name | Type | Required | Description |
|---|---|---|---|
items | Array<StoreMemoryItem> | Yes | 1–50 项,每项包含 content、tags,以及可选的 memory_type 和 importance |
返回:{ items, succeeded, failed }
get_memory
通过 SHA-256 哈希获取一条记忆。
| Name | Type | Required | Description |
|---|---|---|---|
hash | string | Yes | 64 个字符的小写 SHA-256 十六进制字符串 |
返回:Memory;若发生 E_NOT_FOUND,则返回 { ok: false, error }。
update_memory
更新现有记忆的内容,并可选择更新标签。返回新旧两个哈希。
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
hash | string | Yes | — | 现有记忆的哈希 |
content | string | Yes | — | 替换后的内容 |
tags | string[] | No | Existing tags | 替换后的标签 |
返回:{ old_hash, new_hash }
delete_memory
通过哈希删除一条记忆,并级联删除相关的关系行。
| Name | Type | Required | Description |
|---|---|---|---|
hash | string | Yes | 记忆哈希 |
返回:{ hash, deleted }
delete_memories
在一个事务中通过哈希删除多条记忆。
| Name | Type | Required | Description |
|---|---|---|---|
hashes | string[] | Yes | 1–50 个记忆哈希 |
返回:{ items, succeeded, failed }
search_memories
使用 FTS5 对记忆内容和标签进行全文搜索。支持按重要性和类型筛选,并使用游标分页。
| 名称 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
query | string | 是 | — | 搜索文本(1–1000 个字符) |
limit | integer | 否 | 20 | 每页结果数(1–100) |
cursor | string | 否 | — | 上一条响应中的分页游标 |
min_importance | integer | 否 | — | 仅返回重要性 >= 此值的记忆(0–10) |
max_importance | integer | 否 | — | 仅返回重要性 <= 此值的记忆(0–10) |
memory_type | enum | 否 | — | 按记忆类型筛选 |
返回:{ memories, total_returned, nextCursor? }
create_relationship
在两条记忆之间创建有向关系边。此操作具有幂等性。
建议的 relation_type 值:related_to、causes、depends_on、parent_of、child_of、supersedes、contradicts、supports、references。
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
from_hash | string | 是 | 源记忆哈希 |
to_hash | string | 是 | 目标记忆哈希 |
relation_type | string | 是 | 边标签(1–50 个字符,不含空格,可自由填写) |
返回:{ created }
delete_relationship
删除一条有向关系边。
| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
from_hash | string | 是 | 源哈希 |
to_hash | string | 是 | 目标哈希 |
relation_type | string | 是 | 关系类型 |
返回:{ deleted };若出现 E_NOT_FOUND,则返回 { ok: false, error }。
get_relationships
获取某条记忆的关系,可选按方向筛选。
| 名称 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
hash | string | 是 | — | 记忆哈希 |
direction | enum | 否 | both | outgoing、incoming 或 both |
返回:{ relationships, count }
每条关系包含 from_hash、to_hash、relation_type、created_at、linked_hash、linked_content 和 linked_tags。
recall
通过全文查询搜索记忆,然后使用 BFS 遍历关系图,最多跳转 depth 次。每次跳转都会发出 MCP 进度通知。
| 名称 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
query | string | 是 | — | 初始搜索查询(1–1000 个字符) |
depth | integer | 否 | 1 | BFS 跳数(0–3) |
limit | integer | 否 | 10 | 初始记忆数量(1–50) |
cursor | string | 否 | — | 上一响应中的分页游标 |
min_importance | integer | 否 | — | 初始筛选:仅包含重要性 >= 此值(0–10)的记忆 |
max_importance | integer | 否 | — | 初始筛选:仅包含重要性 <= 此值(0–10)的记忆 |
memory_type | enum | 否 | — | 初始筛选:仅包含此类型的记忆 |
返回:{ memories, graph, depth_reached, aborted?, nextCursor? }
graph 中的每个项目都采用以下结构:
{ "from_hash": "...", "to_hash": "...", "relation_type": "..." }
说明
aborted: true表示遍历触及安全限制(RECALL_MAX_FRONTIER_SIZE、RECALL_MAX_EDGE_ROWS或RECALL_MAX_VISITED_NODES)。仍会返回部分结果。
retrieve_context
搜索记忆并返回按相关性排序、符合调用方指定令牌预算的结果。无需手动分页和计算令牌即可管理上下文窗口。
| 名称 | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|
query | string | 是 | — | 搜索查询(1–1000 个字符) |
token_budget | integer | 否 | 4000 | 返回的最大估算令牌数(100–200000) |
strategy | enum | 否 | relevance | 排序方式:relevance(FTS 排名)、importance(优先级最高)、recency(时间最新) |
返回:{ memories, estimated_tokens, truncated }
提示
令牌数为近似估算(内容长度 ÷ 4)。
truncated: true表示达到预算时仍有候选项未被纳入。
memory_stats
返回记忆和关系的汇总统计信息。不接受输入。
返回:
{
"memories": {
"total": 0,
"oldest": null,
"newest": null,
"avg_importance": null
},
"relationships": { "total": 0 },
"by_type": {}
}
资源
| URI | MIME | 描述 |
|---|---|---|
internal://instructions | text/markdown | 所有工具和工作流的 Markdown 使用指南 |
memory://memories/{hash} | application/json | 以 JSON 格式返回一条记忆;支持补全 hash |
提示词
| 名称 | 参数 | 用途 |
|---|---|---|
get-help | 无 | 返回所有工具的完整使用说明 |
配置
环境变量
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
MEMORY_DB_PATH | SQLite 数据库文件路径 | memory_db/memory.db | 否 |
RECALL_MAX_FRONTIER_SIZE | 每跳 BFS 前沿节点数上限(100–50000) | 1000 | 否 |
RECALL_MAX_EDGE_ROWS | 每次遍历获取的关系行数上限(100–50000) | 5000 | 否 |
RECALL_MAX_VISITED_NODES | 整个遍历过程中已访问节点数上限(100–50000) | 5000 | 否 |
重要
如果
MEMORY_DB_PATH是相对路径(包括默认值memory_db/memory.db),则相对于进程的工作目录解析。
提示
将
memory_db/添加到.gitignore,以避免将数据库纳入版本控制——其中包含本地会话数据,不应共享或提交。
限制与约束
| 项目 | 值 |
|---|---|
| 内容长度 | 1–100000 个字符 |
| 标签数量 | 每条记忆 1–100 个 |
| 标签长度 | 1–50 个字符,不含空白字符 |
| 哈希格式 | 64 位小写十六进制 SHA-256 |
| 搜索查询长度 | 1–1000 个字符 |
search_memories.limit | 1–100(默认值为 20) |
recall.depth | 0–3(默认值为 1) |
recall.limit | 1–50(默认值为 10) |
retrieve_context.token_budget | 100–200000(默认值为 4000) |
| 批次大小 | 1–50 项(store_memories、delete_memories) |
| 召回前沿保护上限 | RECALL_MAX_FRONTIER_SIZE(每跳默认值为 1000) |
| SQLite 忙碌超时 | 5000 毫秒 |
说明
游标值是不透明的 base64url 编码令牌。请将其视为不透明值,不要解析。
安全
- 传输仅使用 stdio(
StdioServerTransport)——没有 HTTP 端点。 - 致命进程错误会写入
stderr;为确保 MCP 协议正常工作,stdout 必须保持干净。 - 在访问数据库前,所有输入都会通过严格的 Zod 模式和有界字段约束进行验证。
- 哈希会根据小写 64 位 SHA-256 十六进制正则表达式进行验证。
- 搜索输入会先被拆分为字母数字词项,再执行 FTS
MATCH(非字母数字字符会充当分隔符,从而防止 FTS 注入)。 - SQLite 已启用外键;删除记忆时,相关关系行会级联删除。
开发
安装依赖:
npm install
核心脚本:
| 脚本 | 命令 | 用途 |
|---|---|---|
build | npm run build | 清理、编译、验证说明、复制资源并设置可执行权限 |
dev | npm run dev | TypeScript 监视模式 |
dev:run | npm run dev:run | 使用 .env 和文件监视运行构建后的服务 |
start | npm run start | 启动构建后的服务 |
test | npm run test | 通过任务运行器执行完整构建和测试 |
test:fast | npm run test:fast | 使用 Node 测试运行器直接运行 TS 测试 |
lint | npm run lint | ESLint 检查 |
lint:fix | npm run lint:fix | ESLint 自动修复 |
type-check | npm run type-check | 严格的 TypeScript 检查 |
format | npm run format | Prettier 格式化 |
inspector | npm run inspector | 构建并打开 MCP Inspector,以检查 stdio 服务 |
使用 MCP Inspector 检查:
npx @modelcontextprotocol/inspector node dist/index.js
构建与发布
GitHub Actions 发布工作流(.github/workflows/release.yml)通过单个 workflow_dispatch 触发器处理版本管理、验证和发布:
workflow_dispatch (patch / minor / major / custom)
│
▼
release — bump package.json + server.json → lint → type-check → test → build → tag → GitHub Release
│
├──► publish-npm ──► publish-mcp (npm Trusted Publishing OIDC → MCP Registry)
│
└──► publish-docker (GHCR, linux/amd64 + linux/arm64)
触发发布:
gh workflow run release.yml -f bump=patch
也可以使用 GitHub 界面:Actions → Release → Run workflow。
说明
npm 发布使用 OIDC Trusted Publishing——无需
NPM_TOKEN密钥。MCP Registry 使用 GitHub OIDC。Docker 使用内置的GITHUB_TOKEN。
故障排查
| 症状 | 原因 | 解决方法 |
|---|---|---|
| 启动失败并出现 FTS5 错误 | Node.js 构建不含 FTS5 | 使用支持 SQLite FTS5 的 Node.js 24+ |
get_memory 返回 E_NOT_FOUND | 哈希不存在 | 先通过 search_memories 验证 |
E_INVALID_CURSOR | 游标已过期或格式错误 | 不带 cursor 参数重试请求 |
| MCP 客户端无法连接 | 添加了自定义 stdout 日志 | 确保服务进程没有向 stdout 写入任何内容 |
回忆结果中出现 aborted: true | 遍历达到安全限制 | 减小 depth,或调整 RECALL_MAX_* 环境变量 |
| 数据库锁定错误 | 并发写入负载过高 | SQLite 忙碌超时为 5000 ms;减少并发写入 |
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。