客服团队把 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 协作。
| 维度 | MCP | A2A |
|---|---|---|
| 解决的问题 | Agent 调用工具、读资源、取提示模板 | Agent 之间派发任务、交换产物 |
| 发现方式 | Server 能力列表 | Agent Card,常见路径 /.well-known/agent.json(以所用版本为准) |
| 消息格式 | JSON-RPC 2.0 | JSON-RPC 2.0 |
| 传输 | stdio、Streamable HTTP | HTTP(S)、SSE |
| 状态 | 会话、工具调用结果 | Task 生命周期、Artifact、Message |
| 权限 | OAuth 2.1 资源服务器、scope、mTLS | OAuth2/OIDC、Agent Card 签名、网关策略 |
| 典型入口 | 订单查询、数据库只读、代码搜索 | 退款审核 Agent、风控 Agent、跨部门工单 Agent |
2. 工具注册、权限与审计:把工具当成生产 API
场景:财务 Agent 能调用 refund_order。如果工具端只信任 Agent 传来的 user_id,一个提示注入就能让 Agent 替别人退款。工具端必须自己校验身份和 scope。
注册表字段建议:
| 字段 | 例子 | 用途 |
|---|---|---|
| tool_id | orders.refund | 唯一标识,禁止同名覆盖 |
| owner | 订单平台组 | 出问题找谁 |
| schema | JSON Schema | 参数强校验 |
| data_class | PII/财务/公开 | 决定脱敏和隔离 |
| scopes | orders:refund | 最小权限 |
| rate_limit | 10/min | 防刷和防循环 |
| audit_fields | order_id, amount, operator | 审计可查 |
| approval | amount>5000 人工 | 高风险拦截 |
审计日志至少记:trace_id、agent_id、tool_name、参数摘要(脱敏)、结果状态、耗时、审批人、策略版本。参数不要全量存,尤其是身份证、手机号、地址。需要对账时用哈希或 token 关联。
执行清单:
- 每个工具写清 owner、数据分级、scope
- JSON Schema 校验入参和出参
- 高风险工具接审批队列
- 审计日志写不可篡改存储,保留期按合规要求
- 每季度轮换凭证,清理离职人员权限
3. 多 Agent 编排与状态管理:任务 ID 是主线
常见编排模式:
- Supervisor:主管 Agent 拆任务,分给专业 Agent。适合客服、运维。
- Pipeline:固定顺序,前一个产物是后一个输入。适合文档处理、审单。
- Handoff:当前 Agent 判断自己处理不了,转给另一个 Agent。适合跨部门。
- Blackboard:多个 Agent 读写共享状态。适合研究、诊断,但冲突最多。
task_id,所有工具调用和 A2A 消息都带这个 ID。重试必须幂等,否则一次网络抖动可能退两次款。
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 重复调用 | 看死循环 |
5. 云上部署与成本优化:控制面常驻,执行面弹性
部署形态:
- Serverless:适合短任务、突发流量。注意 Streamable HTTP 有状态会话,冷启动要外置会话。
- 容器/K8s:适合长连接、GPU、内网工具。HPA 按队列长度扩,不只看 CPU。
- 混合:控制面常驻,执行面 Serverless。A2A Agent 用网关统一鉴权和 Agent Card 发现。
| 成本项 | 动作 | 风险 |
|---|---|---|
| 模型 token | 小模型分类,大模型规划;上下文压缩;缓存工具结果 | 缓存过期导致错误 |
| 云函数 | 并发上限、预留实例只给关键路径 | 预留过多闲置 |
| 存储 | 日志采样,冷热分层 | 采样过多漏审计 |
| 网络 | 同区域部署,减少跨区调用 | 可用性下降 |
| Agent 循环 | 步数/预算熔断 | 过早停止影响复杂任务 |
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 调不通。
参考:MCP 官方文档 https://modelcontextprotocol.io,A2A 项目站 https://a2a-protocol.org。链接和规范版本可能变化,部署前以官方仓库为准。本文代码为示例,需按企业安全规范和所用 SDK 版本调整。