chatgpt-app-builder
Build ChatGPT Apps using the Apps SDK and MCP. Use when users want to: (1) Evaluate if their product should become a ChatGPT App (2) Design and implement MCP servers with widgets (3) Test apps locally and in ChatGPT (4) Prepare for App Store submission Triggers: "ChatGPT app", "Apps SDK", "build for ChatGPT", "ChatGPT integration", "MCP server for ChatGPT", "submit to ChatGPT"
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o chatgpt-app-builder.zip https://jpskill.com/download/17483.zip && unzip -o chatgpt-app-builder.zip && rm chatgpt-app-builder.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/17483.zip -OutFile "$d\chatgpt-app-builder.zip"; Expand-Archive "$d\chatgpt-app-builder.zip" -DestinationPath $d -Force; ri "$d\chatgpt-app-builder.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
chatgpt-app-builder.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
chatgpt-app-builderフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 40
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
ChatGPT App Builder
コンセプトから App Store への提出まで、本番環境に対応した ChatGPT アプリを構築します。
クイックスタート
新しいアプリですか? → フェーズ 1 (適合性評価) から開始
app-spec.md がありますか? → フェーズ 3 (実装) から開始
アプリは構築済みですか? → フェーズ 4 (テスト) から開始
出荷準備はできていますか? → フェーズ 5 (デプロイ) から開始
フェーズ 1: 適合性評価
目標: ChatGPT アプリがこの製品に適しているかどうかを判断します。
ステップ 1: コンテキストの収集
ユーザーに以下を尋ねます。
- あなたの製品は何をしますか?
- あなたのユーザーは誰ですか?
- どのような API/データ を公開していますか?
- ユーザーはどのようなアクションを実行できますか?
ステップ 2: Know/Do/Show フレームワークの適用
3 つの価値の柱に対して評価します ( fit_evaluation.md を参照)。
| 柱 | 質問 | 強いシグナル |
|---|---|---|
| Know | ChatGPT が欠いているデータを提供しますか? | ライブ価格、ユーザー固有のデータ、内部メトリクス |
| Do | 実際のアクションを実行できますか? | 作成、更新、削除、送信、スケジュール |
| Show | テキストよりも優れた表示ができますか? | リスト、チャート、マップ、メディアギャラリー |
最低要件: 少なくとも 1 つの柱が強力である必要があります。
ステップ 3: ブロッカーの確認
fit_evaluation.md で以下を確認します。
- 禁止されているカテゴリ (ギャンブル、アダルト、暗号通貨投機)
- データ制限 (PCI、PHI、SSN、API キーは不可)
- 年齢要件 (13 歳以上の対象者)
ステップ 4: ゴールデンプロンプトセットの作成
ディスカバリーテスト用のプロンプトを作成します。
- 5 つの直接的なプロンプト: 製品名を明示的に指定します ("TaskFlow のタスクを表示")
- 5 つの間接的なプロンプト: 名前を指定せずに意図を説明します ("何に取り組むべきですか?")
- 3 つの否定的なプロンプト: 似ていますが、トリガーされるべきではありません ("リマインダーを作成")
ステップ 5: app-spec.md の作成
仕様ファイルを作成します。
# [製品名] ChatGPT アプリ仕様
## 製品コンテキスト
- 名前: [製品名]
- API ベース: [API URL]
- 認証: [Bearer token / OAuth / None]
## 価値提案
- Know: [どのようなデータを提供しますか?]
- Do: [どのようなアクションを実行できますか?]
- Show: [どのような UI が必要ですか?]
## ゴールデンプロンプト
### 直接的 (トリガーされるべき)
1. ...
### 間接的 (トリガーされるべき)
1. ...
### 否定的 (トリガーされるべきではない)
1. ...
出力: プロジェクトディレクトリに app-spec.md
フェーズ 2: アプリ設計
目標: 完全な技術仕様を定義します。
ステップ 1: ツールの定義 (2-5)
1 つのツールに 1 つのジョブという原則に従います。chatgpt_app_best_practices.md を参照してください。
各ツールについて、以下を指定します。
name: service_verb_noun # 例: taskflow_get_tasks
title: 人間が読める名前
description: ユーザーが...したいときにこれを使用します [具体的に]
annotations:
readOnlyHint: true/false
destructiveHint: true/false
openWorldHint: true/false
inputSchema:
param1: type (必須/オプション)
param2: enum["a", "b", "c"]
outputStructure:
content: [モデルのテキスト要約]
structuredContent: {機械可読データ}
_meta: {ウィジェット専用データ}
ステップ 2: ウィジェットのニーズの決定
アプリにカスタム UI が必要ですか?
| ユースケース | ウィジェットが必要ですか? | コンポーネントタイプ |
|---|---|---|
| チェックボックス付きのタスクリスト | はい | アクション付きリスト |
| データ表示のみ | たぶん | テキストを使用可能 |
| マップ、チャート、メディア | はい | 特殊 |
| 複数ステップのワークフロー | はい | ステートフルウィジェット |
パターンについては、widget_development.md を参照してください。
ステップ 3: 認証の計画
ユーザー固有のデータへのアクセスまたは書き込み操作を行う場合は、認証が必要です。
oauth_integration.md を参照してください。
- 既知のエンドポイント設定
- プロバイダー固有のガイド (Auth0, Stytch)
- ツールレベルの securitySchemes
ステップ 4: app-spec.md の更新
技術仕様を追加します。
## ツール
### 1. service_get_items
- **Annotations**: readOnlyHint: true
- **Input**: { status?: "active" | "completed", limit?: number }
- **Output**:
- content: "N 個のアイテムが見つかりました"
- structuredContent: { items: [...] }
- _meta: { fullData: [...] }
### 2. service_create_item
- **Annotations**: openWorldHint: true
- **Input**: { title: string, description?: string }
- **Output**: { id, title, created_at }
## ウィジェット
- タイプ: アクションボタン付きリスト
- 表示モード: インライン、フルスクリーン
- 状態: { selectedId, filter }
## 認証
- 必須: はい
- プロバイダー: Auth0
- スコープ: read:items, write:items
出力: 完全な技術仕様を含む更新された app-spec.md
フェーズ 3: 実装
目標: 完全に動作するプロジェクトを生成します。
ステップ 1: プロジェクトの初期化
アセットからコピーしてカスタマイズします。
# プロジェクト構造
myapp-chatgpt/
├── package.json
├── tsconfig.json
├── src/
│ ├── index.ts # MCP サーバーエントリ
│ ├── tools/ # ツールハンドラー
│ ├── widget/ # ウィジェットソース
│ └── types/ # TypeScript タイプ
└── scripts/
└── build-widget.ts # ウィジェットバンドラー
完全なパターンについては、node_chatgpt_app.md を参照してください。
ステップ 2: MCP サーバーの実装
主要なコンポーネント (assets/server/ から):
- SSE トランスポートを備えた HTTP サーバー (ChatGPT アプリに必須):
import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
// GET /mcp - SSE ストリーム接続 // POST /mcp/messages - メッセージ処理
2. **JSON Schema を使用したツール定義**:
```typescript
const tools: Tool[] = [{
name: "service_get_items",
title: "アイテムを取得",
description: "ユーザーがアイテムを見たいときにこれを使用します...",
inputSchema: { type: "object", properties: {...} },
_meta: {
"openai/outputTemplate": "ui://widget/app.html",
"openai/widgetAccessible": true
},
annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false }
}];
- ハンドラー登録:
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools })); server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; // ツール呼び出しを処理します。
(原文がここで切り詰められています)
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
ChatGPT App Builder
Build production-ready ChatGPT Apps from concept to App Store submission.
Quick Start
New app? → Start at Phase 1 (Fit Evaluation)
Have app-spec.md? → Start at Phase 3 (Implementation)
App built? → Start at Phase 4 (Testing)
Ready to ship? → Start at Phase 5 (Deployment)
Phase 1: Fit Evaluation
Goal: Determine if a ChatGPT App is right for this product.
Step 1: Gather Context
Ask the user:
- What does your product do?
- Who are your users?
- What API/data does it expose?
- What actions can users take?
Step 2: Apply Know/Do/Show Framework
Evaluate against three value pillars (see fit_evaluation.md):
| Pillar | Question | Strong Signal |
|---|---|---|
| Know | Does it provide data ChatGPT lacks? | Live prices, user-specific data, internal metrics |
| Do | Can it take real actions? | Create, update, delete, send, schedule |
| Show | Can it display better than text? | Lists, charts, maps, media galleries |
Minimum requirement: At least one pillar must be strong.
Step 3: Check Blockers
Review fit_evaluation.md for:
- Prohibited categories (gambling, adult, crypto speculation)
- Data restrictions (no PCI, PHI, SSN, API keys)
- Age requirements (13+ audience)
Step 4: Create Golden Prompt Set
Draft prompts for discovery testing:
- 5 direct prompts: Explicitly name your product ("Show my TaskFlow tasks")
- 5 indirect prompts: Describe intent without naming ("What should I work on?")
- 3 negative prompts: Similar but shouldn't trigger ("Create a reminder")
Step 5: Write app-spec.md
Create the specification file:
# [Product Name] ChatGPT App Spec
## Product Context
- Name: [Product name]
- API Base: [API URL]
- Auth: [Bearer token / OAuth / None]
## Value Proposition
- Know: [What data does it provide?]
- Do: [What actions can it take?]
- Show: [What UI is needed?]
## Golden Prompts
### Direct (should trigger)
1. ...
### Indirect (should trigger)
1. ...
### Negative (should NOT trigger)
1. ...
Output: app-spec.md in project directory
Phase 2: App Design
Goal: Define complete technical specification.
Step 1: Define Tools (2-5)
Follow one-job-per-tool principle. See chatgpt_app_best_practices.md.
For each tool, specify:
name: service_verb_noun # e.g., taskflow_get_tasks
title: Human Readable Name
description: Use this when the user wants to... [be specific]
annotations:
readOnlyHint: true/false
destructiveHint: true/false
openWorldHint: true/false
inputSchema:
param1: type (required/optional)
param2: enum["a", "b", "c"]
outputStructure:
content: [text summary for model]
structuredContent: {machine-readable data}
_meta: {widget-only data}
Step 2: Decide Widget Needs
Does the app need custom UI?
| Use Case | Widget Needed? | Component Type |
|---|---|---|
| Task list with checkboxes | Yes | List with actions |
| Data display only | Maybe | Could use text |
| Maps, charts, media | Yes | Specialized |
| Multi-step workflow | Yes | Stateful widget |
See widget_development.md for patterns.
Step 3: Plan Authentication
If accessing user-specific data or write operations, auth is required.
See oauth_integration.md for:
- Well-known endpoint setup
- Provider-specific guides (Auth0, Stytch)
- Tool-level securitySchemes
Step 4: Update app-spec.md
Add technical specification:
## Tools
### 1. service_get_items
- **Annotations**: readOnlyHint: true
- **Input**: { status?: "active" | "completed", limit?: number }
- **Output**:
- content: "Found N items"
- structuredContent: { items: [...] }
- _meta: { fullData: [...] }
### 2. service_create_item
- **Annotations**: openWorldHint: true
- **Input**: { title: string, description?: string }
- **Output**: { id, title, created_at }
## Widget
- Type: List with action buttons
- Display modes: inline, fullscreen
- State: { selectedId, filter }
## Authentication
- Required: Yes
- Provider: Auth0
- Scopes: read:items, write:items
Output: Updated app-spec.md with full technical spec
Phase 3: Implementation
Goal: Generate complete working project.
Step 1: Initialize Project
Copy from assets and customize:
# Project structure
myapp-chatgpt/
├── package.json
├── tsconfig.json
├── src/
│ ├── index.ts # MCP server entry
│ ├── tools/ # Tool handlers
│ ├── widget/ # Widget source
│ └── types/ # TypeScript types
└── scripts/
└── build-widget.ts # Widget bundler
See node_chatgpt_app.md for complete patterns.
Step 2: Implement MCP Server
Key components (from assets/server/):
- HTTP server with SSE transport (required for ChatGPT Apps):
import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
// GET /mcp - SSE stream connection // POST /mcp/messages - Message handling
2. **Tool definitions with JSON Schema**:
```typescript
const tools: Tool[] = [{
name: "service_get_items",
title: "Get Items",
description: "Use this when the user wants to see items...",
inputSchema: { type: "object", properties: {...} },
_meta: {
"openai/outputTemplate": "ui://widget/app.html",
"openai/widgetAccessible": true
},
annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false }
}];
- Handler registration:
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools })); server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; // Handle tool calls... return { content: [{ type: "text", text: `Found ${items.length} items` }], structuredContent: { items: items.slice(0, 10) }, _meta: { fullItems: items } }; });
Step 3: Implement Widget
Key patterns (from assets/widget/):
// Access data
const output = window.openai.toolOutput;
const meta = window.openai.toolResponseMetadata;
// Invoke tools
await window.openai.callTool("service_action", { id: "123" });
// Persist state
window.openai.setWidgetState({ selectedId: "123" });
// Layout control
window.openai.notifyIntrinsicHeight(400);
await window.openai.requestDisplayMode({ mode: "fullscreen" });
See widget_development.md for React hooks and patterns.
Step 4: Build
npm install
npm run build # Compiles server + bundles widget
Step 5: Implementation Checklist
Before moving to testing, verify:
Widget Requirements
- [ ] Uses Apps SDK UI design tokens (see apps_sdk_ui_tokens.md)
- [ ] Implements dark mode with CSS variable architecture
- [ ] Uses LoadingDots pattern for loading states (see widget_ui_patterns.md)
- [ ] Calls
notifyIntrinsicHeight()after all DOM changes - [ ] Includes copy button feedback for copyable content
- [ ] Has show more/less for long lists (>3 items)
- [ ] Works on mobile (test at 375px width)
- [ ] Loading UI guards against re-initialization (see widget_loading_patterns.md)
- [ ] SVG animations use
.styleproperty, notsetAttribute()(see widget_development.md)
Security Requirements
- [ ] All user input is validated (see security_patterns.md)
- [ ] HTML output uses safe DOM methods (textContent, createElement)
- [ ] External image URLs are proxied with domain whitelist and size limits (200KB)
- [ ] Rate limiting is implemented per session with LRU eviction
Server Requirements
- [ ]
/.well-known/openai-apps-challengeendpoint returns challenge token - [ ]
/privacyendpoint returns HTML privacy policy - [ ]
/termsendpoint returns HTML terms of service - [ ]
/mcpendpoint handles SSE connections - [ ]
/healthor/returns health check JSON - [ ] CORS configured for ChatGPT domains only
- [ ] Security headers set on all responses
- [ ] Session routing uses direct lookup by sessionId (CRITICAL - see troubleshooting.md)
- [ ] Response size under 300KB total (remove duplicates, limit images)
Production Readiness (if deploying to production)
- [ ] OAuth tokens stored in database, not in-memory (see oauth_integration.md)
- [ ] Mutation tools include idempotency checks (see chatgpt_app_best_practices.md)
- [ ] Disambiguation pattern for multi-match scenarios (see chatgpt_app_best_practices.md)
- [ ] Confirmation receipts for all mutations (see chatgpt_app_best_practices.md)
Output: Complete project in working directory
Phase 4: Testing
Goal: Verify the app works correctly.
Step 1: Local Testing with MCP Inspector
# Terminal 1: Start server
npm run dev
# Server runs at http://localhost:8000
# Terminal 2: Run inspector
npx @modelcontextprotocol/inspector@latest http://localhost:8000/mcp
Verify:
- [ ] All tools appear in inspector
- [ ] Tool calls return expected structure
- [ ] Widget renders without errors
Step 2: Create HTTPS Tunnel
ngrok http 8000
# Copy the https://xxx.ngrok.app URL
Step 3: Create ChatGPT Connector
- Go to ChatGPT → Settings → Connectors
- Enable Developer Mode (Settings → Apps & Connectors → Advanced)
- Create new connector:
- Name: Your app name
- Description: From app-spec.md
- URL:
https://xxx.ngrok.app/mcp
- Click Create and verify tools appear
Step 4: Test Golden Prompts
In a new ChatGPT conversation:
- Enable your connector (+ button → More → select connector)
- Test each golden prompt from app-spec.md
- Verify:
- [ ] Direct prompts trigger correctly
- [ ] Indirect prompts trigger correctly
- [ ] Negative prompts do NOT trigger
- [ ] Widget renders properly
- [ ] Actions work (if applicable)
Step 5: Iterate
If issues found:
- Fix code
- Rebuild:
npm run build - Refresh connector in ChatGPT settings
- Re-test
See troubleshooting.md for common issues and solutions.
Output: Working app tested in ChatGPT
Phase 5: Deployment & Submission
Goal: Ship to production and App Store.
Step 1: Deploy to Production
Generate deployment configs from assets/deploy/:
Fly.io (recommended):
fly launch
fly deploy
Vercel/Cloudflare: Ensure streaming HTTP support.
Step 2: Update Connector
- Replace ngrok URL with production URL
- Verify connection in ChatGPT settings
Step 3: Pre-Submission Checklist
See submission_requirements.md:
Required:
- [ ] Organization verified on OpenAI Platform
- [ ] All tools have clear descriptions
- [ ] Annotations correct (readOnlyHint, destructiveHint, openWorldHint)
- [ ] No prohibited content/commerce
- [ ] No restricted data collection
- [ ] Widget renders on mobile
- [ ] Test credentials with sample data prepared
If auth required:
- [ ] Well-known endpoints accessible
- [ ] Test account credentials documented
- [ ] OAuth flow completes successfully
Step 4: Submit
- Go to platform.openai.com/apps-manage
- Enter MCP server URL
- Add OAuth metadata (if applicable)
- Complete submission form
- Submit for review
Step 5: Post-Submission
- Monitor email for review status
- Address any reviewer feedback
- Click Publish after approval
Output: App live in ChatGPT App Store
External Resources
同梱ファイル
※ ZIPに含まれるファイル一覧。`SKILL.md` 本体に加え、参考資料・サンプル・スクリプトが入っている場合があります。
- 📄 SKILL.md (13,339 bytes)
- 📎 assets/deploy/Dockerfile (841 bytes)
- 📎 assets/deploy/fly.toml (644 bytes)
- 📎 assets/server/scripts/build-widget.ts (1,847 bytes)
- 📎 assets/server/src/index.ts (17,254 bytes)
- 📎 assets/server/src/lib/api-client.ts (3,683 bytes)
- 📎 assets/server/src/lib/errors.ts (2,400 bytes)
- 📎 assets/server/src/lib/image-proxy.ts (5,873 bytes)
- 📎 assets/server/src/lib/rate-limiter.ts (4,992 bytes)
- 📎 assets/server/src/tools/create-item.ts (2,410 bytes)
- 📎 assets/server/src/tools/example-tool.ts (6,685 bytes)
- 📎 assets/server/src/tools/get-items.ts (2,640 bytes)
- 📎 assets/server/src/tools/index.ts (698 bytes)
- 📎 assets/server/src/types/openai.d.ts (1,994 bytes)
- 📎 assets/server/src/widget/embed.ts (2,327 bytes)
- 📎 assets/server/tsconfig.json (605 bytes)
- 📎 assets/tests/golden-prompts.ts (6,656 bytes)
- 📎 assets/tests/tool-tests.ts (6,439 bytes)
- 📎 assets/widget/src/App.tsx (6,185 bytes)
- 📎 assets/widget/src/components/ExampleList.tsx (3,712 bytes)
- 📎 assets/widget/src/components/ItemList.tsx (4,939 bytes)
- 📎 assets/widget/src/hooks/useOpenAI.ts (5,671 bytes)
- 📎 assets/widget/src/hooks/useWidgetState.ts (170 bytes)
- 📎 assets/widget/src/types/openai.d.ts (1,767 bytes)
- 📎 assets/widget/styles/widget.css (4,963 bytes)
- 📎 assets/widget/tsconfig.json (406 bytes)
- 📎 references/apps_sdk_ui_tokens.md (5,601 bytes)
- 📎 references/chatgpt_app_best_practices.md (11,989 bytes)
- 📎 references/fit_evaluation.md (5,970 bytes)
- 📎 references/node_chatgpt_app.md (18,964 bytes)
- 📎 references/oauth_integration.md (18,982 bytes)
- 📎 references/security_patterns.md (13,755 bytes)
- 📎 references/submission_requirements.md (8,853 bytes)
- 📎 references/testing_patterns.md (11,067 bytes)
- 📎 references/troubleshooting.md (25,463 bytes)
- 📎 references/widget_css_template.md (13,205 bytes)
- 📎 references/widget_development.md (19,995 bytes)
- 📎 references/widget_loading_patterns.md (13,922 bytes)
- 📎 references/widget_ui_patterns.md (11,654 bytes)
- 📎 scripts/validate-app-spec.py (8,711 bytes)