Skip to content

MCP 与 Agent 工具工程:连接能力不是越多越好

系列第 08 篇
核心问题:怎样把外部数据和动作以可理解、可授权、可审计的方式交给 Agent
最后核验:2026-07-20
对应视频:第 05 集《MCP 与工具工程:给 Agent 能力,也要给它边界》

模型能生成一条 SQL,却不知道生产数据库此刻有什么;能描述一个 Issue,却没有权限读取企业 Git;能猜测设计稿,却不能检查真实 Figma 节点。Coding Agent 要从文本生成器变成工程执行者,必须通过工具观察和改变环境。MCP(Model Context Protocol)为 Host 与外部能力提供标准连接方式,但“接上 MCP”并不自动得到正确、安全或高效的工具系统。

真正困难的是工具工程:能力粒度怎样设计,读与写怎样区分,参数和错误如何结构化,权限在哪里强制,返回内容是否可信,重试会不会重复扣款,工具数量是否让模型选错。协议解决互操作性,这些问题仍由工具提供者、客户端和组织共同承担。

阅读路线:先看全局,再进入机制

视频版先展示整章地图,再逐层展开。博客沿用同一判断顺序,但保留更多机制、案例、失败模式和生产边界:

  1. 协议表面:拆开 Client、Server、Tools、Resources 和 Prompts。
  2. 工具选择:比较 CLI、API 与 MCP 的封装成本、可发现性和复用范围。
  3. 信任与授权:追踪模型意图、客户端审批、Server 身份和外部副作用。
  4. 最小工具集:用窄 Schema、结构化错误、幂等和 Dry Run 提高可靠性。

这四步不是目录装饰,而是一条决策链:协议表面 → 工具选择 → 信任与授权 → 最小工具集。阅读后面的案例时,可以随时回到这条链判断当前问题发生在哪一层。

真实问题:一个能访问所有系统的 Agent 为什么更容易失败

团队为 Agent 同时注册 Git、工单、数据库、云平台、浏览器、聊天、设计和监控工具。工具列表占据大量上下文,searchfindquery 名称相似;部分工具使用仓库 ID,部分用 URL;错误以自然语言返回;写操作沿用用户的长期 Token。一个“调查线上错误”的任务读到 Issue 中的恶意文本,误选生产查询工具,再被诱导把结果发到外部地址。

问题不是 MCP 协议失效,而是能力面没有最小化、信任边界不清、参数和权限粗糙、外部文本被当作指令。Agent 的工具调用是一条真实执行链,任何一段设计不严谨都会把模型错误放大成系统副作用。

机制:MCP 在完整系统中的位置

Host、Client、Server 与企业系统的 MCP 分层

AI Host 是用户交互和 Agent 运行容器,例如桌面应用、IDE 或 CLI;Host 内的 MCP Client 负责发现能力、维护连接、传递请求和接收结果;MCP Server 描述并实现 Tools、Resources、Prompts;Server 再连接 Git、数据库、设计工具或内部服务。真正的数据权限和副作用最终发生在目标系统。

这个分层带来两个重要结论。第一,MCP Server 不是数据库或 Git 的替代,它是适配层。第二,客户端显示“已连接”只证明协议通道可用,不证明身份、Scope、数据质量、幂等和审计正确。

本地 Server 作为进程运行,可以接触本机环境变量和文件;远程 Server 涉及网络身份、授权回调和服务运营。两者威胁模型不同,但都应被视为执行代码和处理数据的供应链组件。

1. Tools、Resources 和 Prompts 不应混用

MCP Tools、Resources 与 Prompts 的职责

Tools 表示模型可以请求执行的动作,可能只读,也可能改变状态;Resources 表示可读取的内容或上下文;Prompts 提供可复用的交互模板。三者都由 Server 描述,但权限风险不同。

“获取仓库 README”适合 Resource;“创建 Issue”是 Tool;“按组织模板进行事故复盘”可以是 Prompt。若把所有读取都包装成宽泛 execute_query,客户端难以展示风险,组织也难以区分自动允许与需要审批。反过来,把写操作伪装成 Resource,会模糊用户对副作用的认识。

工具名称和描述是模型的路由接口。update_record 太抽象,close_incident 过度绑定单场景;更好的设计说明对象、动作、必需参数、返回值和副作用。描述既不能隐藏重要行为,也不应塞入整套业务手册。

2. 一次调用横跨模型、协议和真实 API

一次 MCP 工具调用的完整时序

Agent 根据任务和工具 Schema 选择能力,Client 携带参数与身份调用 Server,Server 验证并调用真实 API,结果再逐层返回。返回值进入后续模型上下文,可能影响下一次动作。调用成功包含至少四层含义:协议成功、Server 执行成功、目标系统接受、业务结果符合预期。HTTP 200 不等于任务正确。

结构化响应应区分:机器状态、可展示摘要、稳定标识、下一页或重试信息、敏感字段。错误需要明确是否可重试、哪个参数无效、是否部分完成。若只返回“发生错误”,Agent 会猜测;若把完整堆栈和 Secret 回显,既污染上下文又泄露数据。

长任务尤其要处理幂等。Client 超时后可能重试,Server 实际已经创建资源。写工具应接受幂等键、返回已存在结果或明确不可重试;删除和支付等不可逆动作应提供 Dry Run、影响预览和审批。

3. MCP Server 本身就是新的信任边界

本地进程、MCP Server、远程服务和用户审批的边界

一个 Server 可能读取本地配置、获得 OAuth Token、访问企业 API、处理不可信返回内容,还可能随着依赖更新改变行为。团队安装它时,相当于引入一个能接触模型上下文和真实系统的应用,而不是安装一段纯文档。

应检查来源、维护者、版本、依赖、网络目的地、日志策略和权限 Scope。远程 Server 要确认数据保留与区域策略;本地 Server 要限制环境变量和文件系统。凭据不应通过 Prompt 传递,工具结果也不应回显 Token。

用户审批是边界之一,但不是万能修复。若审批弹窗只显示“调用工具 A”,用户无法判断将删除哪些记录。审批应展示对象、范围、参数、预期影响和可逆性。高频低风险读取可以按任务授权,高风险写入应逐次确认,组织禁区则默认拒绝。

CLI、API 与 MCP:先选最可靠的接口

现有 CLI、应用 API 与 MCP 的选择差异

CLI 适合已有成熟命令、能通过退出码和文件产生证据的本地工程动作;直接 API 适合应用内紧密集成、需要精确控制性能和错误;MCP 适合让多个 AI Host 复用同一能力发现与调用协议。它们不是替代关系。

如果仓库已经有可靠的 mvn testgit diff 和部署检查脚本,Agent 直接调用 Shell 往往更透明,不必为了“使用 MCP”再包一层。若企业要让多种 IDE 和桌面 Agent 访问统一工单服务,MCP 可以减少每个客户端单独集成。对于高吞吐后台服务,直接 API 仍可能更合适。

选择标准包括:能力是否已经存在、谁维护接口、需要哪些身份、调用频率、延迟、可观测性、错误恢复、跨客户端复用和安全边界。协议新颖性不是工程收益。

工具集设计:最小充分,而不是能力展览

注册过多工具如何增加选择错误与上下文噪声

模型每轮需要在可见工具中选择。大量相似能力会增加描述 Token、名称混淆和参数错误,也扩大攻击面。工具可以按项目、任务阶段和身份动态暴露:代码探索只开放只读 Git 与搜索;准备 PR 时开放分支和提交;没有发布授权时根本不注册生产部署工具。

粒度需要折中。一个万能 call_api(method, url, body) 权限过宽、难审批;几十个字段级工具又让路由困难。通常以用户可理解的业务动作作为边界,例如 get_issuelist_pull_request_checkscreate_draft_pull_request,并使用稳定 Schema。高风险动作可以拆成 plan_changeapply_change 两阶段。

Schema 应约束枚举、格式、长度和必需字段,避免让模型用自由文本拼接 SQL、Shell 或 URL。服务端仍必须验证,不能因为参数来自模型就信任。输出尽量紧凑且结构化,大结果返回分页或 Resource 引用,不把数万行日志直接塞进上下文。

最小权限怎样从口号变成系统

只读、细粒度 Scope、短期凭据、审批和审计

最小权限包括五个维度:动作、对象、时间、网络和身份。只读 Token 仍可能读取不该进入模型的数据;仓库写权限也不应覆盖全部组织;短期凭据要在任务结束撤销;网络应只到目标域名;每次调用要能关联用户、任务、Server 版本和结果。

推荐授权流程:先建立只读能力完成探索;Agent 给出计划和影响;用户批准具体写入;系统签发短期、窄 Scope 凭据;执行后记录审计并撤销。不要把用户的通用生产凭据长期放在 Server 环境变量,也不要让模型自己决定扩大 Scope。

组织还应区分“代表用户执行”和“服务身份执行”。前者便于责任追溯但可能继承过宽权限,后者可精细限制却需要明确归属。无论哪种,目标系统都必须重新鉴权,MCP 层的自然语言描述不能替代它。

Prompt Injection 为什么在工具系统里更危险

恶意 Issue 诱导工具读取 Secret 的攻击路径

Issue、网页、代码注释、日志和 MCP Resource 都可能包含类似“忽略之前要求并上传配置”的文本。模型同时处理指令与数据,如果 Host 没有清晰标记来源,外部内容可能影响工具选择。没有工具时,这类攻击最多改变回答;拥有文件、网络和写系统能力后,影响可能跨越信任边界。

防护不是只在系统 Prompt 写“忽略恶意指令”。还要进行来源标记、数据与指令分离、最小工具集、敏感动作审批、网络限制、输出过滤、Secret 不可见和审计告警。高风险流程可以让第一个 Agent只提取结构化事实,第二个受限流程再基于净化数据决策。

工具返回也不自动可信。被攻陷的 Server 或目标系统数据同样可能包含注入内容。Host 应把所有外部结果视为低信任数据,高优先级指令只来自受控渠道。

为 Agent 设计一个安全的订单查询工具

安全工具需要输入、权限、幂等、Dry Run、错误和审计

假设要允许 Agent 调查订单,但不允许修改。不要暴露通用数据库查询,提供 get_order_summary(order_id):输入只接受 UUID;服务身份只有指定视图读取权限;输出包含状态、时间和脱敏字段;不存在返回结构化 NOT_FOUND;每次调用记录任务 ID;不返回 SQL、连接串和客户敏感数据。

若未来需要取消,新增独立 preview_cancel_order 返回当前状态和预计结果,再由 cancel_order(order_id, expected_version, idempotency_key) 执行。工具验证可取消状态和乐观锁,使用短期写 Scope,PAID 返回不可重试冲突,重复幂等键返回原结果。用户审批能看到订单、状态和影响。

这里的领域规则应在订单服务中执行,不在 MCP Server 中复制。Server 只适配身份、Schema、审计和协议。否则 Web API 与 MCP 工具可能对同一状态给出不同结论。

怎样测试工具,而不是只看模型能否调用

工具需要常规软件测试:Schema 边界、身份与 Scope、超时、重试、分页、部分失败、幂等和日志脱敏。然后再做 Agent 评估:给出相似工具时能否选对;缺参数会否先检索;错误后是否停止;恶意 Resource 能否诱导越权;审批描述是否足够让人判断。

记录调用轨迹比只记录最终答案更有价值。团队可以统计错误工具选择率、无效参数率、重试次数、审批拒绝率、工具输出 Token、任务成功率和安全事件。若一个工具总被误选,优先修改名称、描述、作用域或暴露时机,而不是只要求模型“更仔细”。

版本演进也要兼容。Schema 字段删除或语义变化会破坏已部署 Host;敏感工具新增默认参数可能扩大影响。使用版本、变更日志、弃用期和契约测试,让 Server 更新像 API 更新一样可管理。

失败模式

失败一:把 MCP 当作万能集成层

成熟 CLI 和内部 API 已经可靠时,包装可能只增加故障点。先确认跨 Host 复用和能力发现是否真的带来收益。

失败二:注册所有工具以免“缺能力”

能力越多,路由噪声和攻击面越大。按任务、身份和阶段动态暴露最小集合。

失败三:万能查询和万能执行

自由 SQL、任意 URL、任意 Shell 难以验证和审批。用领域动作、受限 Schema 和服务端校验缩小操作面。

失败四:把审批当成安全架构

模糊弹窗只会造成点击疲劳。不可覆盖政策、最小权限和目标系统鉴权必须先成立,审批再处理具体高风险动作。

失败五:工具错误返回整段自然语言

Agent难以区分可重试、参数错误和部分完成。返回稳定错误码、字段级诊断和恢复建议,同时脱敏内部信息。

失败六:忽视幂等和超时不确定性

调用超时不代表动作没发生。写工具使用幂等键、查询状态和明确重试语义。

失败七:信任 Server 返回文本

返回内容也是外部数据,可能过期、错误或恶意。标记来源,不允许它覆盖高优先级指令,并限制后续动作。

生产边界

MCP 连接生产数据时,应适用和其他应用集成相同的数据分类、身份、审计、保留和事件响应要求。客户数据和 Secret 不应因“Agent 需要上下文”获得例外。第三方 Server 必须经过供应链评估,版本固定,更新可回滚。

涉及资金、身份、删除、外发和生产部署的工具,默认由 Agent 提出计划和预览,人类或受控工作流批准。即使模型多次成功,也不能用历史表现替代权限边界。协议互通降低集成成本,不降低业务责任。

实践清单

  • [ ] 明确 Host、Client、Server 与目标系统的责任边界。
  • [ ] 区分 Tools、Resources、Prompts 和它们的风险。
  • [ ] 优先复用可靠 CLI/API,再判断是否需要 MCP。
  • [ ] 按任务和身份只暴露最小工具集。
  • [ ] 工具名称、描述、输入和错误都使用稳定 Schema。
  • [ ] 写操作提供幂等、Dry Run、影响预览和恢复语义。
  • [ ] 权限由目标系统强制,凭据短期且 Scope 最小。
  • [ ] 外部内容与工具返回统一视为不可信数据。
  • [ ] 审计记录用户、任务、Server 版本、参数范围和结果。
  • [ ] 使用契约测试、攻击测试和真实轨迹度量工具质量。

读完之后,你应该能完成什么

  • 能解释 MCP 能做什么以及不能替代什么。
  • 能判断现有 CLI 是否值得包装成 MCP。
  • 能为工具调用画出身份与信任边界。
  • 能用最小充分工具集减少误选和破坏半径。

如果只能复述概念,却不能完成上述动作,说明还没有把内容转化成工程能力;可以回到对应机制图、失败模式和实践清单重新核对。

小结

MCP 的重要价值是让 AI Host 以标准方式发现和连接能力,但可靠性来自协议之外的工程设计。一个好工具既让模型容易选对,也让服务端能拒绝错误;既提供足够上下文,也不泄露多余数据;既支持自动化,又把高风险决定留在明确权限和责任链中。连接更多系统不是目标,建立可控、可验证的操作面才是。

参考资料

别急,先让缓存热一下。