使用说明
MCP小部件
用于在ChatGPT等AI助手中呈现MCP(模型上下文协议)工具响应的UI小部件。
概述
当MCP工具返回数据时,AI助手可以使用自定义UI小部件而不是纯文本来显示它。此软件包提供了可以通过简单的 <script> 标签。
安装
npm install mcp-widgets
# or
pnpm add mcp-widgets
小部件
| 小部件 | 框架 | 大小 | 描述 |
|---|---|---|---|
data-card |
Web小部件 | ~3KB | 简单键值数据显示 |
rich-data-card |
React | ~148KB | 增强的卡片,带有部分、图标和页脚 |
用法
CDN嵌入(用于MCP工具)
通过CDN加载小部件并将其用作自定义HTML元素:
<!-- Load the widget -->
<script src="https://unpkg.com/mcp-widgets/cdn/data-card.js"></script>
<!-- Use it -->
<mcp-data-card
title="Weather"
data='{"temperature": "72°F", "conditions": "Sunny"}'
status="success"
></mcp-data-card>
作为React库
import { RichDataCard } from 'mcp-widgets'
function MyWidget() {
return (
<RichDataCard
title="Order Summary"
icon="🛒"
data={{ orderId: '#12345', total: '$89.99' }}
sections={[{ title: 'Shipping', data: { method: 'Express' } }]}
status="success"
/>
)
}
嵌入是如何工作的
MCP工具响应流程
- 用户提问 在ChatGPT中(例如,“天气怎么样?”)
- ChatGPT调用您的MCP工具 返回结构化数据
- 您的工具响应包括HTML 带着一个
<script>指向CDN托管小部件的标签 - ChatGPT呈现HTML 在沙盒iframe中
- 小部件加载并显示 数据可视化
MCP工具响应示例
当您的MCP服务器处理工具调用时,返回嵌入小部件的HTML:
// In your MCP server tool handler
function handleWeatherTool(location) {
const data = fetchWeather(location)
return {
content: [
{
type: 'text',
text: `
<script src="https://unpkg.com/mcp-widgets/cdn/data-card.js"></script>
<mcp-data-card
title="Weather in ${location}"
data='${JSON.stringify(data)}'
status="success"
></mcp-data-card>
`,
},
],
}
}
OpenAI天桥API
加载器通过以下方式处理与ChatGPT主机的通信 window.openai小部件本身不应该直接调用这些API——加载器管理高度通知和道具提取。
可用的主机API(由加载器使用):
// Notify ChatGPT of widget height (takes a number)
window.openai.notifyIntrinsicHeight(document.body.scrollHeight)
// Access tool response metadata for props
window.openai.toolResponseMetadata._meta
请参阅 OpenAI应用SDK文档 对于完整 window.openai API参考。
安全考虑
- 小部件在功能有限的沙盒iframe中运行
- 数据通过HTML属性传递(必须是JSON字符串化的)
- 无法直接访问父页面或用户会话
- CDN URL应使用HTTPS
小部件参考
<mcp-data-card>
一个轻量级的Web小部件(不依赖于React)。
| 属性 | 类型 | 描述 |
|---|---|---|
title |
string | 卡片标题 |
data |
JSON字符串 | 要显示的键值对 |
status |
success |
error |
<mcp-rich-data-card>
一个基于React的小部件,具有更多功能。
| 属性 | 类型 | 描述 |
|---|---|---|
title |
string | 卡片标题 |
description |
string | 字幕文本 |
icon |
字符串 | 表情符号或图标字符 |
data |
JSON字符串 | 主数据段 |
sections |
JSON字符串 | 数组 {title, data} 章节 |
footer |
string | 页脚文本 |
status |
success |
error |
发展
# Install dependencies
pnpm install
# Start Storybook
pnpm dev
# Run tests
pnpm test
# Build everything
pnpm build
# Build CDN bundles only
pnpm build:cdn
创建新小部件
- 在中创建文件夹
src/widgets/{widget-name}/ - 添加所需文件:
WidgetName.ts(Web小部件)或WidgetName.tsx(反应)manifest.json-小部件元数据cdn.ts或cdn.tsx-CDN入口点index.ts-库导出
- 出口自
src/widgets/index.ts - 跑
pnpm build生成捆绑包
叉车和定制系列
这个存储库是为分叉而设计的!您有两个选择:
选项1:私人小部件集合
分叉此仓库以创建您自己的私有小部件库:
- 分叉 将此存储库添加到您的GitHub帐户/组织
- 添加您的小部件 遵循上述结构
- 私人主持 通过发布到私有npm注册表或从您自己的基础设施提供CDN捆绑包
- 在MCP工具中使用 通过指向您的私有CDN URL
这非常适合:
- 具有自定义品牌的专有UI小部件
- 具有敏感设计的内部工具
- 与私有API集成的小部件
选项2:回馈
我们欢迎社区捐款!如果你构建了一个可以使他人受益的小部件:
- 分叉 此存储库
- 创建您的小部件 遵循现有模式
- 添加测试和故事书故事
- 提交拉取请求 带有您的小部件的描述
社区小部件的好候选者:
- 通用数据可视化(图表、表格、地图)
- 常见的工具响应模式(搜索结果、确认)
- 可访问性改进
- 性能优化
托管自己的CDN
如果您分叉并希望自托管CDN捆绑包:
# Build the CDN bundles
pnpm build:cdn
# The cdn/ directory contains all bundles
# Upload to your preferred hosting:
# - GitHub Pages
# - Cloudflare R2/Pages
# - AWS S3 + CloudFront
# - Vercel/Netlify
然后在MCP工具响应中引用您的托管包:
<script src="https://your-cdn.example.com/widgets/my-widget.js"></script>
许可证
麻省理工学院
