但我在开发自己的 Harness 项目 Chorus 的时候又发现一些场景下没办法替换掉 MCP ,主要的原因是通过 MCP 可以更好地感知 Agent 的意图。有点抽象,让我给大伙把我碰到的问题展开唠唠。
首先说说我想达到什么效果吧,Chorus 是一个用来让 Claude Code 这样的 Coding Agent 能自主推进从需求到设计最后到交付流程的 Harness ,前端看起来大概是这样,能跟踪 Agent 的工作到底到哪了
在这个流程里的关键节点,比如 Proposal 或者 Task 提交审批,就需要在 claude code 里启动一个独立的 Agent 去替人类审,揪出问题,用对抗的方式让 Agent 自己迭代出没有太大问题的结果

那么问题来了:我应该如何让 Claude Code 在这几个关键节点稳定地启动 Reviewer Agent 呢?
方法 1: 用 Skill 或者 Prompt
这是最简单的方式,直接在 Skill 里写清楚,“你必须在 XXX 节点调用 XXX Agent , 根据反馈然后去做 XXX” 非常简单但不靠谱,现在的 Agent 大家调过 PE 也知道,在 Skill 里写的真的会一致遵从吗?尤其是一个小迭代它自己跑上半小时,一开始的 PE 都忘得差不多了,这个方案只是锦上添花但是不解决问题
方法 2:在调用返回中注入 Prompt
既然放在 Skill 里不靠谱,能不能在要启动 Reviewer 的时间点直接给 CC 注入 Prompt 呢?最简单的做法就是上一步动作,比如提交审批这个调用的返回结果里提醒 CC 你该启动一个 Agent 去 review 结果了。其实这个手法是有效的,但存在几个问题:
[ol]
[/ol]
方法 3:在 Hook 处捕获事件
大多数成熟的 Coding Agent 都支持 Hooks ,这也是这类 Agent 的插件系统里最有用的机制,其实就是利用 AOP 的思想去在某一个关键节点上做一些操作。比如我现在的需求,只需要在提交审批这个动作之后去读取本地 Claude Code 配置,如果启用了 Reviewer Agent ,启动它就好。下一个问题是:我如何才能知道 Claude Code 触发了提交审批这个动作,并且提取参数( Proposal ID 等)来让 Reviewer Agent 知道自己到底要去看哪个资源?
拿 Claude Code 举例子,它的 Hook 机制大多数是围绕自己的生命周期流程的,比如SubagentStart, SessionStart等。如何才能知道它在 Chorus 上调用了提交审批这个动作呢?很明显用PostToolUse这个钩子。
如果我的服务用 CLI 或者 API 去暴露接口,那么对应的 tool use 其实是bash或者fetch等等通用的命令/网络操作调用,你想在其中解析出意图不是不可能,但非常不可靠。Claude Code 今天心情好给你直接调用,明天心情不好也许写了一个 py 脚本调用,你怎么去抓呢,参数匹配能出的幺蛾子就更多了。
对比之下用 MCP 去匹配意图简直是手拿把掐,因为 CC 暂时不支持配置本地工具,MCP 就是唯一能把调用固定成一个确定工具名的手法。大家有兴趣可以看下源码我是如何定义这个 Hook 的,简单地说用通配就行
"PostToolUse": [
{
"matcher": ".*chorus_pm_submit_proposal",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/bin/on-post-submit-proposal.sh"
}
]
},
这样我不仅能完全感知到 Claude Code 的意图,还能很好地提取参数去注入到一个 Reviewer Agent 的上下文中,省得 Agent 不靠谱地去帮我用生成 Token 的方式传递了。
当然我不是 MCP 的拥趸,这个协议设计得实在太难用了。MCP 真正不可替代的地方在于它把 Agent 的每一次调用都变成了带语义的、确定性的意图信号,前面提到的接口污染和意图捕获问题本质上都是因为这一点。更关键的是 MCP 是跨 Agent 的,不管哪个框架,不管支不支持本地工具定义,只要接了 MCP ,你就有了一个稳定的锚点去感知意图、围绕意图构建 Harness 。让我稳定感知 Agent 意图的协议,似乎只是目前只有 MCP 能做到?如果大家有更好的方法,务必评论给我。

