如果你用过 Claude Code,大概会有过这种体验:昨天刚跟它敲定的目录规范,今天开个新会话它就忘得一干二净;上周重构时定下的技术决策,这周想问它细节,它一脸茫然地跟你重新分析一遍。这不是 Claude 不够聪明,而是因为每个会话的上下文都是独立加载的,会话一关,记忆就跟着蒸发。
claude-mem 就是来补上这块短板的。它本质上是一个开源的内存层工具,以 MCP(Model Context Protocol)服务的形式接入 Claude Code,把会话里值得保留的信息沉淀成记忆文件,下次会话启动时自动加载。说人话就是:它让 Claude Code 从“每次都是初识”变成“越聊越懂你”。它不给模型增加新的推理能力,但解决了 AI 编程工具最让人头疼的连续性问题。
这篇内容适合所有被 Claude Code 会话断裂感折磨过的开发者,也适合正在做 AI 编码工具集成、想在现有工作流里加一层长期上下文的同学。我会从原理拆到实操,再把我实际用出来的坑和技巧一并交代清楚。读完你至少能自己动手配好一套能用的长期记忆方案,不用再靠“每次手动粘贴背景资料”续命。
1. 先搞清楚一个痛点:Claude Code 的“一次性记忆”困境
1.1 会话隔离带来的断裂感
Claude Code 这类终端 AI 编程工具,本质上是一个“无状态工人”。每次你敲下命令,它读取当前项目的文件、你的提示词、以及上下文窗口内允许携带的信息,然后开始推理。它不像人脑那样有一个长期的记忆皮层,它的所有“记忆”都存在于对话历史里,而这个对话历史是以 session 为单位的——你开一个新会话,历史就归零了。
这个设计本身不算缺陷,而是为了控制上下文长度和 token 成本。所有大模型都有固定的上下文窗口,Claude 也一样。窗口越大,单次能处理的信息越多,但成本和延迟也会上去。所以 Claude Code 默认不跨会话保留任何信息,这是工程上的合理取舍。
但代价在真实开发里非常明显。小项目可能还好,项目一旦上了规模——几十个文件、多套约定、若干待办——你每次新开会话都要重新“热场”:重新介绍目录结构、代码风格、哪些事情优先、哪些代码是临时的。这还不只是浪费几分钟的问题,更麻烦的是它会打断你的思路,甚至让 AI 前后给出完全相反的建议。
1.2 不引入记忆机制的代价
我举一个自己踩过的例子。有一阵子我在维护一个 monorepo,里面同时有 Python 后端和 TypeScript 前端。第一天我跟 Claude Code 商量好:Python 侧统一用 ruff 做 lint,TypeScript 侧用 biome,不要混用两套工具链。当天它执行得很好。第二天我开新会话,想让它继续重构一个 API 模块,结果它上来就给我加了一堆 eslint 配置,还把 Python 代码建议改成 black 风格——因为新会话里它只看到当前文件,根本不知道我们昨天刚定的约定。
这类问题用“每次手动在提示词里补一遍”也能缓解,但人的精力有限,手动维护提示词本身就是负担。尤其当你同时维护多个项目时,每个项目的规则还不一样,靠脑子记根本记不住。
也有人会选择把约定全部写进项目根目录的 CLAUDE.md。这个文件 Claude Code 每次会话都会自动读取,确实是最接近“记忆”的机制。但 CLAUDE.md 的问题是:它是静态的。你手动写进去的规则会一直存在,但项目在演进、约定在变化,静态文件很容易变成一堆过期的旧规则。你真正需要的,是一个能自动沉淀、自动更新、自动加载,并且和现有工作流融合的记忆机制。claude-mem 正是沿着这个方向设计的。
2. claude-mem 的核心设计:它是怎么“记住”你的
2.1 以 MCP 为中转的记忆读写协议
claude-mem 不是在 Claude Code 内部改代码,而是以 MCP Server 的方式工作。MCP(Model Context Protocol)通俗点说,就是“AI 应用的 USB 接口”。通过这个协议,外部工具可以把自己封装成标准化的能力,Claude 这类模型可以按统一的方式去调用这些能力,不需要关心工具内部怎么实现。
为什么选择 MCP 而不是在 Claude Code 里做插件?两个原因。第一是解耦。claude-mem 不需要跟着 Claude Code 的版本迭代去适配内部 API,只要协议稳定,它就能稳定工作。第二是通用。未来如果其他兼容 MCP 的客户端也想用同一套记忆机制,直接挂载同一个 Server 就行,不需要重写一套。
claude-mem 的读写链路大致是这样:启动时,它会读取已有的记忆文件,把里面的内容作为上下文附加信息提供给 Claude;会话进行中,Claude 可以通过工具调用把值得记的内容写入记忆库;会话结束后,claude-mem 还会异步扫描日志,把对话里透露出来的关键信息自动提取、补充进去。也就是说,它同时做了“主动记录”和“被动挖掘”两件事。
2.2 记忆文件的组织方式
记忆不是一股脑堆在一个大文件里。claude-mem 会把记忆分成“全局记忆”和“项目记忆”两层。全局记忆存放跨项目都成立的信息,比如你偏好的代码风格、常用的工具链、通用沟通习惯;项目记忆跟着具体项目走,存放这个项目特有的约定、架构决策、注意事项。
这种分层对应了真实协作中的直觉:你和一个同事合作,既要知道他的个人习惯,也要知道当前项目的背景规则。混在一起会怎样?信息过载,换个项目就全串味了。比如你在 A 项目约定“用 pnpm”,如果这条被当成全局记忆,到了 B 项目,Claude 也会默认用 pnpm,哪怕 B 项目一直用 npm——这就是混乱的源头。
在文件层面,记忆最终会被渲染成 Claude Code 能直接读取的 Markdown 格式,通常是一份或几份类似 CLAUDE.md 的文件。CLAUDE.md 是 Claude Code 本身就支持的“项目说明书”,每次会话自动注入上下文。claude-mem 做的事情,就是想办法把“动态生成的记忆”合并进“静态的 CLAUDE.md”,让这份文件不再是一成不变的说明书,而是一本越用越厚的记忆账本。
2.3 会话日志的价值与抓取策略
很多记忆工具只做“显式记忆”,也就是用户明确说“记住这个”才记。但真实开发里,大量关键信息是在对话中不经意间暴露的。你和 Claude 讨论某个模块时说了句“这个模块暂时不兼容旧版 SDK”,这可能就是一个重要的技术决策,但你未必会专门补一句“记住这个”。
claude-mem 的被动挖掘就在这里发挥价值。Claude Code 每次会话都会在本地写 JSONL 格式的日志文件,记录完整的消息往来。claude-mem 可以扫描这些日志,通过规则或模型分析抽取出潜在的记忆点。设计上它会做去重和相关性过滤,避免把无关紧要的闲聊也写进记忆。
不过说实话,不同版本的日志解析深度不太一样。有些实现会把“挖掘出来的候选记忆”先展示给你确认,而不是直接写入。我在实践中更愿意把它当成半自动工具来用:大的原则让自动提取器去抓,细节保留自己的判断。后面我会专门讲这个使用姿势。
3. 实操:从零到一给 Claude Code 装上长期记忆
3.1 环境检查与依赖安装
先把前提条件理清楚:你需要一个能正常运行的 Claude Code 环境,Node.js 版本建议 18 以上,因为 claude-mem 是通过 npm 分发的 Node 工具。我的环境是 macOS + zsh,Claude Code 版本是 1.x,下面操作的路径和命令在 Linux 上同样通用,Windows 上建议优先用 WSL。
安装就一条命令:
npm install -g claude-mem装完先验证命令是否可用:
claude-mem --version能输出版本号就说明安装成功。这一步出问题最多的是 npm 全局目录没进 PATH,终端报command not found。排查方式是先用npm config get prefix查看全局目录,再把对应的 bin 目录加进 PATH。
如果不想全局安装,也可以用 npx 按需启动,后面配置 MCP 时命令写成npx -y claude-mem即可。效果一致,只是首次启动会有依赖下载的耗时。
3.2 MCP 配置与启动验证
Claude Code 接入 MCP Server 最省事的方式是用它自带的配置命令。在终端执行:
claude mcp add claude-mem -s user -- npx -y claude-mem mcp这条命令的意思是把 claude-mem 注册为用户级别的 MCP Server,-s user表示对当前用户全局生效。如果只想在某个项目启用,可以不加-s user,直接在项目目录下执行,配置会写进项目级配置。
配置完用claude mcp list检查状态。正常情况输出里应该有 claude-mem 这一行,状态是 connected。如果你用的全局安装,把npx -y claude-mem换成claude-mem也行,少一层解析,启动会快一点。
这里最常见的坑是子命令名称。不同版本的 claude-mem,启动 MCP 服务的子命令可能不一样,有的用mcp,有的用server,还有的用stdio。所以加完配置如果连接失败,先跑一下claude-mem --help看当前版本的帮助信息,以你实际安装的版本为准,别照抄旧教程。
3.3 首轮会话:让记忆真正跑起来
配置完成后,重新打开 Claude Code 让它加载新的 MCP Server。你可以先问一句“你现在能使用哪些记忆工具”。如果配置正常,Claude 会告诉你它可以通过 claude-mem 记录和查询记忆。如果它完全没反应,先回到上一步检查连接。
接下来做一轮真实工作。比如你在写一个 Next.js 项目,可以明确告诉 Claude 几个偏好:“页面路由用 App Router 不用 Pages Router,组件命名用 PascalCase,样式优先用 Tailwind”。然后让它帮你写一个页面组件。
会话过程中,claude-mem 会尝试捕捉这些信息。一部分靠模型主动调用记忆工具写入,一部分靠后台日志分析在会话结束后补录。你不用手动操作太多,但有个小建议:重要信息尽量用清晰、命令式的句子说出来,比如“记住:我们统一用 pnpm 安装依赖”。这种句式被准确抓取的概率要高得多,比“我好像觉得 pnpm 也挺好的”这种含糊表达有用十倍。
3.4 检查记忆文件:不要闭眼信任
第一轮会话结束后,去看看记忆文件长什么样。Claude Code 的项目日志默认在~/.claude/projects/,claude-mem 自己的记忆库一般在类似~/.claude-mem/的位置,具体以你安装版本的文档为准。
打开记忆文件,我建议关注三点。
首先是分层是否正确。个人偏好有没有进全局记忆,项目特有信息有没有进项目记忆。如果发现项目相关的规则混进了全局记忆,尽早挪走,否则会污染其他项目。
其次是去重情况。同一个信息有没有被记录多遍。自动提取器偶尔会对同一件事抓取多次,比如“使用 pnpm”在三个不同段落里各出现一次,这就是冗余。
最后是表达质量。记忆内容是否清楚、可执行。对比一下,“使用 pnpm 管理依赖”显然比“用户好像喜欢 pnpm 这种包管理器”更有用。如果发现表达含糊,手动改掉,别懒。
4. 记忆质量的把控:从“能记住”到“记得准”
4.1 四类值得沉淀的信息
把 claude-mem 用了一段时间后,我总结出一个规律:不是所有对话内容都值得进记忆,真正有价值的大概四类。
用户偏好。最基础也最容易被忽略,包括编码风格、工具选择、命名习惯、沟通方式。比如“缩进用两个空格”“接口文档必须写示例”。写进去之后,每次会话 Claude 就会自动遵守,不用反复强调。
项目约定。项目特有的规则,比如“这个项目约定死不用 any”“测试必须覆盖边界情况”“发布流程要走某个脚本”。这些信息往往藏在某一个小时的讨论里,不记下来三天后就忘。
技术决策。为什么选 A 方案而不是 B 方案,这个“为什么”比方案本身更值钱。如果记下的是“最终选 A 是因为要兼容旧系统”,下次讨论相关话题时,Claude 就能避开无意义的重复论证。
进行中的上下文。当前改到哪了、下一步打算做什么、哪些部分还没完成。这类信息时效性强,不需要长期保留,但短期内非常有用,能让你跨会话恢复工作状态,而不是开新会话后从头梳理进度。
4.2 记忆不等于有闻必录
记忆库最大的敌人是膨胀。见过有人用 claude-mem 一个月,CLAUDE.md 变成三四百行,里面一半是互相矛盾的旧约定。记忆一旦膨胀,就失去了“快速定位关键信息”的意义——上下文窗口就那么大,重要信息被淹没在废话里,模型反而会抓错重点。
我建议每过一段时间主动做一次“记忆清理”。清理方式很朴素,打开记忆文件,挨个条目问自己三个问题:这条现在还有效吗?这条会不会和别条冲突?这条删掉会损失什么?三个问题答完,基本就能判断去留。
同时也要知道什么不该记。临时的环境变量、一次性的错误信息、随口提到的工具名,都不值得占用记忆空间。判断标准很简单:这条信息在一个月后还会被用到吗?如果大概率不会,就别让它进记忆库。
4.3 手动治理:把记忆文件当代码管
claude-mem 大部分时间能自动工作,但我强烈建议保留手动治理的习惯。我的做法是:把 CLAUDE.md 和 claude-mem 的记忆库文件纳入 Git 版本管理,和代码一起提交。
为什么?因为记忆文件会随项目演化。如果某天 Claude 误写了一条糟糕的记忆,或者一次自动更新产生了灾难性的干扰,你可以通过 Git 历史轻松回滚到正常状态。这跟代码出问题用 git revert 是一个道理,记忆文件也是一种需要版本管理的资产。
另一个技巧是:在 CLAUDE.md 顶部预留一小块“人工铁律区”。这个区域只放你不希望被自动更新覆盖的内容,比如安全红线、不可变约定。claude-mem 更新记忆文件时,如果你的版本支持保留前缀,把它配置好;不支持的话,就靠 Git 提交节奏来控制。
还有一个细节:记忆文件里尽量别写“永远”“绝对”这类极端措辞,除非你真的想表达一条不可动摇的约束。AI 会把这类词当强规则,一旦代码里出现例外,它可能固执地拒绝变通。用“默认”“优先”“除非”这种有弹性的词,记忆在实战中会更可靠。
5. 常见故障与排查实录
5.1 MCP 工具列表里看不到 claude-mem
这是接入时最高频的问题。配置完claude mcp add之后,重启 Claude Code 却发现它根本不认识 claude-mem。排查思路固定:
先跑claude mcp list,看 claude-mem 的状态。显示 failed 或 error,说明启动失败了,多半是命令路径问题。全局安装就确认claude-mem在 PATH 里;npx 方式就确认网络能正常访问 npm registry。
如果状态是 connected 但 Claude 仍然说没有对应工具,可能是会话启动时 MCP 还没加载完。重启 Claude Code 后等多几秒再问一次。某些版本对 MCP Server 连接有超时机制,启动慢就会静默跳过。
实在不行,就在项目目录下手动加一份.mcp.json,把 claude-mem 的配置写进去,强制项目级别加载。这种方式最直观,而且问题定位也简单。
5.2 记忆文件迟迟不更新
MCP 连接正常,Claude 也能调用记忆工具,但跑完一轮会话,文件里什么都没变。这个症状我遇到过几次,原因一般有两个方向。
一是日志采集链路出了问题。claude-mem 在会话结束后要扫 Claude Code 的会话日志。Claude Code 更新后如果改了日志路径或格式,扫描就可能失败。这种问题通常升级 claude-mem 能解决,所以遇到记忆不更新,先做一次版本检查,别急着瞎改配置。
二是自动提取策略偏保守。如果对话里没有足够强的信号,比如没有明确偏好、没有可识别的决策点,提取器可能判定“没有值得记录的内容”,有意跳过更新。这不是故障,是设计如此。想验证链路是否通畅,故意在对话里说一句“记住:我们统一用 pnpm 管理依赖”,看它是否写入,就能判断问题出在哪一环。
5.3 Claude 答非所问或记忆串味
有时候记忆确实写进去了,但效果适得其反:Claude 满嘴都是记忆里的旧规则,反而忽略了当前对话的具体需求。这通常是上下文里记忆占比太高导致的。CLAUDE.md 被完整注入,如果里面塞了几百行和当前任务无关的内容,模型自然会受干扰。
解决办法有两个层面。一是控制记忆总量,全局加项目记忆别超过一屏的阅读量,只留高价值信息。二是利用文件结构,把“项目当前状态”这类临时信息和“长期约定”这类稳定信息分开存放,并在文件顶部写一句“先看当前任务上下文,再看全局约定”,给模型一个明确的阅读顺序。
另一个导致串味的常见原因是多项目共用记忆。在 A 项目约定的规则,被 claude-mem 当成全局偏好写入了,带到 B 项目。排查方法很简单:打开全局记忆文件,看有没有明显属于特定项目的内容,有就挪到对应项目的记忆里。
5.4 多项目记忆互相干扰
这是比较棘手的一类问题。claude-mem 默认区分全局和项目记忆,但项目目录结构特殊时会出错。比如多个子项目嵌套在同一个仓库,或目录名重复,生成的项目标识可能撞车,导致两个项目记忆互相覆盖。
我踩过的坑是这样的:我在两个不同业务目录下都建了service-api子项目,claude-mem 根据路径生成的项目标识相同,结果两个项目的记忆互相污染。A 项目的约定出现在 B 项目的会话里,排查了半天才定位到是记忆命名空间冲突。
解决办法是,在 MCP 配置里给每个项目手动指定唯一标识,或者在项目根目录放一个标识文件,写清楚记忆命名空间。如果你同时管多个项目,建议定期看一眼记忆库的目录结构,确保每个项目都有独立、清晰的记忆目录。
下面对这几个常见问题做个速查:
| 症状 | 可能原因 | 快速排查 |
|---|---|---|
| 看不到工具 | MCP 连接失败 | claude mcp list查状态 |
| 不回应用户输入 | 路径不在 PATH | npm config get prefix确认 bin 目录 |
| 记忆不更新 | 日志路径变化 | 升级 claude-mem 版本 |
| 记忆串味 | 项目标识冲突 | 检查记忆库目录结构 |
| 模型抓错重点 | 上下文里记忆占比过高 | 压缩记忆,分优先级排列 |
6. 进阶玩法与个人心得
6.1 用模板提升记忆命中率
claude-mem 的自动提取虽然省心,但想让它更精准,最好给它一个“抓取框架”。我自己的项目里维护一份 CLAUDE.md 模板,固定分成几个段落:项目概览、技术栈约定、开发命令、架构决策、当前任务、常见注意事项。每个段落下面预留位置。
为什么这能提升命中率?因为自动提取模型在判断“什么值得记”时,有结构化的提示和段落参照,识别精度会明显更高。模板里已经有“架构决策”这一段,当对话出现选型讨论时,模型更容易判断出这是值得沉淀的决策,而不是随口一提。
模板不一定要放进 claude-mem 的记忆库,放在项目根目录的 CLAUDE.md 就可以。claude-mem 更新记忆文件时,如果发现目标文件已经有清晰结构,会倾向于按段落补充而不是从头重写,这对保持记忆稳定性很重要。
6.2 记忆清理的节奏
记忆清理频率太低不行,太高也累。我摸索出来的节奏是:每完成一个里程碑做一次轻量整理,比如一个功能模块做完、一次重构收尾;每月做一次深度清理,把过期的临时状态删掉、重复条目合并。
轻量整理五分钟就够,主要工作是更新“当前任务”段落,删掉已经完成的进度描述。深度清理则需要结合 Git 历史看这个月的记忆变化,哪些条目从没被用到、哪些条目导致过 Claude 的错误建议,这些都是删除的候选。
不想手动整理的话,可以让 Claude 帮你清理。开一个专门会话,让它把当前记忆文件的冗余条目列出来,给出合并和删除建议,你再确认。比自己一行行读省力不少,而且 Claude 对文本结构的敏感度比人高。
6.3 我踩过的坑与实用建议
最后聊几个零散但实用的经验。
不要在会话中途频繁修改记忆文件。claude-mem 有时候会缓存记忆内容,你改了文件它不一定立刻感知,等半天发现没生效反而会懵。我的做法是:会话开始前改好,或者改完重启一个会话让记忆重新加载。
要严格控制记忆里的敏感信息。记忆文件跨会话存在,甚至纳入版本管理,这就意味着里面不能写密码、密钥、个人隐私。一份包含生产环境令牌的记忆文件被推到远端仓库,后果很严重。给 claude-mem 用之前,先给它划清楚安全边界。
别指望它代替你思考。claude-mem 能帮你减少重复沟通,但它记住的终究是“你告诉过它的东西”和“它从行为里推断出来的东西”。推断就有误差,所以关键场景里,你仍然要对记忆的正确性负责。把它当成一个靠谱但需要监督的执行者,而不是全知全能的记录官。
我个人用了 claude-mem 快两个月,最大的感受是:它没有让 Claude Code 变成全能 AI,但确实把协作的连续性提升了一个量级。昨天聊完的决策,今天不用重新解释;上个模块的约定,下个模块自动遵守。这种“越用越顺手”的状态,和每次开会话都要从头讲起是完全不同的体验。
最后再分享一个小技巧:把 claude-mem 和项目的变更日志工具配合使用。每次发版前,让 Claude 根据记忆库里的“当前任务”和“技术决策”自动生成 changelog 草稿,准确率比我手动写还高。记忆沉淀得越扎实,这类衍生价值就越明显。