如果你每天都在用 Claude Code 干实际活,大概率有过这种感觉:昨天跟它花两个小时讨论定的接口方案、踩坑结论、目录约定,今天新开一个会话,它全忘了。你只能把聊天记录翻出来,或者重新讲一遍。claude-mem 就是冲着这个问题去的——它是一个基于 MCP(Model Context Protocol)的持久记忆服务,专门给 Claude Code 这类 AI 编程助手补上“跨会话记忆”这块短板。这篇文章我会从安装配置、记忆原理、日常用法,到实际踩过的坑,完完整整过一遍,适合所有正在用 Claude Code 写代码、并且被“失忆”折磨过的人。
1. 先说痛点:Claude Code 的“每天失忆”是怎么拖慢开发的
1.1 上下文归零不是小事
Claude Code 每次会话都是独立的。你在这个会话里建立的约定、摸清的依赖关系、讨论过的架构取舍,会话一结束就归零。表面上只是“重新描述一下需求”的成本,实际远不止:你要重新交代项目背景、重新解释你昨天已经说过的约束、甚至重新踩一遍昨天刚绕开的坑。我统计过自己一周的开发记录,真正写代码的时间大概只有四成,剩下六成里一大半都花在“让模型重新进入状态”上。
很多人的第一反应是手动复制粘贴。把上次的关键对话丢回上下文窗口里,让 Claude 重新读一遍。这确实能干活,但有两个问题:一是上下文窗口是有限的,你把旧对话塞进去,留给新代码的空间就少了;二是旧对话里真正有价值的信息可能就三句话,但你连带着把十页无关讨论都塞了进去,反而干扰了当前任务的判断。这个方案治标不治本。
1.2 CLAUDE.md 能兜底,但太“手动”
Claude Code 本身也有记忆机制,最典型的就是项目里的 CLAUDE.md 文件。你手动把项目约定写进去,每次会话启动时它会被自动加载。这玩意有用,但本质上是一个“静态手册”——它的信息更新完全靠你自觉。开发到一半发现某个约定过时了,你大概率不会停下来改文档;忙起来甚至想不起来写。而且 CLAUDE.md 写得太长也不行,启动加载会占用大量上下文 token,最终变成一个又被塞满、又没人维护的垃圾桶。
另外 CLAUDE.md 能承载的信息形态很有限。你很难在里面写清楚“哪个模块的历史包袱是什么”“上个月调研过什么方案、为什么否了”“上次排查某个诡异 bug 的完整链路是什么”。这些动态知识才是跨会话记忆最有价值的部分,恰恰是静态文档最不擅长记录的部分。
1.3 claude-mem 的思路:把会话沉淀成可检索记忆
claude-mem 的核心思路和我上面说的“全塞回去”完全不同:它不做全量上下文注入,而是把每个会话的原始文本保存下来,再从中提炼出结构化的“记忆条目”,存到本地。以后 Claude 遇到新任务时,先去记忆库里检索相关条目,只把命中的少数几条注入上下文。说白了,它干的活是“帮你记笔记 + 需要的时候翻笔记本”,而不是“每次开会前把上个月的会议录像从头到尾放一遍”。
这个思路解决了我前面说的两个痛点:记忆是有选择性的,不会无脑膨胀;同时记忆是不断积累的,不需要你手动维护文档。我实际用下来的感受是,它更像一个“项目第二大脑”,而不只是一个缓存工具。下面我从安装开始,一步步讲清楚。
2. 装好并跑通 claude-mem:MCP 接入的完整操作
2.1 前置条件
先说清楚环境要求。claude-mem 是一个 MCP server,所以前提是你正在用的工具支持 MCP。Claude Code 原生支持,Cursor、Windsurf 这类编辑器也认 MCP 配置。基础环境上,Node.js 版本建议 20 以上,因为 claude-mem 是用 TypeScript 写的,太老的 Node 跑不起来。这里我踩过一次,机器上的 Node 还是 16,npx 启动直接报语法错误,当时还以为是包坏了,一查是版本问题。
还有一点容易被忽略:记忆提炼这一步需要调用大模型接口来对会话内容做总结摘要,所以你得准备好一个有权限调用 Anthropic 模型的 API Key。如果 key 没配好,你会发现 transcripts 目录一直在长,但 memory 目录是空的——这是判断“是不是 key 有问题”最直接的信号。
2.2 两种接入方式对比
接入 MCP 的方式主要有两种,我建议按场景选。一种是项目级配置,在项目根目录下建一个.mcp.json,内容如下:
{ "mcpServers": { "claude-mem": { "command": "npx", "args": ["claude-mem"], "env": { "ANTHROPIC_API_KEY": "你的key" } } } }这样配置的优点是只对当前项目生效,如果你只在某一个仓库里需要记忆功能,就不会污染其他项目;缺点是每个要用到记忆的项目都得配一遍。
另一种是用户级配置,在终端里直接执行命令:
claude mcp add claude-mem -- npx claude-mem这会把 claude-mem 注册到你当前用户的所有 Claude Code 会话里,全局生效。我个人的习惯是用户级装一个,然后在项目级按需调整环境变量。原因是记忆这东西往往是跨项目的——比如你对某个语言框架的个人偏好、常用的代码风格,这些在哪个项目里都用得上。全局配置能让你新开一个仓库时不需要重新想起来“哦对,我还没配记忆”。
2.3 验证是否生效
装完别急着干活,先验证。在 Claude Code 里输入/mcp,正常的话能看到 claude-mem 的状态是 connected。然后看本地目录是否生成:
ls -la ~/.claude-mem首次跑通后,这个目录里通常会出现 transcript、memory、events 等子目录。看到这些目录基本就可以确定服务在干活了。如果/mcp里显示的是 failed 或 error,不要慌,多半是环境变量或 Node 版本问题,按上面说的一步步排查。
2.4 需要理解的数据目录
这里我建议花一分钟搞懂目录结构,因为后面排查问题全靠它。按当前版本的典型布局,核心是两块:一是 transcript 目录,存放每次会话的原始记录,按日期组织;二是 memory 目录,存放提炼出来的记忆条目,每条是一个独立的 markdown 文件。你甚至可以不去提问,直接打开 memory 目录看它到底记住了什么,这比任何文档都直观。
我经常在每周五花五分钟扫一眼 memory 目录,看这一周 claude-mem 到底沉淀了什么。有时候会发现它记住了我根本没意识到的团队约定,有时候会发现它把两条本该合并的拆得七零八落。定期肉眼检查记忆库,是保证记忆质量最笨但最有效的手段。
3. 记忆的完整生命周期:从会话结束到下次检索命中
3.1 第一步:原文留档
claude-mem 做的第一件事是把整个会话过程完整保存下来。这里说的“完整”包括你输入的内容、Claude 的回复、代码块、报错信息,都会以 markdown 形式落到 transcript 目录。这一步的价值平时看不出来,但当你需要回溯“某次讨论为什么最后定了 A 方案而不是 B 方案”时,有原文可查比靠脑子里模糊的印象靠谱得多。
我自己的经验是,一旦开启 claude-mem,就不要轻易删 transcript 目录。它占不了多少空间,但关键时刻能救命。有一次客户线上出了个只在特定数据分布下才会触发的 bug,我翻了半天代码没头绪,最后是在 transcript 里搜关键词,找到一周前跟 Claude 讨论类似数据特征时的完整分析链路,直接定位到问题。
3.2 第二步:提炼记忆
光存档还不够,一堆原文躺在那里,检索成本太高。所以 claude-mem 在会话结束后会做一次“提炼”:把 transcript 里值得长期保留的信息抽出来,写成结构化的记忆条目。这也是为什么需要 API Key——提炼动作本质上还是调大模型做总结,不是简单的规则匹配。
提炼出来的记忆条目通常带几个关键属性:记录的是什么内容、发生在什么时间、属于哪个项目范围。我理解 claude-mem 会把记忆做类型上的分类,比如偏好、决策、约定、知识点、任务状态。这个分类很重要,因为不同类型的记忆在后续检索时的权重是不一样的。比如“约定”类的记忆,在代码评审场景里优先级很高;“任务状态”类的,过两周可能就不重要了。
这里有个我后来才意识到的细节:提炼不是什么都记。它更倾向记录有明确信息量的内容,比如“为什么这么做”“最后选了哪个方案”“哪些方向已经排除了”。普通的过程性对话,比如“试一下这个写法”“报错了,再调调”,不会变成长期记忆。所以如果你希望某个信息被长期记住,最好在对话里明确说清楚它的结论和价值,而不是让它淹没在大量尝试性对话里。
3.3 第三步:去重与归档
记忆库用久了必然产生重复。同一个约定可能在不同会话里被反复提及,同一个决策可能被多次总结。claude-mem 在写入新记忆时会做相似度检查,如果发现和已有记忆高度相似,会做合并或标记处理,避免记忆库变成同一句话的复制粘贴现场。
但别指望去重是完美的。我实测下来,如果两条记忆用了完全不同的表述描述同一件事,它大概率还是当成两条并存。比如一条写的是“日志统一走 lib/logger”,另一条写的是“所有日志必须经过 logging 模块,禁止直接 console.log”,这两条其实是一回事,但字面差异太大,去重算法认不出来。所以定期人工清理还是有必要的,后面讲维护时会细说。
3.4 第四步:按需召回
整个生命周期里最关键的一步是“召回”。当 Claude 在新会话里遇到可能与历史记忆相关的任务时,它会调用 claude-mem 提供的 MCP 工具去检索,而不是把整个记忆库都塞进上下文。检索结果会被评分排序,一般综合考虑相关性和时间两个维度:高度相关的老记忆,会排在不太相关的新记忆前面。
这一步的好处是上下文开销是可控的。你不需要担心记的东西越多,每次会话越慢。因为每次真正注入上下文的只有少数几条命中结果,其余都安安静静躺在磁盘上。我用了一个多月,记忆库里大概有几百条记忆,日常会话的上下文开销几乎没有可感知的变化。
4. 实战中的使用姿势:怎么“教”它记,以及怎么问
4.1 主动记忆:一句话的事
很多人把 claude-mem 当被动工具用,等它自己提炼。但它的完成形态其实是“你主动告诉它什么值得记”。在对话里直接说一句“记住:本项目所有数据库表名统一小写下划线风格,不要用驼峰”,这条约束就会被捕捉为一条高优先级记忆。比我之前习惯了手动往 CLAUDE.md 里写,这个成本低太多了。
我总结了一个经验:主动记忆适合记录四类内容。第一是硬性约定,比如命名规范、目录结构、禁止事项;第二是正在推进的决策,比如“支付模块重构方案已经确定,分三阶段上线”;第三是已经排除的路线,比如“不要用 XX 方案,实测性能不达标”,这能防止下次又绕回去;第四是任务状态,比如“目前卡在 CI 配置,等待运维提供权限”。这四类信息在跨会话协作时价值最高,值得主动交代。
4.2 被动记忆与自动提取
如果你不主动说“记住”,甚至没意识到该记什么,claude-mem 的自动提炼也能兜底。会话结束后它在后台跑一轮,把靠谱的信息沉淀下来。我实测的体验是,自动提取的质量跟对话本身的信息密度强相关:如果你全程跟 Claude 讨论得非常零碎,像是“这里改一下”“报错了”“再看下”,它提炼出来的记忆也会比较水;如果对话里有清晰的方案对比、明确的结论、完整的决策理由,提炼出来的记忆就非常有价值。
所以不要指望自动提炼能拯救一场混乱的对话。真正有效的做法是,在收尾阶段主动梳理一遍。我现在养成一个习惯:每次结束一个开发阶段前,会跟 Claude 说一句“把这次讨论的最终结论整理成几条要点,方便下次继续”。这样既能让本次会话得到一个清晰收束,也给自动提炼提供了高质量素材。
4.3 查询的几种方式
记忆存进去了,怎么用?几种情况我都试过。最简单的是直接问 Claude:“我们之前有没有讨论过日志模块的改造?”它会自己去检索并回答,你不需要指定任何工具名。这是最自然的用法,适合大多数场景。
更精确的用法是让 Claude 用 claude-mem 提供的检索工具主动拉取相关记忆,比如“查一下关于缓存策略的过往决策,特别是涉及 Redis 的那几条”。检索工具返回的是结构化条目,Claude 可以基于这些条目做进一步推理。我理解这种方式适合你明确知道“肯定有相关历史,只是不确定具体内容”的场景。
还有一种是我后来才习惯的:把记忆查询嵌入到任务描述里。比如写需求时直接说“按我们之前定的错误码规范设计新接口的错误返回”,这句话等于同时完成了需求下发和历史记忆检索触发。Claude 发现“错误码规范”有命中记录,就会把相关记忆调出来作为参考。这比事后补救高效得多。
4.4 记忆的日常维护
记忆库跟代码库一样,需要定期维护。我建议每周做三件事:一是扫一眼 memory 目录里新增了哪些条目,看看有没有明显错误或过时的内容;二是看到重复条目就手动合并或删除;三是如果项目方向有重大变化,比如整体迁移框架,把已经被推翻的旧记忆清掉一批,免得以后检索出过时信息误导决策。
claude-mem 对删除操作是开放的。我通常直接用文件操作把对应的记忆文件删掉,或者在对话里请 Claude 删除相关记忆条目。这里有个注意点:删除记忆不会找回已经丢失的信息,所以删除前确认一下自己是真的不需要了。宁可先保留,也不要手滑删掉以后可能会用到的决策记录。
5. 我实测踩过的坑:配置、重复、膨胀、误记
5.1 MCP 配置位置混乱导致没生效
这个坑大概有八成新人都会踩。Claude Code 的 MCP 配置可以放在多个位置:项目级.mcp.json、用户级全局配置、还有一些老的配置文件路径。如果你同时存在多份配置,生效优先级会让人很困惑。我遇到过的情况是:在项目里新建了.mcp.json,但 Claude Code 实际读的是用户级注册的旧配置,导致项目里新增的环境变量一直不生效。
排查方式也很笨但有效:用/mcp查看当前实际加载的配置,以及用claude mcp list列出所有注册记录,确认到底哪份配置在起作用。如果发现项目级想覆盖用户级,但用户级注册在前,相关的环境变量里就可能有冲突。
5.2 npx 拉包慢与版本漂移
用 npx 启动 claude-mem 很方便,但代价是每次冷启动都要检查并拉取最新包。网络慢的时候,Claude Code 启动会明显变久,甚至看起来像卡死了。这个问题在 CI 或频繁切换项目时更明显。我后来的做法是先本地安装一次,把 MCP 配置改成指向本地安装的二进制路径,启动速度会快很多。
另一个 npx 的隐患是版本漂移。npx 默认会拉最新版,如果 claude-mem 发了新版本且配置格式有变化,你可能没注意到就切换了。我更建议在配置里锁定具体版本号,比如claude-mem@0.7.4这种写法,避免“昨天还好好的,今天突然行为不一样”的情况。
5.3 重复记忆如何产生,如何清理
重复是记忆库的通病。我遇到最多的重复来源有三个:同一件事在不同会话里被反复讨论、自动提炼和主动记忆同时命中同一条信息、以及去重算法对同义表述无能为力。重复记忆的直接危害不是占空间,而是检索时多条几乎相同的条目同时被注入上下文,白白占用 token。
清理重复我没有特别花哨的办法,就是定期去 memory 目录里 grep 关键词。比如搜“日志”,把表述不同但语义相同的几条合并成一条,删掉其余。这个频率不需要太高,两周一次就够。我实际感受是,保持记忆库精简比无脑堆积重要得多,因为最终注入上下文的条件是“相关”,而不是“数量”。
5.4 上下文膨胀怎么控制
虽然 claude-mem 的设计是“按需召回”,但如果你配置的召回数量过大,或者记忆条目本身写得太长,上下文膨胀依然会发生。我一开始把单次召回上限调得比较高,结果发现 Claude 每次处理任务前都要先“读”一堆背景记忆,反而拖慢了响应。
这里我的建议是:优先保证记忆条目本身精炼。主动记的时候,一句话能说清的事不要写三段。其次,如果某个项目的历史记忆特别多,可以在配置里调低单次召回条数,让“泛泛相关”的记忆不被加载,真正相关的记忆才进入上下文。小马拉大车的道理在 AI 编程里同样成立。
5.5 敏感信息的处理
这是我最想提醒的一点。claude-mem 会把整个会话原文都存到本地磁盘,包括你可能粘贴过的密钥、Token、内网地址等敏感信息。如果你开发的项目涉及生产环境凭据,这些内容会长期留在 transcript 目录里。虽然它是本地存储,不联网就相对安全,但一旦你的机器被其他人使用、或者你把项目目录同步到云端磁盘,这些信息就可能泄露。
我的处理策略是:涉及密钥的场景,我一般不放进对话里,或者明确要求 Claude 不要复述敏感内容;同时利用 claude-mem 的忽略机制,把包含敏感信息的会话从记忆处理中排除。这里也提醒你,如果你不打算长期保留某个会话的原文,最好先确认删除的方式是否彻底。
6. 进阶玩法:项目级隔离、团队同步与自定义目录
6.1 项目级与全局记忆的边界
默认情况下记忆是全局共享的,全局配置的 claude-mem 会为所有项目积累记忆。好处是通用偏好跨项目可用,坏处是项目 A 的架构决策可能会被错误地应用到项目 B。我建议一开始就明确边界:涉及个人编码风格、语言偏好、习惯性做法这类通用信息,放在全局记忆;涉及某个仓库的架构选择、代码结构、技术栈细节,只在项目级会话里记录,并利用项目级配置或标签做隔离。
如果你同时维护好几个风格完全不同的项目,这个边界如果不划清楚,Claude 很容易把 A 项目的约定带到 B 项目里。我在一个用微服务的仓库和一个单体仓库之间切换时,就发现它把微服务的部署理念错误套到单体代码上,根源就是记忆库里两类项目知识混在一起。
6.2 忽略规则与隐私边界
claude-mem 支持类似 .gitignore 风格的忽略规则,你可以指定某些路径、某些模式的会话内容不被记录和提炼。这不仅是隐私需要,也是记忆质量控制手段。比如依赖更新日志、自动化脚本产生的大量重复输出,这些内容记下来只会稀释记忆库的质量,不如直接忽略。
我实际使用的配置里,会对包含密钥关键词的目录、临时实验目录、以及一些自动化流水线产生的会话做忽略处理。这样可以保证:所有进入记忆库的信息,默认是“值得未来回顾”的,而不是为了全面而全面。
6.3 团队协作与 Git 同步
记忆的另一个价值是团队共享。如果你和同事共用一个仓库,可以把记忆库的关键目录纳入版本管理,或通过 dotfiles 同步,让大家在同一项目里共享“项目级记忆”。这样新同事加入时,不需要从头翻文档,Claude 会基于团队沉淀的共同记忆工作,给出的建议从一开始就更贴合项目实际。
但我会提醒一个边界:全局级包含个人偏好的记忆,不要盲目同步给团队。个人喜好未必是团队规范,同步后反而可能让不同成员维护同一个记忆库时产生冲突。我的做法是团队只同步项目级记忆,个人级记忆留在本机。
6.4 和其他记忆方案的组合
最后聊聊 claude-mem 与 CLAUDE.md 的搭配。有人觉得既然有了 claude-mem,CLAUDE.md 就可以不写了,我不完全同意。CLAUDE.md 适合放那些“任何会话都必须知道、且长期不变”的基础约束,比如项目简介、目录结构、构建命令;而 claude-mem 适合放那些“不一定每次用到,但用了就很有价值”的动态知识,比如历史决策、踩坑记录、方案背调。两者不冲突,反而是互补关系。
我现在的固定组合是:CLAUDE.md 只写最稳定的一页纸,动态知识全交给 claude-mem,每周抽时间去 memory 目录做一次清洗。这套组合跑了一个多月,跨会话衔接顺畅了很多,最明显的变化是以前周一上午都要花大半小时回忆上周进展,现在新会话一开,Claude 直接能接上上周的上下文,我只需要补充当天的新目标就行。
最后分享一个小技巧:会话结束时不要直接关掉终端,花十秒钟说一句“把这次的关键结论记录到记忆里”,然后再退出。这个习惯的投入产出比极高——它让自动提炼的质量明显上了一个台阶,也让下一次会话启动时的“接续感”强了很多。如果你也被 Claude Code 的失忆困扰,我建议你今晚就装上试一轮,先用三天,你大概就回不去了。