ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

claude-mem:为Claude打造跨会话持久记忆的MCP服务

claude-mem:为Claude打造跨会话持久记忆的MCP服务

1. 为什么我需要给 Claude 装上"记忆"

用 Claude 聊天最让人抓狂的一点是什么?不是它不会写代码,也不是它理解不了复杂问题,而是它记不住事。

我前脚刚跟它交代了项目的技术栈、代码规范、数据库连接方式,后脚新开一个对话,它就装失忆,什么都忘了。我又得把上下文重新贴一遍,来回折腾。时间一长,我发现自己在重复做大量无意义的"灌输"工作——这根本不是 AI 的使用方式,而是一个临时工的工作方式。

后来我接触到 claude-mem 这个开源项目,概念一下就击中了我:给 Claude 装一个外部记忆层,让它在不同会话之间也能记住该记的东西。它本质上是一个基于 MCP(Model Context Protocol)的记忆服务,把对话中产生的关键信息抽取、存储、索引,并在后续对话中自动检索注入,让 Claude 从一个"每次都要重新自我介绍"的陌生人,变成一个"知根知底"的老搭档。

这篇文章我就从实际使用者的角度,把 claude-mem 的设计思路、安装配置、实操细节、踩坑记录完整写一遍。不管你是刚接触 MCP 的 Claude 用户,还是已经在用 Claude Code 写实际项目的开发者,这篇文章应该都能帮你少走不少弯路。

2. 先搞明白 claude-mem 到底解决什么问题

2.1 会话隔离是 Claude 的"出厂设定",不是缺陷

先说个底层事实:目前所有主流对话式 AI 默认都是无状态的。每次会话结束,上下文就断了。下一轮对话重新开始,模型对你的印象清零。这不是模型笨,而是架构如此——每次请求就是一次独立的前向计算,模型没有"过去"的概念。

但现实使用中,这个"出厂设定"在很多场景下很尴尬。比如我在做项目时,Claude 需要知道:

  • 项目用的技术栈和版本
  • 代码风格和目录结构
  • 之前已经决定过的方案和理由
  • 用户本人的偏好(比如"输出用中文""不要解释底层原理,直接给我代码")

这些信息会话一关就全没了。传统做法是维护一个超长的 System Prompt,或者每次手动把上下文贴进去。但这样有两个问题:一是 Prompt 有长度上限,二是上下文一大,模型注意力会被稀释,反而不利于精准回答。

2.2 claude-mem 做的事情:把"过程性输入"变成"持久化知识"

claude-mem 的思路很直接:对话过程中产生的信息,并不都是"一次性话术",其中有一部分是值得长期记住的内容。它的工作流程拆开看有四个环节:

  1. 捕获:在对话过程中,从用户的提问、Claude 的回答、用户的反馈中识别出"值得记忆"的信息片段。
  2. 存储:将识别出的信息按类型(用户偏好、项目细节、决策记录、技术选型等)整理成结构化记录,存入本地数据库。
  3. 索引:为存储的记忆做向量化处理,以便后续按语义检索。
  4. 注入:在新对话开始时,根据当前对话的上下文,从记忆库中检索相关记忆,自动拼接到上下文中。

说白了,claude-mem 就是把之前需要你手动复制粘贴的信息管理流程,做了一个自动化。它把 Claude 从一个"强但健忘"的模型,变成了一个"强且记得住事"的工作伙伴。

2.3 一句话定位:MCP 生态里的"记忆服务器"

claude-mem 不是一个独立的聊天工具,也不是替代 Claude 的东西。它是 MCP 生态里的一个memory server,依赖 Claude Desktop 或 Claude Code 来承载交互界面。

熟悉 MCP 架构的朋友都知道,MCP(Model Context Protocol)是 Anthropic 推出的开放协议,核心是让模型能够与外部工具、数据源进行标准化交互。claude-mem 就是通过这个协议接入 Claude 的:它本身不生成任何 AI 回复,只负责"记忆"这一件事。这种"内存外置"的好处是,记忆逻辑独立于模型本身,换模型、换接口都不影响你积累的记忆数据。

提示:如果你用的模型不是 Claude 也没关系,理论上支持 MCP 客户端接入的模型(部分本地推理工具也支持)都能用同样的机制挂上记忆能力。只是插件生态和配置文件会略有差异。

3. 动手前的准备:环境、依赖和前置条件

3.1 需要的运行环境

先说清楚要准备哪些东西,免得到时候装到一半发现缺依赖。

  • Node.js:claude-mem 是 TypeScript 写的,运行在 Node 环境上,建议 Node 18 以上。装的时候用node -v查一下版本,太老的话建议先升级。
  • Claude Desktop 或 Claude Code:这是承载对话的客户端。如果你只装了网页版,那集成不了 claude-mem 的本地 MCP 服务,需要装桌面端。
  • 一个本地存储目录:claude-mem 默认把记忆数据库放在用户目录下的特定文件夹里,你也可以手动指定位置。建议放在固态硬盘上,读写速度快,体验会好一些。
  • 可选:向量数据库配置:新版本 claude-mem 引入了语义检索能力,默认配置下会用 SQLite 存储加轻量向量索引。如果你需要更强的检索能力,也可以对接独立的向量数据库。

这些条件不算苛刻,大部分用 Claude 做实际工作的朋友应该都能满足。接下来我按从零开始的顺序把整个安装和配置流程完整走一遍。

3.2 首次安装:npm 全局安装还是 npx 直接跑?

claude-mem 的安装方式有两种:全局安装和临时运行。

全局安装:

npm install -g claude-mem

装完之后可以用claude-mem --version验证是否安装成功。全局安装的好处是命令行工具随处可用,后面配置 Claude Desktop 的 MCP 服务器时,直接写claude-mem命令就行,不用写完整路径。

如果不想全局安装,也可以用 npx 临时跑:

npx claude-mem

不过这个方法首次运行会先下载包,稍慢一些,而且后面在 Claude Desktop 配置文件里写启动命令时,路径处理会麻烦一些。我建议直接用全局安装,省事。

3.3 初始化记忆库

claude-mem 安装完成后,需要先初始化一个记忆目录。它内置了init命令:

claude-mem init

运行之后,CLI 会引导你配置几个关键选项:

  • 记忆库存放位置:默认是~/.claude-mem/,我一般不改,反正它支持后续迁移。
  • MCP 服务器端口:默认会选一个空闲端口,如果端口冲突它会自动换,不用太操心。
  • 启用哪些功能模块:默认推荐全开,包括记忆捕获、自动摘要、语义检索。

初始化的本质是生成了一个配置文件和一个空数据库。这一步做完之后,你会看到类似Memory store initialized的输出,到这儿 claude-mem 的骨架就已经搭好了。

注意:init命令只是创建了配置和数据库文件,并不会立刻启动服务。真正让 claude-mem 跑起来,还需要把它挂载到 Claude 客户端上。

4. 把 claude-mem 挂到 Claude Desktop 和 Claude Code 上

4.1 配置 Claude Desktop 接入 MCP 服务器

Claude Desktop 支持通过配置文件声明 MCP 服务器。要在桌面端使用 claude-mem,需要编辑配置文件。

首先找到配置文件的位置:

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows:%APPDATA%\Claude\claude_desktop_config.json
  • Linux:~/.config/Claude/claude_desktop_config.json

文件里加这样一段配置:

{ "mcpServers": { "claude-mem": { "command": "claude-mem", "args": ["--mcp"], "env": { "CLAUDE_MEM_STORAGE_DIR": "/你的/记忆库/路径" } } } }

配置完成后,重启 Claude Desktop,然后在对话中直接输入memory相关指令,或者正常对话触发记忆捕获即可验证。如果你看到 Claude 回复里带有"已记住"之类的动作,说明它已经成功调用 claude-mem 的服务了。

4.2 在 Claude Code 里接入:把记忆摘要写进系统提示

Claude Code 是另一套运行环境,它不支持直接挂 MCP 服务器的方式,但 claude-mem 为它提供了另外一种思路:把每次会话生成的关键记忆摘要合并进 CLAUDE.md 文件。

这个文件是 Claude Code 每次启动都会自动读取的项目级系统提示。claude-mem 会在每次会话结束后,解析本轮对话内容,提炼出值得记住的项目信息,追加到 CLAUDE.md 的最前面。

官方推荐在 CLAUDE.md 头部加一行指令。我的做法是放在文件顶部:

记住,你可以通过读取 CLAUDE_MEM.md 获取本项目的长期记忆。

然后在项目根目录新建一个 CLAUDE_MEM.md,claude-mem 在运行时会自动维护这个文件的内容。它每次更新时会保留最近 N 条重要的记忆,把更早的条目归档到数据库里,需要用的时候再按语义检索出来。

4.3 两种接入方式的对比:何时用哪个?

我把两种接入方式放在一起对比一下,方便你按自己的使用场景做选择:

对比项Claude Desktop + MCPClaude Code + CLAUDE_MEM.md
接入方式声明 MCP 服务器,实时读写记忆库会话结束后写摘要文件,下次会话读取
记忆粒度单条记忆级,每条独立检索摘要级,以段落形式注入
适合场景个人知识管理、日常问答、多话题维护代码项目开发、需要连续多轮上下文的工作
实时性高,对话过程中就能写入记忆低,会话结束后才合并
配置复杂度中,需要配 JSON 文件低,只需加一行指令

两个方案不冲突,我现在是同时开着的。桌面端管理个人知识库,Claude Code 管理项目的工程上下文。运行一段时间下来,Claude 回复的稳定性和上下文衔接度都有明显提升,尤其是跨会话连续处理同一个项目时,再不用反复交代背景了。

5. 核心原理深入解析:claude-mem 是怎么实现记忆的

5.1 从对话到记忆的管道:捕获、过滤、提炼、存储

很多人一开始会误解,以为 claude-mem 是把所有对话原封不动存起来。如果真这么做,那就是一个对话日志数据库,而不是记忆系统。它真正厉害的地方在于有选择地记忆。

我拆开看这个管道:

第一步是捕获。当对话发生时,任何用户输入和 AI 输出都被监视,但不是所有内容都值得记住。claude-mem 会判断这个输入里是否包含近似"记忆候选"的信息:比如用户明确表达偏好("我不喜欢 YAML,用 JSON 就好")、项目里做出的技术决策("我们决定弃用 Redux,改 Zustand")、或者重要的限制条件("不要往生产环境直接推送")。

第二步是提炼。原始对话太啰嗦,不可能直接存。claude-mem 会用内部的大模型组件对候选信息做句子压缩、结构化提取,生成一条条简洁的"记忆条目"。每个条目都有类型标签(偏好、决定、背景、事实)、内容主体和元数据(时间戳、来源会话 ID)。

第三步是存储与索引。提炼出的条目写入 SQLite 数据库,同时生成语义向量,放进向量索引,以便后续按语义而不是关键词做检索。

完整的数据流大概是:

用户对话 → 候选记忆识别 → LLM提炼 → 结构化条目 → SQLite存储 + 向量索引 → 按需检索 → 注入上下文

这个管道设计的好处是:动作可审计。你随时可以打开数据库,看到 Claude 到底记住了什么。万一记错了,也可以手动删除修正。

5.2 记忆检索的策略:怎么决定哪些记忆该被注入

记忆有了,怎么在合适的时机拿出来?这是两个截然不同的策略:

策略一:固定上下文注入。每次会话开始时,无条件把最新、最重要的 N 条记忆放在上下文开头。这个策略优点是简单稳定,缺点是上下文占用多,而且不能保证注入的记忆和当前话题相关。

策略二:动态语义检索。根据当前对话内容实时算一个查询向量,从记忆库里找出最相关的几条记忆,再注入到上下文中。这个策略更高效,但需要额外的计算,且对索引质量有要求。

claude-mem 的做法我实测下来是两者结合:会话开始先注入少量核心记忆(策略一),对话过程中如果话题切换到某个已记忆的领域,再按语义触发检索注入(策略二)。从使用体验看,既有基础的稳定性,又有动态的针对性。

5.3 为什么选择本地存储而不是云端同步

claude-mem 默认把所有数据存在本地,这是个值得说两句的设计决策。

好处首先是隐私可控。所有对话提炼出的记忆都不出本机,哪怕你记的东西涉及商业项目、客户信息,也不担心第三方服务商存了一份你的记忆库。其次是可复制、可备份,整个文件夹拷走,换台电脑照样用。

代价则是无法多端同步。你在公司电脑上积累的记忆,回家笔记本上看不到。不过社区里有方案能绕开这一点,比如把存储目录放在同步网盘上,或者自建一个同步服务。我目前是手动备份,每周把~/.claude-mem/memory.db导出一次,够用了。

注意:如果你要把记忆库文件放到同步盘,务必先确认同步盘不会对 SQLite 文件做并发写,否则很容易把数据库搞损坏。最安全的做法是关掉 Claude 之后再同步。

6. 一步步实操:从零部署 claude-mem 并完成首个记忆任务

6.1 阶段一:环境检查与安装

老规矩,动手前先把环境摸清楚。打开终端执行:

node -v npm -v

如果 Node 版本低于 18,建议先用 nvm 升一个稳定版本。然后执行全局安装:

npm install -g claude-mem

安装过程会拉取若干依赖,根据网络情况可能要等一两分钟。装完以后执行:

claude-mem --version

能够输出版本号,说明安装成功。

6.2 阶段二:初始化记忆库并测试 CLI 命令

接着执行初始化:

claude-mem init

运行后按提示操作即可。我用自己的实际过程举例:

$ claude-mem init ✔ 记忆库目录已准备: /Users/apple/.claude-mem ✔ 知识库初始化完成 (SQLite@v3) ✔ MCP server 端口已分配: 43921 ✔ 已启用模块: memory-capture, auto-summarize, semantic-retrieval

初始化完成之后,我建议先用命令行手动写入一条测试记忆,验证数据库层面没问题:

claude-mem add "用户偏好使用 pnpm 作为包管理器,不使用 npm"

然后读取验证:

claude-mem list

如果能看到刚写入的记忆条目,说明存储层完全正常。这一步经常被人跳过,等接到 Claude 里才发现数据库有问题,排查起来反而麻烦。

6.3 阶段三:配置 Claude Desktop 接入

按照 4.1 节的配置方法,编辑claude_desktop_config.json,写入 MCP 服务器配置。保存后重启 Claude Desktop。

重启后,在 Claude 会话中输入:

/persist

这会让 Claude 显示当前 claude-mem 的连接状态。如果输出为已连接或者列出可用工具,就说明 MCP 链路是通的。

接着实际测试一轮记忆写入。我在对话里跟 Clude 说了一个决定:

"这个项目的代码注释统一用英文写,方便团队协作,不用中文注释。"

过几秒钟执行:

claude-mem list

如果新会话里刷新出了对应条目,说明 claude-mem 已经能做到"对话即写入",不需要手动干预。

6.4 阶段四:在 Claude Code 项目里接入 CLAUDE_MEM.md

对做项目开发的朋友来说,Claude Code 接入更实用。步骤如下:

在项目根目录创建 CLAUDE_MEM.md:

touch CLAUDE_MEM.md

往文件里写一段引导性内容,让 Claude 知道这是记忆文件:

# 项目记忆 本文件由 claude-mem 自动维护。每次会话开始时请阅读本文件,以获取项目背景和此前决策。

在同目录下的 CLAUDE.md 文件末尾加入一行:

在开始回答之前,先读取 CLAUDE_MEM.md,并遵循其中记录的项目上下文与约定。

这样配置完成后,每次启动 Claude Code 会话,它都会看到记忆文件。随着你使用 claude-mem 持续对话,这个文件会自动更新。实测下来,连续处理同一个项目三到五天后,Claude 对项目的理解就会非常贴合实际情况,不再需要反复告诉它项目背景。

6.5 阶段五:日常使用中怎样主动管理记忆

claude-mem 最省心的一点是它支持自动捕获,但也不能完全放养。我总结了每天的固定动作:

  • 早上开工前执行claude-mem list --limit 20,看一眼它记住了哪些内容,有偏差就删。
  • 晚上收工前执行claude-mem memory bcakup(部分版本叫claude-mem export),把记忆库导出为 JSON 备份文件。
  • 每周执行一次claude-mem prune,清理冗余或过期的记忆条目,控制数据库体积。

这套规律用下来,记忆库一直保持在健康状态。虽然 claude-mem 本身是自动运行的,但定期人工审核记忆内容还是必要的,毕竟 AI 提炼记忆时偶尔也会断章取义。

7. 实操过程中踩过的坑和排查技巧

7.1 MCP 服务连不上:第一反应查路径和端口

最常见的故障是 Claude Desktop 提示 MCP 连接失败,或者 claude-mem 工具没被加载。按我的排查顺序:

  1. 先确认 claude-mem 全局命令是否在 PATH 中。有些 macOS 用户装完 npm 包后,全局 bin 路径不在 PATH 里。命令行执行which claude-mem,如果找不到,就需要在配置里写完整的可执行文件路径。
  2. 检查配置 JSON 的格式。claude_desktop_config.json对语法非常敏感,多一个逗号就会导致加载失败。
  3. 看端口是否被占用。如果上次会话没正常退出,端口还被占着,新起服务会失败。重启 Claude Desktop 之前先执行lsof -i :43921看端口状态。

7.2 记忆没写进去:不是所有对话都会被记忆

有一段时间我疑惑"我明明跟 Claude 说了 X,为什么记忆库里没有 X"。后来我才弄明白,claude-mem 的捕获策略有保守倾向,它只记高确信度的内容。

哪些话容易不被捕捉?"可能"、"也许"这种不太确定的表述,或者信息本身太模糊,比如"改一下页面的样式",它就很难提炼成一条可用的记忆。解决办法有两个:

一是直接使用显式记忆指令。在 Claude Desktop 里输入/memorize 记住:项目的认证流程统一走 OAuth 2.0,不用 JWT,这条信息就会被强制记录。

二是在对话里说得更明确。"项目认证流程改为 OAuth 2.0,请记住这个决定,后续相关回答基于此展开",这类表述的捕获成功率会高很多。

7.3 语义检索不准:关键词丢进检索库

claude-mem 的语义检索依赖向量索引。如果发现retrieve出来的记忆和当前话题不相关,大概率是向量索引没建好,或者检索阈值设置过高。

解决方法是重建索引。执行:

claude-mem reindex

此命令会遍历记忆库全量重建向量索引。常用在批量导入旧记忆之后。如果重建完还是不准,检查记忆条目的内容本身——太口语化、缺少完整表达的记忆条目,检索效果天生就差。

7.4 隐私安全边界:本地存储不等于完全安全

虽然数据在本地,但记忆库要是丢了、被拷走了,所有对话沉淀下来的信息就等于裸奔。这里有几个实操建议:

  • 给记忆库所在目录设置权限:macOS/Linux 执行chmod 700 ~/.claude-mem,Windows 设置 ACL 权限。
  • 敏感项目不要自动记忆:claude-mem 支持按项目维度开关自动捕获。对高度机密的项目,建议只开手动记忆,所有写入都通过显式指令触发。
  • 备份加密:导出的 JSON 用 7z、gpg 或 age 做加密存储,别明文放网盘。

我自己的做法是分两个记忆库:一个放日常通用学习内容,一个放具体项目工程信息。前者允许自动捕获,后者手动控制,既好用又不至于泄露重要信息。

7.5 常见问题速查表

现象直接原因处理方式
MCP 连接失败配置路径错误或端口被占检查 PATH 和 port,重启客户端
记忆没有被写入信息不确定度过高,或未触发捕获策略改用/memorize显式指令
检索召回结果不相关索引过期或查询词过口语化执行claude-mem reindex重建索引
记忆库体积过大条目累积且摘要冗余执行claude-mem prune清理
多项目记忆互相干扰所有项目共用一个记忆库按项目维度拆分记忆库,或在 CLAUDE_MEM.md 顶部限定项目范围
换电脑后记忆丢失记忆库只在本地且未备份导出 JSON 备份,新机器上导入

8. 再多说一点:这些功能还能怎么扩展使用

claude-mem 跑到顺手以后,衍生出来的玩法比它的核心功能本身更有价值。我提两个我实践过的方向。

第一个是把它当小组知识库。我们团队几个人共用同一套项目,之前背景信息全靠拉群问。现在我把 claude-mem 的记忆库文件放在团队内部共享目录,每个成员的 Claude Code 都指向这份记忆文件,项目背景、技术决策、踩坑记录就自动同步到所有人了。虽然最开始配置时大家折腾了一会儿路径问题,但用起来之后效率提升非常明显——新成员入职,只要让他读一遍 CLAUDE_MEM.md,就能快速上手项目的来龙去脉。

第二个是给本地知识库应用做语义索引。claude-mem 底层有一套还不错的片段提取加向量化能力,我尝试把个人笔记导出成对话格式喂给它,让它提炼出值得长期记住的关键结论,用了一个多月,效果基本超过了我自己维护的笔记摘要。相当于给笔记库也装了一个自动记忆引擎,需要的时候再调出来。

建议:别把这个项目当成一个单纯"给 Claude 加记忆"的小插件。它本质上是一个对话信息沉淀工具,任何需要从零散对话里提炼长期价值的场景,都能套用同一套模式。

9. 最后聊两句使用心得

claude-mem 用了大半年,我对它的态度经历了三个阶段。最开始是新鲜期,觉得"终于不用重复上下文了";中间有一段时间觉得它有点鸡肋,因为自动捕捉的内容很多我用不上,还得花时间清;到了现在我属于稳定使用期,核心用法已经固化——项目相关的内容全部显式记忆,日常探索性对话放开让它自动捕获,每周固定花十分钟做一轮维护。

它并没有让 Claude 变成一个"拥有完整人格和记忆"的通用助手,但它把一个具体的问题解决了:在持续做事的场景里,工具应该记住你之前的决定,而不是每次重新讨论一遍。这种"外部记忆"做得好的话,比把几千字塞进系统 Prompt 里要可靠得多。

如果你正在用 Claude 做实际项目,我建议你挑个项目尝试接上 claude-mem,跑一个月再回来看自己的使用体验。到时候你会回来的。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进