mnemon-mcp
mnemon-mcp
面向 AI 代理的持久化分层记忆。 本地优先。零云端。单个 SQLite 文件。
Landing Page · npm · GitHub
您的 AI 代理在每次会话后都会忘记一切。Mnemon 解决了这个问题。
它能为任何兼容 MCP 的客户端——OpenClaw、Claude Code、Cursor、Windsurf 或您自己的客户端——提供由您机器上的单个 SQLite 数据库支持的结构化长期记忆。无需 API 密钥,无需云端,无遥测。只需 npm install,您的代理就能记住。
为什么需要分层记忆?
扁平化的键值存储将"昨天发生了什么"与"没有测试绝不提交"混为一谈。这是错误的——不同类型的知识有不同的生命周期和访问模式。
Mnemon 将记忆组织为四个层:
层 | 存储内容 | 访问方式 | 生命周期 |
情景 | 事件、会话、日志条目 | 按日期或时间段 | 衰减(30 天半衰期) |
语义 | 事实、偏好、关系 | 按主题或实体 | 稳定 |
程序性 | 规则、工作流、约定 | 启动时加载 | 很少更改 |
资源 | 参考资料、读书笔记 | 按需 | 缓慢衰减(90 天) |
上周二的日志条目和一条永不变更的编码规则位于不同的层中——因为本就该如此。
Related MCP server: persistent-kb-mcp
检索质量
检索质量基于真实的 797 条记忆双语(RU/EN)语料库中的 50 个案例黄金集进行衡量,通过实际的 MCP 服务器进行——而非重新实现。当前数据(方法论与历史):
指标 | 仅 FTS | 仅向量 | 混合(RRF) |
综合得分 | 88.9 | 89.2 | 91.7 |
Recall@5 | 0.907 | 0.898 | 0.919 |
MRR | 0.817 | 0.832 | 0.878 |
nDCG@5 | 0.816 | 0.828 | 0.869 |
负例精确率 | 1.000 | 1.000 | 1.000 |
混合模式在两个单独指标上都更优,这正是融合它们的全部意义所在:词法搜索具有更好的原始召回率,向量搜索具有更好的排序,而 RRF 两者兼得,而不是将两者平均掉。
评估文档也跟踪了失败案例——语料库增长时的分数漂移、评估发现的 BM25 字段权重错误、融合仍然输给纯词法搜索的两种情况,以及黄金集未覆盖的内容。无法审计的数字只是营销话术;了解这些数据是如何产生的。
架构
flowchart LR
C["MCP client<br/>Claude Code · Cursor · …"] -- "stdio / HTTP" --> T["10 tools · 4 resources · 3 prompts"]
T --> R["retrieval pipeline<br/>FTS5 · vector · RRF fusion"]
T --> M["memories + supersede chains"]
I["KB import pipeline<br/>markdown → memories"] --> M
M -- triggers --> F["FTS5 index (stemmed EN+RU)"]
R --> F
R --> V["sqlite-vec (optional, BYOK)"]一个 SQLite 文件保存记忆、FTS5 索引和可选的向量索引。写入通过保持取代链不变式的事务进行;读取运行搜索中描述的分阶段检索流水线。
完整图景——模块边界、写入/读取路径、不变式和已知限制——见 docs/ARCHITECTURE.md。设计决策记录为 ADR:SQLite+FTS5 核心、混合 RRF 检索、同步驱动、分层记忆模型。
快速开始
安装
npm install -g mnemon-mcp或从源码构建:
git clone https://github.com/nikitacometa/mnemon-memory-mcp.git
cd mnemon-memory-mcp && npm install && npm run build配置您的 MCP 客户端
openclaw mcp register mnemon-mcp --command="mnemon-mcp"或添加到 ~/.openclaw/mcp_config.json:
{
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}添加到 ~/.claude/mcp.json:
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}添加到您客户端的 MCP 配置:
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}使用编译后入口点的完整路径:
{
"mnemon-mcp": {
"command": "node",
"args": ["/absolute/path/to/mnemon-mcp/dist/index.js"]
}
}验证
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | mnemon-mcp您应该在响应中看到 10 个工具。数据库(~/.mnemon-mcp/memory.db)在首次运行时自动创建。
就这样。您的代理现在拥有了持久化记忆。
它能做什么
10 个 MCP 工具
工具 | 功能 |
| 存储带层、实体、置信度、重要性和可选 TTL 的记忆 |
| 全文或精确搜索,支持按层、实体、日期、范围、置信度过滤 |
| 原地更新或创建带版本控制的替换(取代链) |
| 删除记忆;如有前驱则重新激活 |
| 获取层统计信息或追踪单条记忆的版本历史 |
| 导出为 JSON、Markdown 或 Claude-md 格式,支持过滤 |
| 运行诊断:过期条目、孤立链、陈旧记忆;可选 GC |
| 启动代理会话——返回用于分组记忆的会话 ID |
| 结束会话并附带可选摘要;返回持续时间和记忆数量 |
| 列出会话,支持按客户端、项目或活动状态过滤 |
MCP 资源与提示词
资源 — 您的代理可以读取的实时数据:
URI | 返回内容 |
| 每层聚合统计信息 |
| 最近 24 小时内创建/更新的记忆 |
| 某层中的所有活动记忆 |
| 关于某实体的所有活动记忆 |
提示词 — 预构建的工作流:
提示词 | 用途 |
| "告诉我你所知道的关于 X 的一切" |
| 开始任务前加载相关上下文 |
| 创建结构化日志条目 |
搜索
四种模式,均支持层 / 实体 / 范围 / 日期 / 置信度过滤:
FTS 模式(未配置嵌入时的默认模式)— 使用 BM25 排序的标记化全文搜索。多词查询使用 AND;如果结果太少,OR 会以分数惩罚作为补充。渐进式 AND 放宽在回退到完整 OR 之前,会先尝试前 3 个最具体的词项。
混合模式(配置嵌入后的默认模式)— 通过倒数排名融合结合 FTS5 + 向量搜索。检测查询中的带引号实体(例如 'Essentialism'),并运行加权子查询以进行交叉引用检索。
向量模式 — 对嵌入进行纯余弦相似度搜索。
精确模式 — 使用 LIKE 子串匹配进行精确短语查找。
分数:bm25 × (0.3 + 0.7 × importance) × decay(layer) × recency
新近度提升:1 / (1 + daysSince / 365) — 温和地奖励最近创建的回忆,而不会惩罚旧回忆。
词干提取
在索引时和查询时对英语和俄语应用 Snowball 词干提取器。这意味着 "running" 匹配 "runs","книги" 匹配 "книга"。停用词会从查询中过滤掉以提高精确度。
事实版本控制
知识会演变。Mnemon 不会删除旧事实——而是将它们链接起来:
v1: "Team uses React 17" → superseded_by: v2
v2: "Team uses React 19" → supersedes: v1 (active)搜索仅返回最新版本。memory_inspect 配合 include_history: true 显示完整链。memory_delete 会重新激活前一个版本——不会丢失任何内容。
向量搜索(可选,自带密钥)
通过提供您自己的嵌入 API 来启用语义相似度搜索:
# OpenAI
MNEMON_EMBEDDING_PROVIDER=openai MNEMON_EMBEDDING_API_KEY=sk-... mnemon-mcp
# Ollama (local, free)
MNEMON_EMBEDDING_PROVIDER=ollama mnemon-mcp这解锁了两种额外的搜索模式:
mode: "vector"— 纯余弦相似度搜索mode: "hybrid"— 通过倒数排名融合结合的 FTS5 + 向量
需要 sqlite-vec(作为可选依赖安装)。新记忆在添加时嵌入;现有记忆可以回填。
变量 | 默认值 | 描述 |
| — |
|
| — | API 密钥(OpenAI 必需) |
|
| 模型名称 |
|
| 向量维度 |
|
| Ollama 端点 |
导入知识库
有一堆 Markdown 文件?批量导入:
cp config.example.json ~/.mnemon-mcp/config.json # edit this first
npm run import:kb -- --kb-path /path/to/your/kb # incremental (skips unchanged files)配置将 glob 模式映射到记忆层:
{
"owner_name": "your-name",
"extra_stop_words": [],
"mappings": [
{
"glob": "journal/*.md",
"layer": "episodic",
"entity_type": "user",
"entity_name": "$owner",
"importance": 0.6,
"split": "h2"
},
{
"glob": "people/*.md",
"layer": "semantic",
"entity_type": "person",
"entity_name": "from-heading",
"importance": 0.8,
"split": "h3"
}
]
}配置字段
字段 | 类型 | 描述 |
| string | 您的姓名——用于 |
| string[] | 从 FTS 查询中过滤的词(例如您的姓名形式) |
| string | 要匹配的文件模式 |
| string | 目标记忆层 |
| string |
|
| string | 字面名称、 |
| string |
|
| number | 0.0–1.0,影响搜索排名 |
| number | 0.0–1.0,可在搜索中过滤 |
| string | 可选命名空间 |
HTTP 传输
用于远程或多客户端设置:
MNEMON_AUTH_TOKEN=your-secret MNEMON_HOST=0.0.0.0 MNEMON_PORT=3000 npm run start:http端点 | 描述 |
| MCP JSON-RPC(如设置令牌则使用 Bearer 认证) |
|
|
默认绑定到 127.0.0.1。绑定到任何其他主机都需要 MNEMON_AUTH_TOKEN — 服务器拒绝在未认证的情况下将记忆存储暴露到网络(在受信任网络上可使用 MNEMON_ALLOW_INSECURE_HTTP=1 覆盖)。速率限制(默认 100 次请求/分钟/IP)、可选 CORS、1MB 请求体限制、时序安全认证、收到 SIGTERM 时优雅关闭。
配置参考
变量 | 默认值 | 描述 |
|
| 数据库路径 |
|
| 导入的知识库根目录 |
|
| 导入配置路径 |
| — | HTTP 传输的 Bearer 令牌 |
|
| HTTP 传输绑定地址 |
|
| HTTP 传输端口 |
| — | CORS |
|
| 每 IP 每分钟最大请求数(0 = 关闭) |
工具参考
参数 | 类型 | 必填 | 描述 |
| string | 是 | 记忆文本(最多 100K 字符) |
| string | 是 |
|
| string | 否 | 短标题(最多 500 字符) |
| string | 否 |
|
| string | 否 | 用于筛选的实体名称 |
| number | 否 | 0.0–1.0(默认 0.8) |
| number | 否 | 0.0–1.0(默认 0.5) |
| string | 否 | 命名空间(默认 |
| string | 否 | 源文件路径 — 触发匹配条目的自动取代 |
| number | 否 | N 天后自动过期 |
| string | 否 | 时间事实窗口(ISO 8601) |
参数 | 类型 | 必填 | 描述 |
| string | 是 | 搜索文本 |
| string | 否 |
|
| string[] | 否 | 按层筛选 |
| string | 否 | 按实体筛选(支持别名) |
| string | 否 | 按作用域筛选 |
| string | 否 | 日期范围(ISO 8601) |
| string | 否 | 时间事实筛选 — 在此日期有效的事实 |
| number | 否 | 最低置信度 |
| number | 否 | 最低重要性 |
| number | 否 | 最大结果数(默认 10,最大 100) |
| number | 否 | 分页偏移量 |
参数 | 类型 | 必填 | 描述 |
| string | 是 | 记忆 ID |
| string | 否 | 新内容 |
| string | 否 | 新标题 |
| number | 否 | 新置信度 |
| number | 否 | 新重要性 |
| boolean | 否 |
|
| string | 否 | 用于取代条目的内容 |
参数 | 类型 | 必填 | 描述 |
| string | 是 | 记忆 ID。如果属于取代链的一部分,则重新激活前驱条目 |
参数 | 类型 | 必填 | 描述 |
| string | 否 | 记忆 ID(省略则显示聚合统计) |
| string | 否 | 按层筛选统计 |
| string | 否 | 按实体筛选统计 |
| boolean | 否 | 显示取代链 |
参数 | 类型 | 必填 | 描述 |
| string | 是 |
|
| string[] | 否 | 按层筛选 |
| string | 否 | 按作用域筛选 |
| string | 否 | 日期范围 |
| number | 否 | 最大条目数(默认全部,最大 10K) |
参数 | 类型 | 必填 | 描述 |
| boolean | 否 |
|
返回:状态(healthy / warning / degraded)、按层统计、过期条目、孤立链、陈旧/低置信度计数,以及 cleanup=true 时的清理计数。
参数 | 类型 | 必填 | 描述 |
| string | 是 | 客户端标识符(例如 |
| string | 否 | 此会话的项目作用域 |
| object | 否 | 附加会话元数据 |
返回:id(会话 UUID)、started_at(ISO 8601)。
参数 | 类型 | 必填 | 描述 |
| string | 是 | 要结束的会话 ID |
| string | 否 | 完成内容的摘要(最多 10K 字符) |
返回:id、ended_at、duration_minutes、memories_count。
参数 | 类型 | 必填 | 描述 |
| number | 否 | 最大会话数(默认 20,最大 100) |
| string | 否 | 按客户端筛选 |
| string | 否 | 按项目筛选 |
| boolean | 否 | 仅返回尚未结束的会话(默认 false) |
返回:会话数组,包含 id、client、project、started_at、ended_at、summary、memories_count。
对比
mnemon-mcp | mem0 | basic-memory | Engram | Anthropic KG | |
架构 | SQLite FTS5 + vector | Cloud API + Qdrant | Markdown + vector | SQLite FTS5 | JSON file |
记忆结构 | 4 个类型化层 | 扁平 | 扁平 | 扁平 + 会话 | 图 |
搜索 | FTS5 + hybrid RRF | 语义 | 混合 | FTS5 | 精确 |
事实版本控制 | 取代链 | 部分 | 无 | 无 | 无 |
词干提取 | EN + RU (Snowball) | 仅 EN | 仅 EN | 无 | 无 |
嵌入 | BYOK (OpenAI / Ollama) | 内置 | FastEmbed | 无 | 无 |
依赖 | 0 个必需 | Qdrant, Neo4j | Python 3.12 | Go binary | 无 |
需要云服务 | 否 | 是 | 否 | 否 | 否 |
成本 | 免费 | $19–249/mo | 免费 | 免费 | 免费 |
安装 |
| Docker + API 密钥 | pip + 依赖 | Go install | 内置 |
许可证 | MIT | Apache 2.0 | AGPL | MIT | MIT |
包含来源的扩展竞争分析:docs/COMPETITORS.md。
开发
npm run dev # run via tsx (no build step)
npm run build # TypeScript → dist/
npm run lint # eslint (flat config)
npm test # vitest — unit + integration + MCP dispatch + HTTP transport + hybrid RRF
npm run bench # performance benchmarks
npm run db:backup # backup databaseCI 在 Node 20 和 22 上运行构建、lint 和测试,然后通过真实 JSON-RPC 对编译后的
服务器进行冒烟测试(tools/list 必须与精确的工具集匹配)。
技术栈: TypeScript 5.9(严格模式)、better-sqlite3、@modelcontextprotocol/sdk、Snowball stemmer、Zod、vitest。
代码指南请参阅 CONTRIBUTING.md。
设计原则
默认气隙隔离 — 零遥测,永不例外。开箱即用,不会有任何数据离开本机;唯一与网络通信的组件是可选的嵌入器(embedder),且仅与你配置的提供商通信(包括本地 Ollama)。
单文件 — 单个 SQLite 数据库,零运维,通过文件复制即可即时备份。
确定性搜索 — 默认使用 FTS5 而非嵌入(embeddings)。可解释、可复现,无需 GPU。
结构化优于扁平化 — 层级编码访问模式;取代链编码时间。
极简 — 仅 4 个生产依赖。可在 Node 运行的任何地方工作。
以度量而非断言评估 — 检索变更以黄金集(golden set)为基准进行评判,包含回归测试。
许可证
This server cannot be deployed
Maintenance
Related MCP Connectors
Cloud-hosted MCP server for durable AI memory
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
1One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.1 npm1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA local-first MCP server providing persistent, searchable knowledge base via SQLite, enabling AI agents to save and recall facts across sessions without cloud dependencies.MIT
- AlicenseNot gradedqualityDmaintenanceA local-first long-term memory system for AI coding agents, exposed as an MCP server.54 npmMIT
- AlicenseAqualityCmaintenancePersistent memory MCP server for AI agents, using SQLite with hybrid keyword and semantic search for long-term memory storage.5Do What The F*ck You Want To Public