实践分享,自用【定位-推理-编排-记忆】全体系MCP

3 阅读8分钟

这是一篇迟到的项目介绍,感觉把readme或者manual直接发出来不是很礼貌,于是有了这篇文章。


MPM-Coding 是开源项目,仓库最近重新提交过,在 GitHub:halflifezyf2680/MPM-Coding 详细文档见 docs/MANUAL.md


8 个月前,我给 AI coding 套了个Harness,可以节省大量的无效tokens消耗

不知不觉,用 AI 帮忙写代码已经快两年了,从一开始的网页对话粘贴、代码补全,到现在沟通基本靠嘴。

AI coding很不错,只要需求足够明确,丢过去就能拉一坨能跑的代码。但项目一大,问题就来了 —— LLM无法理解项目,开始乱读文件、改错地方、改完这头忘那头,有时候改着改着就把自己改迷路了。我明白这不是某个模型的问题,而是上下文工程的问题。

我尝试了各种开源项目,mcp、skill、prompts都上,感觉还是差了点什么。结果还是自己写了个MCP框架,叫 MPM-Coding,去年冬天的时候删了一半的tools,定版,一直用到现在。个人项目和工作项目都在用,感觉到现在也不算过时。它是一个从定位,到推理,到编排,最后记忆的全流程方法。

主要问题出在哪

AI 编程框架(不管是 Claude Code、Cursor 还是 Copilot 等等)在处理大型代码库时,都有一个共同的毛病:暴力扫描范式输出。基于这点,构建代码库索引,和怎么去扫描利用方面一直都是重点关注对象,这里面Augment是第一个及格的,windsurf第二,cursor后来也赶上了。

但是公司项目都不准用,就算不说数据保密的事,作为一个坚定的唯物主义战士,Embedding和RAG这种玄学路子,我一直是绕着走的。我判断还是得走AST,不光要结构树,还要调用图,还要有影响分析,还要有链路追踪。

核心思路1:先给地图,再指路

MPM-Coding 的核心思路很简单——别让 AI 瞎逛,给它结构化的导航信息

刚接手一个陌生项目,第一件事不是读代码,而是搞清楚目录结构。LLM默认的做法是 lsGlob 跑好几遍,然后自己在脑子里拼图。在mpm里面,project_map 一条命令搞定,直接把注意力收窄到关键目录。

知道目录在哪了,下一步是找具体的东西。普通搜索工具(grep、ripgrep)是纯文本匹配,搜 handleMessages,注释里的、字符串里的、测试文件里的全都给你吐出来。code_search 走的是 AST 索引,它知道什么是函数、什么是类、什么是方法。搜 handleMessages,直接返回函数定义 + 22 个相关候选,带文件路径和行号。而且也有 ripgrep 兜底,带模糊查询机制不担心 0 返回。

每一步只给 AI 够它决定下一步看哪个文件的信息量

LLM 有个特长,它自己会根据名称猜这些目录是干啥的,真正的代码理解靠它自己去读目标文件。这不是什么高深的理论,就是一个工程取舍:少喂一点,但喂得更准

为什么用 AST 不用 LSP?

LSP 解决的是编辑器和语言智能之间的 M×N 适配问题,服务对象是人类开发者的实时操作。MPM 要解决的是给 LLM 项目的结构化信息,服务对象是 AI 的上下文工程,是认知过程。 这是两回事。

核心思路2:推理与对齐

定位到了文件和函数,下一步是搞懂数据流动,以及人和 AI 的理解是不是在同一频道上。

理解业务逻辑最难的不是读单个函数,而是搞清楚数据从哪来、到哪去。以前的做法是手动跳转,读一个文件发现它调了另一个函数,再去读那个文件,或并行读 n 个文件或 n 行代码。flow_trace 自动追踪上下游。比如追踪 headless_claude.go 的前向依赖,直接输出完整调用链:runHeadlessClaudeTurnensureAgentMCPConfigbuildPromptresolvePermissionFlagsprepareTaskWorktree,7 个直接依赖一目了然。

人类 和 LLM 的沟通黑洞

人和人之间协作,最重要的不是谁更聪明,而是想法能不能对齐。结构化信息本质上是在做思维同步 —— 先把项目地图对齐了,后面的沟通才有基础。

顺着这个思路,我早期做过一个 prompt 增强工具,核心就是对齐人类和 LLM 的理解。其实就是一个 md 文档,先确认理解一致了再动手,返工率明显降低。但后来我发现一个 workflow 就能干同样的事,就从 MPM 里删掉了。指令是一句话:根据用户输入,结合已有信息,做更清晰的工程化解读,输出结构化目标给用户确认,不要直接执行。后来别人告诉我augment和trae对话框的小星星按钮就是这个功能。

核心思路3:编排——长任务不跑丢,改之前知道影响

定位准了,理解也到位了,接下来就是动手。

code_impact 在你改一个函数之前,直接输出风险等级和调用者列表。

task_chain 任务管理状态机,把任务拆成阶段,每个阶段有明确的目标和验收标准。支持门控(gate)机制——某个阶段完成后检查是否通过,不通过还可以自己改目标。支持断点续传,今天没做完明天接着来。

system_hook,可以理解为任务链里的"便利贴"。当 AI 执行到某一步发现被卡住了(比如需要用户确认、等外部依赖、信息不足无法继续),它可以贴一张便利贴挂起当前进度,记下"卡在哪、为什么卡住"。等你准备好了再释放这张便利贴,AI 就从断点接着往下走。用户也可以说:我想到一个问题(xxx),你分析我的意图,mpm hook挂起,过一会去处理。

核心思路4:记忆——改完必须留记录

这是我认为最重要但最容易被忽略的环节。

memo 每次改动都极简记录原因和上下文,支持批量原子级提交。

system_recall 自动根据需求召回历史,多维筛选过滤,宽进严出。

known_facts 自动将反复错误或者明显的坑点进行简洁记录,mpm自动或者蝇虎主动召回注意力。

time_line 一个可视化的开发历程,会弹出一个web窗口,程序化的,不用tokens。

有一次 LLM 搞坏了我本地 git 仓库。我打开 time_line 看着,叫 claude 拿出 system_recall,把那两天的代码重新写出来了。整个过程纯靠记忆层。感觉代码还更干净。

额外工具

早期 LLM 注意力机制不行的时候,我设计了 persona 工具,它通过强制注入角色约束来进行角色扮演,角色维持度下降也是我判断该不该 compact 的信号之一。现在注意力续接被 task_chain 接过去了,persona 作为 compact 判定信号已经作用不大。留着没删,是因为偶尔换成孔明风格还挺有意思的。persona也能自己管理角色,创建、编辑、删除都行,比如我说:


❯ 用mpm角色工具,创建一个海绵宝宝角色

● MPM-coding - persona (MCP)(mode: "create", name: "spongebob", new_name: "", display_name: "海绵宝宝", avatar: "🧽",
(中间省略) ⎿ ✅ 已创建人格: spongebob


实际表现

回到实际情况,我曾经让 claude code 审计一个 1300 文件的项目,它派几个 agent 去扫地,地推式读文件,token 烧得让人心慌。

盲测对比:拿同一个开源项目(opencode,4500+ 文件的 monorepo),先用通用 agent 审计,再用 MPM-Coding 审计。

通用 agent 那次,5 个 agent 并行跑了 35 分钟,产出了 86 条发现。看着很厉害,但仔细一看,很多 LLM 式的泛泛而谈和大惊小怪。

用 MPM-Coding 那次,默认行为很收敛,沿着 project_map → flow_trace → code_search → 精读关键文件 的路径走,最终产出 16 条发现。量少了很多,但是深度不一样,但每条都有精确的文件定位、代码片段、攻击场景和修复建议,甚至某些点可以直接和issue对上号。

少而精,比多而杂有用得多。

通用 Agent(5 个并行)MPM 工具链
耗时35 分钟约 15 分钟
发现数86 条16 条
有效发现大量泛泛而谈,真正有深度的不多每条都有文件定位、代码片段和修复建议

把 1000 多个文件一股脑堆到它面前,信息太多等于没有信息。

技术实现

  • Go 写的 MCP Server,通过 StdIO 和 AI 客户端通信
  • AST 索引用 Rust + Tree-sitter,支持多语言,多线程并发扫描
  • 记忆层用 SQLite + WAL,所有操作记录可追溯
  • 索引支持异步构建和增量更新,大项目也能跑

总结

MPM-Coding 解决的不是一个问题,而是AI coding 如何工程化问题。 如果你也在用 AI 编程,并且在大型项目中被"AI 失控"困扰过,可以试试这个思路。


MPM-Coding 是开源项目,仓库最近重新提交过,在 GitHub:halflifezyf2680/MPM-Coding 详细文档见 docs/MANUAL.md