准备一场高级后端面试,战线能拉到一个多月。Claude 每天陪着刷题、啃系统设计、读 DDIA,所有相关对话都塞进同一个 Claude 项目里。五个月之后,三个问题反复冒出来。
![]()
第一,长对话太贵。他给每家公司的招聘流程各开一个对话,有的对话跑了好几周。最夸张的时候,一条新消息就用掉了他 5 小时用量限额的约 30%,三条消息就见底了。
第二,项目记忆不够用。新开的对话仍然要提醒它别的对话里做过什么,而且他看不到 Claude 到底选择记住了什么。
第三,进度只活在他脑子里。申请、学习、简历改动都记在自己的笔记里,每次对话再粘一遍,还经常忘了更新。
于是他换了个思路:把记忆从 Claude 里搬出来,放进自己拥有的笔记,再给 Claude 一个 MCP 服务器去读写这些笔记。哪个对话存什么、下一个对话读什么,由他决定。记忆变成了可以阅读、可以 diff、可以回滚的东西,而不是一个看不进去的黑箱。
这个工具叫 prep-mcp,一个用 Go 写的二进制程序,由 Claude Desktop 和 Claude Code 通过 stdio 启动。它围绕一个 markdown 笔记文件夹(vault)提供 11 个工具。他在 Obsidian 里编辑同一个 vault,AI 的每一次写入都落成一个 git 提交。
服务器本身对面试一无所知。vault 根目录下两个文件决定它的形状:prep.config.yaml 定义文档类型(文件夹、文件名模式、必填字段、日期字段)、标签词表文件,以及新对话会看到什么;CLAUDE.md 用平实的文字给助手定工作规则——怎么开始、记什么、优先用哪种写入。他的 vault 为求职面试搭了七种类型:申请、准备场次、改进项(每项一个弱点,带退出标准)、故事、推荐人、学习笔记和周计划。那份约 7 KB 的 CLAUDE.md 规定了每种练习怎么跑、怎么打分、怎么记录。改掉这两个文件,同一个服务器就能追踪考试、认证或语言学习。
一个对话的流程是这样的:开始时,get_context 取代了过去手动粘贴的交接提示,一次调用返回配置里 context 块指定的内容——工作规则、本周计划和日志、每个未结事项及其下一步动作、最近几次准备场次,以及过去 30 天用得最多的标签。干活时,另外四个读工具随时回答问题,其中 list_docs 承担了大部分工作:标签(AND、OR、前缀)、frontmatter 条件和日期可以在一次调用里组合,group_by 返回计数而不是文档。“哪些申请在等我?”和“这个月哪些弱点出现最多?”是同一个工具换不同参数。list_tags 显示什么反复出现、什么已经安静下来,search_text 找任意短语,read_doc 返回文件及其内容哈希,后续的整文件重写必须引用这个哈希。
写入时,每个写工具只改它点名的东西:建文件、在某标题下追加、修补 frontmatter、替换一段精确文本,或重写整个文件。一个对话通常以一次 batch 收尾:准备场次笔记加上周日志里的一行,合成一个提交。没有数据库,没有索引,每次调用都扫描文件夹——2,000 个生成文档约 58 毫秒,他这个规模的 vault 约 5 毫秒。存一个索引就等于多一份副本,还得跟他手动编辑的文件保持同步。
让 AI 写才是难的部分。一个会写的服务器可能覆盖他的编辑、弄坏文件的 frontmatter,或者执行藏在文档里的指令。每个决定都有代价:小写入优先于整文件重写,append_section、edit_text、update_frontmatter 只改点名的部分,代价是只追加的文档会一直变长;replace_doc 需要上次读取时的内容哈希,如果他在 Obsidian 里中途改过文件,写入会失败而不是覆盖他,代价是模型得重读再改一遍;每次 AI 写入一个 git 提交,用独立的作者身份,所有改动都能审查、diff、回滚,batch 最多把 200 次写入合成一个提交,要么全成要么全不成;一次写入不能让文档变差,会破坏必填字段、日期或标签的写入直接失败并说明怎么修,文件本来就有的问题只算警告;不删除,也碰不到 vault 之外,因为 AI 读到的任何文档都可能夹带指令,代价是文件放错文件夹时,移动它需要他手动建文件、修链接、再跑一次 git rm。
他用 Claude Desktop 使用 prep-mcp,用 Claude Code 开发它,AI 既是用户又是开发者。Desktop 对话里的摩擦变成一张工单,Claude Code 对话把它修掉。多数改动走同一个循环:Claude 先提问直到每个决定都达成一致,没谈完不写代码;测试先行,覆盖改动触及的地方;两个审查者并行,一个对照规格检查改动,一个对照代码标准检查。
10 月 2 日到 19 日的结果:Claude 向 vault 提交了 272 次,他自己提交了 3 次——第一次导入、一次配置修改,以及那次手动 git rm。回滚 0 次,错误由后续写入修正。他不逐条读提交,而是在使用中通过 Obsidian 读文件,git 留着在看起来不对时用。vault 长到 166 个带类型的文档,其中 41 个是准备场次笔记。第一个完整周,Claude 增加了 3,908 行、删除了 153 行,笔记在增长,几乎没被重写。小写入干了几乎全部的活:那一周 append_section 52 次、batch 47 次、edit_text 25 次、create_doc 23 次、update_frontmatter 15 次、replace_doc 3 次。下一周 81 次提交里有 63 次是 batch,replace_doc 仍是 3 次。截至 10 月 16 日,Claude Desktop 日志显示 0 次哈希冲突——git 显示不了这个数字,因为被拒绝的写入不会产生提交。这个 vault 现在是他唯一的申请追踪器,之前那个独立工具已经退役。
对照最初三个目标:一个对话现在覆盖一天,而不是一家公司的整个招聘流程,它从 get_context 开始,而不是几周的聊天记录;几周长对话末尾一条消息曾花掉约 30% 的 5 小时限额,一天对话末尾他实测的那条花了 6%。每个在攻的弱点都有自己的文件和一个退出标准,每次准备场次给它看到的弱点打标签,每周复盘用一次 list_docs 调用统计这些模式,进度来自笔记而不是记忆。“每个申请到哪一步了”是一个问题,从笔记里带着每个申请的下一步动作和日期回答。
日常使用一直在改设计。工具描述就是模型的界面:list_tags 展示出完整标签词表后,模型写之前会先查它,未知标签的拒绝就不再触发;当它在一个什么都做对的 batch 上触发时,原因是工具描述承诺了代码没做的事。上下文丢失的解药也有自己的成本:对话从 vault 读到的内容会留在对话里,每次回复都重读一遍,在 Claude 的用量报告里,vault 约占一个对话成本的三分之一。最贵的时刻是“回来”——隔一段时间回到旧对话会重新加载全部内容,这些回归是报告里最大的单项成本。有了 vault,关掉对话不丢东西,解法就是每天开一个新的,难的是养成习惯。边界只跟留在外面的最强文件一样强:模板曾为防止提示注入而锁死,而更能左右模型的 CLAUDE.md 却可写,于是他把模板解锁了。副本会漂移:一个复制 git 锁规则的检查漏掉了 git 自己的报错已经点名的情况,修法是删掉这个检查。
还没解决的问题记在仓库的 issue 里。read_doc 返回整个文件,get_context 完整嵌入本周文档,两者都会一直长到撞上客户端单个工具结果 25,000 token 的上限;一份长日志已经被截断过,而截断丢掉的正是新对话需要的最新条目,按标题读某一节或读最后几条可以解决。配置只在启动时读取,改了要重启才生效,而且没有任何提示说正在运行的配置已经过期。还有一个想法:用 whisper.cpp 转写练习录音,算出每分钟词数、长停顿和到第一个句号的时间,让模型不必去估这些数。
仓库在 github.com/Arkoes07/prep-mcp 公开,README 覆盖 Claude Code 和 Claude Desktop 的安装,还附了一个虚构的示例 vault 可以先拿来试。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.