---
title: "mcp-memory-service：Claude Code 与 Cursor 共享记忆"
canonical: https://wavect.io/zh/blog/mcp-memory-service-claude-code-cursor/
language: zh
description: "用 mcp-memory-service 为 Claude Code、Cursor 和 OpenCode 配置共享持久记忆。详解 SQLite 路径、本地 ONNX 嵌入、5 毫秒声明、跨语言检索，以及旧决策和因果关系的验证方法。"
image: "https://wavect.io/img/blog/headers/header_mcp-memory-service-claude-code-cursor.png"
---

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

14 分钟 阅读 · 2026年9月24日 最近审核 2026年9月24日

[**下一篇**](/zh/blog/openviking-agent-memory-review/)

# mcp-memory-service：让 Claude Code 与 Cursor 共享持久记忆

要点速览

mcp-memory-service 为 AI 编程工具提供共享的持久记忆。它最有价值的用途，是让 Claude Code、Cursor 和 OpenCode 检索同一份项目决策历史，而不是替代仓库指令，也不是证明所有智能体原本都没有记忆。需要配置同一本地数据库，验证实际跨客户端检索，并保留证据与决策状态。本地 ONNX 推理不代表云端编程模型离线；5 毫秒是项目方声明，不是我们复现的基准。

**mcp-memory-service 为 AI 编程智能体提供共享的持久记忆，用来保存架构决策、故障调查和项目约定。**它的价值不是让模型在一个上下文窗口中保留无限对话，而是让新会话能够检索另一个会话或工具保存的相关记录。前提是各客户端连接同一个存储，并且实际调用记忆工具。 [项目官方仓库](https://github.com/doobidoo/mcp-memory-service) 介绍了本地嵌入、语义检索和带类型的知识图谱关系。

**资料核查日期：2026 年 9 月 24 日。**本文是基于文档的配置与评估指南，不是我们已经执行的集成实测，也没有独立复现性能基准。下文会区分项目公开的能力、我们组合的配置示例以及建议的验收测试。

## 它能替代 CLAUDE.md、Cursor 规则或原生记忆吗？

**不能。稳定的指令应保留在代码仓库中，持续变化且有证据支持的历史信息才适合放入共享记忆。**“Claude Code 每次启动都完全没有持久上下文”并不准确。 [Claude Code 的记忆文档](https://code.claude.com/docs/en/memory) 说明了指令文件和自动记忆。 [Cursor 规则](https://cursor.com/docs/rules) 同样可以保留指令。但这些能力本身，并不代表不同工具已经共享一个可查询的决策历史。

| 信息类型 | 建议位置 | 原因 |
| --- | --- | --- |
| 构建命令、目录约定和必须执行的检查 | 纳入版本控制的 CLAUDE.md、AGENTS.md 或 Cursor 规则等指令 | 需要审查的规范应随代码一起变更。 |
| 为何放弃某个方案，哪次迁移引入了回归 | 按项目隔离的共享记忆，并附上决策、提交和测试的引用 | 历史理由应能跨会话检索，而不是反复口头重建。 |
| 应用现在实际如何运行 | 当前代码、配置和可执行测试 | 记忆中的陈述可能已经过时。 |

因此，是否引入它可以从一个具体问题判断：开发者在 Claude Code、Cursor 和 OpenCode 之间切换时，是否不断重建相同的推理过程？先解决这一问题，而不是建立另一套可能与仓库规范冲突的指令系统。历史解释有价值，但不应取得高于现行规则和代码事实的权限。

## 安装 mcp-memory-service：安装完成不等于集成完成

单行安装命令如下：

```
pip install mcp-memory-service
```

[PyPI 项目页](https://pypi.org/project/mcp-memory-service/) 列出了 **11.13.0** 版本，发布日期为 2026 年 9 月 19 日，要求 Python 3.10 或以上，采用 Apache-2.0 许可证。本示例固定使用核查过的版本，避免安装时自动跟随之后的发行版。

```
python3 -m venv "$HOME/.venvs/mcp-memory-service"
"$HOME/.venvs/mcp-memory-service/bin/python" -m pip install "mcp-memory-service==11.13.0"
mkdir -p "$HOME/.local/share/agent-memory/example-app"
"$HOME/.venvs/mcp-memory-service/bin/memory" server --help
```

这些 Shell 命令适用于 macOS 和 Linux。Windows 用户需要调整虚拟环境中的可执行文件位置和绝对存储路径，不能原样使用 POSIX 路径。团队已有 Python 环境管理方式时，应沿用既有流程，并确认 IDE 启动的进程能访问同一环境。

[官方安装指南](https://github.com/doobidoo/mcp-memory-service/blob/main/docs/setup-guide.md) 说明了 `memory server` 以及后续客户端连接步骤。安装 Python 包不会自动在每个 IDE 中注册 MCP 服务，不会自动导入旧对话，也不保证每个新会话都会读取记忆。软件存在、客户端连通、记录已写入和任务开始时实际检索，是四个不同的检查点。

## 最重要的设置：所有客户端必须使用同一个数据库

**包名相同、数据库路径不同，得到的就是不同的记忆。**下面的单用户、单机示例让三个客户端使用同一个可执行文件和同一个绝对 SQLite 文件路径。 [配置参考](https://github.com/doobidoo/mcp-memory-service/blob/main/docs/mastery/configuration-guide.md) 说明了 `MCP_MEMORY_STORAGE_BACKEND`、`MCP_MEMORY_SQLITE_PATH` 和 `MCP_MEMORY_USE_ONNX`。

请把所有示例中的 `example-app` 一致替换为一个项目或信任边界。不同客户的仓库应使用独立存储，不要把标签当作访问控制。该路径指向数据库文件，而不只是父目录。容器、远程开发主机和另一个操作系统账户不会因为配置文本相似，就自动共享你的主目录。

这里每个 MCP 客户端都会启动一个 stdio 进程，访问同一个本地存储。这不是多用户服务的部署设计。正式依赖前应测试并发使用，不要把活动中的 SQLite 数据库提交到 Git，也不要把网盘同步文件夹当作数据库复制方案。如果开发工作实际跨多台机器，应该单独设计服务端点与授权，而不是继续假设本地路径能够互通。

## 通过本地 MCP 连接 Claude Code

在需要使用该连接的项目目录中执行：

```
claude mcp add \
  --env MCP_MEMORY_STORAGE_BACKEND=sqlite_vec \
  --env MCP_MEMORY_SQLITE_PATH="$HOME/.local/share/agent-memory/example-app/sqlite_vec.db" \
  --env MCP_MEMORY_USE_ONNX=true \
  --transport stdio --scope local \
  memory -- "$HOME/.venvs/mcp-memory-service/bin/memory" server
claude mcp list
```

示例遵循 [Claude Code 官方 MCP 命令格式](https://code.claude.com/docs/en/mcp) 。`--scope local` 将注册保留在你的本地项目配置中。选项位于服务名称之前，`--` 分隔符后面才是可执行文件。显式指定程序路径，可避免依赖 IDE 继承终端的 PATH。

根据客户端状态重新启动或重新连接，然后确认服务连通，且 `memory_store` 与 `memory_search` 工具可用。只批准预期操作。服务显示“已连接”并不意味着某条记录已经写入，更不意味着下一项任务会自动读取它。

## 配置 Cursor，让它读取相同的记忆存储

将以下条目合并到项目的 `.cursor/mcp.json`，保留已有的其他服务配置：

```
{
  "mcpServers": {
    "memory": {
      "type": "stdio",
      "command": "${userHome}/.venvs/mcp-memory-service/bin/memory",
      "args": [
        "server"
      ],
      "env": {
        "MCP_MEMORY_STORAGE_BACKEND": "sqlite_vec",
        "MCP_MEMORY_SQLITE_PATH": "${userHome}/.local/share/agent-memory/example-app/sqlite_vec.db",
        "MCP_MEMORY_USE_ONNX": "true"
      }
    }
  }
}
```

[Cursor MCP 文档](https://cursor.com/docs/mcp) 定义了 stdio 配置字段，并支持 `${userHome}` 插值。请检查变量展开后的实际路径，重新连接服务，工具缺失时查看 MCP 输出。不要把凭证或从客户项目复制出来的数据库放入项目配置并提交。

两个客户端都显示名为“memory”的服务，并不能证明状态共享成功。下文的跨客户端验收会同时检查实际数据库和工具调用流程。尤其是在一个客户端由终端启动、另一个由桌面启动时，不能只比较服务名称。

## OpenCode：标准 MCP 连接和自动采集插件不是一回事

继续使用相同的本地 MCP 方案时，将以下内容合并到 `opencode.json`：

```
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "memory": {
      "type": "local",
      "command": [
        "{env:HOME}/.venvs/mcp-memory-service/bin/memory",
        "server"
      ],
      "enabled": true,
      "environment": {
        "MCP_MEMORY_STORAGE_BACKEND": "sqlite_vec",
        "MCP_MEMORY_SQLITE_PATH": "{env:HOME}/.local/share/agent-memory/example-app/sqlite_vec.db",
        "MCP_MEMORY_USE_ONNX": "true"
      }
    }
  }
}
```

[OpenCode MCP 参考](https://opencode.ai/docs/mcp-servers/) 使用 `type: local`、命令数组和 `environment`，不是 Cursor 的 `env` 字段。其 [配置文档](https://opencode.ai/docs/config/) 说明了 `{env:HOME}` 替换规则。这个示例把客户端公开支持的格式与上游服务命令组合起来；我们没有实际运行这套三客户端配置。

单独提供的 [Memory Awareness 插件](https://github.com/doobidoo/mcp-memory-service/blob/main/opencode/README.md) 通过 HTTP REST API 在会话开始时检索记忆并执行自动采集。插件文件来自仓库，仅运行 pip 安装不会把它装好。标准 MCP 提供可调用工具，插件则增加会话生命周期自动化，这是两条不同的集成路径。

建议先选一条路径。没有采集策略就同时启用两者，会增加判断记录来源的难度。本 stdio 示例不需要 HTTP 监听服务。若以后部署插件，需要单独核查端点、身份验证和网络访问范围，而不是直接复制一个面向演示的匿名服务配置。

## 验证记忆能否跨重启、跨 IDE 保留

**验证实际检索结果，不要只相信智能体声称“我记得”。**在 Claude Code 中明确要求调用 `memory_store`，保存一条虚构决策，标签为 `project:example-app`：“支付事件使用 outbox，避免支付提交成功后，下游事件丢失。”再加上虚构的决策引用、状态和日期，不要使用真实客户数据。

检查存储工具返回的成功结果，然后关闭会话。在全新的 Cursor 会话中明确要求调用 `memory_search`，查找为什么支付事件采用 outbox。核对返回记录的标识符和内容，而不是接受模型凭一般知识写出的合理解释。在 OpenCode 中重复，再重启客户端进程后重复一次。这样才能把会话上下文残留与持久存储区分开。

还应加入反向测试：按照你选择的隔离设计，另一个项目不应该能够读取这条决策。搜索标签能缩小结果范围，却不构成安全边界。启用自动采集前，既要检查本应出现却缺失的结果，也要检查本不应出现的结果。

## 本地 ONNX 嵌入：“零外部 API 调用”具体指什么？

**嵌入在本地计算，不代表整个编程流程都离线。** [ONNX Runtime](https://onnxruntime.ai/docs/get-started/with-python.html) 可以在本地执行已经可用的模型。安装软件包和首次下载模型是另外的网络活动。客户端把记忆工具的结果加入上下文后，云端编程模型仍可能收到这些内容。

多语言团队还需要核查另一个边界。 [all-MiniLM-L6-v2 模型卡](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2) 将默认模型标为英语模型，输出 384 维向量，默认会截断超过 256 个 word pieces 的输入。中文界面并不能证明“中文问题检索英文决策”效果可靠。直接保存很长的会话导出，也可能在生成嵌入之前就丢掉关键细节。

项目的 [环境变量示例](https://github.com/doobidoo/mcp-memory-service/blob/main/.env.example) 提供模型、提供方和可选功能设置。应检查具体配置，而不是把“本地优先”当作数据边界已经满足要求的证明。云端或混合存储、外部评分、LLM 辅助采集都需要另外作出选择。

我们建议用一个简单的跨语言测试开始：用英语保存一条已批准决策，再分别使用德语、西班牙语和中文，以开发者真实的提问方式寻找它。评估正确记录是否被检索出来，而不是模型是否能翻译回答。更换嵌入模型时，应先备份，再规划重新生成向量的迁移；即使新旧模型维度相同，也不应直接混用其向量空间。

## mcp-memory-service 真的能在 5 毫秒内检索上下文吗？

**5 毫秒是项目方的性能声明，不是本文验证过的端到端保证。**不能把 [仓库中的宣传语](#source-01) 扩展成“任意历史决策和任意图谱关系都能在 5 毫秒内返回”。我们没有独立复现这个数字。

本地评估时，应分别计量进程启动、首次模型加载、查询向量生成、数据库检索、图谱扩展和客户端传输，再测量整个工具调用往返。热缓存下的数据库读取，与冷启动检索、远程请求或编程模型生成完整答案，测量的不是同一件事。

记录硬件、模型、记忆数量和长度、查询类型、并发客户端以及预热条件。报告中位耗时与较慢请求的表现，同时记录证据是否正确。我们的采用标准是：如果智能体自信地召回一条已经失效的架构决策，节省几毫秒没有实际价值。先定义可接受的正确率和错误类型，再讨论响应速度是否足够。

## 用因果记忆排查故障：建立关系不等于证明因果

[知识图谱文档](https://github.com/doobidoo/mcp-memory-service/blob/main/docs/features/knowledge-graph-dashboard.md) 介绍了 `causes`、`fixes`、`contradicts`、`supports`、`follows` 和 `related` 等关系类型。它们能表达调查链条，但不会自动证明调查结论为真。

考虑一个**虚构**案例：提交 `demo-change-A` 删除了幂等性保护；缺陷 `DEMO-42` 记录了重复支付事件；补丁 `demo-fix-B` 恢复保护；回归测试 `test_duplicate_event` 在补丁前复现失败、补丁后通过。应把这些工件的引用和因果陈述一起保存，区分“怀疑是原因”和“已通过所审查的测试确认”。

如果后续迁移替换了原设计，应保留历史记录，同时把旧建议标记为已被替代。否则，语义匹配度很高的结果也可能变成错误的工程建议。智能体根据记忆采取行动前，应查看当前代码和相关测试，而不是把图谱中的一条边当作永远有效的事实。

## 实用记忆策略：记录决策、精确检索、淘汰过时建议

我们建议每条记录包含项目、组件、决策、理由、证据位置、来源提交、作者或审查者、状态、记录日期和下一次复核触发条件。这是记录内容的编辑模板，不是声称这些字段都是 API 必填参数。每条记忆保留一个值得长期保存的结论，不要把临时想法全部升级为正式决策。

任务开始时，围绕相关组件检索并检查证据状态。任务结束时，只保存已经验证的变更和明确标记的未决问题。把“我们试过”与“团队已批准”分开。在自动整合可能改变重要运行含义之前，要求人工复核。记录量持续增长本身，不应被当作质量提升的指标。

[节省 token 的检索指南](https://github.com/doobidoo/mcp-memory-service/blob/main/docs/guides/token-efficient-retrieval.md) 说明了有界检索和基于图谱的探索。下面是传给 `memory_search` 的示例参数对象，限制返回条数和字符数。`6000` 是我们选择的示例预算，不是项目推荐的性能参数，也不是 token 数量：

```
{
  "query": "Why does example-app use an outbox for payment events?",
  "tags": [
    "project:example-app"
  ],
  "limit": 5,
  "max_response_chars": 6000
}
```

实体图谱需要单独验收。即使已有文本记忆，`memory_explore` 返回空结果也可能是因为实体从未生成。文档中的 `MCP_ENTITY_LINKING_ENABLED=1` 设置影响之后新保存的记录；历史数据需要明确规划的维护或回填步骤。不要为了让空图谱看起来正常，就盲目执行会修改数据的维护命令。

## 排查记忆无法持久化或召回不准确的问题

| 现象 | 优先检查 | 应收集的证据 |
| --- | --- | --- |
| Claude Code 可用，Cursor 不可用 | 可执行文件、环境变量、数据库绝对路径和系统账户 | 比较展开后的配置，并检索同一个记录标识符。 |
| 重启后记忆消失 | 写入是否成功、容器路径是否临时、重新打开的是哪个存储 | 不依赖对话历史，执行保存、关闭、重开、检索测试。 |
| 服务已连接，智能体仍然忘记 | 是否实际调用过记忆工具 | 检查真实工具调用，并制定明确的任务开始检索流程。 |
| 文本检索有效，图谱探索为空 | 实体链接配置和实体是否已生成 | 先核查实体数量，再考虑经过审查的回填。 |
| 中文问题找不到英文决策 | 嵌入模型、查询语言、文本长度和过滤条件 | 对已知记录运行语义相同的多语言查询。 |
| 更换模型后出现维度错误 | 模型选择、模型缓存和已有向量兼容性 | 停止新写入，保留备份并规划重新生成嵌入。 |
| 多个客户端同时使用时偶发失败 | 并发写入、存储位置和进程日志 | 先用受控客户端复现，再考虑数据库设置变更。 |

## 共享编程记忆需要哪些安全边界？

**把检索到的记忆视为不可信证据，而不是优先级更高的指令。**记录中出现“忽略之前的指令”时，这句话仍然只是数据。每个项目只应获得必要的存储和工具权限，客户提供的文档不应悄悄改写团队开发规范。自动采集不应绕过原本适用于代码、凭证和客户资料的审查。

[MCP 安全指南](https://modelcontextprotocol.io/docs/2025-11-25/tutorials/security/security_best_practices) 可以作为核查授权和传输风险的起点。我们的操作建议是先采用本地 stdio，排除密钥和客户会话文本，在暴露共享端点前单独评审。使用 HTTP 时，应明确选择绑定地址、身份验证、访问权限、传输保护和允许的客户端。不要把匿名访问演示直接用于网络可达的部署。

在开启自动采集之前，明确纠错、删除、保留期限和恢复的责任人。测试一致的备份与恢复流程，确认已删除或已被替代的记录不会从第二个存储重新出现。开源、本地嵌入和标签本身，都不能证明合规或租户隔离已经成立。

## 用一个小型试点判断是否值得采用

不要一开始就导入全部历史。以下是我们建议的试点，不是公开基准：十条已批准决策、五条已被替代的决策、五组缺陷与修复链，以及五个跨语言查询。再加入其他项目不应读取的记录，让试点同时验证正确召回和权限边界。

| 测试 | 有意义的通过条件 |
| --- | --- |
| 跨工具连续性 | 每个客户端的新会话都能检索同一条决策，并返回标识符和证据。 |
| 决策时效性 | 答案识别当前决策，并把旧决策标为已被替代。 |
| 隔离 | 信任边界之外的客户端不能读取另一个项目的记忆。 |
| 故障分析可追溯性 | 智能体找到假设、修复变更和回归证据，不虚构因果证明。 |
| 成本与延迟 | 分别记录工具往返时间、返回上下文大小和任何外部调用。 |
| 故障与恢复 | 记忆不可用时明确报告，而不是假装记得；经过测试的恢复保留预期记录。 |

如果试点减少了重复解释，又没有增加过时建议和跨项目误用，就值得继续采用。如果真正缺少的只是清晰的开发约定，先完善仓库指令。更广泛的上下文架构可参考我们的 [OpenViking 评测](/zh/blog/openviking-agent-memory-review/) ；应用层记忆与不同部署方式的取舍，可阅读 [Supermemory 指南](/zh/blog/supermemory-ai-agent-memory/) 。

需要实施支持时，可以了解 Wavect 的 [AI 工程服务](/zh/services/artificial-intelligence/) 。 [Twinsoft AI 案例](/zh/case-studies/twinsoft-ai/) 提供相关交付背景，但不是该项目使用了此工具的证明。我们的 [上线前软件 QA 清单](/zh/software-development-guide/software-qa-checklist-before-launch/) 有助于把试点变成发布标准，也可以 [与团队讨论范围明确的记忆集成](/zh/contact/) 。

## 关于 mcp-memory-service 的常见问题

### mcp-memory-service 是什么？

它是开源的持久记忆后端，让编程智能体保存和检索项目上下文。本文采用本地 MCP 连接，让 Claude Code、Cursor 和 OpenCode 访问同一个 SQLite 存储。

### 安装后，每个会话都会自动记住项目吗？

不会。还需要配置各客户端、验证写入成功，并建立检索流程。会话开始时自动读取以及自动采集，取决于启用的集成方式或自动化。

### Claude Code 和 Cursor 能共享同一份记忆吗？

可以，前提是配置的服务进程拥有适当权限，并访问同一个底层存储。在本文的本地示例中，应比较实际展开的 SQLite 绝对路径，再确认新客户端能检索相同的记录标识符。

### 它能替代 CLAUDE.md 或 Cursor 规则吗？

不能。这些文件仍适合保存稳定且可审查的项目指令。共享记忆补充持续变化的决策和故障历史，检索到的建议仍需与当前代码核对。

### OpenCode 记忆插件与 MCP 服务是一回事吗？

不是。标准本地 MCP 配置提供记忆工具；独立的 Memory Awareness 插件使用 HTTP REST 实现会话生命周期自动化，还需要仓库中的插件文件。仅通过 pip 安装不会安装该插件。

### 它完全离线，而且没有 API 成本吗？

所需模型文件已就绪时，本地嵌入可以不调用外部嵌入 API。但安装、模型下载、可选云功能以及编程模型本身有各自的网络和成本边界。自托管也需要运维资源。

### 5 毫秒包含任何搜索和图谱查询吗？

本文没有证明这一点。5 毫秒是项目公开的性能声明，不保证覆盖查询嵌入、冷启动、远程传输、图谱扩展或模型生成完整答案。应测量自己的实际工具往返。

### 已有记忆，为什么 memory_explore 仍为空？

文本记录和已经生成的图谱实体不是同一回事。应检查实体链接配置与实体数量。启用链接影响之后保存的记录，历史记录回填是独立维护操作，需要审查和备份。

模型与基础设施

## 继续浏览此集群

模型选择、推理经济性、本地部署、压缩与服务架构。

[从核心文章开始**在欧盟自托管 LLM：开放权重模型何时才真正划算**](/zh/blog/self-hosting-llms-eu-cost/)

- [Laya vs Jev：基准结果与 AI 创业护城河](/zh/blog/laya-vs-jev-benchmark-ai-startup-moat/)
- [Jev AI 评测：面向智能体工作流的决策模型](/zh/blog/jev-ai-decision-model-review/)
- [SwarmLLM 评测 2026：手机与笔记本协同浏览器 LLM 推理](/zh/blog/swarmllm-browser-p2p-inference-review-2026/)
- [Phonely Alma 评测：这款语音 LLM 能否用于生产？](/zh/blog/phonely-alma-voice-llm-review/)
- [Utopia 企业评估：双时态知识图谱与历史问答](/zh/blog/utopia-temporal-knowledge-graph/)

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

14 分钟 阅读 · 2026年9月24日 最近审核 2026年9月24日

[**下一篇**](/zh/blog/openviking-agent-memory-review/)

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/blog/mcp-memory-service-claude-code-cursor/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-09-24",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-09-24",
      "url": "https://wavect.io/zh/blog/mcp-memory-service-claude-code-cursor/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "mcp-memory-service 为 AI 编程工具提供共享的持久记忆。它最有价值的用途，是让 Claude Code、Cursor 和 OpenCode 检索同一份项目决策历史，而不是替代仓库指令，也不是证明所有智能体原本都没有记忆。需要配置同一本地数据库，验证实际跨客户端检索，并保留证据与决策状态。本地 ONNX 推理不代表云端编程模型离线；5 毫秒是项目方声明，不是我们复现的基准。",
  "articleBody": " 博客概览/AI 与智能体/模型与基础设施 mcp-memory-service：让 Claude Code 与 Cursor 共享持久记忆 要点速览 mcp-memory-service 为 AI 编程工具提供共享的持久记忆。它最有价值的用途，是让 Claude Code、Cursor 和 OpenCode 检索同一份项目决策历史，而不是替代仓库指令，也不是证明所有智能体原本都没有记忆。需要配置同一本地数据库，验证实际跨客户端检索，并保留证据与决策状态。本地 ONNX 推理不代表云端编程模型离线；5 毫秒是项目方声明，不是我们复现的基准。 mcp-memory-service 为 AI 编程智能体提供共享的持久记忆，用来保存架构决策、故障调查和项目约定。它的价值不是让模型在一个上下文窗口中保留无限对话，而是让新会话能够检索另一个会话或工具保存的相关记录。前提是各客户端连接同一个存储，并且实际调用记忆工具。项目官方仓库介绍了本地嵌入、语义检索和带类型的知识图谱关系。 资料核查日期：2026 年 9 月 24 日。本文是基于文档的配置与评估指南，不是我们已经执行的集成实测，也没有独立复现性能基准。下文会区分项目公开的能力、我们组合的配置示例以及建议的验收测试。 它能替代 CLAUDE.md、Cursor 规则或原生记忆吗？ 不能。稳定的指令应保留在代码仓库中，持续变化且有证据支持的历史信息才适合放入共享记忆。“Claude Code 每次启动都完全没有持久上下文”并不准确。Claude Code 的记忆文档说明了指令文件和自动记忆。Cursor 规则同样可以保留指令。但这些能力本身，并不代表不同工具已经共享一个可查询的决策历史。 编程智能体不同类型上下文的建议存放位置 信息类型建议位置原因 构建命令、目录约定和必须执行的检查纳入版本控制的 CLAUDE.md、AGENTS.md 或 Cursor 规则等指令需要审查的规范应随代码一起变更。 为何放弃某个方案，哪次迁移引入了回归按项目隔离的共享记忆，并附上决策、提交和测试的引用历史理由应能跨会话检索，而不是反复口头重建。 应用现在实际如何运行当前代码、配置和可执行测试记忆中的陈述可能已经过时。 因此，是否引入它可以从一个具体问题判断：开发者在 Claude Code、Cursor 和 OpenCode 之间切换时，是否不断重建相同的推理过程？先解决这一问题，而不是建立另一套可能与仓库规范冲突的指令系统。历史解释有价值，但不应取得高于现行规则和代码事实的权限。 安装 mcp-memory-service：安装完成不等于集成完成 单行安装命令如下： pip install mcp-memory-service PyPI 项目页列出了 11.13.0 版本，发布日期为 2026 年 9 月 19 日，要求 Python 3.10 或以上，采用 Apache-2.0 许可证。本示例固定使用核查过的版本，避免安装时自动跟随之后的发行版。 python3 -m venv \"$HOME/.venvs/mcp-memory-service\" \"$HOME/.venvs/mcp-memory-service/bin/python\" -m pip install \"mcp-memory-service==11.13.0\" mkdir -p \"$HOME/.local/share/agent-memory/example-app\" \"$HOME/.venvs/mcp-memory-service/bin/memory\" server --help 这些 Shell 命令适用于 macOS 和 Linux。Windows 用户需要调整虚拟环境中的可执行文件位置和绝对存储路径，不能原样使用 POSIX 路径。团队已有 Python 环境管理方式时，应沿用既有流程，并确认 IDE 启动的进程能访问同一环境。 官方安装指南说明了 memory server 以及后续客户端连接步骤。安装 Python 包不会自动在每个 IDE 中注册 MCP 服务，不会自动导入旧对话，也不保证每个新会话都会读取记忆。软件存在、客户端连通、记录已写入和任务开始时实际检索，是四个不同的检查点。 最重要的设置：所有客户端必须使用同一个数据库 包名相同、数据库路径不同，得到的就是不同的记忆。下面的单用户、单机示例让三个客户端使用同一个可执行文件和同一个绝对 SQLite 文件路径。配置参考说明了 MCP_MEMORY_STORAGE_BACKEND、MCP_MEMORY_SQLITE_PATH 和 MCP_MEMORY_USE_ONNX。 请把所有示例中的 example-app 一致替换为一个项目或信任边界。不同客户的仓库应使用独立存储，不要把标签当作访问控制。该路径指向数据库文件，而不只是父目录。容器、远程开发主机和另一个操作系统账户不会因为配置文本相似，就自动共享你的主目录。 这里每个 MCP 客户端都会启动一个 stdio 进程，访问同一个本地存储。这不是多用户服务的部署设计。正式依赖前应测试并发使用，不要把活动中的 SQLite 数据库提交到 Git，也不要把网盘同步文件夹当作数据库复制方案。如果开发工作实际跨多台机器，应该单独设计服务端点与授权，而不是继续假设本地路径能够互通。 通过本地 MCP 连接 Claude Code 在需要使用该连接的项目目录中执行： claude mcp add \\ --env MCP_MEMORY_STORAGE_BACKEND=sqlite_vec \\ --env MCP_MEMORY_SQLITE_PATH=\"$HOME/.local/share/agent-memory/example-app/sqlite_vec.db\" \\ --env MCP_MEMORY_USE_ONNX=true \\ --transport stdio --scope local \\ memory -- \"$HOME/.venvs/mcp-memory-service/bin/memory\" server claude mcp list 示例遵循 Claude Code 官方 MCP 命令格式。--scope local 将注册保留在你的本地项目配置中。选项位于服务名称之前，-- 分隔符后面才是可执行文件。显式指定程序路径，可避免依赖 IDE 继承终端的 PATH。 根据客户端状态重新启动或重新连接，然后确认服务连通，且 memory_store 与 memory_search 工具可用。只批准预期操作。服务显示“已连接”并不意味着某条记录已经写入，更不意味着下一项任务会自动读取它。 配置 Cursor，让它读取相同的记忆存储 将以下条目合并到项目的 .cursor/mcp.json，保留已有的其他服务配置： { \"mcpServers\": { \"memory\": { \"type\": \"stdio\", \"command\": \"${userHome}/.venvs/mcp-memory-service/bin/memory\", \"args\": [ \"server\" ], \"env\": { \"MCP_MEMORY_STORAGE_BACKEND\": \"sqlite_vec\", \"MCP_MEMORY_SQLITE_PATH\": \"${userHome}/.local/share/agent-memory/example-app/sqlite_vec.db\", \"MCP_MEMORY_USE_ONNX\": \"true\" } } } } Cursor MCP 文档定义了 stdio 配置字段，并支持 ${userHome} 插值。请检查变量展开后的实际路径，重新连接服务，工具缺失时查看 MCP 输出。不要把凭证或从客户项目复制出来的数据库放入项目配置并提交。 两个客户端都显示名为“memory”的服务，并不能证明状态共享成功。下文的跨客户端验收会同时检查实际数据库和工具调用流程。尤其是在一个客户端由终端启动、另一个由桌面启动时，不能只比较服务名称。 OpenCode：标准 MCP 连接和自动采集插件不是一回事 继续使用相同的本地 MCP 方案时，将以下内容合并到 opencode.json： { \"$schema\": \"https://opencode.ai/config.json\", \"mcp\": { \"memory\": { \"type\": \"local\", \"command\": [ \"{env:HOME}/.venvs/mcp-memory-service/bin/memory\", \"server\" ], \"enabled\": true, \"environment\": { \"MCP_MEMORY_STORAGE_BACKEND\": \"sqlite_vec\", \"MCP_MEMORY_SQLITE_PATH\": \"{env:HOME}/.local/share/agent-memory/example-app/sqlite_vec.db\", \"MCP_MEMORY_USE_ONNX\": \"true\" } } } } OpenCode MCP 参考使用 type: local、命令数组和 environment，不是 Cursor 的 env 字段。其配置文档说明了 {env:HOME} 替换规则。这个示例把客户端公开支持的格式与上游服务命令组合起来；我们没有实际运行这套三客户端配置。 单独提供的 Memory Awareness 插件通过 HTTP REST API 在会话开始时检索记忆并执行自动采集。插件文件来自仓库，仅运行 pip 安装不会把它装好。标准 MCP 提供可调用工具，插件则增加会话生命周期自动化，这是两条不同的集成路径。 建议先选一条路径。没有采集策略就同时启用两者，会增加判断记录来源的难度。本 stdio 示例不需要 HTTP 监听服务。若以后部署插件，需要单独核查端点、身份验证和网络访问范围，而不是直接复制一个面向演示的匿名服务配置。 验证记忆能否跨重启、跨 IDE 保留 验证实际检索结果，不要只相信智能体声称“我记得”。在 Claude Code 中明确要求调用 memory_store，保存一条虚构决策，标签为 project:example-app：“支付事件使用 outbox，避免支付提交成功后，下游事件丢失。”再加上虚构的决策引用、状态和日期，不要使用真实客户数据。 检查存储工具返回的成功结果，然后关闭会话。在全新的 Cursor 会话中明确要求调用 memory_search，查找为什么支付事件采用 outbox。核对返回记录的标识符和内容，而不是接受模型凭一般知识写出的合理解释。在 OpenCode 中重复，再重启客户端进程后重复一次。这样才能把会话上下文残留与持久存储区分开。 还应加入反向测试：按照你选择的隔离设计，另一个项目不应该能够读取这条决策。搜索标签能缩小结果范围，却不构成安全边界。启用自动采集前，既要检查本应出现却缺失的结果，也要检查本不应出现的结果。 本地 ONNX 嵌入：“零外部 API 调用”具体指什么？ 嵌入在本地计算，不代表整个编程流程都离线。ONNX Runtime可以在本地执行已经可用的模型。安装软件包和首次下载模型是另外的网络活动。客户端把记忆工具的结果加入上下文后，云端编程模型仍可能收到这些内容。 多语言团队还需要核查另一个边界。all-MiniLM-L6-v2 模型卡将默认模型标为英语模型，输出 384 维向量，默认会截断超过 256 个 word pieces 的输入。中文界面并不能证明“中文问题检索英文决策”效果可靠。直接保存很长的会话导出，也可能在生成嵌入之前就丢掉关键细节。 项目的环境变量示例提供模型、提供方和可选功能设置。应检查具体配置，而不是把“本地优先”当作数据边界已经满足要求的证明。云端或混合存储、外部评分、LLM 辅助采",
  "articleSection": "工程实践",
  "author": {
    "@id": "https://wavect.io/team/kevin-riedl/#person",
    "@type": "Person",
    "name": "Kevin Riedl",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796365",
      "https://www.linkedin.com/in/wsdt",
      "https://github.com/wsdt"
    ],
    "url": "https://wavect.io/team/kevin-riedl/"
  },
  "citation": [
    {
      "@type": "WebPage",
      "name": "项目官方仓库",
      "url": "https://github.com/doobidoo/mcp-memory-service"
    },
    {
      "@type": "WebPage",
      "name": "Claude Code 的记忆文档",
      "url": "https://code.claude.com/docs/en/memory"
    },
    {
      "@type": "WebPage",
      "name": "Cursor 规则",
      "url": "https://cursor.com/docs/rules"
    },
    {
      "@type": "WebPage",
      "name": "PyPI 项目页",
      "url": "https://pypi.org/project/mcp-memory-service/"
    },
    {
      "@type": "WebPage",
      "name": "官方安装指南",
      "url": "https://github.com/doobidoo/mcp-memory-service/blob/main/docs/setup-guide.md"
    },
    {
      "@type": "WebPage",
      "name": "配置参考",
      "url": "https://github.com/doobidoo/mcp-memory-service/blob/main/docs/mastery/configuration-guide.md"
    },
    {
      "@type": "WebPage",
      "name": "Claude Code 官方 MCP 命令格式",
      "url": "https://code.claude.com/docs/en/mcp"
    },
    {
      "@type": "WebPage",
      "name": "Cursor MCP 文档",
      "url": "https://cursor.com/docs/mcp"
    },
    {
      "@type": "WebPage",
      "name": "OpenCode MCP 参考",
      "url": "https://opencode.ai/docs/mcp-servers/"
    },
    {
      "@type": "WebPage",
      "name": "配置文档",
      "url": "https://opencode.ai/docs/config/"
    },
    {
      "@type": "WebPage",
      "name": "Memory Awareness 插件",
      "url": "https://github.com/doobidoo/mcp-memory-service/blob/main/opencode/README.md"
    },
    {
      "@type": "WebPage",
      "name": "ONNX Runtime",
      "url": "https://onnxruntime.ai/docs/get-started/with-python.html"
    },
    {
      "@type": "WebPage",
      "name": "all-MiniLM-L6-v2 模型卡",
      "url": "https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2"
    },
    {
      "@type": "WebPage",
      "name": "环境变量示例",
      "url": "https://github.com/doobidoo/mcp-memory-service/blob/main/.env.example"
    },
    {
      "@type": "WebPage",
      "name": "知识图谱文档",
      "url": "https://github.com/doobidoo/mcp-memory-service/blob/main/docs/features/knowledge-graph-dashboard.md"
    },
    {
      "@type": "WebPage",
      "name": "节省 token 的检索指南",
      "url": "https://github.com/doobidoo/mcp-memory-service/blob/main/docs/guides/token-efficient-retrieval.md"
    },
    {
      "@type": "WebPage",
      "name": "MCP 安全指南",
      "url": "https://modelcontextprotocol.io/docs/2025-11-25/tutorials/security/security_best_practices"
    }
  ],
  "dateModified": "2026-09-24",
  "datePublished": "2026-09-24",
  "description": "mcp-memory-service 为 AI 编程工具提供共享的持久记忆。它最有价值的用途，是让 Claude Code、Cursor 和 OpenCode 检索同一份项目决策历史，而不是替代仓库指令，也不是证明所有智能体原本都没有记忆。需要配置同一本地数据库，验证实际跨客户端检索，并保留证据与决策状态。本地 ONNX 推理不代表云端编程模型离线；5 毫秒是项目方声明，不是我们复现的基准。",
  "headline": "mcp-memory-service：让 Claude Code 与 Cursor 共享持久记忆",
  "image": "https://wavect.io/img/blog/headers/header_mcp-memory-service-claude-code-cursor.svg",
  "inLanguage": "zh",
  "keywords": "AI 智能体, MCP, mcp-memory-service, Claude Code, Cursor, OpenCode, 持久记忆",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/zh/blog/mcp-memory-service-claude-code-cursor/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/zh/blog/mcp-memory-service-claude-code-cursor/",
  "wordCount": 556
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/overview/",
      "name": "博客概览",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/topics/ai-agents/",
      "name": "AI 与智能体",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/clusters/models-infrastructure/",
      "name": "模型与基础设施",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/mcp-memory-service-claude-code-cursor/",
      "name": "mcp-memory-service：Claude Code 与 Cursor 共享记忆",
      "position": 5
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "它是开源的持久记忆后端，让编程智能体保存和检索项目上下文。本文采用本地 MCP 连接，让 Claude Code、Cursor 和 OpenCode 访问同一个 SQLite 存储。"
      },
      "name": "mcp-memory-service 是什么？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "不会。还需要配置各客户端、验证写入成功，并建立检索流程。会话开始时自动读取以及自动采集，取决于启用的集成方式或自动化。"
      },
      "name": "安装后，每个会话都会自动记住项目吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "可以，前提是配置的服务进程拥有适当权限，并访问同一个底层存储。在本文的本地示例中，应比较实际展开的 SQLite 绝对路径，再确认新客户端能检索相同的记录标识符。"
      },
      "name": "Claude Code 和 Cursor 能共享同一份记忆吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "不能。这些文件仍适合保存稳定且可审查的项目指令。共享记忆补充持续变化的决策和故障历史，检索到的建议仍需与当前代码核对。"
      },
      "name": "它能替代 CLAUDE.md 或 Cursor 规则吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "不是。标准本地 MCP 配置提供记忆工具；独立的 Memory Awareness 插件使用 HTTP REST 实现会话生命周期自动化，还需要仓库中的插件文件。仅通过 pip 安装不会安装该插件。"
      },
      "name": "OpenCode 记忆插件与 MCP 服务是一回事吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "所需模型文件已就绪时，本地嵌入可以不调用外部嵌入 API。但安装、模型下载、可选云功能以及编程模型本身有各自的网络和成本边界。自托管也需要运维资源。"
      },
      "name": "它完全离线，而且没有 API 成本吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "本文没有证明这一点。5 毫秒是项目公开的性能声明，不保证覆盖查询嵌入、冷启动、远程传输、图谱扩展或模型生成完整答案。应测量自己的实际工具往返。"
      },
      "name": "5 毫秒包含任何搜索和图谱查询吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "文本记录和已经生成的图谱实体不是同一回事。应检查实体链接配置与实体数量。启用链接影响之后保存的记录，历史记录回填是独立维护操作，需要审查和备份。"
      },
      "name": "已有记忆，为什么 memory_explore 仍为空？"
    }
  ]
}
```
