[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EMREYTV4AHSWSJ73QPWRRT":3,"skill-same:01M6EMREYTV4AHSWSJ73QPWRRT":256},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":34,"publishedAt":55,"linkOnly":56,"markdownContent":57,"markdownBody":58,"frontMatter":59,"refName":67,"commitSha":68,"skillDirectory":69,"forksCount":70,"repositoryHtmlUrl":71,"repositoryHomepageUrl":72,"ownerHtmlUrl":73,"ownerBlogUrl":6,"ownerDescription":74,"updatedAt":75,"install":76,"resources":89},"01M6EMREYTV4AHSWSJ73QPWRRT","chatgpt-app-builder",null,"Build ChatGPT Apps using the Apps SDK and MCP. Use when users want to:\n(1) Evaluate if their product should become a ChatGPT App\n(2) Design and implement MCP servers with widgets\n(3) Test apps locally and in ChatGPT\n(4) Prepare for App Store submission\nTriggers: \"ChatGPT app\", \"Apps SDK\", \"build for ChatGPT\",\n\"ChatGPT integration\", \"MCP server for ChatGPT\", \"submit to ChatGPT\"","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002FSKILL.md",[18,23,26,29],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":30,"categoryName":31,"taxonomyType":32,"taxonomyTypeDesc":33},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54],"app","app builder","chatgpt app builder","chatgpt","builder","access","submit","apps","widgets","write","read","node","testing","Bash","server","product","code","mcp server","MCP","design","2026-11-10 10:12:30",false,"---\nname: chatgpt-app-builder\ndescription: |\n  Build ChatGPT Apps using the Apps SDK and MCP. Use when users want to:\n  (1) Evaluate if their product should become a ChatGPT App\n  (2) Design and implement MCP servers with widgets\n  (3) Test apps locally and in ChatGPT\n  (4) Prepare for App Store submission\n  Triggers: \"ChatGPT app\", \"Apps SDK\", \"build for ChatGPT\",\n  \"ChatGPT integration\", \"MCP server for ChatGPT\", \"submit to ChatGPT\"\nlicense: MIT\ncompatibility: |\n  Requires Node.js 18+, npm. Network access needed for testing with ngrok.\n  Intended for Claude Code and similar filesystem-based agents.\nmetadata:\n  author: Bayram Annakov (onsa.ai)\n  version: \"1.0.0\"\n  category: development\nallowed-tools: Bash(npm:*) Bash(npx:*) Bash(node:*) Bash(ngrok:*) Read Write Edit Glob Grep\n---\n\n# ChatGPT App Builder\n\nBuild production-ready ChatGPT Apps from concept to App Store submission.\n\n## Quick Start\n\n```\nNew app?           → Start at Phase 1 (Fit Evaluation)\nHave app-spec.md?  → Start at Phase 3 (Implementation)\nApp built?         → Start at Phase 4 (Testing)\nReady to ship?     → Start at Phase 5 (Deployment)\n```\n\n---\n\n## Phase 1: Fit Evaluation\n\n**Goal**: Determine if a ChatGPT App is right for this product.\n\n### Step 1: Gather Context\nAsk the user:\n1. What does your product do?\n2. Who are your users?\n3. What API\u002Fdata does it expose?\n4. What actions can users take?\n\n### Step 2: Apply Know\u002FDo\u002FShow Framework\nEvaluate against three value pillars (see [fit_evaluation.md](references\u002Ffit_evaluation.md)):\n\n| Pillar | Question | Strong Signal |\n|--------|----------|---------------|\n| **Know** | Does it provide data ChatGPT lacks? | Live prices, user-specific data, internal metrics |\n| **Do** | Can it take real actions? | Create, update, delete, send, schedule |\n| **Show** | Can it display better than text? | Lists, charts, maps, media galleries |\n\n**Minimum requirement**: At least one pillar must be strong.\n\n### Step 3: Check Blockers\nReview [fit_evaluation.md](references\u002Ffit_evaluation.md) for:\n- Prohibited categories (gambling, adult, crypto speculation)\n- Data restrictions (no PCI, PHI, SSN, API keys)\n- Age requirements (13+ audience)\n\n### Step 4: Create Golden Prompt Set\nDraft prompts for discovery testing:\n- **5 direct prompts**: Explicitly name your product (\"Show my TaskFlow tasks\")\n- **5 indirect prompts**: Describe intent without naming (\"What should I work on?\")\n- **3 negative prompts**: Similar but shouldn't trigger (\"Create a reminder\")\n\n### Step 5: Write app-spec.md\nCreate the specification file:\n\n```markdown\n# [Product Name] ChatGPT App Spec\n\n## Product Context\n- Name: [Product name]\n- API Base: [API URL]\n- Auth: [Bearer token \u002F OAuth \u002F None]\n\n## Value Proposition\n- Know: [What data does it provide?]\n- Do: [What actions can it take?]\n- Show: [What UI is needed?]\n\n## Golden Prompts\n### Direct (should trigger)\n1. ...\n\n### Indirect (should trigger)\n1. ...\n\n### Negative (should NOT trigger)\n1. ...\n```\n\n**Output**: `app-spec.md` in project directory\n\n---\n\n## Phase 2: App Design\n\n**Goal**: Define complete technical specification.\n\n### Step 1: Define Tools (2-5)\nFollow one-job-per-tool principle. See [chatgpt_app_best_practices.md](references\u002Fchatgpt_app_best_practices.md).\n\nFor each tool, specify:\n```yaml\nname: service_verb_noun  # e.g., taskflow_get_tasks\ntitle: Human Readable Name\ndescription: Use this when the user wants to... [be specific]\nannotations:\n  readOnlyHint: true\u002Ffalse\n  destructiveHint: true\u002Ffalse\n  openWorldHint: true\u002Ffalse\ninputSchema:\n  param1: type (required\u002Foptional)\n  param2: enum[\"a\", \"b\", \"c\"]\noutputStructure:\n  content: [text summary for model]\n  structuredContent: {machine-readable data}\n  _meta: {widget-only data}\n```\n\n### Step 2: Decide Widget Needs\nDoes the app need custom UI?\n\n| Use Case | Widget Needed? | Component Type |\n|----------|----------------|----------------|\n| Task list with checkboxes | Yes | List with actions |\n| Data display only | Maybe | Could use text |\n| Maps, charts, media | Yes | Specialized |\n| Multi-step workflow | Yes | Stateful widget |\n\nSee [widget_development.md](references\u002Fwidget_development.md) for patterns.\n\n### Step 3: Plan Authentication\nIf accessing user-specific data or write operations, auth is required.\n\nSee [oauth_integration.md](references\u002Foauth_integration.md) for:\n- Well-known endpoint setup\n- Provider-specific guides (Auth0, Stytch)\n- Tool-level securitySchemes\n\n### Step 4: Update app-spec.md\nAdd technical specification:\n\n```markdown\n## Tools\n\n### 1. service_get_items\n- **Annotations**: readOnlyHint: true\n- **Input**: { status?: \"active\" | \"completed\", limit?: number }\n- **Output**:\n  - content: \"Found N items\"\n  - structuredContent: { items: [...] }\n  - _meta: { fullData: [...] }\n\n### 2. service_create_item\n- **Annotations**: openWorldHint: true\n- **Input**: { title: string, description?: string }\n- **Output**: { id, title, created_at }\n\n## Widget\n- Type: List with action buttons\n- Display modes: inline, fullscreen\n- State: { selectedId, filter }\n\n## Authentication\n- Required: Yes\n- Provider: Auth0\n- Scopes: read:items, write:items\n```\n\n**Output**: Updated `app-spec.md` with full technical spec\n\n---\n\n## Phase 3: Implementation\n\n**Goal**: Generate complete working project.\n\n### Step 1: Initialize Project\nCopy from assets and customize:\n\n```bash\n# Project structure\nmyapp-chatgpt\u002F\n├── package.json\n├── tsconfig.json\n├── src\u002F\n│   ├── index.ts          # MCP server entry\n│   ├── tools\u002F            # Tool handlers\n│   ├── widget\u002F           # Widget source\n│   └── types\u002F            # TypeScript types\n└── scripts\u002F\n    └── build-widget.ts   # Widget bundler\n```\n\nSee [node_chatgpt_app.md](references\u002Fnode_chatgpt_app.md) for complete patterns.\n\n### Step 2: Implement MCP Server\nKey components (from assets\u002Fserver\u002F):\n\n1. **HTTP server with SSE transport** (required for ChatGPT Apps):\n```typescript\nimport { Server } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Findex.js\";\nimport { SSEServerTransport } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fsse.js\";\n\n\u002F\u002F GET \u002Fmcp - SSE stream connection\n\u002F\u002F POST \u002Fmcp\u002Fmessages - Message handling\n```\n\n2. **Tool definitions with JSON Schema**:\n```typescript\nconst tools: Tool[] = [{\n  name: \"service_get_items\",\n  title: \"Get Items\",\n  description: \"Use this when the user wants to see items...\",\n  inputSchema: { type: \"object\", properties: {...} },\n  _meta: {\n    \"openai\u002FoutputTemplate\": \"ui:\u002F\u002Fwidget\u002Fapp.html\",\n    \"openai\u002FwidgetAccessible\": true\n  },\n  annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false }\n}];\n```\n\n3. **Handler registration**:\n```typescript\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n  const { name, arguments: args } = request.params;\n  \u002F\u002F Handle tool calls...\n  return {\n    content: [{ type: \"text\", text: `Found ${items.length} items` }],\n    structuredContent: { items: items.slice(0, 10) },\n    _meta: { fullItems: items }\n  };\n});\n```\n\n### Step 3: Implement Widget\nKey patterns (from assets\u002Fwidget\u002F):\n\n```typescript\n\u002F\u002F Access data\nconst output = window.openai.toolOutput;\nconst meta = window.openai.toolResponseMetadata;\n\n\u002F\u002F Invoke tools\nawait window.openai.callTool(\"service_action\", { id: \"123\" });\n\n\u002F\u002F Persist state\nwindow.openai.setWidgetState({ selectedId: \"123\" });\n\n\u002F\u002F Layout control\nwindow.openai.notifyIntrinsicHeight(400);\nawait window.openai.requestDisplayMode({ mode: \"fullscreen\" });\n```\n\nSee [widget_development.md](references\u002Fwidget_development.md) for React hooks and patterns.\n\n### Step 4: Build\n```bash\nnpm install\nnpm run build  # Compiles server + bundles widget\n```\n\n### Step 5: Implementation Checklist\n\nBefore moving to testing, verify:\n\n#### Widget Requirements\n- [ ] Uses Apps SDK UI design tokens (see [apps_sdk_ui_tokens.md](references\u002Fapps_sdk_ui_tokens.md))\n- [ ] Implements dark mode with CSS variable architecture\n- [ ] Uses LoadingDots pattern for loading states (see [widget_ui_patterns.md](references\u002Fwidget_ui_patterns.md))\n- [ ] Calls `notifyIntrinsicHeight()` after all DOM changes\n- [ ] Includes copy button feedback for copyable content\n- [ ] Has show more\u002Fless for long lists (>3 items)\n- [ ] Works on mobile (test at 375px width)\n- [ ] Loading UI guards against re-initialization (see [widget_loading_patterns.md](references\u002Fwidget_loading_patterns.md))\n- [ ] SVG animations use `.style` property, not `setAttribute()` (see [widget_development.md](references\u002Fwidget_development.md#common-widget-gotchas))\n\n#### Security Requirements\n- [ ] All user input is validated (see [security_patterns.md](references\u002Fsecurity_patterns.md))\n- [ ] HTML output uses safe DOM methods (textContent, createElement)\n- [ ] External image URLs are proxied with domain whitelist and size limits (200KB)\n- [ ] Rate limiting is implemented per session with LRU eviction\n\n#### Server Requirements\n- [ ] `\u002F.well-known\u002Fopenai-apps-challenge` endpoint returns challenge token\n- [ ] `\u002Fprivacy` endpoint returns HTML privacy policy\n- [ ] `\u002Fterms` endpoint returns HTML terms of service\n- [ ] `\u002Fmcp` endpoint handles SSE connections\n- [ ] `\u002Fhealth` or `\u002F` returns health check JSON\n- [ ] CORS configured for ChatGPT domains only\n- [ ] Security headers set on all responses\n- [ ] **Session routing uses direct lookup by sessionId** (CRITICAL - see [troubleshooting.md](references\u002Ftroubleshooting.md#critical-multi-connection-session-routing))\n- [ ] Response size under 300KB total (remove duplicates, limit images)\n\n#### Production Readiness (if deploying to production)\n- [ ] OAuth tokens stored in database, not in-memory (see [oauth_integration.md](references\u002Foauth_integration.md#production-considerations-token-storage))\n- [ ] Mutation tools include idempotency checks (see [chatgpt_app_best_practices.md](references\u002Fchatgpt_app_best_practices.md#idempotency-keys))\n- [ ] Disambiguation pattern for multi-match scenarios (see [chatgpt_app_best_practices.md](references\u002Fchatgpt_app_best_practices.md#disambiguation-pattern))\n- [ ] Confirmation receipts for all mutations (see [chatgpt_app_best_practices.md](references\u002Fchatgpt_app_best_practices.md#confirmation-receipts))\n\n**Output**: Complete project in working directory\n\n---\n\n## Phase 4: Testing\n\n**Goal**: Verify the app works correctly.\n\n### Step 1: Local Testing with MCP Inspector\n```bash\n# Terminal 1: Start server\nnpm run dev\n# Server runs at http:\u002F\u002Flocalhost:8000\n\n# Terminal 2: Run inspector\nnpx @modelcontextprotocol\u002Finspector@latest http:\u002F\u002Flocalhost:8000\u002Fmcp\n```\n\nVerify:\n- [ ] All tools appear in inspector\n- [ ] Tool calls return expected structure\n- [ ] Widget renders without errors\n\n### Step 2: Create HTTPS Tunnel\n```bash\nngrok http 8000\n# Copy the https:\u002F\u002Fxxx.ngrok.app URL\n```\n\n### Step 3: Create ChatGPT Connector\n1. Go to ChatGPT → Settings → Connectors\n2. Enable Developer Mode (Settings → Apps & Connectors → Advanced)\n3. Create new connector:\n   - Name: Your app name\n   - Description: From app-spec.md\n   - URL: `https:\u002F\u002Fxxx.ngrok.app\u002Fmcp`\n4. Click Create and verify tools appear\n\n### Step 4: Test Golden Prompts\nIn a new ChatGPT conversation:\n1. Enable your connector (+ button → More → select connector)\n2. Test each golden prompt from app-spec.md\n3. Verify:\n   - [ ] Direct prompts trigger correctly\n   - [ ] Indirect prompts trigger correctly\n   - [ ] Negative prompts do NOT trigger\n   - [ ] Widget renders properly\n   - [ ] Actions work (if applicable)\n\n### Step 5: Iterate\nIf issues found:\n1. Fix code\n2. Rebuild: `npm run build`\n3. Refresh connector in ChatGPT settings\n4. Re-test\n\nSee [troubleshooting.md](references\u002Ftroubleshooting.md) for common issues and solutions.\n\n**Output**: Working app tested in ChatGPT\n\n---\n\n## Phase 5: Deployment & Submission\n\n**Goal**: Ship to production and App Store.\n\n### Step 1: Deploy to Production\nGenerate deployment configs from assets\u002Fdeploy\u002F:\n\n**Fly.io** (recommended):\n```bash\nfly launch\nfly deploy\n```\n\n**Vercel\u002FCloudflare**: Ensure streaming HTTP support.\n\n### Step 2: Update Connector\n1. Replace ngrok URL with production URL\n2. Verify connection in ChatGPT settings\n\n### Step 3: Pre-Submission Checklist\nSee [submission_requirements.md](references\u002Fsubmission_requirements.md):\n\n**Required**:\n- [ ] Organization verified on OpenAI Platform\n- [ ] All tools have clear descriptions\n- [ ] Annotations correct (readOnlyHint, destructiveHint, openWorldHint)\n- [ ] No prohibited content\u002Fcommerce\n- [ ] No restricted data collection\n- [ ] Widget renders on mobile\n- [ ] Test credentials with sample data prepared\n\n**If auth required**:\n- [ ] Well-known endpoints accessible\n- [ ] Test account credentials documented\n- [ ] OAuth flow completes successfully\n\n### Step 4: Submit\n1. Go to platform.openai.com\u002Fapps-manage\n2. Enter MCP server URL\n3. Add OAuth metadata (if applicable)\n4. Complete submission form\n5. Submit for review\n\n### Step 5: Post-Submission\n- Monitor email for review status\n- Address any reviewer feedback\n- Click Publish after approval\n\n**Output**: App live in ChatGPT App Store\n\n---\n\n## External Resources\n\n- [OpenAI Apps SDK Docs](https:\u002F\u002Fdevelopers.openai.com\u002Fapps-sdk)\n- [Apps SDK Examples](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-apps-sdk-examples)\n- [Apps SDK UI Kit](https:\u002F\u002Fopenai.github.io\u002Fapps-sdk-ui)\n- [MCP Protocol Spec](https:\u002F\u002Fmodelcontextprotocol.io)\n","# ChatGPT App Builder\n\nBuild production-ready ChatGPT Apps from concept to App Store submission.\n\n## Quick Start\n\n```\nNew app?           → Start at Phase 1 (Fit Evaluation)\nHave app-spec.md?  → Start at Phase 3 (Implementation)\nApp built?         → Start at Phase 4 (Testing)\nReady to ship?     → Start at Phase 5 (Deployment)\n```\n\n---\n\n## Phase 1: Fit Evaluation\n\n**Goal**: Determine if a ChatGPT App is right for this product.\n\n### Step 1: Gather Context\nAsk the user:\n1. What does your product do?\n2. Who are your users?\n3. What API\u002Fdata does it expose?\n4. What actions can users take?\n\n### Step 2: Apply Know\u002FDo\u002FShow Framework\nEvaluate against three value pillars (see [fit_evaluation.md](references\u002Ffit_evaluation.md)):\n\n| Pillar | Question | Strong Signal |\n|--------|----------|---------------|\n| **Know** | Does it provide data ChatGPT lacks? | Live prices, user-specific data, internal metrics |\n| **Do** | Can it take real actions? | Create, update, delete, send, schedule |\n| **Show** | Can it display better than text? | Lists, charts, maps, media galleries |\n\n**Minimum requirement**: At least one pillar must be strong.\n\n### Step 3: Check Blockers\nReview [fit_evaluation.md](references\u002Ffit_evaluation.md) for:\n- Prohibited categories (gambling, adult, crypto speculation)\n- Data restrictions (no PCI, PHI, SSN, API keys)\n- Age requirements (13+ audience)\n\n### Step 4: Create Golden Prompt Set\nDraft prompts for discovery testing:\n- **5 direct prompts**: Explicitly name your product (\"Show my TaskFlow tasks\")\n- **5 indirect prompts**: Describe intent without naming (\"What should I work on?\")\n- **3 negative prompts**: Similar but shouldn't trigger (\"Create a reminder\")\n\n### Step 5: Write app-spec.md\nCreate the specification file:\n\n```markdown\n# [Product Name] ChatGPT App Spec\n\n## Product Context\n- Name: [Product name]\n- API Base: [API URL]\n- Auth: [Bearer token \u002F OAuth \u002F None]\n\n## Value Proposition\n- Know: [What data does it provide?]\n- Do: [What actions can it take?]\n- Show: [What UI is needed?]\n\n## Golden Prompts\n### Direct (should trigger)\n1. ...\n\n### Indirect (should trigger)\n1. ...\n\n### Negative (should NOT trigger)\n1. ...\n```\n\n**Output**: `app-spec.md` in project directory\n\n---\n\n## Phase 2: App Design\n\n**Goal**: Define complete technical specification.\n\n### Step 1: Define Tools (2-5)\nFollow one-job-per-tool principle. See [chatgpt_app_best_practices.md](references\u002Fchatgpt_app_best_practices.md).\n\nFor each tool, specify:\n```yaml\nname: service_verb_noun  # e.g., taskflow_get_tasks\ntitle: Human Readable Name\ndescription: Use this when the user wants to... [be specific]\nannotations:\n  readOnlyHint: true\u002Ffalse\n  destructiveHint: true\u002Ffalse\n  openWorldHint: true\u002Ffalse\ninputSchema:\n  param1: type (required\u002Foptional)\n  param2: enum[\"a\", \"b\", \"c\"]\noutputStructure:\n  content: [text summary for model]\n  structuredContent: {machine-readable data}\n  _meta: {widget-only data}\n```\n\n### Step 2: Decide Widget Needs\nDoes the app need custom UI?\n\n| Use Case | Widget Needed? | Component Type |\n|----------|----------------|----------------|\n| Task list with checkboxes | Yes | List with actions |\n| Data display only | Maybe | Could use text |\n| Maps, charts, media | Yes | Specialized |\n| Multi-step workflow | Yes | Stateful widget |\n\nSee [widget_development.md](references\u002Fwidget_development.md) for patterns.\n\n### Step 3: Plan Authentication\nIf accessing user-specific data or write operations, auth is required.\n\nSee [oauth_integration.md](references\u002Foauth_integration.md) for:\n- Well-known endpoint setup\n- Provider-specific guides (Auth0, Stytch)\n- Tool-level securitySchemes\n\n### Step 4: Update app-spec.md\nAdd technical specification:\n\n```markdown\n## Tools\n\n### 1. service_get_items\n- **Annotations**: readOnlyHint: true\n- **Input**: { status?: \"active\" | \"completed\", limit?: number }\n- **Output**:\n  - content: \"Found N items\"\n  - structuredContent: { items: [...] }\n  - _meta: { fullData: [...] }\n\n### 2. service_create_item\n- **Annotations**: openWorldHint: true\n- **Input**: { title: string, description?: string }\n- **Output**: { id, title, created_at }\n\n## Widget\n- Type: List with action buttons\n- Display modes: inline, fullscreen\n- State: { selectedId, filter }\n\n## Authentication\n- Required: Yes\n- Provider: Auth0\n- Scopes: read:items, write:items\n```\n\n**Output**: Updated `app-spec.md` with full technical spec\n\n---\n\n## Phase 3: Implementation\n\n**Goal**: Generate complete working project.\n\n### Step 1: Initialize Project\nCopy from assets and customize:\n\n```bash\n# Project structure\nmyapp-chatgpt\u002F\n├── package.json\n├── tsconfig.json\n├── src\u002F\n│   ├── index.ts          # MCP server entry\n│   ├── tools\u002F            # Tool handlers\n│   ├── widget\u002F           # Widget source\n│   └── types\u002F            # TypeScript types\n└── scripts\u002F\n    └── build-widget.ts   # Widget bundler\n```\n\nSee [node_chatgpt_app.md](references\u002Fnode_chatgpt_app.md) for complete patterns.\n\n### Step 2: Implement MCP Server\nKey components (from assets\u002Fserver\u002F):\n\n1. **HTTP server with SSE transport** (required for ChatGPT Apps):\n```typescript\nimport { Server } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Findex.js\";\nimport { SSEServerTransport } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fsse.js\";\n\n\u002F\u002F GET \u002Fmcp - SSE stream connection\n\u002F\u002F POST \u002Fmcp\u002Fmessages - Message handling\n```\n\n2. **Tool definitions with JSON Schema**:\n```typescript\nconst tools: Tool[] = [{\n  name: \"service_get_items\",\n  title: \"Get Items\",\n  description: \"Use this when the user wants to see items...\",\n  inputSchema: { type: \"object\", properties: {...} },\n  _meta: {\n    \"openai\u002FoutputTemplate\": \"ui:\u002F\u002Fwidget\u002Fapp.html\",\n    \"openai\u002FwidgetAccessible\": true\n  },\n  annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false }\n}];\n```\n\n3. **Handler registration**:\n```typescript\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n  const { name, arguments: args } = request.params;\n  \u002F\u002F Handle tool calls...\n  return {\n    content: [{ type: \"text\", text: `Found ${items.length} items` }],\n    structuredContent: { items: items.slice(0, 10) },\n    _meta: { fullItems: items }\n  };\n});\n```\n\n### Step 3: Implement Widget\nKey patterns (from assets\u002Fwidget\u002F):\n\n```typescript\n\u002F\u002F Access data\nconst output = window.openai.toolOutput;\nconst meta = window.openai.toolResponseMetadata;\n\n\u002F\u002F Invoke tools\nawait window.openai.callTool(\"service_action\", { id: \"123\" });\n\n\u002F\u002F Persist state\nwindow.openai.setWidgetState({ selectedId: \"123\" });\n\n\u002F\u002F Layout control\nwindow.openai.notifyIntrinsicHeight(400);\nawait window.openai.requestDisplayMode({ mode: \"fullscreen\" });\n```\n\nSee [widget_development.md](references\u002Fwidget_development.md) for React hooks and patterns.\n\n### Step 4: Build\n```bash\nnpm install\nnpm run build  # Compiles server + bundles widget\n```\n\n### Step 5: Implementation Checklist\n\nBefore moving to testing, verify:\n\n#### Widget Requirements\n- [ ] Uses Apps SDK UI design tokens (see [apps_sdk_ui_tokens.md](references\u002Fapps_sdk_ui_tokens.md))\n- [ ] Implements dark mode with CSS variable architecture\n- [ ] Uses LoadingDots pattern for loading states (see [widget_ui_patterns.md](references\u002Fwidget_ui_patterns.md))\n- [ ] Calls `notifyIntrinsicHeight()` after all DOM changes\n- [ ] Includes copy button feedback for copyable content\n- [ ] Has show more\u002Fless for long lists (>3 items)\n- [ ] Works on mobile (test at 375px width)\n- [ ] Loading UI guards against re-initialization (see [widget_loading_patterns.md](references\u002Fwidget_loading_patterns.md))\n- [ ] SVG animations use `.style` property, not `setAttribute()` (see [widget_development.md](references\u002Fwidget_development.md#common-widget-gotchas))\n\n#### Security Requirements\n- [ ] All user input is validated (see [security_patterns.md](references\u002Fsecurity_patterns.md))\n- [ ] HTML output uses safe DOM methods (textContent, createElement)\n- [ ] External image URLs are proxied with domain whitelist and size limits (200KB)\n- [ ] Rate limiting is implemented per session with LRU eviction\n\n#### Server Requirements\n- [ ] `\u002F.well-known\u002Fopenai-apps-challenge` endpoint returns challenge token\n- [ ] `\u002Fprivacy` endpoint returns HTML privacy policy\n- [ ] `\u002Fterms` endpoint returns HTML terms of service\n- [ ] `\u002Fmcp` endpoint handles SSE connections\n- [ ] `\u002Fhealth` or `\u002F` returns health check JSON\n- [ ] CORS configured for ChatGPT domains only\n- [ ] Security headers set on all responses\n- [ ] **Session routing uses direct lookup by sessionId** (CRITICAL - see [troubleshooting.md](references\u002Ftroubleshooting.md#critical-multi-connection-session-routing))\n- [ ] Response size under 300KB total (remove duplicates, limit images)\n\n#### Production Readiness (if deploying to production)\n- [ ] OAuth tokens stored in database, not in-memory (see [oauth_integration.md](references\u002Foauth_integration.md#production-considerations-token-storage))\n- [ ] Mutation tools include idempotency checks (see [chatgpt_app_best_practices.md](references\u002Fchatgpt_app_best_practices.md#idempotency-keys))\n- [ ] Disambiguation pattern for multi-match scenarios (see [chatgpt_app_best_practices.md](references\u002Fchatgpt_app_best_practices.md#disambiguation-pattern))\n- [ ] Confirmation receipts for all mutations (see [chatgpt_app_best_practices.md](references\u002Fchatgpt_app_best_practices.md#confirmation-receipts))\n\n**Output**: Complete project in working directory\n\n---\n\n## Phase 4: Testing\n\n**Goal**: Verify the app works correctly.\n\n### Step 1: Local Testing with MCP Inspector\n```bash\n# Terminal 1: Start server\nnpm run dev\n# Server runs at http:\u002F\u002Flocalhost:8000\n\n# Terminal 2: Run inspector\nnpx @modelcontextprotocol\u002Finspector@latest http:\u002F\u002Flocalhost:8000\u002Fmcp\n```\n\nVerify:\n- [ ] All tools appear in inspector\n- [ ] Tool calls return expected structure\n- [ ] Widget renders without errors\n\n### Step 2: Create HTTPS Tunnel\n```bash\nngrok http 8000\n# Copy the https:\u002F\u002Fxxx.ngrok.app URL\n```\n\n### Step 3: Create ChatGPT Connector\n1. Go to ChatGPT → Settings → Connectors\n2. Enable Developer Mode (Settings → Apps & Connectors → Advanced)\n3. Create new connector:\n   - Name: Your app name\n   - Description: From app-spec.md\n   - URL: `https:\u002F\u002Fxxx.ngrok.app\u002Fmcp`\n4. Click Create and verify tools appear\n\n### Step 4: Test Golden Prompts\nIn a new ChatGPT conversation:\n1. Enable your connector (+ button → More → select connector)\n2. Test each golden prompt from app-spec.md\n3. Verify:\n   - [ ] Direct prompts trigger correctly\n   - [ ] Indirect prompts trigger correctly\n   - [ ] Negative prompts do NOT trigger\n   - [ ] Widget renders properly\n   - [ ] Actions work (if applicable)\n\n### Step 5: Iterate\nIf issues found:\n1. Fix code\n2. Rebuild: `npm run build`\n3. Refresh connector in ChatGPT settings\n4. Re-test\n\nSee [troubleshooting.md](references\u002Ftroubleshooting.md) for common issues and solutions.\n\n**Output**: Working app tested in ChatGPT\n\n---\n\n## Phase 5: Deployment & Submission\n\n**Goal**: Ship to production and App Store.\n\n### Step 1: Deploy to Production\nGenerate deployment configs from assets\u002Fdeploy\u002F:\n\n**Fly.io** (recommended):\n```bash\nfly launch\nfly deploy\n```\n\n**Vercel\u002FCloudflare**: Ensure streaming HTTP support.\n\n### Step 2: Update Connector\n1. Replace ngrok URL with production URL\n2. Verify connection in ChatGPT settings\n\n### Step 3: Pre-Submission Checklist\nSee [submission_requirements.md](references\u002Fsubmission_requirements.md):\n\n**Required**:\n- [ ] Organization verified on OpenAI Platform\n- [ ] All tools have clear descriptions\n- [ ] Annotations correct (readOnlyHint, destructiveHint, openWorldHint)\n- [ ] No prohibited content\u002Fcommerce\n- [ ] No restricted data collection\n- [ ] Widget renders on mobile\n- [ ] Test credentials with sample data prepared\n\n**If auth required**:\n- [ ] Well-known endpoints accessible\n- [ ] Test account credentials documented\n- [ ] OAuth flow completes successfully\n\n### Step 4: Submit\n1. Go to platform.openai.com\u002Fapps-manage\n2. Enter MCP server URL\n3. Add OAuth metadata (if applicable)\n4. Complete submission form\n5. Submit for review\n\n### Step 5: Post-Submission\n- Monitor email for review status\n- Address any reviewer feedback\n- Click Publish after approval\n\n**Output**: App live in ChatGPT App Store\n\n---\n\n## External Resources\n\n- [OpenAI Apps SDK Docs](https:\u002F\u002Fdevelopers.openai.com\u002Fapps-sdk)\n- [Apps SDK Examples](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-apps-sdk-examples)\n- [Apps SDK UI Kit](https:\u002F\u002Fopenai.github.io\u002Fapps-sdk-ui)\n- [MCP Protocol Spec](https:\u002F\u002Fmodelcontextprotocol.io)\n",{"name":5,"license":15,"metadata":60,"description":64,"allowed-tools":65,"compatibility":66},{"author":61,"version":62,"category":63},"Bayram Annakov (onsa.ai)","1.0.0","development","Build ChatGPT Apps using the Apps SDK and MCP. Use when users want to:\n(1) Evaluate if their product should become a ChatGPT App\n(2) Design and implement MCP servers with widgets\n(3) Test apps locally and in ChatGPT\n(4) Prepare for App Store submission\nTriggers: \"ChatGPT app\", \"Apps SDK\", \"build for ChatGPT\",\n\"ChatGPT integration\", \"MCP server for ChatGPT\", \"submit to ChatGPT\"\n","Bash(npm:*) Bash(npx:*) Bash(node:*) Bash(ngrok:*) Read Write Edit Glob Grep","Requires Node.js 18+, npm. Network access needed for testing with ngrok.\nIntended for Claude Code and similar filesystem-based agents.\n","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":77,"prompt":87,"zipAvailable":88},[78,81,84],{"tool":79,"command":80},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill chatgpt-app-builder",{"tool":82,"command":83},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill chatgpt-app-builder",{"tool":85,"command":86},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill chatgpt-app-builder","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002FSKILL.md",true,[90,96,100,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,200,204,208,212,216,220,224,228,232,236,240,244,248,252],{"path":91,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":94,"sourceHtmlUrl":95},"assets\u002Fdeploy\u002FDockerfile","ASSET","资产文件",841,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fdeploy\u002FDockerfile",{"path":97,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":98,"sourceHtmlUrl":99},"assets\u002Fdeploy\u002Ffly.toml",644,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fdeploy\u002Ffly.toml",{"path":101,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":104,"sourceHtmlUrl":105},"assets\u002Fserver\u002Fscripts\u002Fbuild-widget.ts","SCRIPT","脚本",1847,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fscripts\u002Fbuild-widget.ts",{"path":107,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":108,"sourceHtmlUrl":109},"assets\u002Fserver\u002Fsrc\u002Findex.ts",17254,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Findex.ts",{"path":111,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":112,"sourceHtmlUrl":113},"assets\u002Fserver\u002Fsrc\u002Flib\u002Fapi-client.ts",3683,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Flib\u002Fapi-client.ts",{"path":115,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":116,"sourceHtmlUrl":117},"assets\u002Fserver\u002Fsrc\u002Flib\u002Ferrors.ts",2400,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Flib\u002Ferrors.ts",{"path":119,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":120,"sourceHtmlUrl":121},"assets\u002Fserver\u002Fsrc\u002Flib\u002Fimage-proxy.ts",5873,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Flib\u002Fimage-proxy.ts",{"path":123,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":124,"sourceHtmlUrl":125},"assets\u002Fserver\u002Fsrc\u002Flib\u002Frate-limiter.ts",4992,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Flib\u002Frate-limiter.ts",{"path":127,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":128,"sourceHtmlUrl":129},"assets\u002Fserver\u002Fsrc\u002Ftools\u002Fcreate-item.ts",2410,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Ftools\u002Fcreate-item.ts",{"path":131,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":132,"sourceHtmlUrl":133},"assets\u002Fserver\u002Fsrc\u002Ftools\u002Fexample-tool.ts",6685,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Ftools\u002Fexample-tool.ts",{"path":135,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":136,"sourceHtmlUrl":137},"assets\u002Fserver\u002Fsrc\u002Ftools\u002Fget-items.ts",2640,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Ftools\u002Fget-items.ts",{"path":139,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":140,"sourceHtmlUrl":141},"assets\u002Fserver\u002Fsrc\u002Ftools\u002Findex.ts",698,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Ftools\u002Findex.ts",{"path":143,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":144,"sourceHtmlUrl":145},"assets\u002Fserver\u002Fsrc\u002Ftypes\u002Fopenai.d.ts",1994,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Ftypes\u002Fopenai.d.ts",{"path":147,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":148,"sourceHtmlUrl":149},"assets\u002Fserver\u002Fsrc\u002Fwidget\u002Fembed.ts",2327,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Fsrc\u002Fwidget\u002Fembed.ts",{"path":151,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":152,"sourceHtmlUrl":153},"assets\u002Fserver\u002Ftsconfig.json",605,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fserver\u002Ftsconfig.json",{"path":155,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":156,"sourceHtmlUrl":157},"assets\u002Ftests\u002Fgolden-prompts.ts",6656,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Ftests\u002Fgolden-prompts.ts",{"path":159,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":160,"sourceHtmlUrl":161},"assets\u002Ftests\u002Ftool-tests.ts",6439,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Ftests\u002Ftool-tests.ts",{"path":163,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":164,"sourceHtmlUrl":165},"assets\u002Fwidget\u002Fsrc\u002FApp.tsx",6185,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fwidget\u002Fsrc\u002FApp.tsx",{"path":167,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":168,"sourceHtmlUrl":169},"assets\u002Fwidget\u002Fsrc\u002Fcomponents\u002FExampleList.tsx",3712,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fwidget\u002Fsrc\u002Fcomponents\u002FExampleList.tsx",{"path":171,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":172,"sourceHtmlUrl":173},"assets\u002Fwidget\u002Fsrc\u002Fcomponents\u002FItemList.tsx",4939,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fwidget\u002Fsrc\u002Fcomponents\u002FItemList.tsx",{"path":175,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":176,"sourceHtmlUrl":177},"assets\u002Fwidget\u002Fsrc\u002Fhooks\u002FuseOpenAI.ts",5671,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fwidget\u002Fsrc\u002Fhooks\u002FuseOpenAI.ts",{"path":179,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":180,"sourceHtmlUrl":181},"assets\u002Fwidget\u002Fsrc\u002Fhooks\u002FuseWidgetState.ts",170,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fwidget\u002Fsrc\u002Fhooks\u002FuseWidgetState.ts",{"path":183,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":184,"sourceHtmlUrl":185},"assets\u002Fwidget\u002Fsrc\u002Ftypes\u002Fopenai.d.ts",1767,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fwidget\u002Fsrc\u002Ftypes\u002Fopenai.d.ts",{"path":187,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":188,"sourceHtmlUrl":189},"assets\u002Fwidget\u002Fstyles\u002Fwidget.css",4963,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fwidget\u002Fstyles\u002Fwidget.css",{"path":191,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":192,"sourceHtmlUrl":193},"assets\u002Fwidget\u002Ftsconfig.json",406,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fassets\u002Fwidget\u002Ftsconfig.json",{"path":195,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":198,"sourceHtmlUrl":199},"references\u002Fapps_sdk_ui_tokens.md","REFERENCE","参考文档",5601,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Fapps_sdk_ui_tokens.md",{"path":201,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":202,"sourceHtmlUrl":203},"references\u002Fchatgpt_app_best_practices.md",11989,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Fchatgpt_app_best_practices.md",{"path":205,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":206,"sourceHtmlUrl":207},"references\u002Ffit_evaluation.md",5970,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Ffit_evaluation.md",{"path":209,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":210,"sourceHtmlUrl":211},"references\u002Fnode_chatgpt_app.md",18964,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Fnode_chatgpt_app.md",{"path":213,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":214,"sourceHtmlUrl":215},"references\u002Foauth_integration.md",18982,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Foauth_integration.md",{"path":217,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":218,"sourceHtmlUrl":219},"references\u002Fsecurity_patterns.md",13755,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Fsecurity_patterns.md",{"path":221,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":222,"sourceHtmlUrl":223},"references\u002Fsubmission_requirements.md",8853,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Fsubmission_requirements.md",{"path":225,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":226,"sourceHtmlUrl":227},"references\u002Ftesting_patterns.md",11067,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Ftesting_patterns.md",{"path":229,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":230,"sourceHtmlUrl":231},"references\u002Ftroubleshooting.md",25463,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Ftroubleshooting.md",{"path":233,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":234,"sourceHtmlUrl":235},"references\u002Fwidget_css_template.md",13205,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Fwidget_css_template.md",{"path":237,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":238,"sourceHtmlUrl":239},"references\u002Fwidget_development.md",19995,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Fwidget_development.md",{"path":241,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":242,"sourceHtmlUrl":243},"references\u002Fwidget_loading_patterns.md",13922,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Fwidget_loading_patterns.md",{"path":245,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":246,"sourceHtmlUrl":247},"references\u002Fwidget_ui_patterns.md",11654,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Freferences\u002Fwidget_ui_patterns.md",{"path":249,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":250,"sourceHtmlUrl":251},"scripts\u002Fvalidate-app-spec.py",8711,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fscripts\u002Fvalidate-app-spec.py",{"path":253,"resourceType":196,"resourceTypeDesc":197,"sizeBytes":254,"sourceHtmlUrl":255},"skill-report.json",15919,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbayramannakov\u002Fchatgpt-app-builder\u002Fskill-report.json",[257,267,276,284,290,297],{"skillNo":258,"name":259,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":260,"categories":261,"keywords":263,"publishedAt":55},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[262],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[264,265,266],"model","model hierarchy","model hierarchy skill",{"skillNo":268,"name":269,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":270,"categories":271,"keywords":273,"publishedAt":55},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[272],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[53,274,275],"zoom","zoom mcp",{"skillNo":277,"name":278,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":279,"categories":280,"keywords":281,"publishedAt":55},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[282,283,42,274],"sdk","zoom apps sdk",{"skillNo":285,"name":286,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":287,"categories":288,"keywords":289,"publishedAt":55},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[286],{"skillNo":291,"name":292,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":293,"categories":294,"keywords":296,"publishedAt":55},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[295],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[292],{"skillNo":298,"name":299,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":300,"categories":301,"keywords":302,"publishedAt":55},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[299]]