☰
claude-mem:用MCP协议赋予Claude长期记忆,解决会话失忆
2026/10/26 15:58:25 网站建设 项目流程

如果你跟我一样每天至少要在Claude里开五个会话,肯定体会过那种“换个窗口就失忆”的憋屈感。上午刚对齐的项目背景、你说过的技术偏好,下午换个会话它就当没发生,一切从头解释。这不是Claude笨,而是它天生就是“无状态”的——对话结束,上下文窗口一关,什么都留不下。claude-mem这个开源工具就是冲着这个痛点来的:它用MCP协议把本地数据库变成Claude的外挂长期记忆,让AI跨对话记住你是谁、你习惯什么、你上次聊到哪。这篇文章我从头到尾拆一遍它的设计思路、安装配置、日常用法和踩坑记录,如果你也在为AI记不住事儿而头疼,可以照着重现一遍。

简单说,claude-mem适合两类人。一类是高频个人用户,天天拿Claude查资料、写方案,实在烦透了反复交代背景信息;另一类是开发者,在Claude Code里维护多个项目,希望AI能记住每个项目的技术栈、目录结构和已经定过的决策。前者图省事,后者图效率,这款工具都能覆盖到。更关键的是,它不需要改Claude的任何逻辑,也没有云端上传,数据全落在你本地的SQLite文件里——这一点对在意隐私的人非常友好。

1. claude-mem到底解决了什么问题

1.1 核心痛点:大模型的“金鱼记忆”

Claude这种大模型在交互上的最大短板,就是上下文窗口之外一片空白。你可以把上下文窗口理解成一块临时白板,白板上的内容随会话结束被擦掉,下一次会话又发你一块全新的白板。对用户来说,这意味着每次对话都要重复交代背景:你的名字、你的工作、你正在做什么项目、上次讨论到哪一步了。

实际使用中这个成本非常高。我做运维工作,经常在Claude里查Terraform写法,过了几天想接着问,又得重新写一遍“我们团队用的是AWS,但有个历史遗留的Azure环境”这种背景。一次两次忍了,天天这么干就很烦躁。claude-mem解决的就是这个问题:它把需要长期保留的信息单独抽出来,存到本地数据库,在新会话开始的时候自动喂给Claude,让对话保持连续性。

1.2 它和“长上下文”有什么区别

很多人会问:Claude不是有很长的上下文窗口吗,新开一个会话接着聊不就行了?这里要区分两个概念:上下文和记忆。上下文长,意味着单次对话能承载的信息量大,但它依然是临时的;记忆则意味着跨会话、跨时间的知识沉淀。Claude的多轮对话只是在同一块白板上不断写字,而claude-mem是给你的白板旁边挂了一个小仓库,需要的时候取出来贴上去。

有个很形象的类比:前者是“靠聊天记录反查”,后者是“有人帮你做会议纪要并整理归档”。实际体验也不一样——用claude-mem之后,新会话开头它会主动说“根据你的历史记忆,我了解到你常用……”,等于省掉了一整段寒暄交代。而且上下文窗口再大,也存不下过去几个月所有对话里的关键信息,但数据库可以。

1.3 和手写记忆方案、记忆平台类工具的取舍

市面上给LLM做记忆的方案不止claude-mem一个,我自己也试过通用的记忆中间件,对比下来各有优劣。通用型工具(比如mem0)功能更强,支持多种模型、多种向量数据库,但它把整条记忆链路拉得很长,要配向量库、要管理API Key、要做数据同步,对只想让Claude“记住我”的人来说太重了。

手写方案就更不划算:你要么把历史对话全部塞到系统提示词里,烧token不说,越长越容易让模型分心;要么自己维护一套数据库加检索逻辑,工作量完全可以再造一个claude-mem出来。相比之下,claude-mem选择的路线是“小而准”:只服务Claude生态,用MCP标准协议接入,本地文件存储,零外部依赖。对个人用户和轻量团队来说,这个取舍很务实。

2. 核心机制:MCP、对话边界与存储设计

2.1 MCP协议:Claude外设的“USB接口”

claude-mem不是浏览器脚本,也不是黑进去改Claude的私有API,它走的是一条官方路子——MCP(Model Context Protocol,模型上下文协议)。这套协议可以理解成给Claude这类大模型定义的“外设总线”,第三方工具只要实现了这个协议,就能被Claude当成外部设备来调用。claude-mem在本地起一个MCP server,Claude通过这个接口调用“写入记忆”“读取记忆”的工具。

这种架构有三个很实际的好处。第一,不侵入:Claude本体逻辑不动,只是多了一个可用工具,不影响原有对话能力,出问题也能快速摘除。第二,跨平台:现在Claude Desktop、Claude Code都支持MCP,未来大概率会有更多客户端接入,你写的记忆资产可以在不同客户端之间复用。第三,安全:数据只存在本地SQLite文件里,不经过任何第三方服务器,协议层面就决定了它不会把你的隐私偷传到别处。

2.2 对话怎么切分:时间窗口判断

记忆必须建立在“对话”这个单位之上,因为摘要、回顾都是围绕某次对话展开的。claude-mem需要知道“哪几条消息算同一场对话”。它的做法不是去解析语义,而是一个非常朴素的时间策略:记录每条消息的时间戳,如果两条消息之间的时间间隔超过max_conversation_age_seconds(默认通常是3600秒,也就是1小时),就判定上一场对话已经结束,下一条消息属于新对话。

这个策略看起来很土,但实测很有效。日常使用中我们聊一个主题,中间间隔基本不会超过一小时;隔天再聊,肯定算新对话。它的好处是零成本、确定性高,不需要跑模型去判断“这句话跟上文有没有关系”。你可以按自己的习惯调这个值:如果经常挂机半天再回来继续聊,可以把阈值调成7200秒甚至更大,避免把一个长话题拆成两段来总结;如果你习惯频繁切换话题,更短的值会让记忆切得更细腻。

改完这个配置记得完全重启客户端,不是重开聊天窗口,是退出进程再重新打开,否则不会生效。我一开始就是改完没重启,排查了半天以为是失效了。

2.3 记忆的三种类型与数据模型

claude-mem把记忆分成三类,这个分类很关键,直接决定了后续怎么存、怎么查、怎么用。

记忆类型关注对象典型内容
facts(事实)用户身份与客观信息姓名、职业、当前项目、团队情况、技术栈
preferences(偏好)用户的风格与习惯喜欢用空格缩进、输出简体中文、默认生成JWT
conversation_summaries(对话摘要)某次对话的核心结论“20240601讨论了日志方案,决定用Loki+Grafana”

为什么这么分?因为它们的生命周期和检索方式不同。facts和preferences是长期稳定信息,需要随时供新对话引用;conversation_summaries则是“索引式”的,一条记录指向某天某场对话发生了什么,方便回溯。在存储层面,每一条记忆都有创建时间、更新时间、访问次数等元数据,Claude可以根据这些元数据做优先级排序,优先把“最常访问”“最近更新”的记忆带到新对话里。这个设计很像浏览器的书签排序——常点的排前面,冷门的沉淀下去。

2.4 存储为什么选SQLite

记忆数据落在本地SQLite文件里,一般存放于用户目录下的.claude-mem目录(Windows上则是在用户目录对应的配置路径)。选SQLite而不是MySQL、PostgreSQL或者纯JSON文件,我觉得是相当务实的决定。记忆数据量不会特别大,单机使用场景,SQLite这种文件型数据库完全够用,零运维、拷个文件就能备份、不占端口。

如果用纯JSON文件存储,并发写入容易把文件写坏,而且随着数据量增大,检索只能全量遍历,效率太低。SQLite虽然极端高并发下也会锁库,但它是成熟的关系型引擎,支持标准SQL和索引,针对“类型+关键词”的查询非常轻松。再加上Python的标准库就内置sqlite3模块,依赖成本几乎为零,这几乎就是本地记忆服务的最优解。

顺便提一个SQLite的经典限制:单写多读。如果你在同一台机器上跑多个MCP客户端同时高频写记忆,偶尔会遇到“database is locked”的报错。单机日常使用几乎碰不到,但一旦遇到,要么让多个客户端错开写库,要么把存储切到PostgreSQL。大多数人的场景用默认配置就够了,不必提前焦虑。

3. 安装配置与实操全流程

3.1 环境准备与安装

先交代环境要求:Python 3.10及以上,最好装了pip和uv。uv是Python社区现在很流行的包管理器,速度比pip快很多,后面可以用它来临时运行claude-mem,避免污染全局环境。没有uv的话,一行命令装好:

pip install uv

接下来安装claude-mem本体:

pip install claude-mem

装完直接在终端里验证:

claude-mem --help

能看到命令帮助信息就说明装好了。如果你的终端提示找不到claude-mem,多半是Python的Scripts目录没进PATH,把路径补上,或者干脆用下面这种零安装的方式运行——效果一样,只是首次会拉一下包。

uvx claude-mem

3.2 接入Claude Desktop

Claude Desktop是claude-mem最典型的使用场景,接入方式是在Claude的配置文件里声明一个MCP server。配置文件位置视操作系统而定:

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

打开这个文件,把下面这段JSON合并进去。注意是往已有的配置对象里加键值,别把原来的内容覆盖掉:

{ "mcpServers": { "claude-mem": { "command": "uvx", "args": ["claude-mem"] } } }

如果你用的是conda环境,或者系统Python比较特殊导致uvx不可用,就改用标准库模块启动方式:

{ "mcpServers": { "claude-mem": { "command": "python", "args": ["-m", "claude_mem"] } } }

保存后,退出Claude Desktop完全重启,然后在MCP设置面板里确认claude-mem显示为连接成功。重启后随便开一个新会话,直接问“你现在能调用哪些工具”,如果它列出记忆相关的工具,就说明整个链路已经通了。

3.3 接入Claude Code

Claude Code是Anthropic的命令行编程助手,对开发者来说,这是claude-mem另一个非常有价值的场景——它可以让每个项目天然拥有独立的项目记忆,AI在项目A里积累的经验不会串到项目B。

接入方式也是走MCP注册,在项目目录下执行:

claude mcp add claude-mem -- python -m claude_mem

执行成功后可以这样确认:

claude mcp list

如果你的Claude Code版本较老,不支持mcp子命令,也可以打开全局配置文件~/.claude.json直接手写同样的server配置,效果一致。注册后重启Claude Code,然后输入/mcp查看工具列表,能看到claude-mem的工具组就说明接好了。

这里有个值得特意留意的点:Claude Code的一个实例通常只绑定一个项目目录,所以你在项目A中记忆的事实不会自动出现在项目B里。从信息隔离的角度看这反而是优点,不同项目的技术栈、依赖习惯全混在一起,记忆召回质量会直线下降。你可以在每个项目里配置不同的记忆策略,比如前端项目重点记组件约定,后端项目重点记接口规范。

3.4 配置项逐条说明

claude-mem的配置主要在配置文件或命令行参数里设置,信息比较集中。我整理了自己常用的几个关键项:

配置项作用我的常用值
max_conversation_age_seconds对话切分的时间阈值3600(默认即可)
auto_memory_enabled是否自动从对话中抽取记忆true(默认)
auto_summarize_enabled是否自动生成对话摘要true(默认)
max_summary_length_chars对话摘要的最大长度1500(默认偏短)
database_path记忆数据库文件路径默认用户目录
system_prompt给Claude的额外系统提示空

我比较推荐保持默认值,唯一经常改的是max_summary_length_chars。默认值在真实技术对话下经常不够用,一次方案讨论的结论很容易超过500字,截断之后记忆价值就大打折扣。我一般设到1500,既能覆盖一次小型会议的全部结论,又不至于让单条记录变成一篇冗长的流水账。

另外要提醒:auto_memory_enabled这个开关是“自动记忆”的总闸,打开后Claude会在对话中自行判断哪些信息值得记录并主动写入。这个功能很省心,但代价是不可控,有时候它会把一次性事件当成长期事实存进去,比如“用户今天下午要去开周会”,这种临时信息存下来就是噪音。我的做法是先用默认全开状态跑几天,观察数据库里积累了哪些内容,再决定要不要调低自动记忆的激进程度,不要一上来就把它关掉。

4. 记忆的日常使用与管理

4.1 显式记忆指令:@mention命令

自动记忆之外,claude-mem还提供一套显式指令,方便你强制安排记忆。这些指令以@开头,直接在对话消息里附带,Claude识别到后会调用对应的MCP工具。常用指令如下:

指令作用
@remember 内容主动让AI把某条具体信息存为长期记忆
@forget 内容删除某条记忆
@recall手动触发记忆召回,刷新当前会话的记忆缓存
@summarize强制生成当前对话的摘要
@remember-yesterday把昨天对话中出现的背景信息补存为记忆
@forget-yesterday清理昨天生成的记忆

举个例子,你可以在对话里说:

我的生产环境用的是Gunicorn + 3个worker,日常请求量不大。@remember

Claude会把这句话解析成一条fact类型的记忆写入数据库。这种做法的价值在于:你替模型划定了“这条值得长期保留”的边界,避免它自行脑补该留什么不该留什么。尤其在人名、职业、技术选型这类明确信息上,显式指令比自动记忆可靠得多。

从没人提过的是@recall的用法。很多人只把它当成手动召回工具,实际上它在长对话的中段非常有用。默认情况下Claude在会话开始时加载记忆,会话中途如果你改了很多配置、推进了大量任务,它的“记忆快照”会滞后于最新状态。这时发一个@recall,它会强制再拉取一遍最新的记忆,相当于刷新一下脑子。我在技术讨论里习惯每隔十几轮就刷一次,防止它把较早的过时结论当成最新共识。

4.2 记忆的检索与召回是怎么回事

记忆不只是写进去,还得方便读出来。claude-mem的召回主要有三个通道。

第一,会话启动注入。新对话开始时,MCP server会把与当前用户相关的facts和preferences取出来,作为上下文的一部分发给Claude。你会明显感知到它的存在:新会话里Claude会用“根据你的偏好……”这类措辞开始回答,而不是冷冰冰地从头问起。

第二,对话中途主动查询。当对话内容涉及历史记忆,比如你问“我之前说过要选哪个日志方案?”,Claude会主动调用搜索工具去数据库里找相关记录,而不是凭上下文猜。这个动作对用户是透明的,你也无需任何额外指令。

第三,摘要检索。想回顾“上次我们聊到哪”,它会把conversation_summaries里的相关条目列出来。这里的检索是关键词加时段过滤,虽然没有向量检索那种语义模糊匹配能力,但针对“上次聊什么”这种场景完全够用。你要找“上周日志方案结论”,用关键词“日志”搜一下就会出现对应的摘要记录。

实际使用中我发现一个规律:记忆召回的质量,极大程度上取决于你存进去时的信息质量。如果存的是“用户好像说过他们团队在做微服务改造,不太确定”,这种模糊表述后面召回基本就是噪音;反而是“用户所在团队正在从单体迁移到微服务,网关部分由小明负责”这种准确简洁的句子,在后续对话里能被直接拿来用。所以无论自动还是手动记忆,尽量让表述保持“主谓宾清晰、不带情绪、不留歧义”,这句话值得多看两遍。

4.3 项目级记忆隔离与共享

刚在Claude Code部分提到过,不同项目默认使用各自的记忆空间,这是件好事。但有人也想做跨项目共享,比如个人编码风格、公司级规范,希望所有项目都能用上。这需要通过配置指定记忆数据库路径,把多个项目的记忆指向同一个数据库文件。

以Claude Code为例,你可以在项目A和项目B的启动环境里设置同一个记忆库路径,或者直接在claude-mem的配置里指定database_path。共享的好处是语境统一,坏处是某个项目产生了噪音记忆,另一个项目也会被污染。我自己的折中方案是:个人偏好类信息放共享库,项目技术细节放各自库。如果技术细节混进了共享库,尽量在项目内手动用@forget清掉,保持共享库的干净度。

不同版本对数据库路径的环境变量名可能不一样,网上文章写的也新旧混杂,建议动手前先在你当前版本的README或claude-mem --help里确认准确的名字,这个细节能帮你省掉不少无效排查。

5. 常见问题排查实录

5.1 MCP server启动失败:路径和依赖是重灾区

症状:Claude Desktop的MCP面板里claude-mem显示红色连接状态,或者新会话里Claude说“无法连接claude-mem工具”。

原因九成是命令路径问题。用uvx启动的先在终端手动执行uvx claude-mem,如果提示uvx not found,说明uv本身没进PATH,要么重新安装uv并source shell配置,要么果断改成python -m claude_mem的方式,不要死磕。用python方式启动失败的,执行python -m claude_mem看报错细节,如果提示ModuleNotFoundError,说明依赖缺失或没装成功,补装依赖再试。

另一种情况是端口占用。MCP服务默认监听在本地端口上,如果被其他服务占了,启动也会失败,日志里能看到bind相关的错误。我在Windows上遇到过一次,排查办法是查看占用端口的进程,把不用的停掉或给claude-mem换一个空闲端口。

5.2 配置显示已连接,但Claude“装看不见”工具

有时候MCP面板里明明显示已连接,你问Claude“你现在能调用哪些工具”,它却说“我没有任何工具”。这个情况很迷惑,但基本不是claude-mem坏了,而是Claude在对话中没有主动把工具调用当成第一优先级,或者当前对话的上下文太短,它判断不需要动用外部记忆工具。

碰到这种情况,最有效的办法是发显式指令,比如直接说:“请调用claude-mem的recall工具,把与我相关的记忆调出来。”如果这样能触发工具调用,说明链路是通的,只是Claude的主动性不够。还有一个特别容易被忽略的点:Claude Desktop的MCP改动需要完全重启,而且要新开一个会话测试,旧会话不会重新加载MCP工具列表。我踩过这个坑,配置改了、进程也重启了,但一直用旧对话测试,当然看不到效果。

5.3 自动记忆不生效或写入太少

如果你的数据库文件一直很小,说明自动记忆可能根本没跑起来。按这个顺序排查:

第一,确认auto_memory_enabled是true,改过配置的话要重启客户端。第二,确认对话足够长。一条“你好”当然不会触发记忆抽取,至少要几轮实质性的内容交流,Claude才有材料可记。第三,观察是不是只有手动@remember才生效,如果是,说明自动记忆模块没有触发,多给几轮长对话再看。

如果你确实想让自动记忆更积极一点,可以在会话开始时跟Claude明确说一句:“请在每个关键信息出现后立即调用保存工具。”我实测过,确实有效。但激进模式会带来误记,需要你后续多清理几次。稳定的平衡点得靠自己的使用习惯慢慢调,别人的配置只能做起点参考。

5.4 数据库锁冲突与文件损坏

SQLite在单机单进程下非常稳定,但如果你同时开着Claude Desktop和Claude Code,两边都连着同一个记忆库,就可能出现database is locked。解决思路有几种:要么不要同时开多个写客户端;要么给不同客户端配置不同的数据库文件;要么如果确实需要并发读写,就换PostgreSQL这类服务型数据库。

另外对.claude-mem目录一定要有备份意识。里面的memories.db就是你的全部记忆资产,丢了只能从头积累。我习惯用cron每天把它打包扔进备份盘,一行命令就能搞定:

7 0 * * * tar czf ~/backups/claude-mem-$(date +\%F).tar.gz ~/.claude-mem

这个习惯看起来多余,等你真正因为重装系统、误删目录而丢过一次记忆,就知道有多值钱了。

5.5 记忆内容质量差、噪音过多

用一段时间后,你可能会发现Claude在某些新会话里“记错”了你的情况。查来查去,问题不在Claude,而在于记忆库里存了互相矛盾的旧条目。比如旧事实是“用户正在用Django”,后来新记了一条“用户最近切到了FastAPI”,两条都存在数据库里。Claude召回时无法判断时效优先级,可能就选了已经过期的旧条目。

这类问题的解法就是定期清理。发现明显过期的,直接在对话里用@forget指令删掉;也可以打开SQLite数据库人工审查。在终端里执行:

sqlite3 ~/.claude-mem/memories.db "select id, content, type, created_at from memories order by created_at desc limit 20;"

看到废弃的条目就删。清理难度很低,难的是养成习惯。我自己的频率是两周一次,顺手做,不花太多时间。

提示:涉及账号密码、内网IP、密钥、身份证号这类敏感信息,强烈不建议写进记忆库。Claude在会话中可能会把记忆内容原样带出来,虽然数据都在本地,但对话内容本身会经过模型服务端处理。安全边界要自己守,工具不会替你脱敏。

用claude-mem这几个月下来,最直观的变化倒不是“AI记住了我”,而是我的工作流被真正改变了一点:我不再需要每次打开会话都花两分钟复述背景,也不再担心聊到一半换个上下文就要从头来。它的价值不是一次性解决什么大问题,而是把那些反反复复的沟通成本一点一点省掉了。

如果你刚开始接触,我的建议是先装上,保持默认配置跑三天,别急着调参数。三天之后打开SQLite看看自动记忆里都攒了什么,再决定是加强自动、减少自动,还是清理噪音。最后分享一个小技巧:在你最常使用的角色提示词里加一句“每次讨论进入结论阶段,调用记忆工具记录本次核心决策”,配合auto_summarize_enabled,它就会像一个非常细心的会议记录员,把一次次讨论归档得干干净净。这比手动整理省事得多,而且用得越久,它对你的了解就越准确。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询