真实面经题目 · 原创解析
MCP、Function Call 和 A2A 在 Agent 系统中分别解决什么边界,如何协同?
这题考 Agent 系统的协议和责任边界。Function Call 解决模型到宿主工具调用意图的结构化表达,MCP 解决宿主和外部工具/资源服务之间的标准化连接,A2A 解决 Agent 与 Agent 之间的任务委托和协作。三者层级不同,不能混成同一个概念。
真实面经题目 · 原创解析
这题考 Agent 系统的协议和责任边界。Function Call 解决模型到宿主工具调用意图的结构化表达,MCP 解决宿主和外部工具/资源服务之间的标准化连接,A2A 解决 Agent 与 Agent 之间的任务委托和协作。三者层级不同,不能混成同一个概念。
我会把它们放在同一条调用链里解释。Function Call 是模型输出层的能力:模型根据上下文选择某个工具名,并生成符合 schema 的参数,它解决的是自然语言意图如何变成结构化调用请求,但它本身不负责发现工具、执行工具、鉴权或跨进程通信。MCP 更像 Agent 宿主连接工具和上下文资源的协议边界:宿主作为 client,连接一个或多个 MCP server,获取工具、资源或提示能力,并用标准协议完成调用、返回结果和上下文注入。它解决的是工具生态标准化、能力发现、资源访问和运行时隔离,而不等同于模型的 function calling。A2A 则是更高一层的 Agent-to-Agent 边界:当一个 Agent 不是调用一个确定性工具,而是把任务委托给另一个具备目标理解、规划、工具使用和状态管理能力的 Agent 时,需要协议来描述任务、消息、产物、状态、权限和完成条件。协同时可以是:主 Agent 通过 Function Call 决定需要某个能力;这个能力可能由 MCP server 暴露为工具;如果任务需要另一个专业 Agent 自主完成,就通过 A2A 发起任务委托,等待它返回中间状态或最终产物。设计时要明确谁负责规划、谁负责执行、状态归谁、权限在哪里校验、错误如何返回、trace 如何贯通。简单本地函数不必上 MCP,确定性 API 不必包装成 A2A,只有跨工具生态或跨 Agent 协作复杂到需要标准边界时才引入对应协议。
Function Call、MCP 和 A2A 不是同一层的替代品。Function Call 面向模型输出和宿主调度,MCP 面向宿主和工具/资源服务连接,A2A 面向不同 Agent 之间的任务协作。把层级讲清楚,才能解释它们为什么可以协同而不是互相替代。
Function Call 的核心是让模型在生成文本之外,输出工具名和结构化参数。它依赖 schema、工具描述和宿主执行器。模型负责选择和填参,宿主负责校验、鉴权、执行、重试和把结果放回上下文。它不天然提供工具发现、网络协议、资源目录或跨服务生命周期管理。
MCP 关注的是 Agent 宿主如何连接外部能力提供方。一个 MCP server 可以暴露 tools、resources、prompts 等能力,宿主通过 client 协议发现和调用。它的价值在于标准化工具接入、降低集成成本、把文件系统、数据库、浏览器、业务 API 等能力放在更清楚的边界后面。
A2A 面向的不是调用一个函数,而是把一个任务交给另一个 Agent。被调用方可能会自己规划、调用工具、维护状态、产生产物并汇报进度。因此 A2A 需要表达任务目标、输入上下文、能力描述、状态流转、产物引用、取消/超时、权限和责任归属。
一个典型链路是:主 Agent 先用模型判断下一步;模型通过 Function Call 生成结构化调用;宿主发现这个工具来自某个 MCP server,于是执行 MCP 调用;如果需要专业 Agent 自主完成子任务,则宿主或主 Agent 通过 A2A 委托。每一层都要明确决策者、执行者和返回结果的格式。
Function Call 参数必须由宿主校验,不能因为模型输出合法 JSON 就直接执行。MCP server 需要权限范围、资源隔离、审计和超时。A2A 更要明确对方 Agent 的身份、可见上下文、可调用能力和产物可信度。越往外部协作,信任边界越大,越需要授权和可追踪。
Function Call 常见状态是一次调用成功或失败;MCP 还涉及连接、能力列表、资源读取和工具结果;A2A 往往有任务创建、进行中、等待输入、失败、取消和完成等生命周期。错误也要区分参数错误、权限不足、工具失败、Agent 拒绝、任务超时和结果不可验证。
如果只是进程内确定性函数,直接 function calling 加本地 executor 就够了。如果只是接一个稳定业务 API,可以通过普通 tool 或 MCP server 暴露,不必包装成 Agent。只有当对方能力需要标准工具生态、跨运行时连接或自主任务协作时,MCP 或 A2A 才体现价值。
Function Call 是模型输出工具调用意图的格式,重点在工具名和参数;MCP 是宿主连接外部工具和资源服务的协议,重点在能力发现、调用通道和运行时边界。模型可以通过 Function Call 选择一个由 MCP 暴露的工具,但两者不是一回事。
工具函数通常是确定性能力,输入参数后返回结果;A2A 的对方是 Agent,可能会自己理解目标、拆任务、调用工具、维护状态并返回阶段性产物。A2A 更像任务委托,而不是一次函数执行。
可以把发起 A2A 委托这个动作暴露成一个工具,让模型用 Function Call 触发。但被触发后的生命周期、状态流、权限和产物管理仍属于 A2A 边界,不能因为入口是 Function Call 就把它简化成普通函数。
如果工具只在当前进程内使用,数量少、权限简单、没有跨客户端复用需求,直接本地 executor 更简单。MCP 更适合工具要被多个宿主复用、需要标准发现和资源访问边界、或工具运行在独立服务中的场景。
常见风险是模型生成参数未经校验直接执行、MCP server 暴露过宽资源、A2A 委托泄露过多上下文、外部 Agent 返回结果未经验证,以及缺少 trace 导致越权和错误无法追溯。