1. 项目概述:告别重复解释,让AI拥有持久记忆
如果你和我一样,深度依赖Claude、Cursor这类AI编程助手来构建项目,那你一定经历过这个令人沮丧的循环:昨天你花了半小时向AI详细解释了整个项目的架构设计、核心模块的交互逻辑、以及为什么选择某个特定的库。今天,当你打开新会话,准备继续开发时,AI助手仿佛得了“健忘症”,你又得把昨天的话重新说一遍。这种重复劳动不仅消耗时间,更打断了深度工作的心流。
这正是Kratos MCP诞生的背景。它不是一个功能繁杂的“瑞士军刀”,而是一个极简、专注的记忆系统。它的核心目标只有一个:让AI记住关于你项目的一切,并在需要时精准回忆。你可以把它理解为AI的“第二大脑”或“项目知识库”,但它比传统知识库更智能、更轻量、更无缝。它通过Model Context Protocol与你的AI工具对话,将项目记忆作为上下文注入,从而让AI助手在每一次交互中都“记得”你之前的决策、代码模式和项目细节。
我最初接触Kratos是因为在一个中型全栈项目上,每次向Claude解释身份验证流程(我们用了JWT + httpOnly cookie + 双token轮换)都让我头疼。有了Kratos后,我只需要系统性地“教”它一次,之后所有关于“auth”的问题,它都能基于记忆给出符合项目上下文的精准回答。这不仅仅是节省时间,更是将开发者从“项目历史讲解员”的角色中解放出来,回归到真正的创造者。
2. 核心设计理念:极简主义与精准记忆
Kratos的设计哲学非常明确:做最少的事,但做到极致。这体现在以下几个核心设计决策上,每一个决策背后都有其深刻的工程考量。
2.1 为什么选择SQLite + FTS5作为存储引擎?
在评估存储方案时,团队考虑过多种选择:纯文件存储(如JSON)、嵌入式文档数据库(如LevelDB)、甚至连接外部数据库。最终选择SQLite,尤其是其FTS5(全文搜索)扩展模块,是基于以下几个关键原因:
- 零依赖与极致轻量:SQLite是一个单文件数据库,无需任何额外的服务进程。这意味着Kratos的安装和运行几乎不引入任何外部依赖,非常适合作为开发工具链的一环。一个典型的项目记忆数据库文件大小通常在2MB以内,对磁盘和内存都极其友好。
- 强大的全文搜索能力:FTS5是SQLite的全文搜索引擎。当AI工具通过
memory_search查询“如何实现用户登录”时,FTS5能对记忆库中所有summary和text字段进行高效的语义分词和匹配。它不仅仅是简单的关键词匹配,还能处理一些自然语言的模糊查询,这是实现“智能回忆”的基础。 - 事务安全与可靠性:SQLite支持ACID事务。这意味着当AI助手同时保存多条记忆(例如,在分析一个文件后保存多个代码片段的理解)时,能保证数据的完整性和一致性,避免记忆丢失或损坏。
- 本地化与隐私:所有数据都存储在本地
~/.kratos/目录下,没有任何网络请求。你的项目架构、API密钥模式(当然,经过扫描脱敏后)、业务逻辑等敏感信息永远不会离开你的机器,这对于企业级开发至关重要。
实操心得:在实际使用中,我发现FTS5的默认分词器对英文和代码标识符支持很好,但对中文等非空格分隔语言的支持有限。如果你的项目注释或记忆摘要包含大量中文,可能需要考虑在保存前进行一些预处理,或者依赖
tags和paths进行更精确的定位。
2.2 项目隔离:为什么每个项目都需要独立的记忆库?
Kratos采用严格的项目隔离策略。它会自动检测当前工作目录所属的项目(通过寻找.git目录、package.json或特定的目录结构),并为每个项目创建独立的SQLite数据库文件。
这个设计的优势非常明显:
- 避免记忆污染:你在A项目中定义的“User”模型(可能是MongoDB Schema)和在B项目中定义的“User”模型(可能是Prisma Model)绝不会被混淆。AI在B项目上下文中搜索“User”时,只会看到B项目的相关记忆。
- 性能与清晰度:搜索范围被限定在单个项目内,这使得
memory_search的返回结果更精准、速度更快(数据量小)。同时,project_switch工具让你可以主动管理上下文,特别是在使用Monorepo或同时开发多个前端/后端服务时。 - 可移植性与备份:每个项目的记忆库是一个独立的
.db文件。你可以轻松地备份它,甚至(在注意安全的前提下)在团队间共享一个项目的“记忆快照”,帮助新成员快速建立项目上下文认知。
2.3 工具集的极简主义:12个工具背后的思考
Kratos MCP仅暴露了12个工具(Tool),这远少于一些同类产品。这不是功能缺失,而是刻意为之的“功能克制”。
- 聚焦核心工作流:这12个工具覆盖了记忆的增(save)、删(forget)、改(可通过save覆盖)、查(search, ask, get)以及项目管理(switch)这一完整核心循环。它不处理代码生成、不处理文件操作,只专注于“记忆”这一件事。
- 减少上下文负担:MCP协议中,工具的定义(名称、描述、参数schema)本身也会占用AI模型的上下文窗口。更少的工具意味着更少的“元描述”开销,让更多宝贵的上下文空间留给实际的记忆内容。官方称其上下文占用比v3版本减少64%,工具集的精简功不可没。
- 降低使用心智负担:开发者不需要记忆一大堆复杂的工具名和参数。常用的只有
memory_save、memory_search和memory_ask,学习曲线平缓。
3. 从安装到实战:一步步构建你的项目记忆体
理论说得再多,不如动手实践。让我们从一个干净的环境开始,完整地配置并使用Kratos MCP。
3.1 安装与基础配置
安装方式有多种,我推荐使用npx直接运行,无需全局安装,避免环境冲突。
# 方法一:使用npx临时运行(推荐初次尝试) npx kratos-mcp # 方法二:全局安装(适合长期使用) npm install -g kratos-mcp@latest # 方法三:作为项目开发依赖安装 npm install --save-dev kratos-mcp安装后,关键一步是配置你的AI工具,使其能调用Kratos。这里以最常用的Claude Desktop和Cursor为例。
为Claude Desktop配置Kratos:
- 找到Claude Desktop的配置文件。
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/claude/claude_desktop_config.json
- macOS:
- 打开(或创建)这个JSON文件,添加
mcpServers配置。如果你用npx方式,配置如下:
{ "mcpServers": { "kratos": { "command": "npx", "args": ["--yes", "kratos-mcp@latest"] } } }- 保存文件,并完全重启Claude Desktop应用。重启后,在Claude的聊天界面,你应该能看到一个微小的“螺丝刀”或“工具”图标被点亮,或者直接尝试让Claude“列出可用工具”,如果出现
memory_save等工具,即表示配置成功。
为Cursor配置Kratos:
Cursor的配置更简单,是基于项目的。
- 在你的项目根目录下,创建或编辑文件:
.cursor/mcp_config.json。 - 加入同样的配置:
{ "mcpServers": { "kratos": { "command": "npx", "args": ["--yes", "kratos-mcp@latest"] } } }- 重启Cursor,或者重新打开该项目文件夹。配置即可生效。
注意事项:配置文件的路径和格式必须严格正确。最常见的失败原因就是JSON格式错误(如缺少逗号、尾随逗号)或路径不对。建议使用支持JSON校验的编辑器(如VSCode)来编辑这些文件。
3.2 初始化你的项目记忆库
配置完成后,AI工具第一次在项目中调用Kratos时,它会自动初始化。但我们可以主动开始“喂养”它。一个好的开始是为项目建立一个“记忆骨架”。
打开你的AI助手(Claude或Cursor),尝试发送如下指令:
“请使用 memory_save 工具,保存我们项目的基本信息。摘要为‘项目基础架构’,内容描述我们这是一个使用Next.js 14 App Router的前端项目,后端是NestJS,数据库使用PostgreSQL,通过Prisma ORM连接。状态管理使用Zustand,UI库是Shadcn/ui。给这个记忆打上‘architecture’, ‘stack’标签,关联路径为根目录‘/’。”
AI助手会调用工具,并返回一个成功的响应,包含一个唯一的memoryId。这意味着第一条记忆已经存入你本地~/.kratos/projects/[your-project-hash]/memories.db数据库中。
3.3 核心工具使用详解与最佳实践
现在,我们来深入看看几个核心工具如何使用,以及我摸索出的一些最佳实践。
1.memory_save:如何有效地保存记忆?
保存记忆不是简单地把代码扔进去。低质量的记忆输入,会导致低质量的回忆输出。
// 一个较好的记忆保存示例 await memory_save({ summary: "用户认证:JWT与Refresh Token流程", // 摘要要具体、可搜索 text: `核心流程: 1. 用户登录成功,后端生成一对Token:JWT (有效期15分钟) 和 Refresh Token (有效期7天)。 2. JWT通过响应体返回,Refresh Token存入HttpOnly Cookie。 3. 前端请求API时在Authorization头携带JWT。 4. 当JWT过期,前端调用/auth/refresh接口(自动携带Cookie),获取新的JWT。 5. 安全考量:Refresh Token单次使用,刷新后旧Token立即失效。 实现文件:@/lib/auth.ts, backend/src/auth/。 不推荐使用localStorage存储Token。`, tags: ["authentication", "security", "jwt", "backend"], // 标签是重要的搜索维度 paths: ["/src/lib/auth.ts", "/backend/src/auth/service.ts"], // 关联具体文件,增强上下文相关性 importance: 7 // 范围1-10,用于搜索结果排序 });实操心得:
summary是黄金搜索字段:尽量使用未来你可能用来搜索的短语。与其写“登录逻辑”,不如写“用户登录JWT认证流程”。text结构化:在text字段中使用换行、列表、代码块,让内容清晰。AI在回忆时,也能更好地理解和提取关键信息。- 善用
tags:建立一套你自己的标签体系,例如按领域(auth,payment)、按技术(react,typescript)、按状态(todo,deprecated)。paths关联:强烈建议关联文件路径。当AI在编辑/src/components/Button.tsx时,搜索到的与该文件路径关联的记忆会获得更高的相关性评分。importance慎用:不要把所有记忆都标为10。保留高分给那些真正核心、不容出错的设计决策或项目规范。
2.memory_search与memory_ask:如何精准回忆?
memory_search是基于关键词和元数据(标签、路径)的搜索,而memory_ask是更接近自然语言的问答。
// 场景:我正在编写一个需要认证的API端点,想回忆认证细节。 // 方法A:使用memory_search(我知道关键术语) const searchResults = await memory_search({ q: "jwt authentication refresh token", // 查询词 k: 5, // 返回最相关的5条记忆 debug: true // 开启debug会返回每条记忆的相关性得分,有助于理解搜索逻辑 }); // 方法B:使用memory_ask(我用自然语言提问) const answer = await memory_ask({ question: "我们项目里用户登录后,token是怎么管理和刷新的?前端应该怎么处理?", limit: 3 // 限制返回用于生成答案的记忆条数 });memory_ask工具内部会先将你的问题转化为搜索查询,然后获取相关记忆,最后综合这些记忆生成一个连贯的答案。它更适合开放性的、需要综合理解的提问。
避坑技巧:如果
memory_search返回的结果不理想,可以打开debug: true查看每条记忆的score。这能帮你理解是summary写得不好,还是tags没打对,或者是paths不匹配,从而反向优化你的保存策略。
3.security_scan:保存前的安全检查
这是一个非常重要的工具。在让AI自动保存一些对话或代码片段时,可能会无意中包含敏感信息。
// 在调用memory_save之前,可以先扫描 const scanResult = await security_scan({ text: `Here is the connection string: mongodb+srv://admin:myPassword123@cluster0.xxx.mongodb.net/mydb` }); if (scanResult.hasIssues) { console.log("发现敏感信息,已自动脱敏:", scanResult.filteredText); // 此时应该使用filteredText进行保存 await memory_save({ summary: "数据库配置(已脱敏)", text: scanResult.filteredText, // ...其他参数 }); }这个工具能识别常见的密钥模式、邮箱、IP地址等,并对其进行脱敏处理(如替换为[REDACTED]),从源头保护你的项目安全。
4. 高级用法与集成策略
当你熟悉了基本操作后,可以探索一些更高效的用法,将Kratos深度集成到你的开发工作流中。
4.1 建立项目“记忆清单”:主动知识沉淀
不要被动地等待AI在对话中保存记忆。我习惯在项目关键节点,主动进行一轮“记忆录入”:
- 项目启动时:保存技术选型理由、核心依赖库版本及原因、项目结构说明。
- 核心模块开发后:保存该模块的架构图(文字描述)、核心接口设计、重要的业务逻辑流程图。
- 遇到并解决一个复杂Bug后:保存Bug的现象、根本原因、排查步骤和最终解决方案。这能极大避免团队踩入同一个坑。
- 做出重要技术决策后:比如“为什么选择A方案而非B方案”,把权衡利弊的过程记录下来。
你可以创建一个简单的脚本或使用AI助手批量执行这些memory_save操作,快速构建项目的知识基石。
4.2 与AI工作流深度结合:自动化记忆
真正的威力在于自动化。你可以指示AI助手在完成某些任务后,自动总结并保存记忆。
例如,在对Cursor或Claude Code下指令时,可以这样结尾:
“...请完成这个重构。完成后,请用
memory_save工具总结本次重构的核心变更、涉及的文件以及重构前后的主要差异,打上refactor和[当前模块名]标签。”
这样,每一次重要的代码变更都会被自动记录,形成可追溯的项目演进日志。
4.3 管理多个项目与存储迁移
如果你使用Monorepo,或者同时开发多个微服务,project_switch和change_storage_path就非常有用。
project_switch:当你从/projects/frontend切换到/projects/backend时,Kratos会自动检测并切换到对应的记忆库。你也可以手动指定项目ID。change_storage_path:默认存储路径是~/.kratos/。你可以将其改为项目内的.kratos/目录,这样记忆库就和项目代码一起被版本控制(注意:.db文件是二进制,通常不建议直接git提交,但可以方便地随项目拷贝)。或者改为/opt/team_kratos/这样的共享位置,供团队使用(需注意权限和同步问题)。
5. 常见问题与故障排查实录
在实际使用中,你可能会遇到一些问题。以下是我和社区遇到的一些典型情况及其解决方法。
5.1 问题:AI工具无法识别Kratos,工具列表为空
排查步骤:
- 检查配置路径和格式:这是最常见的问题。用JSON验证器检查你的
claude_desktop_config.json或.cursor/mcp_config.json文件。确保没有语法错误,且mcpServers层级正确。 - 确认Kratos可执行:在终端直接运行
npx kratos-mcp,看是否有错误输出。如果报错(如Node.js版本过低),需要先解决环境问题。 - 重启AI工具:修改MCP配置后,必须完全退出并重启Claude Desktop或Cursor。热重载通常不适用于MCP服务器配置变更。
- 查看工具日志:某些AI工具(如Cursor)有开发者控制台或日志输出,可以查看MCP服务器初始化的错误信息。
5.2 问题:memory_search搜不到已知的记忆
排查步骤:
- 确认当前项目:使用
project_current工具,确认AI当前的工作目录是否是你保存记忆的那个项目。不同项目的记忆是完全隔离的。 - 检查搜索关键词:尝试使用更简单、更可能在
summary或text中出现的字面词。FTS5虽然智能,但过于口语化的长句可能匹配不佳。 - 使用
debug模式:在memory_search中设置debug: true,查看返回的score。如果相关记忆的得分是0或很低,说明匹配度不够。 - 检查记忆内容:用
memory_get工具,通过ID查看你怀疑的那条记忆,确认summary和text内容是否如你所想。
5.3 问题:存储文件越来越大或出现性能问题
解决方案:
- 定期清理:使用
memory_forget删除过时、无效或测试用的记忆。对于重要的历史决策,可以将其importance调低,而不是删除。 - 优化保存内容:避免保存整个文件的原始代码。而是保存核心逻辑的总结、设计意图和关键代码片段。记住,Kratos是记忆库,不是代码备份工具。
- SQLite维护:虽然不常见,但如果数据库文件异常增大,可以尝试在项目目录下使用SQLite命令行工具执行
VACUUM;命令来整理数据库碎片(操作前请备份memories.db文件)。
5.4 问题:在团队中如何共享项目记忆?
Kratos本身是一个本地优先的工具,没有内置的同步功能。但这不意味着不能团队协作。
推荐方案:
- 导出/导入关键记忆:团队负责人或架构师可以定期使用脚本,将核心架构决策、开发规范等关键记忆导出为结构化文档(如Markdown),并纳入项目Wiki或文档库。
- 共享存储路径(高级):对于小团队,可以约定使用
change_storage_path将存储位置指向一个共享的网络驱动器或云盘同步文件夹(如Dropbox、OneDrive的业务目录)。但必须极度谨慎,因为这需要解决文件锁和并发写入问题,仅推荐给有经验的团队在低并发场景下尝试。 - 依赖AI工具本身的团队功能:一些AI工具(如Cursor)可能在未来提供基于其平台的团队上下文共享。届时,Kratos可以作为个人记忆的补充。
6. 演进与未来:从Kratos MCP到Kratos CLI
正如项目README顶部所提示的,Kratos MCP目前已是“遗产”状态。原开发团队推出了它的进化版——Kratos CLI。这个转变非常值得关注,因为它代表了一种更通用、更轻量的设计思路。
Kratos CLI的核心变化:
- 脱离MCP协议:不再依赖Model Context Protocol。这意味着它不再需要集成到特定的AI工具(如Claude、Cursor)中才能工作。
- 成为一个独立的命令行工具:你可以直接通过
npx kratos-memory调用它。 - 与任何能执行命令的AI代理协作:无论是Claude Code、Codex,还是任何能够运行Bash命令的AI环境,现在都可以通过调用CLI命令来与Kratos记忆系统交互。
这对开发者意味着什么?
- 更低的耦合度:你不再需要等待你用的AI工具官方支持MCP。只要AI能执行shell命令,就能用上Kratos。
- 更灵活的使用场景:你可以在脚本中、在CI/CD流程中、甚至在其他非AI的开发工具中调用Kratos来存取记忆。
- 平滑迁移:Kratos CLI完全兼容MCP版本的数据格式,你的
~/.kratos/目录下的所有记忆都能无缝迁移。
如何开始使用Kratos CLI?
# 安装并运行 npx kratos-memory # 查看帮助 npx kratos-memory --help # 基本命令示例:保存记忆 npx kratos-memory save "项目使用PNPM管理依赖" --tags "tooling" --importance 5 # 搜索记忆 npx kratos-memory search "依赖管理"我个人已经将工作流逐步迁移到CLI版本。它的直接和灵活让我能更自由地将项目记忆能力嵌入到各种自动化流程中。例如,我写了一个简单的Git钩子,在每次提交时,让AI自动分析本次提交的diff,并生成一条总结性记忆保存起来,实现了代码变更的“自动日记”。
回过头看,无论是MCP版本还是CLI版本,Kratos解决的核心痛点始终未变:为AI赋予持久化、项目化的记忆,终结重复的解释。它不是一个炫酷的AI黑科技,而是一个踏实、解决实际工程问题的工具。它的价值不在于技术有多复杂,而在于它是否真的融入了你的开发日常,并让你和AI的协作变得更顺畅、更高效。我的体会是,花一点时间建立和维护这个记忆系统,在项目的长跑中,它会为你节省数十倍的时间,并显著提升代码质量和架构的一致性。