该项目演示了如何构建在Cloudflare Workers上运行并可以嵌入到如ChatGPT等AI聊天界面中的交互式MCP(模型上下文协议)小部件。它展示了结合MCP与现代Web技术创建丰富、有状态的AI对话体验的强大功能。
观看计算器小部件与ChatGPT互动的视频,包括隐藏的TRON复活节彩蛋:
https://github.com/user-attachments/assets/5df110d8-f40b-4c6a-8820-c2dbf3ff79c8
此演示实现了一个作为MCP工具的计算器小部件,可以被AI助手调用。架构由几个关键组件组成:
计算器是一个完全功能的、美观设计的计算器,具有受Tron启发的复古未来主义风格。以下是其特别之处:
当AI助手调用计算器工具时,它可以传递初始状态参数:
display - 初始显示值previousValue - 已经输入的值(例如,“我想加5到一个数”)operation - 待执行的操作(+,-,*,/)waitingForNewValue - 计算器是否准备好接受新输入errorState - 是否以错误状态开始这意味着AI可以根据用户请求预先配置计算器。例如,如果用户说“我想加5到某个数”,AI可以调用计算器,设置previousValue: 5,operation: '+',以及waitingForNewValue: true。
计算器小部件是一个完全交互式的Remix应用程序,它:
计算器中有一个隐藏的功能:当结果等于1982(原版Tron电影发布的年份)时,计算器会向AI助手发送一个MCP提示消息,指示其采用Tron中的主控程序(MCP)的人格。
这展示了小部件通过向AI发送消息来动态影响对话的能力。
MathMCP类扩展了McpAgent,并使用Cloudflare的持久对象来维护状态:
export class MathMCP extends McpAgent<Env, State, Props> {
server = new McpServer(
{
name: 'MathMCP',
version: '1.0.0',
},
{
instructions: `Use this server to solve math problems reliably and accurately.`,
},
)
async init() {
await registerTools(this)
await registerWidgets(this)
}
}
服务器注册两种类型的能力:
do_math工具,在服务器端执行算术运算小部件作为MCP资源(用于HTML/JS包)和MCP工具(用于调用)进行注册。注册包括:
agent.server.registerResource(name, uri, {}, async () => ({
contents: [
createUIResource({
content: {
type: 'rawHtml',
htmlString: await widget.getHtml(),
},
metadata: {
'openai/widgetDescription': widget.description,
'openai/widgetCSP': {
connect_domains: [],
resource_domains: [baseUrl],
},
},
}).resource,
],
}))
项目使用两个独立的构建过程:
小部件构建(Vite) - 将计算器UI构建为独立的JavaScript包
worker/widgets/calculator/index.tsxdist/public/widgets/calculator.js工作者构建(Wrangler) - 构建带有MCP服务器的Cloudflare工作者
worker/index.tsx小部件使用postMessage与其父框架(AI聊天界面)通信:
ui-lifecycle-iframe-readyui-lifecycle-iframe-render-data带有初始状态tool消息调用其他MCP工具prompt消息向AI发送新的提示link消息打开链接// 小部件向AI发送提示
sendMcpMessage('prompt', { prompt: MCP_PROMPT })
// 小部件等待初始渲染数据
const renderData = await waitForRenderData(renderDataSchema)
当用户在ChatGPT中与这个MCP服务器互动时,会发生以下情况:
calculator工具克隆并安装
npm install
启动开发服务器
npm run dev
这将同时运行两个进程:
测试计算器小部件
访问http://localhost:8787/__dev/widgets以单独查看计算器小部件。
连接到MCP检查器
使用MCP检查器测试MCP服务器:
npm run inspect
然后在检查器中连接到http://localhost:8787/mcp。
生产构建
npm run build
部署到Cloudflare
npm run deploy
与ChatGPT一起使用
部署后,您可以通过提供部署URL + /mcp端点将此MCP服务器添加到ChatGPT。
├── worker/
│ ├── index.tsx # 主工作者入口点
│ ├── tools.ts # MCP工具定义(do_math)
│ ├── widgets.tsx # 小部件注册系统
│ ├── utils.ts # CORS和实用函数
│ └── widgets/
│ ├── utils.ts # 小部件通信实用工具
│ └── calculator/
│ ├── index.tsx # 计算器UI组件
│ ├── calculator.ts # 计算器业务逻辑
│ └── mcp-prompt.ts # MCP复活节彩蛋提示
├── dist/
│ └── public/
│ └── widgets/
│ └── calculator.js # 构建的计算器包
├── vite.config.widgets.ts # 小部件构建的Vite配置
└── wrangler.jsonc # Cloudflare Workers配置
wrangler.jsonc配置:
MATH_MCP_OBJECT)npm run typecheck以验证TypeScriptnpm run lint以检查代码风格此演示展示了包括实验性的Remix 3特性、MCP小部件和Cloudflare边缘计算平台在内的尖端Web技术。计算器的设计致敬了Tron的美学,以其独特的橙色光芒和复古未来主义风格。