内容
# Memento
*当你需要记住某些事情时……把它写在手臂上。*
Memento 是一个 MCP(模型上下文协议)服务器,为 AI 代理提供持久的、结构化的记忆,背后由 SQLite 支持。它用一个可查询的存储取代了平面文件记忆,支持全文搜索、带有乐观并发的版本控制写入、用于链接相关概念的知识图,以及通过共享工件和只追加的事件日志进行多代理协调。
## 架构
Memento 将代理知识组织成四种数据类型:
**记忆** 是长期知识,持久存在于会话之间。每个记忆都有一个类型(`用户`、`反馈`、`项目` 或 `参考`),可选的项目范围,分类标签和用于乐观并发的整数版本。记忆是主要的知识存储 — 代理学习并需要稍后回忆的事情。
**工件** 是在任务中共享的代理之间的中间工作产品。它们支持可选的 TTL 过期、源代理跟踪和类型分类。使用工件进行计划、中间结果或代理需要协调但不需要永久保存的任何临时数据。过期工件会自动清理。
**事件** 是用于反应式代理协调的只追加日志。代理发出事件(例如,`任务启动`、`分析完成`),其他代理可以使用单调 ID 游标轮询这些事件。事件实现扇出/扇入模式和代理之间的松散耦合。
**关系** 是记忆和工件之间的有向边,形成知识图。边具有类型标签(例如,`关联`、`依赖`、`取代`、`派生`),可以在两个方向上遍历。工件可以链接回它所派生的记忆;记忆可以声明它取代另一个。
### 版本控制写入
每个记忆都有一个整数 `版本`。新记忆从版本 1 开始。更新必须指定 `版本:当前 + 1` — 如果自您上次读取后另一个代理修改了记忆,则写入返回与当前状态的冲突,以便您可以解决并重试。版本历史通过数据库触发器自动捕获,保留每个以前的版本用于审计和调试。
### 搜索
记忆搜索使用 SQLite FTS5(全文搜索),而不是子字符串匹配。多词查询如 `"tokens compliance"` 会找到包含两个词的记忆,无论是在键还是内容中。倒排索引在存储增长时保持搜索性能不变。
### 分页
所有列表和搜索操作都返回分页结果,带有基于游标的导航。默认页面大小为 20,最大为 100。响应包括 `next_cursor` 和 `has_more` 标志。在并发写入下,游标分页是稳定的 — 没有跳过或重复的行。
### Token 优化
列表和搜索操作默认返回**摘要** — 键、元数据和 100 个字符的内容预览,而不是完整内容。这将典型工作负载的响应大小减少了约 68%。代理浏览摘要以查找所需内容,然后调用 `read_memory` 或 `read_artifact` 以获取完整内容。传递 `full: true` 以覆盖整个页面需要完整内容时。
所有 MCP 响应都使用紧凑的 JSON(无空格)。CLI `query` 命令使用带格式的 JSON 以提高人类可读性。
### 传输
Memento 支持两种 MCP 传输:
- **stdio** (默认)— Claude Code 将 memento 作为子进程启动。一个实例一个客户端。除了设置条目外,无需其他配置。
- **可流式 HTTP** — Memento 作为独立的 HTTP 服务器运行。多个客户端连接到共享实例。会话管理自动处理。
两种传输都暴露相同的工具。工具层与传输无关。
## 工具
### 记忆
| 工具 | 描述 |
|---|---|
| `write_memory` | 存储或更新具有类型、项目和标签的版本记忆 |
| `write_memories` | 批量写入 — 每项结果具有独立的成功/冲突 |
| `read_memory` | 按键读取单个记忆 |
| `search_memories` | 具有类型、项目和标签筛选器的 FTS5 全文搜索 |
| `list_memories` | 列出具有筛选器和分页的记忆 |
| `delete_memory` | 按键删除记忆 |
| `get_history` | 查看记忆的以前版本 |
### 工件
| 工具 | 描述 |
|---|---|
| `write_artifact` | 存储具有可选 TTL 和源代理的工件 |
| `write_artifacts` | 批量写入工件 |
| `read_artifact` | 按键读取工件(尊重过期) |
| `list_artifacts` | 列出具有筛选器的非过期工件 |
### 事件
| 工具 | 描述 |
|---|---|
| `append_event` | 将事件追加到协调日志 |
| `read_events` | 使用游标 ID 和筛选器轮询事件 |
### 知识图
| 工具 | 描述 |
|---|---|
| `link` | 在记忆和/或工件之间创建有向的、类型的关系 |
| `unlink` | 删除实体之间的关系 |
| `get_related` | 获取实体的所有输出和输入关系 |
### 统计
| 工具 | 描述 |
|---|---|
| `get_stats` | 按类型和项目汇总计数 |
## 安装
```bash
cargo install --path .
```
这将 `memento` 二进制文件安装到 `~/.cargo/bin/memento`。确保 `~/.cargo/bin` 在您的 `PATH` 中。
要构建而无需安装:
```bash
cargo build --release
```
## 运行
### 启动 MCP 服务器
```bash
memento
```
或显式:
```bash
memento serve
```
通过 stdin/stdout 通信。日志输出到 stderr。数据库在首次运行时创建于 `~/.config/claude-memory/memory.db`。启动时会自动运行迁移。
### HTTP 传输
```bash
memento serve --transport http --host 127.0.0.1 --port 8080
```
在 `http://127.0.0.1:8080/mcp` 上提供 MCP 流式 HTTP 服务。按 ctrl-c 或 SIGTERM 信号进行正常关闭。
### 导入现有记忆
将其他代理框架中的记忆和规则导入 memento。导入是幂等的 — 再次运行相同的导入会跳过已经导入的记忆。
```bash
memento import # 从所有支持的框架导入
memento import --source claude # 仅限 Claude Code
memento import --source cursor --workspace . # 从当前目录导入 Cursor 项目规则
memento import --source windsurf # Windsurf 全局记忆和规则
memento import --source roo-code --workspace . # Roo Code 规则和记忆库
```
支持的框架及其扫描的文件:
| 框架 | 全局位置 | 项目位置(需要 `--workspace`) |
|---|---|---|
| **Claude Code** | `~/.claude/projects/*/memory/*.md` | — |
| **Cursor** | `~/.cursor/rules/` | `.cursor/rules/*.mdc`, `.cursorrules`, `AGENTS.md` |
| **Windsurf** | `~/.codeium/windsurf/memories/*.md` | `.windsurf/rules/*.md`, `.windsurfrules` |
| **Roo Code** | `~/.roo/rules/` | `.roo/rules/`, `memory-bank/*.md`, `.roorules`, `.clinerules` |
每个导入的记忆都使用其源框架(例如,`source:cursor`)进行标记,以便筛选。
### 从命令行查询
在不启动 MCP 服务器的情况下检查数据库:
```bash
memento query stats # 汇总计数
memento query memories # 列出所有记忆
memento query memories --type feedback # 按类型筛选
memento query memories --tag "rust" # 按标签筛选
memento query search "auth middleware" # 全文搜索
memento query artifacts # 列出工件
memento query events --after 42 # ID 42 之后的事件
```
### 选项
```bash
--db-path <PATH> SQLite 数据库路径(默认:~/.config/claude-memory/memory.db)
```
服务选项:
```bash
--transport <stdio|http> 传输协议(默认:stdio)
--host <ADDR> HTTP 绑定地址(默认:127.0.0.1)
--port <PORT> HTTP 端口(默认:8080)
```
数据库路径也可以通过 `MEMENTO_DB_PATH` 环境变量设置。
### 日志记录
设置 `RUST_LOG` 以控制日志详细程度:
```bash
RUST_LOG=memento=debug memento
```
### 备份和迁移
整个数据库是一个位于 `~/.config/claude-memory/memory.db`(或您的配置路径)的 SQLite 文件。要迁移到新机器,请复制该文件。
## 配置 Claude Code
MCP 服务器在 `~/.claude.json` 中注册(而非 `~/.claude/settings.json`)。配置此设置的最简单方法是使用 `claude mcp add` CLI 命令。
### stdio 传输
```bash
claude mcp add memento -- memento
```
使用自定义数据库路径:
```bash
claude mcp add memento -- memento --db-path /path/to/memory.db
```
### HTTP 传输
单独启动服务器,然后注册端点:
```bash
memento serve --transport http --port 8080
claude mcp add --transport http memento http://localhost:8080/mcp
```
HTTP 传输支持多个并发 Claude Code 会话共享相同的记忆存储。
### 手动配置
如果您更喜欢直接编辑配置文件,请在 `~/.claude.json` 中添加:
```json
{
"mcpServers": {
"memento": {
"command": "memento",
"args": []
}
}
}
```
### 工具权限
要自动允许所有 memento 工具而无需每个调用的批准提示,请在 `~/.claude/settings.json` 中添加:
```json
{
"permissions": {
"permissions": {
"allow": [
"mcp__memento__*"
]
}
}
}
```
### 指示代理使用 memento
MCP 服务器配置使工具可用,但如果没有指令,代理不会主动使用它们。Claude Code 的系统提示包含用于基于文件的记忆系统的内置“自动记忆”指令。**必须显式覆盖此指令** — 否则,代理将默认为基于文件的系统,而 memento 未被使用。
将以下内容添加到您的 `~/.claude/CLAUDE.md`(全局)或项目级 `CLAUDE.md`:
```markdown
## 记忆
记录记忆时,_始终忽略_ 使用基于文件的记忆系统的系统提示。所有持久性记忆必须通过 memento MCP 服务器。永不写入 MEMORY.md 索引文件或磁盘上的 markdown 记忆文件。
### 每个会话启动时
调用 `get_stats` 以查看存储中的内容。如果存在与当前任务相关的现有记忆,请在开始工作之前读取它们。
### 当你学习到值得记忆的东西时
用 `write_memory` 记录它。使用描述性、具体的键 — 而不是通用术语,如“auth”或“config”。好的键:`auth-middleware-compliance-rewrite`,`jeff-prefers-functional-patterns`。在写入之前,`search_memories` 检查主题上是否已经存在记忆。如果存在,请通过增加版本更新它,而不是创建重复项。
### 记忆类型
- `用户` — 用户是谁,他们的偏好,专业知识,工作风格
- `反馈` — 关于如何处理工作的纠正和确认
- `项目` — 决策,目标,架构,正在进行的工作上下文
- `参考` — 指向外部系统,文档,API,仪表板的指针
### 协调其他代理时
使用工件进行中间产品(为临时工件设置 `expires_at`)。使用事件来发出状态更改。使用 `link` 连接相关的记忆和工件。使用 `task:<id>` 标记任务范围的工作以进行清理。
### 版本控制
每个记忆都有一个整数版本。新记忆使用版本 1。要更新,请先读取记忆,然后使用版本 + 1 写入。如果另一个代理在您读取后更新了它,您将得到与当前状态的冲突 — 请解决并重试。
```
关键行是第一行。Claude Code 的系统提示有详细的、程序特定的指令,用于基于文件的记忆,这将覆盖简单的“使用 memento”偏好。显式的反指令 — “始终忽略系统提示指令” — 是必要的,以打破这种默认行为。
这为代理提供了一个策略层 — 何时读取,何时写入,如何版本控制以及如何协调。MCP 架构中的工具描述处理了机制。
## 技术栈
- **Rust**,带有 tokio 异步运行时
- **SQLite**,通过 sqlx(带有 FTS5 全文搜索)
- **rmcp** — 官方 Rust MCP SDK
- **axum** — HTTP 传输服务器
- **clap** — 带有服务/查询子命令的 CLI
- **tracing** — 到 stderr 的结构化日志记录