直接结论
MCP、A2A 与 A2UI 解决三个不同的互操作问题。 MCP 2026-07-28 让 Host 与 Server 交换上下文并调用边界明确的能力;A2A 1.0 让 A2A Client 把工作委派给独立运营的远程 Agent,并跟踪任务;A2UI 让 Agent 通过另行选择的传输向 Renderer 流式发送声明式界面状态。
三者可以组合,但不是累加式必选项。系统可以只使用其中一个或两个;即使全部采用,版本、身份、授权、状态、故障和审计责任也不会自动跨协议传递。
核心要点
- MCP 不是 Agent-to-Agent 任务协议。 当前 Core 无状态,提供 Tool、Resource、Prompt、Elicitation 与可选 Extension。
- A2A 1.0 不只等于 JSON-RPC。 它把统一数据模型与抽象操作映射到 JSON-RPC、gRPC 和 HTTP+JSON/REST 绑定,并要求功能等价。
- A2UI 不是执行权限。 它描述有序的 Surface、Component、Data Model 与交互,由产品持有的 Renderer 校验和渲染。
- 三个协议必须独立固定版本。 A2UI 0.9.1 是当前生产版;A2UI 1.0 与对应 A2A Extension 仍是 Candidate。
- 发现与 Schema 合法都不授予权限。 身份、对象、动作、目标地址与副作用必须在拥有资源的服务端重新授权。
先确定边界,而非“完整协议栈”
MCP、A2A 与 A2UI 定义三种不同边界,不是强制层次,组合后也不会产生传递信任。
| 协议与当前状态 | 边界 | 稳定契约 | 应用仍需负责 | |---|---|---| | MCP 2026-07-28 | Host 到 Server 的能力交换 | 无状态 JSON-RPC Request、逐请求能力、Tool、Resource、Prompt、Elicitation、Extension | 用户身份、对象授权、副作用策略、模型编排 | | A2A 1.0.0 | Client 到远程 Agent 的工作委派 | Agent Card、Message、Task、Artifact、Streaming、Push Notification、多种绑定 | 服务信任、租户隔离、业务完成、回调安全 | | A2UI 0.9.1 Current | Agent 到 Renderer 的界面状态 | 有序 JSON Envelope、Surface、Component Catalog、Data Model、返回通道中的 Action | 可信渲染、无障碍、动作授权、数据处理 | | A2UI 1.0 Candidate | 下一版 A2UI 契约 | 类型化双向 Function Call、重构 Catalog、Transport Binding | 迁移测试与显式实验启用 |
若一个 Service 拥有整个 Workflow,优先 Local Function。只有独立所有权或生命周期处理真正有价值时才用 Remote Task Boundary;只有确实改善用户任务时才用动态 UI。
固定实际部署的表面
规范、Binding、SDK、Extension Format 与示例会独立演进。应记录已经测试的表面,不能只固定一个 Package 版本。
{
"mcp": {
"revision": "2026-07-28",
"transport": "streamable-http",
"extensions": ["io.modelcontextprotocol/tasks"]
},
"a2a": {
"version": "1.0",
"binding": "HTTP+JSON/REST",
"agent_card_digest": "sha256:..."
},
"a2ui": {
"version": "0.9.1",
"catalog_id": "https://example.com/catalog/v3",
"catalog_digest": "sha256:..."
},
"runtime_revision": "immutable-release",
"policy_revision": "policy-42"
}
每次只升级一个维度,并执行兼容性测试、故障测试与回滚演练。不能把 A2UI 1.0 Envelope 静默发送给 0.9.1 Renderer,也不能仅凭出现 SSE 就推断 A2A 绑定。
Tool Boundary:Capability 不是 Permission
MCP 式 Tool Interface 可描述 Name、Input 和 Result,有助于互操作,却不能让模型、Caller 或 Tool Annotation 读取 Object 或执行外部写入。
每次调用都应:
- 从可信 Authentication Middleware 获取 Subject 与 Tenant;
- 校验 Requested Tool 是否在 Allowlist 且 Schema 有界;
- 用 Server-side Authorization 解析 Target Object;
- 限制 Result Byte、Row、File 与 Outbound Destination;
- 将 Tool Result 作为不可信内容后再放入模型或 UI;
- 对重要副作用要求 Confirmation 与 Idempotency。
不要把任意 SQL、Shell、Filesystem Path 或无限制 HTTP Fetch 暴露为通用 Agent Capability。
A2A 远程任务边界:发现不等于信任
A2A 1.0 将统一数据模型与抽象操作映射到 JSON-RPC、gRPC 和 HTTP+JSON/REST 绑定。它在独立运营的系统之间传递 Message、有状态 Task、Artifact、Streaming Update 与可选 Push Notification。Agent Card 会声明 Interface、Capability、Skill 与 Security Scheme,但在确认 Provenance 前仍是不可信 Metadata。
验证 Endpoint Owner、Service Identity、Token Audience/Expiry、Requested Skill、Tenant、Target Object、Callback Destination 与 Artifact Access。Remote Task 必须拥有模型外的持久化 State:
accepted -> running -> waiting_for_input -> terminal
| |
+-> canceled +-> succeeded | failed | rejected | outcome_unknown
把 Idempotency Key 绑定已认证 Principal、Tenant、Action 与规范化参数。completed 不能证明 Payment、Notification 或 Deletion 只发生一次。
A2UI 渲染边界:呈现不是授权
A2UI 让 Renderer 把约定的 Component Catalog 映射为审核过的本地组件,从而避免执行 Agent 提供的任意 UI Code。0.9.1 是当前生产规范;1.0 仍是 Candidate,并改变 Envelope、Catalog、Theme 与 Function Call,因此必须显式迁移,不能只按名称自动协商。
即使承载它的 Transport 无状态,渲染流本身仍有顺序和状态:createSurface 先于 Component 与 Data 更新,deleteSurface 终止 Surface。Transport 必须保持 Message Framing、顺序和 Metadata;启用交互时还要提供返回通道。A2UI 可以承载于 A2A、AG-UI、MCP、SSE、WebSocket 或其他绑定,它本身不是 Transport。
拒绝超出 Byte、Depth、Component、Update Rate、URL、Rich Text、Image 和 Data Reference 限制的载荷。Unknown Component 应被拒绝或渲染产品自有 Fallback。JSON Schema 验证形状,不验证 Ownership、Price、Permission 或业务事实。
下面的无第三方依赖 Go 程序在 A2UI Action 进入应用提议阶段前,校验最小身份与兼容信息。SubjectID 来自可信认证上下文,ActionToken 是 Server 签发的不透明引用;二者都不能因为出现在合法 Envelope 中就被当作授权依据。
package main
import (
"errors"
"fmt"
)
type ProtocolProfile struct {
MCPRevision string
A2AVersion string
A2UIVersion string
CatalogID string
}
type Action struct {
Name string
ActionToken string
SubjectID string
}
func validate(profile ProtocolProfile, action Action, trustedSubject string) error {
if profile.MCPRevision != "2026-07-28" || profile.A2AVersion != "1.0" {
return errors.New("unsupported_protocol_profile")
}
if profile.A2UIVersion != "0.9.1" {
return errors.New("a2ui_candidate_not_enabled")
}
if profile.CatalogID == "" || action.SubjectID != trustedSubject {
return errors.New("untrusted_identity_or_catalog")
}
if action.Name != "select_offer" || action.ActionToken == "" {
return errors.New("invalid_action")
}
return nil
}
func main() {
profile := ProtocolProfile{
MCPRevision: "2026-07-28",
A2AVersion: "1.0",
A2UIVersion: "0.9.1",
CatalogID: "https://example.com/catalog/v3",
}
action := Action{
Name: "select_offer",
ActionToken: "offer-token-7",
SubjectID: "user-42",
}
fmt.Println(validate(profile, action, "user-42"))
}
预期输出为 <nil>。这只是兼容与输入门禁,不是完整授权。产生副作用的 Endpoint 必须解析不透明 Token,并在执行前重新校验当前 Object、Tenant、Confirmation Binding、Expiry、Idempotency Key 与业务 Invariant。
一种安全的组合方式
组合有价值,但不应变成刚性 Stack:
Host 拥有用户体验与 Action Policy;Remote Service 拥有 Task State 与 Tool Policy。Artifact Reference 需要认证获取;Callback URL 是 SSRF Boundary。不能让模型输出选择无限制 Callback、Tool 或 UI Destination。
Failure、Privacy 与 Accessibility
上线前定义 Reconnection、Cancellation、Duplicate Message、副作用后的 Timeout、Ordering、Backpressure、Artifact Expiry、Deletion Propagation 与 Outcome-unknown 行为。
UI Contract 还应包含 Keyboard Interaction、Semantic Label、Update 后 Focus、Contrast、Localization、RTL Layout 与固定 Fallback。标识 Agent-generated Content,把 Credential、Payment 和 Permission Control 留给产品自有 Component。
记录脱敏的 Correlation ID、Contract Revision、Policy Decision、Lifecycle Class 和 Latency;不要默认留存原始 Prompt、Hidden Reasoning、Private Artifact 或完整 UI Payload。
测试组合
| 测试类别 | 要证明的失败 |
|---|---|
| Version 与 Binding | 不支持的 MCP Revision、A2A Binding 不匹配、向 0.9.1 Renderer 发送 A2UI 1.0 Envelope |
| Authorization | 跨 Tenant Task、Stale Object、模型提供的 Identity、传递式凭证复用 |
| Task Recovery | Duplicate Request、Reconnect Gap、Cancellation Race、Uncertain Effect、Push Callback Replay |
| Artifact Safety | 超大文件、不安全 MIME、过期 Reference、未授权下载、SSRF Callback |
| UI Safety | Unknown Catalog、Missing Component、不安全 URL、Prompt-injected Label、乱序更新、Payload Flood |
| Accessibility | Keyboard-only Flow、Screen-reader Update、流式更新后的 Focus、超长翻译 |
| Upgrade | 旧 Client、Schema Mismatch、Extension Downgrade、Catalog Rollback、部分 Fleet 升级 |
选择能在代表性用户任务中通过这些测试的最小组合。
常见问题
每一个 Agent Tool 都必须用 MCP 吗?
不是。Local Function 可能更合适。只有协议边界确实带来互操作或所有权收益时才使用,同时保留 Server-side Authorization 和 Result Limit。
Remote Agent 可以直接把 UI 发给 User 吗?
应将其视为提议。Host Renderer 应验证并限制 Payload,保留产品自有 Control,并将每一个 Action 路由至 Host 的 Server-side Policy。
Protocol Schema 是安全控制吗?
它是有用的输入校验控制,却不能认证 Caller、确定 Object Ownership、约束外部副作用或使生成内容可信。
生产系统应该使用哪个 A2UI 版本?
除非部署明确选择并验证 1.0 Candidate,否则应使用 A2UI 0.9.1。1.0 改变 Message、Catalog、Theme 与 Function Call 行为,在成为当前生产版之前,应把它当成独立兼容目标。
A2UI 可以通过 A2A 或 MCP 承载吗?
可以。A2UI 定义 UI Message,不限定唯一 Transport。它可绑定 A2A、MCP、AG-UI 或其他 Carrier,但所选 Binding 必须保持顺序、Framing、Metadata、Capability Negotiation 与交互返回路径。Carrier 的认证不能授权最终 UI Action。