先确定边界,而非“完整协议栈”
MCP、A2A 与 A2UI 是三种有价值边界的常用名称,不是强制层次,更不会共同授权一个系统。
| 边界 | 常见目的 | 应用仍需负责 |
|---|---|---|
| Tool Boundary | 向 AI Application 暴露 Tool、Resource、Prompt | User Identity、Object Authorization、副作用 Policy |
| Remote Task Boundary | 向独立运营的 Agent Service 委派工作 | Service Identity、持久化 Task State、Tenant Isolation |
| UI Boundary | 展示受限的 Agent 提议并收集 Intent | 可信呈现、Action Authorization、Accessibility |
若一个 Service 拥有整个 Workflow,优先 Local Function。只有独立所有权或生命周期处理真正有价值时才用 Remote Task Boundary;只有确实改善用户任务时才用动态 UI。
固定实际部署的表面
规范、Transport、SDK、Extension Format 与示例都会演进。记录已测试表面,不能假定博客、Package Name 或生态宣传永久有效。
{
"tool_protocol": "pinned-spec-and-transport",
"task_protocol": "pinned-spec-and-binding",
"ui_contract": "pinned-schema-and-catalog",
"runtime": "package-and-revision",
"authentication": "deployment-specific",
"artifact_policy": "approved-store-and-retention",
"checked_at": "recorded-time"
}
通过 Compatibility Fixture、Failure Test 和 Rollback Plan 升级。版本记录比 Vendor Support Matrix 更具可操作性。
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。
Remote Task Boundary:Discovery 不是 Trust
A2A 式 Task Protocol 可在 Service 之间传递 Message、Task Update 和 Artifact。Card 或 Capability Description 有助于 Routing,但在建立 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 只发生一次。
UI Boundary:呈现不是授权
A2UI 式 Contract 可以让 Renderer 将小型 Component Catalog 映射到审阅过的 Local Component,从而避免任意 UI Code。Payload 仍是不可信输入。
拒绝超出 Byte、Depth、Component、Update Rate、URL、Rich Text、Image 和 Data Reference 限制的载荷。Unknown Component 应被拒绝或渲染产品自有 Fallback。JSON Schema 验证形状,不验证 Ownership、Price、Permission 或业务事实。
下面是说明策略边界的伪代码:session.subject_id 必须来自可信认证上下文,action.token 则应是 Server 签发的不透明引用。两者都不能因为出现在 UI Payload 中就被当作授权依据。
def authorize_action(session, action, offers):
if action.name not in {"select_offer", "request_confirmation"}:
return {"status": "rejected", "reason": "unknown_action"}
offer = offers.resolve(action.token, subject_id=session.subject_id)
if offer is None:
return {"status": "rejected", "reason": "not_available"}
return {"status": "accepted", "offer_id": offer.public_id}
这是应用 Policy,而不是 Protocol Code。重要写入 Endpoint 必须在执行前重新校验当前 Object、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。
测试组合
| 测试类别 | 要证明的失败 |
|---|---|
| Authorization | Cross-tenant Task、Stale Object、模型提供的 Identity |
| Task Recovery | Duplicate Request、Reconnect Gap、Cancellation Race、Uncertain Effect |
| Artifact Safety | 超大文件、不安全 MIME、过期 Reference、SSRF Callback |
| UI Safety | Unknown Component、不安全 URL、Prompt-injected Label、Payload Flood |
| Accessibility | Keyboard-only Flow、Screen-reader Update、超长翻译 |
| Upgrade | 旧 Client、Schema Mismatch、Transport Rollback |
选择能在代表性用户任务中通过这些测试的最小组合。
常见问题
每一个 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、约束外部副作用或使生成内容可信。