手握 REA 的 138 个逆向工具,Agent 为什么会手写脚本绕远路?
1. 现象:明明有专业 MCP,Agent 却在裸跑脚本
今天在分析一款桌面客户端(采用开源免费版 + 官网闭源版双轨发行)时,踩了一个典型的工具调度坑。
环境中已经配置了由官方维护的逆向工程 MCP(morluto/rea,涵盖 138 个反编译与二进制静态分析工具)以及一套前置分诊 Skill。然而在实际执行时,Agent 并没有调用任何 REA 工具,而是顺着习惯在终端里执行 7z 解包、临时用 pip 安装 pefile、写 Python 脚本提取导入表与节区信息。
直到人工介入提醒后,才重新切入 REA 工具链。随后通过二进制符号分析,在官网安装包中提取出了开源版中被物理剔除的尽职调查商业引擎符号。如果全程只看开源源码或依赖手工脚本抽样,这个关键差异就会被漏掉。
工具链健全,纪律要求明确,但执行链路依然走偏。这并不是偶尔的注意力分散,而是当前 Agent 工具加载架构下的结构性缺陷。
2. 根因分析:延迟加载机制下的三层断裂
2.1 ToolSearch 机制的搜索边界
为了控制上下文开销,现代 Agent 运行时(如 Claude Code)普遍引入了工具延迟加载机制(Deferred Tools):
- 核心工具(Bash、Read、Write、Edit 等):定义常驻系统提示词,随时可用;
- Skill 技能库:以单行描述常驻系统提示词,只有显式调用时才读取具体指引;
- 外接 MCP 工具:在初次加载时被放入延迟池,上下文里只保留纯英文工具名(例如
mcp__rea__inspect_binary_layout)。
当 Agent 认为需要某项工具时,必须先通过 ToolSearch 发起查询,将该工具的完整参数 Schema 载入当前轮次,随后才能发起调用。
2.2 渐进式披露的中间层缺失
按照标准的渐进式披露(Progressive Disclosure)模型,工具的暴露应当分为三层:
- L1(意图感知):工具/技能的简短定位(占极少 Token);
- L2(功能导览):工具适用的业务场景、限制与推荐组合;
- L3(参数契约):具体的 JSON Schema 与调用规范。
当前延迟加载的问题在于直接跳过了 L2。留在上下文里的只有 L1 的裸标识符。对于 mcp__rea__analyze_javascript_application 这种机器命名的英文长串,大语言模型在没有看到完整描述前,无法建立它与“解构桌面端前端打包产物”的语义关联。
这就导致了负向循环:无法凭空预测精确关键词 → 触发不了 ToolSearch → 误以为没有现成工具 → 退回训练权重极高的通用解法(Bash/手写脚本)。
2.3 Skill 与 MCP 的生态位分化
在实际运行中,Skill 很少被遗漏,而 MCP 工具遗漏率极高。原因在于两者的信息表达范式不同:
- Skill 具备自然的 L2 属性:它的提示词是由人写的业务场景描述(如“逆向工程、反编译与二进制分析分诊”),天然契合 LLM 的自然语言意图匹配;
- MCP 本质是远程过程调用(RPC):它提供的是原子化能力。如果让 100 多个 MCP 工具全量常驻,每轮对话要额外承担数万 Token 的静态开销,同时稀释模型对业务指令的注意力。
业界逐渐达成的共识是:Skill 充当控制层(神经与路由),MCP 充当驱动层(手和脚)。复杂 MCP 必须由 Skill 在前端进行意图收拢,而不是直接平铺给模型自由挑选。
2.4 训诫式规则的执行失效
项目此前制定过针对性的开发纪律(如“先出方案,禁止直接编码”)。但这类抽象准则在面对技术执行时容易被旁路绕过。
当模型认为“写个 Python 脚本 10 秒就能跑完”时,它在逻辑上误判这是最高效的捷径,因此不会意识到自己违反了规范。依赖模型主观自觉的口头约束,无法阻断行为惯性,只有硬性的确定性路由才能形成有效约束。
3. 解决方案:三层映射矩阵
针对上述断点,我们将工具发现机制重构为三层结构,将“靠模型自觉猜测工具”转变为“规则锁死确定性路由”:
第一层:核心提示词中的意图映射(强制必读)
在核心规则文件(CLAUDE.md)中建立高频意图与工具的硬编码映射表,每轮会话常驻:
| 任务意图 | 强制调用的 Skill | 必须唤醒的 MCP | 禁止行为 |
|---|---|---|---|
| 二进制逆向 / 反编译 / 应用拆解 | reverse-skill 分诊 | mcp__rea__*(REA) | 禁止手写脚本替代,版本不一致时必须查二进制 |
| 代码调用链 / 架构定位 / 影响面 | codebase-memory | mcp__codebase-memory-mcp__* | 禁止直接全文阅读源代码 |
| 案卷 OCR / 票据高保真文字提取 | paddleocr | — | 禁止由视觉模型估算猜测 |
| 文档生成 / 格式化处理 | officecli | — | 禁止直接导入底层操作库破坏样式 |
在每轮大型任务执行前,增加确定性自检:当前任务命中的意图域是否已调用指定 Skill?未调用则前置阻断。
第二层:知识库全量图谱(按需扩展)
在项目知识库中维护全量映射表,涵盖中低频场景(如安全审计、数据导出、环境部署等)以及所有 MCP 的具体方法索引。当第一层的精简规则无法覆盖边界场景时,检索知识库进行二次对齐。
第三层:子代理规程继承(闭环防漏)
在多代理协作(Multi-Agent)场景中,主代理派发给子代理的任务 Prompt 必须显式声明对应 Skill 的约束条件与工具链路径,避免出现“主代理以为子代理会查工具,子代理以为主指令无需扩展”的协同盲区。
4. 总结
上下文管理中的“延迟加载”确实大幅减轻了每一轮会话的 Token 负担,但它人为切断了工具从“名称”到“能力”的语义链路。
省在上下文中的说明书,必须通过确定性的路由矩阵补偿回来。 建立清晰的意图映射层,让 Skill 承担导览与分发职责,才能确保底层庞大的专业工具链真正被有效调度,而不是让系统一再退回到原始脚本的路径依赖中。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!







