Skip to main content

前置条件

你需要安装 Node.js 18 或更高版本。建议熟悉 MCP 工具资源,因为 MCP Apps 会组合使用这两种原语。如果你有 MCP TypeScript SDK 使用经验,会更容易理解服务器端模式。

开始使用

创建 MCP App 最快的方式,是使用带有 MCP Apps 技能的 AI 编码智能体。如果你更想手动搭建项目,可以跳到手动设置

使用 AI 编码智能体

支持技能的 AI 编码智能体可以为你脚手架生成完整的 MCP App 项目。技能是包含指令和资源的文件夹,智能体会在相关场景下加载它们。它们会教 AI 如何执行创建 MCP Apps 等专门任务。 create-mcp-app 技能包含架构指导、最佳实践和可运行示例,智能体会用它们生成你的项目。
1

安装技能

如果你使用 Claude Code,可以直接用以下命令安装该技能:
你也可以使用 Vercel Skills CLI 在不同 AI 编码智能体中安装技能:
也可以通过克隆 ext-apps 仓库来手动安装该技能:
然后将该技能复制到你的智能体对应位置:
该列表并不完整。其他智能体可能在不同位置支持技能,请查看你的智能体文档。
例如,使用 Claude Code 时,可以全局安装该技能(所有项目都可用):
也可以只为单个项目安装,将它复制到项目目录下的 .claude/skills/
要确认技能已安装,可以询问智能体“你可以访问哪些技能?”,你应该能看到 create-mcp-app 是可用技能之一。
2

创建应用

让你的 AI 编码智能体构建它:
智能体会识别出 create-mcp-app 技能与任务相关,加载其中指令,然后脚手架生成包含服务器、UI 和配置文件的完整项目。
使用 Claude Code 创建新的 MCP App

使用 Claude Code 创建新的 MCP App

3

运行应用

运行上述命令前,可能需要先确认自己位于应用文件夹中。
4

测试应用

按照下方测试应用中的说明操作。对于取色器示例,可以启动一个新聊天,并让 Claude 提供一个取色器。
在 Claude 中测试取色器

在 Claude 中测试取色器

手动设置

如果你不使用 AI 编码智能体,或想了解设置过程,可以按以下步骤操作。
1

创建项目结构

典型 MCP App 项目会将服务器代码和 UI 代码分开:
my-mcp-app
package.json
tsconfig.json
vite.config.ts
server.ts
mcp-app.html
src
mcp-app.ts
服务器会注册工具并提供 UI 资源。UI 资源最终会在安全 iframe 中渲染,并使用默认拒绝的 CSP 配置。如果应用包含 CSS 和 JS 资产,需要配置 CSP,也可以使用 vite-plugin-singlefile 这样的工具将资产打包进 HTML,本教程会采用这种方式。
2

安装依赖

ext-apps 包同时为服务器端(注册工具和资源)与客户端(用于 UI 到主机通信的 App 类)提供辅助工具。这里使用 Vite 和 vite-plugin-singlefile 插件将 UI 和资产打包成单个 HTML 文件,便于演示;但这是可选的,只要配置 CSP,你也可以使用任意打包器,或直接提供未打包文件。
3

配置项目

"type": "module" 设置会启用 ES module 语法。build 脚本使用 INPUT 环境变量告诉 Vite 要打包哪个 HTML 文件。serve 脚本使用 tsx 运行 TypeScript 服务器。
4

构建项目

项目结构和配置就绪后,继续阅读下方构建 MCP App,实现服务器和 UI。

构建 MCP App

下面构建一个显示当前服务器时间的简单应用。这个示例展示了完整模式:注册带 UI 元数据的工具,将打包后的 HTML 作为资源提供,并构建能与服务器通信的 UI。

服务器实现

服务器需要做两件事:注册一个包含 _meta.ui.resourceUri 字段的工具,并注册一个资源处理器来提供打包后的 HTML。下面是完整服务器文件:
关键部分如下:
  • resourceUriui:// scheme 会告诉主机这是一个 MCP App 资源。路径结构是任意的。
  • registerAppTool:注册一个带 _meta.ui.resourceUri 字段的工具。当主机调用该工具时,会获取并渲染 UI,并在工具结果到达后传给 UI。
  • registerAppResource:当主机请求 UI 资源时,提供打包后的 HTML。
  • Express 服务器:通过端口 3001 上的 HTTP 暴露 MCP 服务器。

UI 实现

UI 由一个 HTML 页面和一个使用 App 类与主机通信的 TypeScript 模块组成。下面是 HTML:
以及 TypeScript 模块:
关键部分如下:
  • app.connect():与主机建立通信。应用初始化时调用一次。
  • app.ontoolresult:当主机向应用推送工具结果时触发的回调(例如首次调用工具并渲染 UI 时)。
  • app.callServerTool():让应用主动调用服务器上的工具。请注意,每次调用都会与服务器往返一次,因此 UI 设计应能妥善处理延迟。
App 类还提供用于记录日志、打开 URL,以及使用应用中的结构化数据更新模型上下文的额外方法。请查看完整 API 文档

测试应用

要测试 MCP App,请构建 UI 并启动本地服务器:
在默认配置下,服务器可通过 http://localhost:3001/mcp 访问。不过,要看到应用渲染,需要使用支持 MCP Apps 的 MCP 主机。你有几种选择。

使用 Claude 测试

Claude (web) 和 Claude Desktop 支持 MCP Apps。对于本地开发,需要将服务器暴露到互联网。你可以在本地运行 MCP 服务器,并使用 cloudflared 等工具通过隧道转发流量。 在另一个终端中运行:
复制生成的 URL(例如 https://random-name.trycloudflare.com),并在 Claude 中将其添加为自定义连接器:点击个人资料,进入 SettingsConnectors,最后点击 Add custom connector
自定义连接器可在 Claude 付费计划(Pro、Max 或 Team)中使用。
在 Claude 中添加 custom connector

在 Claude 中添加 custom connector

使用 basic-host 测试

ext-apps 仓库包含一个用于开发的测试主机。克隆仓库并安装依赖:
ext-apps/examples/basic-host/ 中运行 npm start 会启动 basic-host 测试界面。要将它连接到特定服务器(例如你正在开发的服务器),请以内联方式传入 SERVERS 环境变量:
访问 http://localhost:8080。你会看到一个简单界面,可以选择工具并调用它。当你调用工具时,主机会获取 UI 资源,并在沙箱 iframe 中渲染它。之后你可以与应用交互,并验证工具调用是否正常工作。
二维码 MCP App 在 basic host 中运行的示例

使用 basic host 测试二维码 MCP App

了解更多

API 文档

完整 SDK 参考和 API 详情

GitHub 仓库

源代码、示例和议题跟踪器

规范

面向实现者的技术规范

反馈

MCP Apps 正在积极开发中。如果遇到问题或有改进想法,请在 GitHub 仓库中提交 issue。关于该扩展方向的更广泛讨论,可以参与 GitHub Discussions