MCP与Agent协作
5535 字约 18 分钟
AIAgentMCP
2026-07-24
MCP 为 Agent 提供了标准化的能力接入层,使 Agent 能够动态发现、选择和调用外部工具。本文聚焦 MCP 与 Agent 的协作机制——MCP 不是 Agent,而是 Agent 架构中的「能力管道」,理解两者的边界和配合方式是构建可靠 Agent 系统的关键。
一、基本定义
MCP(Model Context Protocol) 是一个开放协议,标准化了 AI 应用与外部工具/数据源的连接方式。MCP 本身不包含推理、规划或决策能力——它只负责暴露能力和传递调用。
Agent 是一个具备自主决策能力的 AI 系统,能够感知环境、制定计划、选择工具并执行任务。Agent 的核心是 LLM(大语言模型),它提供推理、规划和反思能力。
两者的关系可以简化为:
- Agent 是大脑:负责思考「做什么」和「为什么做」
- MCP 是手臂:负责执行「怎么做」和「做到什么」
Agent 通过 MCP Client 连接到一个或多个 MCP Server,在运行时动态发现和调用工具。这个协作过程不需要预先硬编码——Agent 在 协议初始化 阶段通过 tools/list 获取可用工具清单,然后根据任务需求自主选择。
二、核心区分:MCP ≠ Agent
这是最常见的认知误区。很多人把「能调用工具的 AI」等同于 Agent,但 MCP 和 Agent 的职责完全不同:
| 维度 | Agent | MCP |
|---|---|---|
| 核心职责 | 规划、推理、决策、编排 | 能力暴露、参数校验、调用转发 |
| 状态管理 | 维护任务状态、记忆、上下文 | 无状态(每次调用独立) |
| 决策能力 | 选择工具、判断结果、处理异常 | 无决策,只执行请求 |
| 错误处理 | 判断是否重试、换工具、求助人类 | 返回错误码和错误信息 |
| 目标理解 | 理解用户意图,拆解子任务 | 不理解目标,只处理参数 |
一个直观的类比:Agent 是厨师,MCP 是厨房里的各种工具(刀、锅、烤箱)。刀不会自己决定切什么菜,烤箱不会自己决定烤什么——是厨师在规划和决策。
三、Agent 循环中的 MCP
Agent 执行任务遵循经典的 ReAct(Reasoning + Acting) 循环。MCP 在这个循环中扮演的角色是工具执行通道:
3.1 规划器(Planner)
Agent 收到用户目标后,LLM 进行推理,将目标分解为可执行的子任务序列。规划阶段不涉及 MCP 调用——这是纯推理过程。
例如用户说「帮我查一下上周 GitHub 上的新 issue 并整理成报告」,Planner 可能分解为:
- 查询指定仓库的 issue 列表
- 筛选上周创建的 issue
- 按标签分类
- 生成摘要报告
3.2 工具选择(Tool Selection)
Agent 根据当前子任务,从已发现的工具列表中选择最合适的工具。选择依据来自 Tool 的描述信息(description)和参数结构(inputSchema)。
这一步完全由 LLM 驱动——模型根据 tool description 判断哪个工具最适合当前需求。这也是为什么 Tool 描述的质量直接影响 Agent 的工具选择准确率。
3.3 工具执行(Tool Execution via MCP)
Agent 生成 tool_call,由 MCP Client 序列化为 JSON-RPC 请求,发送给对应的 MCP Server。执行过程:
- Agent 输出
tool_call(包含 tool name 和 arguments) - Host 将
tool_call交给 MCP Client - MCP Client 通过 传输层 发送到目标 Server
- Server 执行实际操作并返回结果
- MCP Client 将结果返回给 Host
- Host 将结果作为
tool_result注入 LLM 上下文
3.4 结果观察(Observation)
工具返回的结果成为 Agent 的新观察。Agent 需要解析结果、判断是否有效、提取关键信息,然后决定下一步行动。
观察结果的质量取决于:
- Server 返回的
content结构是否清晰 - 错误信息是否有足够的上下文
- 结果数据量是否在 LLM 上下文窗口范围内
3.5 反思与重试(Reflection and Retry)
如果工具执行失败或结果不符合预期,Agent 进入反思阶段:
- 失败重试:参数错误 → 修正参数后重新调用
- 换工具:当前工具不适合 → 选择另一个工具
- 降级策略:工具不可用 → 使用替代方案或告知用户
- 求助人类:超出能力范围 → 触发 Human-in-the-loop
四、协作闭环
完整的 Agent-MCP 协作流程如下:
这个循环有几个关键特征:
- 迭代性:一次规划不一定完成任务,可能需要多轮工具调用
- 动态性:每一轮的工具选择都基于最新的观察结果
- 可中断性:循环中的任何一步都可以因错误、超时或人工干预而中断
五、记忆和上下文
Agent 的记忆系统与 MCP 的交互是一个容易被忽视但极其重要的话题:
短期上下文(Working Memory):当前任务链中的所有 tool_call 和 tool_result 都保存在 LLM 的对话上下文中。随着工具调用次数增加,上下文会快速膨胀。需要注意:
- 工具结果可能包含大量原始数据(如整个文件内容),需要做截断或摘要
- 多轮 MCP 调用的历史会占用 context window,影响推理质量
- 建议 Agent 在每轮结束后提取关键信息,而非保留全部原始结果
长期记忆(Long-term Memory):Agent 可以将之前的任务经验存储到外部记忆系统(如向量数据库),下次遇到类似任务时检索。这部分可以通过 MCP 的 Resource 能力 实现——将记忆系统作为 MCP Server 暴露。
上下文传递策略:
| 策略 | 适用场景 | 实现方式 |
|---|---|---|
| 全量保留 | 工具调用少、结果短 | 直接保留所有 tool_result |
| 摘要压缩 | 工具返回大量数据 | LLM 提取关键信息后替换原始结果 |
| 滑动窗口 | 长任务链 | 只保留最近 N 轮的完整结果 |
| 外部存储 | 跨会话任务 | 通过 MCP Resource 存取中间状态 |
六、权限和状态
MCP 本身是无状态的——每次工具调用独立,Server 不保存调用者的任务上下文。但 Agent 是有状态的,它需要管理:
权限边界:
状态管理:
- Agent 维护自己的任务状态机(pending → in_progress → waiting_confirmation → completed / failed)
- MCP Server 的状态(如数据库连接、文件锁)对 Agent 是透明的
- Agent 需要处理 Server 端的状态变化(如资源被其他进程修改)
会话隔离:
- 不同用户任务的 MCP 调用应该隔离
- 同一 Agent 处理多个任务时,需要区分不同任务的工具调用上下文
七、长任务处理
当 Agent 的任务需要大量工具调用时(如「遍历所有文件并生成索引」),会面临几个挑战:
上下文溢出:工具调用历史超出 LLM 的 context window。解决方案:
- 定期将中间结果摘要化
- 将子任务的中间状态写入外部存储(通过 MCP Tool 写入文件/数据库)
- 分阶段执行,每个阶段有明确的输入和输出
超时和重试:长时间运行的工具调用可能超时。Agent 需要:
- 区分「工具执行中」和「工具已失败」
- 支持异步调用模式(通过 协议扩展 或轮询)
- 设置合理的最大重试次数和总超时时间
进度反馈:长任务应该向用户提供进度反馈。Agent 可以在每轮循环结束后,将当前进度作为中间输出展示给用户。
八、多 Agent 和多 Server
复杂系统往往涉及多个 Agent 和多个 MCP Server 的协作:
多 Agent 架构:
在这种架构中,每个 Agent 有自己的 MCP Client 和工具集。Orchestrator Agent 负责任务分配,执行层 Agent 负责具体操作。
多 Server 管理:
- 一个 Agent 可以同时连接多个 MCP Server
- 每个 Server 提供不同领域的能力(如文件系统、数据库、API)
- Agent 需要知道「哪个 Server 提供哪个工具」——这通过 能力发现机制 实现
- 工具命名应该包含 Server 标识,避免跨 Server 的工具名冲突
九、工具冲突和能力路由
当多个 MCP Server 提供功能相似的工具时,Agent 面临工具选择冲突:
常见冲突场景:
- 两个 Server 都提供「搜索文件」工具,但搜索范围不同
- 多个数据库 Server 都能执行查询,但数据结构不同
- 同名工具在不同 Server 上语义不同
路由策略:
- 命名空间隔离:工具名使用
server_name__tool_name格式,避免冲突 - 描述差异化:每个工具的描述应该明确说明适用范围和限制
- 优先级配置:Agent 或 Host 可以配置工具优先级
- 上下文感知选择:Agent 根据当前任务上下文选择最合适的工具
能力注册表:Agent 在初始化阶段建立内部的能力注册表,记录每个工具的来源 Server、功能描述和适用场景。这类似于服务发现机制。
十、人在回路(Human-in-the-loop)
并非所有操作都应该由 Agent 自主完成。关键的人类介入点:
必须人工确认的操作:
- 写入/修改外部系统数据
- 发送消息或邮件
- 删除资源
- 涉及金额的操作
- 超出预设权限范围的操作
触发机制:
- Agent 在执行敏感工具前暂停,向用户展示即将执行的操作和参数
- 用户确认后才继续通过 MCP 执行
- 用户也可以修改参数或拒绝执行
实现方式:
Agent: 我需要调用 `filesystem__write_file` 修改 config.yaml
Agent: 操作内容: 修改端口配置从 3000 → 8080
Agent: [等待用户确认]
User: 确认执行
Agent: 继续执行 tool_call参考 MCP权限设计 中关于分级授权的详细设计。
十一、MCP 在 Agent 架构中的位置
在一个完整的 Agent 系统中,MCP 位于工具层,是 Agent 与外部世界交互的标准化接口:
┌─────────────────────────────────────────┐
│ 用户界面层 │
├─────────────────────────────────────────┤
│ Agent 核心层 │
│ ┌─────────┬──────────┬──────────┐ │
│ │ Planner │ Memory │ Policy │ │
│ └────┬────┴────┬─────┴────┬─────┘ │
│ │ LLM 推理引擎 │ │
├───────┼────────────────────┼────────────┤
│ │ MCP Client 层 │ │
│ ┌────┴────┐ ┌────┴────┐ │
│ │ Client A│ │ Client B│ │
│ └────┬────┘ └────┬────┘ │
├───────┼────────────────────┼────────────┤
│ │ MCP Server 层 │ │
│ ┌────┴────┐ ┌────┴────┐ │
│ │Server A │ │Server B │ ... │
│ │(Files) │ │(GitHub) │ │
│ └─────────┘ └─────────┘ │
└─────────────────────────────────────────┘MCP 不包含 Agent 核心层的任何逻辑。它只做三件事:
- 暴露工具清单(
tools/list) - 接收调用请求(
tools/call) - 返回执行结果
十二、Agent 错误 vs Tool 错误的区分
正确区分错误来源是 Agent 做出正确决策的前提:
| 错误类型 | 来源 | 示例 | Agent 应对策略 |
|---|---|---|---|
| Tool 错误 | MCP Server | 文件不存在、API 超时、权限不足 | 修正参数、换工具、报告用户 |
| Agent 错误 | LLM 推理 | 选错工具、误解任务、逻辑错误 | 反思、重新规划、换策略 |
| 协议错误 | MCP 传输层 | 连接断开、消息格式错误 | 重连、降级、报告 |
| 系统错误 | Host 环境 | 内存不足、配置错误 | 终止任务、报告用户 |
Agent 需要从 tool_result 的 isError 字段和错误信息中判断错误类型,然后采取不同的处理策略。参考 MCP错误处理 了解错误分类和最佳实践。
十三、工具结果如何进入下一轮推理
工具返回的结果通过以下路径进入 Agent 的下一轮推理:
- MCP Server 返回
CallToolResult(包含content数组和isError标志) - MCP Client 将结果传递回 Host
- Host 将结果封装为对话消息中的
tool_result类型消息 - LLM 在下一轮推理时看到完整的
tool_result,包括:- 调用的是哪个工具
- 传入的参数是什么
- 返回了什么内容
- 是否出错
关键设计点:
- 工具结果的格式和详细程度直接影响 LLM 的推理质量
- 过长的结果需要截断或摘要,否则会挤占推理空间
- 错误结果应该包含足够的上下文信息(「什么操作」「什么参数」「为什么失败」)
- 结构化数据(JSON)比非结构化文本更容易被 LLM 正确解析
十四、任务终止条件
Agent 需要明确的条件来判断何时停止工具调用循环:
正常终止:
- 任务目标已达成(Agent 自主判断)
- 所有子任务都已完成
- 最终结果已生成并返回用户
异常终止:
- 达到最大工具调用轮次(如 20 轮)
- 累计超时超过阈值
- 连续 N 次相同错误(死循环检测)
- 用户主动取消
挂起等待:
- 需要人类确认
- 等待异步操作完成
- 依赖外部事件触发
十五、常见问题
15.1 模型误选工具
现象:Agent 选择了功能不匹配的工具。比如用「读文件」工具去执行「搜索文件」的操作。
原因:工具描述不够精确,或者多个工具的描述过于相似。
解决:
- 优化工具 description,明确说明「这个工具做什么」和「这个工具不做什么」
- 在描述中加入使用场景示例
- 参考 MCP能力设计指南 中的描述编写规范
15.2 循环调用
现象:Agent 反复调用同一工具,传入相似参数,得不到预期结果却不换策略。
原因:Agent 没有有效的失败检测机制,或者工具返回的错误信息不够明确。
解决:
- Agent 层面设置最大重复调用次数
- 工具返回的错误信息应包含建议的修正方向
- 检测到循环后强制 Agent 换策略或上报
15.3 工具结果不可信
现象:工具返回了错误的数据,Agent 却基于错误数据继续推理。
原因:Agent 默认信任工具结果,没有验证机制。
解决:
- 关键操作的结果应该有交叉验证(用另一个工具验证)
- Agent 对异常结果保持怀疑(如文件内容明显不合理)
- 工具应该返回数据校验信息(如 checksum、数据时间戳)
15.4 工具描述诱导
现象:工具描述中的某些措辞导致 Agent 在不合适的场景下调用该工具。
原因:描述中的关键词触发了 LLM 的模式匹配,但实际功能不匹配。
解决:
- 描述应该准确而非「吸引人」
- 加入限制条件说明(如「仅适用于 JSON 格式」「不支持大于 10MB 的文件」)
- 使用负面示例说明不适用场景
15.5 权限越界
现象:Agent 调用了超出当前用户权限的工具或操作。
原因:MCP Server 的权限检查不完善,或 Agent 没有被正确配置可用工具范围。
解决:
15.6 多 Agent 并发冲突
现象:多个 Agent 同时操作同一资源,导致数据不一致。
原因:MCP Server 默认无状态,不处理并发冲突。
解决:
- Server 端实现乐观锁或悲观锁机制
- Agent 层面的任务分配应避免资源竞争
- 使用 Orchestrator 模式协调多 Agent 的操作顺序
十六、设计原则
构建可靠的 Agent-MCP 协作系统应遵循以下原则:
- 职责分离:Agent 负责决策,MCP 负责执行。不要让 Server 包含业务逻辑判断。
- 最小权限:每个 Agent 只连接必要的 MCP Server,只暴露需要的工具。
- 描述即文档:工具描述是 Agent 选择工具的唯一依据,必须准确、完整、无歧义。
- 结果可解析:工具返回结果应结构化,方便 Agent 解析和推理。
- 失败快速:工具应该在失败时快速返回明确的错误信息,而非长时间挂起。
- 幂等优先:设计工具时优先考虑幂等性,降低 Agent 重试的风险。
- 人在关键路径:高风险操作必须经过人类确认。
- 可观测性:Agent 的每次工具调用都应该有日志,方便调试和审计。参考 MCP调试与诊断。
十七、常见误区
| 误区 | 正确理解 |
|---|---|
| MCP 就是 Agent 框架 | MCP 只是工具接入协议,不包含 Agent 逻辑 |
| 工具越多 Agent 越强 | 工具过多反而降低选择准确率,应精选工具集 |
| Agent 可以无限调用工具 | 每轮调用都消耗 context window 和 token,需要控制 |
| MCP Server 应该有智能 | Server 应该「笨」——只做执行,不做判断 |
| 工具结果 Agent 都能理解 | 结果格式不当会导致 Agent 误读,需要精心设计 |
| 多 Agent 一定比单 Agent 好 | 多 Agent 增加了协调复杂度和通信成本 |
| MCP 能解决所有集成问题 | MCP 解决的是「连接标准化」,不是「业务逻辑」 |
十八、实践检查清单
设计 Agent-MCP 协作系统时,逐项检查:
工具设计
Agent 设计
安全设计
运维设计
十九、关联笔记
MCP 核心概念:
- MCP基础 — 协议基本定义和核心概念
- MCP架构总览 — Host/Client/Server 三层架构详解
- MCP Tool能力 — Tool 的设计规范和最佳实践
- MCP协议生命周期 — 初始化、通信和关闭流程
MCP 设计与实现:
- MCP Server设计 — Server 端的设计模式
- MCP Client设计 — Client 端的实现要点
- MCP能力设计指南 — 工具描述和参数设计
- MCP能力发现 — 动态发现和注册机制
- MCP资源模型 — Resource 能力详解
安全和运维:
扩展阅读:
- MCP与GitHub — GitHub 集成的 Agent 场景
- MCP与本地知识库 — 知识库场景的 Agent 协作
- MCP项目实践 — 完整项目案例