jpskill.com
🛠️ 開発・MCP コミュニティ

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"

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
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
🪟 Windows (PowerShell)
$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. 1. 下の青いボタンを押して chatgpt-app-builder.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → chatgpt-app-builder フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

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: コンテキストの収集

ユーザーに以下を尋ねます。

  1. あなたの製品は何をしますか?
  2. あなたのユーザーは誰ですか?
  3. どのような API/データ を公開していますか?
  4. ユーザーはどのようなアクションを実行できますか?

ステップ 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/ から):

  1. 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 }
}];
  1. ハンドラー登録:
    
    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:

  1. What does your product do?
  2. Who are your users?
  3. What API/data does it expose?
  4. 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/):

  1. 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 }
}];
  1. 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 .style property, not setAttribute() (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-challenge endpoint returns challenge token
  • [ ] /privacy endpoint returns HTML privacy policy
  • [ ] /terms endpoint returns HTML terms of service
  • [ ] /mcp endpoint handles SSE connections
  • [ ] /health or / 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)

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

  1. Go to ChatGPT → Settings → Connectors
  2. Enable Developer Mode (Settings → Apps & Connectors → Advanced)
  3. Create new connector:
    • Name: Your app name
    • Description: From app-spec.md
    • URL: https://xxx.ngrok.app/mcp
  4. Click Create and verify tools appear

Step 4: Test Golden Prompts

In a new ChatGPT conversation:

  1. Enable your connector (+ button → More → select connector)
  2. Test each golden prompt from app-spec.md
  3. 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:

  1. Fix code
  2. Rebuild: npm run build
  3. Refresh connector in ChatGPT settings
  4. 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

  1. Replace ngrok URL with production URL
  2. 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

  1. Go to platform.openai.com/apps-manage
  2. Enter MCP server URL
  3. Add OAuth metadata (if applicable)
  4. Complete submission form
  5. 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` 本体に加え、参考資料・サンプル・スクリプトが入っている場合があります。