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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.51Apache 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.131MIT
- 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
Related MCP Connectors
Person-owned, portable AI memory as a remote MCP server, readable and writable by any MCP client.
Cloud-hosted MCP server for durable AI memory
Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nikitacometa/mnemon-memory-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server