名称: chatgpt-apps
描述: 完整的 ChatGPT 应用构建器 - 通过 MCP 服务器、小部件、身份验证、数据库集成和自动化部署,创建、设计、实现、测试和部署 ChatGPT 应用
主页: https://github.com/hollaugo/prompt-circle-claude-plugins
user-invocable: true
提供从概念到生产的完整工作流,用于构建、测试和部署 ChatGPT 应用。
/chatgpt-apps new - 创建一个新的 ChatGPT 应用/chatgpt-apps add-tool - 向你的应用添加一个 MCP 工具/chatgpt-apps add-widget - 向你的应用添加一个小部件/chatgpt-apps add-auth - 配置身份验证/chatgpt-apps add-database - 设置数据库/chatgpt-apps validate - 验证你的应用/chatgpt-apps test - 运行测试/chatgpt-apps deploy - 部署到生产环境/chatgpt-apps resume - 继续开发一个应用目的: 从概念到可运行代码,创建一个新的 ChatGPT 应用。
询问应用想法
"你想构建什么样的 ChatGPT 应用?描述它的功能和解决的问题。"
基于 UX 原则分析
检查反模式
定义用例
创建 3-5 个主要用例,包含用户故事。
工具拓扑
readOnlyHint: true)destructiveHint: false)destructiveHint: true)_meta 返回 UI)openWorldHint: true)小部件设计
对于每个小部件:
id - 唯一标识符 (kebab-case)name - 显示名称description - 描述其显示内容mockData - 预览用的示例数据数据模型
设计实体和关系。
身份验证要求
生成具有以下结构的完整应用:
{应用名称}/
├── package.json
├── tsconfig.server.json
├── setup.sh
├── START.sh
├── .env.example
├── .gitignore
└── server/
└── index.ts
关键要求:
- 从 @modelcontextprotocol/sdk/server/index.js 导入 Server 类
- 使用 StreamableHTTPServerTransport 进行会话管理
- 小部件 URI:ui://widget/{widget-id}.html
- 小部件 MIME 类型:text/html+skybridge
- 工具响应中包含 structuredContent
- 工具上带有 _meta 和 openai/outputTemplate
./setup.sh./START.sh --devhttp://localhost:3000/preview目的: 向你的 ChatGPT 应用添加一个新的 MCP 工具。
收集信息
分类工具类型
readOnlyHint: true) - 获取数据destructiveHint: false) - 创建/更新数据destructiveHint: true) - 删除数据openWorldHint: true) - 调用外部 API设计输入模式
使用适当的类型和描述创建 Zod 模式。
生成工具处理器
使用 chatgpt-mcp-generator 代理创建:
server/tools/ 中的工具处理器注册工具
在 server/index.ts 中更新元数据:
typescript
{
name: "my-tool",
_meta: {
"openai/toolInvocation/invoking": "加载中...",
"openai/toolInvocation/invoked": "完成",
"openai/outputTemplate": "ui://widget/my-widget.html", // 如果是小部件
}
}
更新状态
将工具添加到 .chatgpt-app/state.json。
使用 kebab-case:list-items, create-task, show-recipe-detail
| 场景 | readOnlyHint | destructiveHint | openWorldHint |
|---|---|---|---|
| 列表/获取 | true | false | false |
| 创建/更新 | false | false | false |
| 删除 | false | true | false |
| 外部 API | 视情况而定 | 视情况而定 | true |
目的: 添加带有 HTML/CSS/JS 和 Apps SDK 集成的内联 HTML 小部件。
收集信息
定义数据结构
使用 TypeScript 接口记录预期的结构。
添加小部件配置
typescript
const widgets: WidgetConfig[] = [
{
id: "my-widget",
name: "我的小部件",
description: "显示数据",
templateUri: "ui://widget/my-widget.html",
invoking: "加载中...",
invoked: "准备就绪",
mockData: { /* 示例 */ },
},
];
添加小部件 HTML
生成包含以下内容的 HTML:
window.PREVIEW_DATA)window.openai.toolOutput)openai:set_globals)创建/更新工具
通过 widgetId 将工具链接到小部件。
测试小部件
使用模拟数据在 /preview/{widget-id} 预览。
(function() {
let rendered = false;
function render(data) {
if (rendered || !data) return;
rendered = true;
// 渲染逻辑
}
function tryRender() {
if (window.PREVIEW_DATA) { render(window.PREVIEW_DATA); return; }
if (window.openai?.toolOutput) { render(window.openai.toolOutput); }
}
window.addEventListener('openai:set_globals', tryRender);
const poll = setInterval(() => {
if (window.openai?.toolOutput || window.PREVIEW_DATA) {
tryRender();
clearInterval(poll);
}
}, 100);
setTimeout(() => clearInterval(poll), 10000);
tryRender();
})();
目的: 使用 Auth0 或 Supabase Auth 配置身份验证。
Auth0:
- 企业级
- OAuth 2.1, PKCE 流程
- 社交登录 (Google, GitHub 等)
Supabase Auth:
- 设置更简单
- 默认邮箱/密码
- 与 Supabase 数据库集成
选择提供商
根据需求询问用户偏好。
指导设置
生成身份验证代码
使用 chatgpt-auth-generator 代理创建:
更新服务器
添加身份验证中间件以保护路由。
更新环境变量
```bash
# Auth0
AUTH0_DOMAIN=your-tenant.auth0.com
AUTH0_CLIENT_ID=...
AUTH0_CLIENT_SECRET=...
SUPABASE_URL=...
SUPABASE_ANON_KEY=...
```
测试
验证登录流程和用户隔离。
目的: 使用 Supabase 配置 PostgreSQL 数据库。
检查 Supabase 设置
验证账户和项目是否存在。
收集凭证
定义实体
对于每个实体,指定:
生成模式
使用 chatgpt-database-generator 代理创建包含以下内容的 SQL:
id (UUID 主键)user_subject (varchar,已索引)created_at (timestamptz)updated_at (timestamptz)设置连接池
```typescript
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!
);
```
应用迁移
在 Supabase 仪表板中或通过迁移工具运行 SQL。
始终通过 user_subject 过滤:
const { data } = await supabase
.from('tasks')
.select('*')
.eq('user_subject', userSubject);
目的: 生成测试提示词以验证 ChatGPT 是否正确调用工具。
直接提示词 - 显式调用工具
间接提示词 - 基于结果,ChatGPT 应推断工具
负面提示词 - 不应触发工具
分析工具
审查每个工具的目的和输入。
生成提示词
对于每个工具,创建:
最佳实践
保存输出
写入 .chatgpt-app/golden-prompts.json:
json
{
"toolName": {
"direct": ["prompt1", "prompt2"],
"indirect": ["prompt1", "prompt2"],
"negative": ["prompt1", "prompt2"],
"edge": ["prompt1", "prompt2"]
}
}
目的: 部署前的验证套件。
必需文件
服务器实现
ServerStreamableHTTPServerTransport小部件配置
widgets 数组ui://widget/{id}.html工具响应格式
structuredContent (不仅仅是 content)openai/outputTemplate 的 _meta资源处理器格式
text/html+skybridge_meta小部件 HTML 结构
端点存在性
/health - 健康检查/preview - 小部件索引/preview/:widgetId - 小部件预览/mcp - MCP 端点Package.json 脚本
build:serverstart (HTTP_MODE=true)dev (监视模式)注解验证
数据库验证 (如果启用)
| 错误 | 修复方法 |
|---|---|
| 缺少 structuredContent | 添加到工具响应 |
| 错误的小部件 URI | 使用 ui://widget/{id}.html |
| 没有会话管理 | 添加 Map |
| 缺少 _meta | 添加到工具定义和响应 |
| 错误的 MIME 类型 | 使用 text/html+skybridge |
关键: 在其他验证之前首先检查文件是否存在!
目的: 使用 MCP Inspector 和黄金提示词运行自动化测试。
MCP 协议
模式验证
小部件测试
黄金提示词测试
在测试模式下启动服务器
bash
HTTP_MODE=true NODE_ENV=test npm run dev
运行 MCP Inspector
测试协议合规性:
模式验证
验证模式编译并与实现匹配。
黄金提示词测试
使用 ChatGPT 测试提示词:
生成报告
json
{
"passed": 42,
"failed": 3,
"categories": {
"mcp": "✅",
"schema": "✅",
"widgets": "✅",
"prompts": "⚠️ 3 failures"
},
"timing": "2.3s"
}
对于每个失败,解释:
- 什么失败了