Skip to content

MCP Apps — 交互式 UI 能力扩展

官方 MCP 扩展,让工具返回丰富的交互界面(仪表盘、表单、可视化等)

官方文档: https://apps.extensions.modelcontextprotocol.io

核心概念

MCP Apps 是 MCP 的第一个官方扩展,允许工具返回交互式 UI 组件,直接在对话中渲染。

解决的问题

传统 MCP 工具只返回文本,用户想要"筛选""排序""深入查看某条记录"时,需要反复 prompt。效率低,体验差。

MCP Apps 填补了这个空白:模型保持参与对话,UI 处理文本无法表达的部分(实时更新、媒体查看、持久状态)。

典型应用场景

场景描述
数据探索销售分析工具返回交互仪表盘,用户按区域筛选、钻取账户
配置向导部署工具显示依赖字段表单,选"生产"显示安全选项
文档审查合同分析工具内嵌 PDF,高亮条款,用户点击审批或标记
实时监控服务器健康工具展示实时指标,系统变化时自动更新

技术原理

架构:两个关键 MCP 原语

  1. 带 UI 元数据的工具 — 工具包含 _meta.ui.resourceUri 字段
  2. UI 资源 — 服务器通过 ui:// 协议提供包含 HTML/JS 的资源
json
// 工具定义
{
  "name": "visualize_data",
  "description": "可视化数据为交互图表",
  "inputSchema": { /* ... */ },
  "_meta": {
    "ui": {
      "resourceUri": "ui://charts/interactive"
    }
  }
}

宿主获取资源,在沙箱 iframe 中渲染,通过 postMessage JSON-RPC 实现双向通信。

App API

使用 @modelcontextprotocol/ext-apps 包:

typescript
import { App } from "@modelcontextprotocol/ext-apps";

const app = new App();
await app.connect();

// 接收工具结果
app.ontoolresult = (result) => {
  renderChart(result.data);
};

// 从 UI 调用服务器工具
const response = await app.callServerTool({
  name: "fetch_details",
  arguments: { id: "123" },
});

// 更新模型上下文
await app.updateModelContext({
  content: [{ type: "text", text: "User selected option B" }],
});

安全模型

机制说明
iframe 沙箱所有 UI 在受限权限的沙箱 iframe 中运行
预声明模板宿主可在渲染前审查 HTML 内容
可审计消息所有 UI→宿主通信通过可记录的 JSON-RPC
用户授权宿主可要求 UI 触发的工具调用必须用户确认

客户端支持

客户端状态
Claude (Web + Desktop)已上线
Goose已上线
VS Code Insiders已上线
ChatGPT本周开始支持

与 MCP-UI 的关系

MCP Apps 建立在 MCP-UIOpenAI Apps SDK 的工作基础上。若已使用 MCP-UI,可继续使用,迁移到官方扩展也很简单。

相关资源

为前端工程师打造 · 基于 VitePress 构建