MCP 与 A2A 实战指南:企业如何搭建可观测、可治理的多智能体系统

技术工程MCPA2A多智能体可观测性权限治理云部署2026-10-06

客服团队把 6 个内部系统接给 Agent 后,常见故障是同一工单被两个 Agent 重复处理,工具调用还可能读到财务表。模型换了几轮,问题依旧。协议边界、权限校验和审计记录缺一块,故障就会从模型层漏到业务层。2026 年做多 Agent 项目,MCP 管 Agent 到工具/数据源的连接,A2A 管 Agent 之间的任务协作。两套协议一起用,才需要注册、权限、编排、可观测、成本控制这几层。

1. MCP 与 A2A:先分清谁连工具,谁连 Agent

MCP 的通信模型是客户端-服务器。Host(IDE、聊天客户端、企业 Agent 运行时)里跑 MCP Client,连接到 MCP Server。Server 暴露 tools、resources、prompts。传输常用 stdio 和 Streamable HTTP。JSON-RPC 2.0 是消息格式。

A2A 的通信模型是对等 Agent。每个 Agent 发布 Agent Card,其他 Agent 发现后发任务,任务有状态和产物。传输是 HTTP 上的 JSON-RPC 2.0,流式用 SSE。适合跨团队、跨厂商、跨运行时的 Agent 协作。

维度MCPA2A
解决的问题Agent 调用工具、读资源、取提示模板Agent 之间派发任务、交换产物
发现方式Server 能力列表Agent Card,常见路径 /.well-known/agent.json(以所用版本为准)
消息格式JSON-RPC 2.0JSON-RPC 2.0
传输stdio、Streamable HTTPHTTP(S)、SSE
状态会话、工具调用结果Task 生命周期、Artifact、Message
权限OAuth 2.1 资源服务器、scope、mTLSOAuth2/OIDC、Agent Card 签名、网关策略
典型入口订单查询、数据库只读、代码搜索退款审核 Agent、风控 Agent、跨部门工单 Agent
选择规则:工具和数据源用 MCP;需要另一个 Agent 做判断、走自己的模型和策略,用 A2A。把 A2A 当 MCP 用,会多一层网络和状态;把 MCP 当 A2A 用,做不了长任务和 Agent 间协商。

2. 工具注册、权限与审计:把工具当成生产 API

场景:财务 Agent 能调用 refund_order。如果工具端只信任 Agent 传来的 user_id,一个提示注入就能让 Agent 替别人退款。工具端必须自己校验身份和 scope。

注册表字段建议:

字段例子用途
tool_idorders.refund唯一标识,禁止同名覆盖
owner订单平台组出问题找谁
schemaJSON Schema参数强校验
data_classPII/财务/公开决定脱敏和隔离
scopesorders:refund最小权限
rate_limit10/min防刷和防循环
audit_fieldsorder_id, amount, operator审计可查
approvalamount>5000 人工高风险拦截
权限检查放在工具网关,不放在 Agent 提示词里。提示词可以被绕过,网关不会。Agent 身份用短期凭证,绑定租户和用户。生产数据库凭证不要进 Agent 环境变量。

审计日志至少记:trace_id、agent_id、tool_name、参数摘要(脱敏)、结果状态、耗时、审批人、策略版本。参数不要全量存,尤其是身份证、手机号、地址。需要对账时用哈希或 token 关联。

执行清单:

  • 每个工具写清 owner、数据分级、scope
  • JSON Schema 校验入参和出参
  • 高风险工具接审批队列
  • 审计日志写不可篡改存储,保留期按合规要求
  • 每季度轮换凭证,清理离职人员权限

3. 多 Agent 编排与状态管理:任务 ID 是主线

常见编排模式:

  • Supervisor:主管 Agent 拆任务,分给专业 Agent。适合客服、运维。
  • Pipeline:固定顺序,前一个产物是后一个输入。适合文档处理、审单。
  • Handoff:当前 Agent 判断自己处理不了,转给另一个 Agent。适合跨部门。
  • Blackboard:多个 Agent 读写共享状态。适合研究、诊断,但冲突最多。
状态分三层:会话状态放 Redis,任务状态放 Postgres,大文件放对象存储。每个任务生成 task_id,所有工具调用和 A2A 消息都带这个 ID。重试必须幂等,否则一次网络抖动可能退两次款。

sequenceDiagram participant U as 用户 participant S as Supervisor Agent participant A as 订单 Agent participant B as 风控 Agent (A2A) participant DB as 任务状态库 participant L as 审计日志

U->>S: 退款申请 S->>DB: 创建 task_id S->>A: 查订单 (MCP tool) A->>L: 审计 tool_call A-->>S: 订单信息 S->>B: 风控审核 (A2A) B->>DB: 更新子任务状态 B-->>S: 审核结果 + Artifact S->>A: 执行退款 (MCP tool, 幂等键) A->>L: 审计 tool_result S-->>U: 结果

控制循环:最大步数、最大 token 预算、最大墙钟时间。超限后停止并转人工。A2A 长任务用推送通知,少用轮询。

4. 可观测性与评测:先能追一次任务,再谈准确率

可观测性三件套:日志、指标、链路追踪。OpenTelemetry 可以传播 traceparent。MCP 和 A2A 都走 HTTP/JSON-RPC,网关和 Agent 运行时都能埋点。

关键指标:

指标定义用途
任务成功率完成且通过校验的任务/总任务看整体
P95 延迟从用户请求到最终产物看体验
工具错误率工具调用失败/总调用看集成
越权拒绝率拒绝的调用/总调用看攻击和配置
每任务成本token+工具+云资源看预算
人工升级率转人工任务/总任务看自治边界
循环触发次数同一 task_id 重复调用看死循环
评测用离线回放:把历史任务脱敏后回放,比较新旧版本。黄金集覆盖正常、边界、越权、工具超时、A2A 对方不可用。LLM-as-judge 适合粗筛,人工抽检校准。灰度发布时按 `agent_id` 和租户切流。

5. 云上部署与成本优化:控制面常驻,执行面弹性

部署形态:

  • Serverless:适合短任务、突发流量。注意 Streamable HTTP 有状态会话,冷启动要外置会话。
  • 容器/K8s:适合长连接、GPU、内网工具。HPA 按队列长度扩,不只看 CPU。
  • 混合:控制面常驻,执行面 Serverless。A2A Agent 用网关统一鉴权和 Agent Card 发现。
成本优化动作:

成本项动作风险
模型 token小模型分类,大模型规划;上下文压缩;缓存工具结果缓存过期导致错误
云函数并发上限、预留实例只给关键路径预留过多闲置
存储日志采样,冷热分层采样过多漏审计
网络同区域部署,减少跨区调用可用性下降
Agent 循环步数/预算熔断过早停止影响复杂任务
预算熔断按 task_id 和租户双维度。超预算不是直接失败,先降级到小模型或转人工。

6. 代码示例与避坑清单

MCP 工具注册伪代码(Python,按 SDK 版本调整):

from mcp.server.fastmcp import FastMCP, Context
import logging

mcp = FastMCP("order-tools") audit = logging.getLogger("audit")

def require_scope(ctx: Context, scope: str): # 从网关注入的 token claims 读取,示例用 meta scopes = set(getattr(ctx.request_context, "meta", {}).get("scopes", [])) if scope not in scopes: audit.warning({"event": "tool_denied", "scope": scope}) raise PermissionError(f"missing scope: {scope}")

@mcp.tool() async def refund_order(order_id: str, amount: float, reason: str, ctx: Context) -> dict: require_scope(ctx, "orders:refund") if amount <= 0 or amount > 5000: return {"ok": False, "error": "amount_out_of_policy"} # 幂等键用 order_id + amount,调用内部订单服务 result = await call_order_service(order_id, amount, reason, idempotency_key=f"{order_id}:{amount}") audit.info({ "event": "tool_call", "tool": "orders.refund", "order_id": order_id, "amount": amount, "ok": result["ok"], }) return result

A2A Agent Card 示例:

{
  "name": "refund-agent",
  "description": "退款审核 Agent,处理订单校验和额度检查",
  "url": "https://你的-A2A-网关域名/a2a/refund",
  "version": "1.0.0",
  "capabilities": {
    "streaming": true,
    "pushNotifications": true
  },
  "defaultInputModes": ["application/json"],
  "defaultOutputModes": ["application/json"],
  "skills": [
    {
      "id": "refund-review",
      "name": "退款审核",
      "description": "校验订单、风控和退款额度",
      "tags": ["refund", "risk"],
      "examples": ["订单 A123 退款 200 元"]
    }
  ]
}

避坑清单:

  • 把 MCP 当 A2A 用,工具调用代替不了 Agent 协商。
  • Agent Card 写内网 IP 或数据库地址。
  • 只在 Agent 提示词里写“不要越权”,工具端不校验。
  • 审计日志存完整 prompt,泄露 PII。
  • 退款、发邮件、删数据没有幂等键。
  • 会话状态放 Pod 内存,重启后任务卡死。
  • 没有最大步数,Agent 循环调用工具。
  • 评测只看 LLM 打分,不做人工抽检。
  • Serverless 里跑长连接 SSE,超时断线丢事件。
  • SDK 版本不锁,schema 升级后旧 Agent 调不通。
下一步:从团队里选一个只读工具,按第 2 节的注册表补 owner、schema、data_class、scope,在网关加审计日志和 trace_id。跑一周,看越权拒绝率和工具错误率,再决定要不要接第二个工具。

参考:MCP 官方文档 https://modelcontextprotocol.io,A2A 项目站 https://a2a-protocol.org。链接和规范版本可能变化,部署前以官方仓库为准。本文代码为示例,需按企业安全规范和所用 SDK 版本调整。

PREMIUM

需要完整版教程?

包含详细步骤、视频演示、提示词模板和可下载资料包。微信支付即时获取。

购买完整版 ¥29.90