先确定边界,而非“完整协议栈”

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 或生态宣传永久有效。

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

每次调用都应:

  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。

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:

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

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

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。

测试组合

测试类别 要证明的失败
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、约束外部副作用或使生成内容可信。

延伸阅读