SEP-1865:MCP Apps——MCP 的交互式用户界面

SEP-1865:MCP Apps——MCP 的交互式用户界面

社区译文;来源: MCP 29affa6b

本 SEP 已达到 Final 状态,并作为已接受设计的历史记录保留。 定稿后对协议所做的更改不会反映在此处。权威要求请参阅当前规范 及其变更日志。
字段值
SEP1865
标题MCP Apps——MCP 的交互式用户界面
状态Final
类型扩展跟踪
创建日期2025-11-21
作者Ido Salomon (@idosal), Liad Yosef (@liadyosef), Olivier Chafik (@olivierchafik), Jerome Swannack (@jeromeswannack), Jonathan Hefner (@jonathanhefner), Anton Pidkuiko (@antonpidkuiko), Nick Cooper (@nickcooper), Bryan Ashley (@bryanashley), Alexi Christakis (@alexichristakis)
发起人无(正在寻求发起人)
PR#1865

摘要

本 SEP 提议一项 MCP 扩展(依据 SEP-1724),使服务器能够向宿主交付交互式用户界面。MCP Apps 引入一种标准化模式:通过 ui:// URI scheme 声明 UI 资源,通过元数据将资源与工具关联,并使用 MCP 的 JSON-RPC 基础协议实现 UI 与宿主之间的双向通信。该扩展满足 MCP 社区对丰富交互体验日益增长的需求,同时维持安全性、可审计性,并与 MCP 核心架构保持一致。初始规范聚焦于 HTML 资源(text/html;profile=mcp-app),同时为未来扩展提供清晰路径。

动机

MCP 缺少一种让服务器向宿主交付丰富交互式用户界面的标准方式。这一缺口阻碍了许多超出纯文本或结构化数据、需要视觉呈现和交互的用例。随着越来越多宿主采用这项能力,碎片化和互操作性问题的风险也随之增加。

MCP-UI 已证明基于 UI 资源构建 MCP Apps 的可行性和价值,并作为 UI 规范与 SDK 的社区试验场。在专门社区的推动下,它发展出了双向通信模型,以及 HTML、外部 URL 和远程 DOM 等内容类型。MCP-UI 的采用者包括 Postman、HuggingFace、Shopify、Goose 和 ElevenLabs 等宿主与提供方,他们为社区提供了关键见解与贡献。

OpenAI 的 Apps SDK 于 2025 年 11 月发布,进一步验证了在对话式 AI 界面中提供丰富 UI 体验的需求。Apps SDK 使开发者能够以 MCP 为基础,在 ChatGPT 内构建丰富的交互式应用。

Apps SDK 和 MCP-UI 的架构都对本规范的设计产生了重要影响。

但是,如果没有正式标准化:

  • 服务器无法可靠地预期 MCP 支持 UI
  • 各宿主可能实现略有不同的行为
  • 安全与可审计模式不一致
  • 开发者必须为不同宿主维护不同实现或适配器(例如 MCP-UI 与 Apps SDK)

本 SEP 通过一项可选且向后兼容的扩展解决这些现有限制,将 MCP-UI 和 Apps SDK 开创的方法统一为一项开放标准。

规范

完整规范位于 modelcontextprotocol/ext-apps。

从总体上看,MCP Apps 扩展了模型上下文协议,使服务器能够向宿主交付交互式用户界面。该扩展引入:

  • UI 资源: 使用 ui:// URI scheme 预先声明的资源
  • 资源发现: 工具通过元数据引用 UI 资源
  • 双向通信: UI iframe 使用标准 MCP JSON-RPC 协议与宿主通信
  • 安全模型: 强制使用 iframe 沙箱,并提供可审计的通信

本规范以 HTML 内容(text/html;profile=mcp-app)作为初始内容类型,同时允许未来扩展其他格式。

作为一项扩展,MCP Apps 是可选的,客户端与服务器必须通过扩展能力机制显式协商(参见完整规范中的 Capability Negotiation 一节)。

理由

预先声明资源与内联嵌入

UI 被建模为由工具通过元数据引用的预先声明资源(ui://)。这样可以:

  • 让宿主在工具执行前预取模板,从而改善性能
  • 将呈现内容(模板)与数据(工具结果)分离,从而便于缓存
  • 对 UI 资源进行安全审查

考虑过的替代方案:

  • 嵌入式资源: 当前 MCP-UI 的做法,即在工具结果中返回资源。虽然这对服务器开发更方便,但由于性能优化方面存在缺口,且 UI 审查流程面临挑战,因此被延期。
  • 资源链接: 预先声明资源,但在工具结果中返回链接。由于性能优化方面存在缺口,因此被延期。

复用 MCP JSON-RPC,而非自定义协议

复用现有 MCP 基础设施(类型定义、SDK 等)。JSON-RPC 提供超时、错误等高级能力。

考虑过的替代方案:

  • 自定义消息协议: 当前 MCP-UI 的做法,使用 tool、intent、prompt 等消息类型。这些消息类型可以转换为所提议 JSON-RPC 消息的一个子集。
  • 全局 API 对象: 已拒绝,因为它需要宿主特定的注入,并且不适用于外部 iframe 来源。服务器/UI 一侧仍可增加语法糖。

仅支持 HTML 的 MVP

  • HTML 得到普遍支持,且广为人知
  • 安全模型最简单(标准 iframe 沙箱)
  • 支持生成截图/预览(例如通过 html2canvas)
  • 足以覆盖大多数已观察到的用例
  • 为未来扩展提供清晰基线

考虑过的替代方案:

  • 在 MVP 中包含外部 URL: 这是服务器最容易采用的内容类型之一,因为可以嵌入普通应用。但是,考虑到模型可见性、无法截取内容以及审查流程等问题,该方案被延期。SEP 新增的 externalIframes 能力实际上可能支持这种方式。

向后兼容性

本提案是核心协议的一项可选扩展。现有实现无需变更即可继续工作。

安全影响

托管来自潜在不可信 MCP 服务器的交互式 UI 内容,需要谨慎考虑安全问题。

根据威胁模型,MCP Apps 提议采取以下缓解措施:

  • Iframe 沙箱: 所有 UI 内容都在权限受限的沙箱 iframe 中运行
  • 预先声明模板: 宿主可以在渲染前审查 HTML 内容
  • 可审计消息: UI 到宿主的全部通信均通过可记录日志的 JSON-RPC
  • 用户同意: 宿主可以要求用户显式批准由 UI 发起的工具调用

完整威胁模型分析和缓解措施请参阅完整规范。

参考实现

  • MCP-UI 客户端和服务器 SDK 支持本规范提议的模式。
  • ext-apps 仓库包含 Olivier Chafik 编写的原型实现。