chatgpt-appsComplete ChatGPT Apps builder - Create, design, implement, test, and deploy ChatGPT Apps with MCP servers, widgets, auth, database integration, and automated deployment
Install via ClawdBot CLI:
clawdbot install hollaugo/chatgpt-appsComplete workflow for building, testing, and deploying ChatGPT Apps from concept to production.
/chatgpt-apps new - Create a new ChatGPT App/chatgpt-apps add-tool - Add an MCP tool to your app/chatgpt-apps add-widget - Add a widget to your app/chatgpt-apps add-auth - Configure authentication/chatgpt-apps add-database - Set up database/chatgpt-apps validate - Validate your app/chatgpt-apps test - Run tests/chatgpt-apps deploy - Deploy to production/chatgpt-apps resume - Resume working on an appPurpose: Create a new ChatGPT App from concept to working code.
"What ChatGPT App would you like to build? Describe what it does and the problem it solves."
Create 3-5 primary use cases with user stories.
For each widget:
id - unique identifier (kebab-case)name - display namedescription - what it showsmockData - sample data for previewDesign entities and relationships.
Generate complete application with this structure:
{app-name}/
āāā package.json
āāā tsconfig.server.json
āāā setup.sh
āāā START.sh
āāā .env.example
āāā .gitignore
āāā server/
āāā index.ts
Critical Requirements:
Server class from @modelcontextprotocol/sdk/server/index.jsStreamableHTTPServerTransport for session managementui://widget/{widget-id}.htmltext/html+skybridgestructuredContent in tool responses_meta with openai/outputTemplate on tools./setup.sh./START.sh --devhttp://localhost:3000/previewPurpose: Add a new MCP tool to your ChatGPT App.
Create Zod schema with appropriate types and descriptions.
Use chatgpt-mcp-generator agent to create:
server/tools/ Update server/index.ts with metadata:
{
name: "my-tool",
_meta: {
"openai/toolInvocation/invoking": "Loading...",
"openai/toolInvocation/invoked": "Done",
"openai/outputTemplate": "ui://widget/my-widget.html", // if widget
}
}
Add tool to .chatgpt-app/state.json.
Use kebab-case: list-items, create-task, show-recipe-detail
| Scenario | readOnlyHint | destructiveHint | openWorldHint |
|----------|--------------|-----------------|---------------|
| List/Get | true | false | false |
| Create/Update | false | false | false |
| Delete | false | true | false |
| External API | varies | varies | true |
Purpose: Add inline HTML widgets with HTML/CSS/JS and Apps SDK integration.
Document expected structure with TypeScript interface.
const widgets: WidgetConfig[] = [
{
id: "my-widget",
name: "My Widget",
description: "Displays data",
templateUri: "ui://widget/my-widget.html",
invoking: "Loading...",
invoked: "Ready",
mockData: { /* sample */ },
},
];
Generate HTML with:
window.PREVIEW_DATA)window.openai.toolOutput)openai:set_globals) Link tool to widget via widgetId.
Preview at /preview/{widget-id} with mock data.
(function() {
let rendered = false;
function render(data) {
if (rendered || !data) return;
rendered = true;
// Render logic
}
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();
})();
Purpose: Configure authentication using Auth0 or Supabase Auth.
Auth0:
Supabase Auth:
Ask user preference based on needs.
Use chatgpt-auth-generator agent to create:
Add auth middleware to protect routes.
# Auth0
AUTH0_DOMAIN=your-tenant.auth0.com
AUTH0_CLIENT_ID=...
AUTH0_CLIENT_SECRET=...
# Supabase (from database setup)
SUPABASE_URL=...
SUPABASE_ANON_KEY=...
Verify login flow and user isolation.
Purpose: Configure PostgreSQL database using Supabase.
Verify account and project exist.
For each entity, specify:
Use chatgpt-database-generator agent to create SQL with:
id (UUID primary key)user_subject (varchar, indexed)created_at (timestamptz)updated_at (timestamptz)
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!
);
Run SQL in Supabase dashboard or via migration tool.
Always filter by user_subject:
const { data } = await supabase
.from('tasks')
.select('*')
.eq('user_subject', userSubject);
Purpose: Generate test prompts to validate ChatGPT correctly invokes tools.
Review each tool's purpose and inputs.
For each tool, create:
Write to .chatgpt-app/golden-prompts.json:
{
"toolName": {
"direct": ["prompt1", "prompt2"],
"indirect": ["prompt1", "prompt2"],
"negative": ["prompt1", "prompt2"],
"edge": ["prompt1", "prompt2"]
}
}
Purpose: Validation suite before deployment.
Server from MCP SDKStreamableHTTPServerTransportwidgets array existsui://widget/{id}.htmlstructuredContent (not just content)_meta with openai/outputTemplatetext/html+skybridge_meta with serialization and CSP/health - Health check/preview - Widget index/preview/:widgetId - Widget preview/mcp - MCP endpointbuild:serverstart with HTTP_MODE=truedev with watch mode| Error | Fix |
|-------|-----|
| Missing structuredContent | Add to tool response |
| Wrong widget URI | Use ui://widget/{id}.html |
| No session management | Add Map
| Missing _meta | Add to tool definition and response |
| Wrong MIME type | Use text/html+skybridge |
Critical: Check file existence FIRST before other validations!
Purpose: Run automated tests using MCP Inspector and golden prompts.
HTTP_MODE=true NODE_ENV=test npm run dev
Test protocol compliance:
Verify schemas compile and match implementation.
Use ChatGPT to test prompts:
{
"passed": 42,
"failed": 3,
"categories": {
"mcp": "ā
",
"schema": "ā
",
"widgets": "ā
",
"prompts": "ā ļø 3 failures"
},
"timing": "2.3s"
}
For each failure, explain:
Purpose: Deploy ChatGPT App to Render with PostgreSQL and health checks.
services:
- type: web
name: {app-name}
runtime: docker
plan: free
healthCheckPath: /health
envVars:
- key: PORT
value: 3000
- key: HTTP_MODE
value: true
- key: NODE_ENV
value: production
- key: WIDGET_DOMAIN
generateValue: true
# Add auth/database vars if needed
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY dist ./dist
EXPOSE 3000
CMD ["node", "dist/server/index.js"]
Option A: Automated (if Render MCP available)
Use Render MCP agent to deploy.
Option B: Manual
https://{app}.onrender.com/healthhttps://{app}.onrender.com/mcphttps://{app}.onrender.com/mcpPurpose: Resume building an in-progress ChatGPT App.
Read .chatgpt-app/state.json:
{
"appName": "My Task Manager",
"phase": "Implementation",
"tools": ["list-tasks", "create-task"],
"widgets": ["task-list"],
"auth": false,
"database": true,
"validated": false,
"deployed": false
}
Show current status:
Based on phase:
Concept Phase:
Implementation Phase:
Testing Phase:
Deployment Phase:
Based on user's choice, invoke the appropriate workflow section.
The .chatgpt-app/state.json file tracks progress:
{
"appName": "string",
"description": "string",
"phase": "Concept" | "Implementation" | "Testing" | "Deployment",
"tools": ["tool-name"],
"widgets": ["widget-id"],
"auth": {
"enabled": boolean,
"provider": "auth0" | "supabase" | null
},
"database": {
"enabled": boolean,
"entities": ["entity-name"]
},
"validated": boolean,
"tested": boolean,
"deployed": boolean,
"deploymentUrl": "string | null",
"goldenPromptsGenerated": boolean,
"lastUpdated": "ISO timestamp"
}
# Setup
./setup.sh
# Development
./START.sh --dev # Dev mode with watch
./START.sh --preview # Open preview in browser
./START.sh --stdio # STDIO mode (testing)
./START.sh # Production mode
# Testing
npm run validate # Type checking
curl http://localhost:3000/health
# Deployment
git push origin main # Trigger Render deploy
When the user invokes any chatgpt-app command:
.chatgpt-app/state.json existsAlways guide users through the natural progression:
Concept ā Implementation ā Testing ā Deployment
Generated Mar 1, 2026
A ChatGPT App that helps users track expenses, set budgets, and visualize spending through interactive widgets like bar charts and card grids. It integrates with banking APIs via MCP tools for real-time data fetching and uses a database to store user financial records securely.
An app that suggests recipes based on dietary preferences and available ingredients, with widgets displaying step-by-step instructions and nutritional stats. It uses MCP tools to query external recipe APIs and a database to save user meal plans and shopping lists.
A tool for teams to manage tasks, deadlines, and collaboration within ChatGPT, featuring widgets like tables for task lists and stats dashboards for progress tracking. It includes authentication for multi-user access and database integration to store project data.
An app that allows users to search for products, compare prices, and view details via widgets such as card grids and detail widgets. It leverages MCP tools to connect with e-commerce APIs and uses a database to cache product information and user preferences.
Offer basic app functionality for free, such as limited tool usage or widgets, and charge for advanced features like custom MCP tool integrations, enhanced analytics, or priority support. Revenue can be generated through monthly subscriptions or one-time payments for premium upgrades.
License the ChatGPT Apps builder platform to businesses for internal use, such as creating custom apps for employee productivity or customer service. Revenue comes from annual licensing fees, with additional charges for enterprise-level support, custom deployments, or integration with proprietary systems.
Create a marketplace where developers can sell pre-built ChatGPT Apps or templates, with revenue generated through commissions on sales. This model encourages community contributions and provides a curated selection of apps for users to deploy quickly without starting from scratch.
š¬ Integration Tip
Start by using the /chatgpt-apps add-tool command to integrate simple MCP tools for data fetching before moving to more complex features like authentication or database setup, ensuring each component is validated with /chatgpt-apps validate to avoid deployment issues.
Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Clau...
Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
Search and analyze your own session logs (older/parent conversations) using jq.
Typed knowledge graph for structured agent memory and composable skills. Use when creating/querying entities (Person, Project, Task, Event, Document), linking related objects, enforcing constraints, planning multi-step actions as graph transformations, or when skills need to share state. Trigger on "remember", "what do I know about", "link X to Y", "show dependencies", entity CRUD, or cross-skill data access.
Ultimate AI agent memory system for Cursor, Claude, ChatGPT & Copilot. WAL protocol + vector search + git-notes + cloud backup. Never lose context again. Vibe-coding ready.
Headless browser automation CLI optimized for AI agents with accessibility tree snapshots and ref-based element selection