直接结论

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 版本。

json
{
  "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 或执行外部写入。

每次调用都应:

  1. 从可信 Authentication Middleware 获取 Subject 与 Tenant;
  2. 校验 Requested Tool 是否在 Allowlist 且 Schema 有界;
  3. 用 Server-side Authorization 解析 Target Object;
  4. 限制 Result Byte、Row、File 与 Outbound Destination;
  5. 将 Tool Result 作为不可信内容后再放入模型或 UI;
  6. 对重要副作用要求 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:

text
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 中就被当作授权依据。

go
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:

sequenceDiagram participant U as User participant H as Host Application participant R as Remote Service participant T as Owned Tool Service U->>H: Provides constrained intent H->>R: Authorized task request with idempotency key R->>T: Policy-checked tool request T-->>R: Bounded, untrusted result R-->>H: Durable task update or artifact reference H-->>U: Validated, accessible presentation

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。

延伸阅读

一手来源