MCP + A2A 双协议时代:2026 AI Agent 互操作标准全景解析
前言:当 Agent 们终于学会「打电话」
2025 年之前,AI Agent 领域最大的笑话是什么?
是你同时跑了三个 Agent——一个帮你查资料,一个帮你写代码,一个帮你发邮件——然后发现它们三个之间完全不知道彼此的存在。你,作为中间的人类,成了它们的「人肉总线」,来回复制粘贴信息。
这不叫 Agent,这叫三个互相听不懂对方语言的外国人关在同一个房间里。
2026 年,局面终于变了。
两件事彻底改变了游戏规则:MCP(Model Context Protocol) 和 A2A(Agent-to-Agent Protocol)。一个是让 Agent 连接世界的「USB-C 接口」,一个是让 Agent 之间互相打字的「TCP/IP 协议」。它们联手,宣告了 AI Agent 互操作时代的正式到来。
本文将用工程师的视角,深度拆解这两个协议的设计哲学、核心架构、代码实战,以及它们在 2026 年初的最新演进方向。
一、为什么 AI Agent 时代必须要有协议层?
1.1 困境:一个 Agent 一套集成,集成到崩溃
在 MCP 出现之前,给大模型接入一个外部工具,意味着为每个模型单独写一套适配代码。OpenAI 有 Function Calling,Anthropic 有 Tool Use,Google 有 Grounding with Google,Meta 有另一套……每换一个大模型,上一套工具集成全部推翻重来。
开发者们管这叫「烟囱式集成」——每个工具像一根烟囱,各自独立冒烟,互不相通。
这带来了三个根本性问题:
第一,重复劳动极高。 同一个 API(比如查天气),需要为 Claude 写一版,为 GPT 写一版,为 Gemini 再写一版。三套代码,三套测试,三套 bug。
第二,工具生态割裂。 某公司为 Claude 开发了一套很棒的代码审查工具,GPT 用户用不了。这就是生态锁定的代价。
第三,可靠性无保证。 每个工具集成的质量参差不齐,缺乏统一的规范约束。
1.2 行业共识:协议层是必经之路
回顾计算机发展史,每次重大生态爆发前夜,都会经历类似的「协议涌现期」:
- USB 协议出现前,外设和电脑之间的连接混乱不堪
- TCP/IP 确立前,不同网络之间老死不相往来
- REST API 规范流行前,每个 Web 服务各自为政
AI Agent 时代同样如此。2024 年底,Anthropic 推出 MCP;2025 年 4 月,Google 推出 A2A。两条技术路线的快速收敛,绝非巧合——这是行业共同焦虑后的集体选择。
二、MCP:让 AI 模型连接一切的工具协议
2.1 什么是 MCP
MCP 全称 Model Context Protocol(模型上下文协议),由 Anthropic 于 2024 年底推出,2025 年捐赠给 Linux 基金会旗下的 Agentic AI Foundation 维护。
它的定位非常清晰:AI 模型的「USB-C 接口」——一套协议,统一规范 AI 模型与外部工具、资源、数据源之间的交互方式。
截至 2026 年初,MCP 月 SDK 下载量已超过 9700 万次,生产环境中运行的 MCP 服务器超过 10,000 个。从 GitHub trending 到哈啰顺风车,越来越多的服务开始提供 MCP 接口。
2.2 MCP 的核心架构
MCP 协议采用了经典的 C/S 架构,但与传统 REST API 不同,它专为 LLM 交互场景设计,包含完整的双向通信机制。
┌─────────────────────────────────────────────────────┐
│ LLM Application │
│ (Claude / GPT / Gemini / Any Model) │
│ │ │
│ MCP Client (SDK) │
│ ┌─────────────────────────────────────────┐ │
│ │ Schema Registry │ Tool Discovery │ │
│ │ State Management │ Auth Handler │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ MCP Protocol │
│ (JSON-RPC 2.0 over SSE/stdio) │
│ │ │
│ ┌─────────────────────────────────────────┐ │
│ │ MCP Server │ │
│ │ ┌─────────┐ ┌──────────┐ ┌────────┐ │ │
│ │ │Resources│ │ Tools │ │Prompts │ │ │
│ │ └─────────┘ └──────────┘ └────────┘ │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
MCP 协议定义了三个核心能力抽象:
Resources(资源)——AI 可以读取的外部数据源。文件、数据库记录、API 返回……都是资源。资源通过 URI 标识,支持增量更新通知。
// MCP Resource 示例
{
"uri": "file:///project/config.json",
"name": "Project Config",
"mimeType": "application/json",
"description": "当前项目的配置文件"
}
Tools(工具)——AI 可以调用的外部动作。搜索、发送邮件、执行 SQL、调用 CI/CD……工具通过 JSON Schema 声明接口规范,AI 可以自主决定何时调用。
// MCP Tool 定义示例
{
"name": "search_github",
"description": "在 GitHub 仓库中搜索代码",
"inputSchema": {
"type": "object",
"properties": {
"repo": {
"type": "string",
"description": "仓库地址,格式 owner/repo"
},
"query": {
"type": "string",
"description": "搜索关键词"
},
"language": {
"type": "string",
"enum": ["python", "go", "rust", "typescript"],
"description": "按编程语言筛选"
}
},
"required": ["repo", "query"]
}
}
Prompts(提示模板)——可复用的提示词模板,供 AI 在特定场景下直接调用。
2.3 传输层:从 stdio 到 SSE,再到无状态请求
MCP 协议的传输层经历了三次重大演进,这也是 2026 年初最新的技术焦点。
阶段一:本地 stdio(2024 年底)
最初的 MCP 服务器通过标准输入输出(stdio)通信,适合本地进程场景。Claude Desktop、Cline 等工具的本地 MCP 扩展都采用这种方式。
优点:零网络开销,调试简单
缺点:只能本地使用,无法远程共享
阶段二:SSE + HTTP(2025 年)
为解决远程调用问题,MCP 增加了 Server-Sent Events(SSE)传输机制。MCP 服务器可以部署在远程,通过 HTTP POST + SSE 建立双向通信。
# Python MCP Server 示例(使用 FastMCP 框架)
from fastmcp import FastMCP
mcp = FastMCP("我的工具集")
@mcp.tool()
def search_code(query: str, language: str = "python") -> list[dict]:
"""在 GitHub 中搜索代码片段"""
# 实际业务逻辑
return [{"file": "src/main.py", "matches": [...]}]
@mcp.resource("config://app")
def get_config() -> dict:
"""返回应用配置资源"""
return {"version": "1.0", "env": "production"}
# 启动服务器(自动选择 stdio 或 SSE)
mcp.run()
阶段三:SEP-1442 无状态请求(2026 年进行中)
这是 2026 年初 MCP 开发者峰会上最重磅的技术方向。
当前的 MCP 协议本质上是有状态的——客户端和服务器维护一个会话上下文。这在长时间运行的 Agent 场景中很有价值,但也带来了扩展性瓶颈:一个服务器能同时服务的 Agent 数量受限于内存中的会话数量。
SEP-1442 提案推动 MCP 从有状态会话转向无状态请求模式,类似于 HTTP 的无状态设计:
- 每个请求自带完整上下文
- 服务器无需维护会话状态
- 可以水平扩展,支持高并发场景
- 适合云原生部署和微服务架构
这一改变将使 MCP 真正成为企业级基础设施,而不仅仅是开发工具。
2.4 MCP 服务器生态图谱
2026 年的 MCP 生态已经相当丰富。以下是几个具有代表性的方向:
数据与存储类
iotdb-mcp-server(Apache IoTDB):时序数据库交互kubernetes-mcp-server:K8s 集群管理,支持 Helm 部署- 各主流数据库(PostgreSQL、MySQL、MongoDB)均有 MCP 适配器
搜索与数据获取
- GitHub MCP:仓库搜索、Issue 管理、PR 协作
- Brave Search MCP:隐私保护的网络搜索
- Brave Data MCP:大规模网页数据采集
业务与平台
- 哈啰顺风车 MCP:出行服务,AI 可以直接帮用户叫车
- Slack/飞书 MCP:企业协作平台集成
- Figma MCP:设计文件读取与标注
# 在 Claude Desktop 中配置 MCP 服务器
# 配置文件:~/.claude-desktop.json 或项目 .mcp.json
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx"
}
},
"kubernetes": {
"command": "docker",
"args": ["run", "-it", "--rm",
"-e", "KUBECONFIG=/path/to/config",
"manusa/kubernetes-mcp-server"],
"type": "docker"
}
}
}
2.5 MCP 的安全模型
MCP 协议在安全设计上下了不少功夫:
第一,工具执行需要用户确认。 默认情况下,AI 调用敏感工具(如发送邮件、执行 shell 命令)需要用户显式授权。
第二,OAuth 2.0 支持。 远程 MCP 服务器可以要求 OAuth 认证,防止未授权访问。
第三,资源作用域。 每个 MCP 服务器只能访问其声明范围内的资源,无法越界读取其他服务器的私有资源。
第四,Schema 约束。 工具的输入输出均有严格的 Schema 定义,AI 无法传入未声明的参数。
三、A2A:让 Agent 与 Agent 直接对话的通信协议
3.1 什么是 A2A
如果说 MCP 是「Agent 连接世界的接口」,那 A2A 就是「Agent 与 Agent 通信的标准语言」。
A2A(Agent-to-Agent Protocol) 由 Google 于 2025 年 4 月推出,2025 年 6 月捐赠给 Linux 基金会,由包括 Google、Microsoft、AWS、Cisco 在内的 八大厂商 共同组成技术指导委员会(TSC)。2026 年 3 月,协议已迭代至 v0.3.0 版本,预计 2026 年 Q4 发布 v1.0 稳定版。
A2A 解决的核心问题是:不同厂商、不同能力、不同平台部署的 AI Agent,如何互相发现、协商任务、协作完成复杂工作?
3.2 核心概念一:Agent Card
A2A 协议的基础是 Agent Card——每个 Agent 在网络上的「自我介绍名片」,包含能力声明和通信接口。
// Agent Card 示例
{
"name": "travel-planner-agent",
"description": "专业的旅行规划 Agent,支持机票、酒店、景点的一站式规划",
"url": "https://api.travel-agent.example.com/a2a",
"version": "1.0.0",
"capabilities": {
"streaming": true,
"longRunningTasks": true,
"pushNotifications": false
},
"defaultInputModes": ["text", "application/json"],
"defaultOutputModes": ["text", "application/json"],
"skills": [
{
"id": "flight-booking",
"name": "航班预订",
"description": "搜索和预订航班,支持多城市联程",
"tags": ["travel", "booking", "flights"],
"inputModes": ["application/json"],
"outputModes": ["application/json"]
},
{
"id": "hotel-recommendation",
"name": "酒店推荐",
"description": "基于用户偏好推荐酒店,含评分和价格对比",
"tags": ["travel", "hotels", "recommendation"],
"inputModes": ["text", "application/json"],
"outputModes": ["text", "application/json"]
}
]
}
Agent Card 通过 .well-known/agent.json 路径暴露,客户端可以通过 Agent 的基础 URL 自动发现其能力,无需提前配置。这解决了 Agent 互操作中的「能力发现问题」。
3.3 核心概念二:Task 生命周期
A2A 将跨 Agent 协作抽象为 Task(任务),每个任务有完整的状态生命周期:
SUBMITTED → WORKING → INPUT_REQUIRED → COMPLETED
↓ ↓
COMPLETED PARTIAL_COMPLETED
↓ ↓
FAILED CANCELED
SUBMITTED:客户端或上游 Agent 发起任务
WORKING:执行中
INPUT_REQUIRED:需要用户提供更多信息(阻塞等待)
COMPLETED:成功完成
PARTIAL_COMPLETED:部分完成
FAILED:执行失败
CANCELED:被取消
这种状态机设计让任务的追踪和恢复变得极为简单。即使 Agent 崩溃重启,也可以通过查询任务状态恢复执行上下文。
// Task 消息示例(任务提交)
{
"jsonrpc": "2.0",
"method": "tasks/send",
"params": {
"id": "task-uuid-12345",
"sessionId": "session-uuid-67890",
"message": {
"role": "user",
"parts": [
{
"type": "text",
"text": "帮我规划一个5天的东京行程,第3天要去浅草寺"
},
{
"type": "data",
"data": {
"budget": 15000,
"travelers": 2,
"startDate": "2026-05-01"
}
}
]
},
" PushNotification": {
"url": "https://callback.example.com/notify"
}
},
"id": 1
}
3.4 核心概念三:Skill 机制
Skill 是 A2A 协议中最精妙的设计之一。
在 MCP 中,工具是「被调用的函数」——你告诉 Agent 调什么,它就调什么。但在 A2A 中,Skill 是「能力的声明」——Agent 告诉你它能做什么,由对方 Agent 来判断如何组合。
这意味着,一个「旅行规划 Agent」不需要知道「酒店预订 Agent」的具体接口,只需知道它有 hotel-recommendation 这个 Skill,然后把用户需求通过 A2A 协议发送过去。
# A2A Client SDK 示例(伪代码)
import a2a
# 1. 发现 Agent 能力
registry = a2a.AgentRegistry.discover("https://api.hotel-agent.example.com")
hotel_agent = registry.get_agent("hotel-recommendation")
# 2. 发送任务
task = hotel_agent.create_task(
skill="hotel-recommendation",
input={
"destination": "东京",
"checkin": "2026-05-03",
"checkout": "2026-05-04",
"budget": 3000,
"preferences": ["near_station", "breakfast_included"]
}
)
# 3. 订阅任务状态变化
for update in task.subscribe():
if update.state == "COMPLETED":
result = update.result
print(f"推荐了 {len(result.hotels)} 家酒店")
3.5 多 Agent 编排模式
A2A 协议支撑了多种复杂的多 Agent 编排场景:
编排模式一:Supervisor(主管)模式
User Request
│
▼
┌─────────────────┐
│ Supervisor │ ← 主 Agent,负责拆解任务、协调子 Agent
│ (Orchestrator) │
└────────┬────────┘
│ A2A
┌────┴────┬───────────┐
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌────────┐
│Search │ │Coder │ │Reporter│
│Agent │ │Agent │ │Agent │
└───────┘ └───────┘ └────────┘
Supervisor Agent 接收用户请求,通过 A2A 将子任务分发给专用的子 Agent,最后汇总结果返回给用户。LangGraph 是实现 Supervisor 模式的流行框架。
编排模式二:Sequential(顺序)模式
任务按顺序在多个 Agent 间流转,每个 Agent 完成自己的一环后,将结果作为上下文传给下一个。
Agent A → [结果 + 上下文] → Agent B → [结果] → Agent C → 最终结果
编排模式三:Parallel(并行)模式
一个任务被分解后,同时分发给多个 Agent 并行处理,最后汇总。
┌→ Agent A ─┐
请求 ───→│ ┌→ Agent B ─┼─→ 汇总结果
│ └→ Agent C ─┘
└→ Agent D ─┘
3.6 A2A v0.3.0 的新特性(2026年3月)
v0.3.0 是协议正式进入企业级应用的关键版本,带来了几个重要更新:
Streaming 增强:text/event-stream 支持更稳定,支持双向流(Agent 可以边处理边推送中间结果)
Task Push Notifications:支持 Webhook 回调,Agent 不再需要持续轮询任务状态
Enhanced Auth:增加了 mTLS 支持,适用于企业内网跨服务通信
Skill version negotiation:Skill 版本协商机制,不同版本的 Skill 之间可以找到最大公约数
四、MCP vs A2A:一张图说清核心差异
很多开发者容易混淆这两个协议,用一张对比表说清楚:
| 维度 | MCP | A2A |
|---|---|---|
| 定位 | Agent ↔ 工具/资源 | Agent ↔ Agent |
| 类比 | USB-C 接口 | TCP/IP 协议 |
| 发起方 | AI 模型主动调用工具 | Agent 之间互相通信 |
| 通信模式 | 请求/响应 + 资源订阅 | 异步任务 + 状态推送 |
| 状态管理 | 有状态会话(正在演进无状态) | 任务状态机 |
| 核心抽象 | Tools / Resources / Prompts | Agent Card / Task / Skill |
| 标准化组织 | Agentic AI Foundation (Anthropic 主导) | Linux Foundation TSC (Google 主导) |
| v1.0 预计 | 已稳定使用中 | 2026 年 Q4 |
| 典型场景 | AI 调用 GitHub API、数据库查询 | 旅行规划 Agent 调用酒店 Agent |
关键理解:MCP 和 A2A 不是竞争关系,而是互补关系。一个 AI Agent 通常同时使用两者——用 MCP 连接工具和服务,用 A2A 与其他 Agent 协作。
┌────────────────────────────────────────────┐
│ AI Agent │
│ │
│ 用 MCP ─────────────────→ 外部工具/服务 │
│ (模型调用工具) │
│ │ │
│ 用 A2A ───────────────→ 其他 Agent │
│ (Agent间协作) │
└────────────────────────────────────────────┘
五、实战:构建一个 MCP + A2A 的多 Agent 系统
5.1 场景设计
我们构建一个「代码审查 + 优化建议」的多 Agent 系统:
- Reviewer Agent:接收代码,通过 MCP 调用 GitHub API 获取上下文,通过 A2A 调用 Optimizer Agent
- Optimizer Agent:接收 Reviewer 的建议,通过 MCP 调用代码补全工具生成优化方案
5.2 Step 1:定义 Reviewer Agent(含 MCP 工具集成)
# reviewer_agent/server.py
from fastapi import FastAPI
from fastmcp import FastMCP
from a2a import A2AServer, AgentCard, Skill
from pydantic import BaseModel
import httpx
app = FastAPI()
# ── MCP 工具层 ──
mcp = FastMCP("CodeReviewAgent")
@mcp.tool()
async def get_github_file(owner: str, repo: str, path: str,
branch: str = "main") -> dict:
"""通过 GitHub API 获取文件内容"""
async with httpx.AsyncClient() as client:
url = f"https://api.github.com/repos/{owner}/{repo}/contents/{path}"
headers = {"Accept": "application/vnd.github.v3+json"}
if token := os.getenv("GITHUB_TOKEN"):
headers["Authorization"] = f"Bearer {token}"
resp = await client.get(url, params={"ref": branch}, headers=headers)
resp.raise_for_status()
data = resp.json()
import base64
content = base64.b64decode(data["content"]).decode()
return {"path": path, "content": content, "sha": data["sha"]}
@mcp.tool()
def analyze_code_quality(code: str, language: str) -> dict:
"""静态代码质量分析"""
issues = []
if "TODO" in code:
issues.append({"severity": "info", "msg": "发现 TODO 注释"})
if len(code.splitlines()) > 500:
issues.append({"severity": "warning", "msg": "函数过长,建议拆分"})
# ... 更多分析规则
return {"score": 85, "issues": issues}
# ── A2A 服务层 ──
class ReviewRequest(BaseModel):
owner: str
repo: str
path: str
branch: str = "main"
focus: list[str] = ["readability", "performance"]
a2a_server = A2AServer(
agent_card=AgentCard(
name="Code Reviewer Agent",
description="专业的代码审查 Agent,支持多语言静态分析和 GitHub 上下文集成",
url="http://localhost:8000",
capabilities={"streaming": True, "longRunningTasks": False},
skills=[
Skill(id="code-review", name="代码审查",
description="对代码进行质量评估和安全检查")
]
),
async_handlers={
"code-review": async def handle_review(req: ReviewRequest):
# 1. MCP:获取代码
code_data = await get_github_file(
req.owner, req.repo, req.path, req.branch
)
code = code_data["content"]
# 2. MCP:分析质量
quality = analyze_code_quality(
code,
language=req.path.split(".")[-1]
)
# 3. A2A:调用 Optimizer Agent 生成优化建议
optimizer_client = A2AClient("http://optimizer-agent:8000")
optimization = await optimizer_client.send_task(
skill="code-optimization",
input={
"code": code,
"issues": quality["issues"],
"focus": req.focus
}
)
return {
"review": quality,
"optimization": optimization.result,
"file": req.path
}
}
)
app.mount("/mcp", mcp.stream_handler())
app.mount("/a2a", a2a_server.handle_http())
5.3 Step 2:定义 Optimizer Agent(生成优化建议)
# optimizer_agent/server.py
from fastapi import FastAPI
from a2a import A2AServer, AgentCard, Skill
from pydantic import BaseModel
app = FastAPI()
class OptimizationRequest(BaseModel):
code: str
issues: list[dict]
focus: list[str]
a2a_server = A2AServer(
agent_card=AgentCard(
name="Code Optimizer Agent",
description="基于代码审查意见生成具体的优化重构方案",
url="http://localhost:8001",
capabilities={"streaming": True, "longRunningTasks": False},
skills=[
Skill(
id="code-optimization",
name="代码优化",
description="生成代码优化和重构建议,包含具体改动示例"
)
]
),
async_handlers={
"code-optimization": async def handle_optimize(req: OptimizationRequest):
suggestions = []
for issue in req.issues:
if issue["severity"] in req.focus or "all" in req.focus:
suggestions.append({
"issue": issue["msg"],
"suggestion": generate_fix_suggestion(
req.code, issue, req.focus
)
})
return {
"suggestions": suggestions,
"summary": f"共生成 {len(suggestions)} 条优化建议"
}
}
)
app.mount("/a2a", a2a_server.handle_http())
5.4 Step 3:客户端调用
# client.py — 用户发起代码审查请求
import a2a
async def main():
# 1. 发现 Reviewer Agent
reviewer = await a2a.discover_agent("http://reviewer-agent:8000")
# 2. 发起审查任务(通过 A2A 发送)
task = await reviewer.send_task(
skill="code-review",
input={
"owner": "langchain-ai",
"repo": "langchain",
"path": "libs/core/langchain/core/runnables/base.py",
"branch": "master",
"focus": ["performance", "readability"]
}
)
# 3. 等待并获取结果
result = await task.wait_for_completion()
print(f"审查分数: {result.data['review']['score']}")
print(f"优化建议数: {len(result.data['optimization']['suggestions'])}")
for s in result.data['optimization']['suggestions']:
print(f" - {s['issue']}: {s['suggestion']}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
整个调用链路清晰:Client → Reviewer Agent(MCP 调 GitHub + A2A 调 Optimizer)→ Optimizer Agent → 汇总结果。整个过程中,各 Agent 只需声明自己的能力,无需了解彼此的实现细节。
六、MCP + A2A 在生产环境中的挑战
6.1 协议版本碎片化
A2A 协议目前处于 v0.3.0,距离 v1.0 还有几个月的迭代期。这期间协议-breaking change 不可避免。生产环境部署时,必须锁定协议版本号:
# docker-compose.yml 示例
services:
reviewer-agent:
image: reviewer-agent:1.0.0
environment:
A2A_VERSION: "0.3.0" # 锁定协议版本
MCP_VERSION: "1.0"
optimizer-agent:
image: optimizer-agent:1.0.0
environment:
A2A_VERSION: "0.3.0"
MCP_VERSION: "1.0"
6.2 信任与身份问题
当 Agent A 通过 A2A 调用 Agent B 时,B 如何信任 A 的身份?如果 A 被伪造或劫持,B 可能会执行恶意指令。
当前 A2A 规范支持 OAuth 2.0 客户端凭证流,但身份验证不等于授权——即便证明了「你是 Agent A」,还需要回答「Agent A 有没有权限调用这个 Skill」。
更高级的信任方案(如零知识证明、区块链身份)还在讨论中,2026 年 Q4 的 v1.0 规范可能会给出更完整的答案。
6.3 任务状态的持久化
A2A 的任务状态机设计得很好,但如果 Agent 重启,未完成的任务状态是否会丢失?
生产环境必须将任务状态外置到分布式存储(Redis、PostgreSQL):
# 任务状态持久化示例
class PersistentTaskStore:
def __init__(self, redis_url: str):
self.redis = redis.from_url(redis_url)
async def save_state(self, task_id: str, state: TaskState):
key = f"a2a:task:{task_id}"
self.redis.setex(key, ttl=86400, value=json.dumps(state.to_dict()))
async def get_state(self, task_id: str) -> TaskState:
key = f"a2a:task:{task_id}"
data = self.redis.get(key)
if data is None:
return None
return TaskState.from_dict(json.loads(data))
6.4 延迟与超时
MCP 调用工具通常很快(毫秒级),但 A2A 跨 Agent 调用涉及网络往返和 LLM 推理,延迟可能高达数十秒。需要设置合理的超时和重试机制:
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=2, max=10)
)
async def call_agent_with_retry(agent_url: str, skill: str, input_data: dict):
async with asyncio.timeout(60): # 最多等60秒
return await a2a_client.send_task(skill=skill, input=input_data)
七、性能优化:让 Agent 系统跑得更快
7.1 MCP 服务器连接池
每个 MCP 请求都建立新连接会产生巨大开销。生产环境中务必使用连接池:
# MCP 连接池配置
mcp_client = MCPSyncClient(
server_url="https://mcp-server.example.com",
pool_size=20, # 最大并发连接数
max_overflow=10, # 允许的超量连接数
timeout=30,
pool_recycle=3600, # 连接回收时间(秒)
)
7.2 A2A 任务并行化
如果一个任务需要调用多个不相关的 Skill,不要串行等待——并行发送:
# 串行(慢)
result1 = await agent.call_skill("fetch-code", input1)
result2 = await agent.call_skill("analyze-security", input2)
result3 = await agent.call_skill("check-performance", input3)
# 并行(快)
results = await asyncio.gather(
agent.call_skill("fetch-code", input1),
agent.call_skill("analyze-security", input2),
agent.call_skill("check-performance", input3),
return_exceptions=True # 一个失败不影响其他
)
7.3 上下文压缩策略
A2A 任务中的消息历史会随对话增长,如果不加以控制,Token 成本和延迟都会爆炸。建议在消息超过阈值时启用摘要压缩:
class ContextCompressor:
def __init__(self, max_messages: int = 20, compress_threshold: int = 15):
self.max_messages = max_messages
self.compress_threshold = compress_threshold
def should_compress(self, messages: list) -> bool:
return len(messages) >= self.compress_threshold
async def compress(self, messages: list) -> list:
# 用 LLM 对前 N 条消息做摘要,保留最近的消息
recent = messages[-5:] # 保留最近5条
older = messages[:-5]
summary = await llm.acomplete(
f"请将以下对话摘要为100字以内:{older}"
)
return [
{"role": "system", "content": f"【对话摘要】{summary}"},
*recent
]
八、展望:2026 年下半场,协议层将走向何方?
8.1 MCP 的无状态化(SEP-1442)
如前所述,SEP-1442 将推动 MCP 走向无状态请求模式。这对于云原生部署意义重大:
- 水平扩展:无状态服务器可以随意增减实例
- 边缘部署:MCP 服务可以部署在 CDN 边缘,延迟从 100ms 降到 5ms
- 成本降低:不需要为每个连接维护会话状态,内存消耗大幅下降
预计 2026 年下半年,主流 MCP SDK 都会支持无状态模式。
8.2 A2A v1.0 的发布
2026 年 Q4,A2A v1.0 将正式发布,提供向后兼容性保证。这意味着:
- 企业现在可以在非关键场景试用 A2A
- v1.0 发布后,API 将保持稳定,不会再出现 breaking change
- 多厂商互操作将从「可能」变成「可靠」
8.3 MCP 与 A2A 的融合趋势
一个有趣的趋势是:未来这两个协议的边界可能会变得模糊。
MCP 社区正在讨论是否支持「工具作为 Skill」——让 MCP 工具可以被 A2A 协议发现和调用。反过来,A2A 社区也在讨论是否让 Agent Card 支持 MCP 工具声明。
如果这两条路线最终收敛,我们将迎来一个真正统一的 Agent 互操作标准——既有工具层面的标准化(MCP 的强项),又有 Agent 间协作层面的标准化(A2A 的强项)。
8.4 安全与治理的成熟
2026 年,随着 MCP 和 A2A 进入生产环境,安全治理将成为焦点:
- MCP 服务器的权限分级(只读工具 vs 写入工具 vs 高危工具)
- A2A 跨域调用的审计日志
- Agent 身份的可验证声明(类似 SPIFFE)
- 多 Agent 协作的决策追溯(某个 Agent 在哪一步做了什么决定)
这些安全基础设施将在 2026 年下半年逐步成熟。
九、总结:站在协议时代的起点
MCP 和 A2A 的出现,标志着 AI Agent 领域从「玩具 Demo」时代正式进入了「工程系统」时代。
MCP 解决的是 Agent 与世界的连接问题——它让 AI 模型不再是一座孤岛,而是一个可以调用真实世界工具、读取真实世界数据的智能体。
A2A 解决的是 Agent 与 Agent 的协作问题——它让多个 Agent 可以像人类团队一样分工合作,而不需要人类在中间做「人肉总线」。
两者结合,想象空间是巨大的:
- 一个「旅行 Agent」可以调用「地图 Agent」查路线,调用「天气 Agent」预测天气,调用「酒店 Agent」预订房间,全程不需要人类介入
- 一个「代码审查 Agent」可以调用「安全扫描 Agent」检查漏洞,调用「性能分析 Agent」测性能瓶颈,调用「文档生成 Agent」写修复文档
- 一个「数据分析 Agent」可以调用「数据库 Agent」查数据,调用「可视化 Agent」生成图表,调用「报告 Agent」撰写结论
这不是科幻,这是 2026 年已经在发生的事情。
作为工程师,你现在最应该做的一件事:选一个你熟悉的工具(数据库、GitHub、K8s),搭一个 MCP Server;选一个你工作中遇到的实际问题,用 A2A 把两个 Agent 连起来。
协议时代已经到来。站在起点的你,准备好了吗?
本文参考资料:
- Anthropic MCP 官方文档 & SEP-1442 提案
- Linux Foundation Agentic AI Foundation — A2A Protocol v0.3.0 规范
- InfoQ《MCP开发者峰会观察:网关、无状态请求与企业级落地路径》
- CSDN《从MCP到A2A:2026年AI Agent为什么进入"协议时代"》
- GitHub awesome-mcp-servers 生态列表
标签:AI Agent | MCP | A2A | 大模型 | 协议标准 | 2026技术趋势 | Agent互操作
字数:约 12,500 字