Skip to main content

A CLI tool to scaffold ChatGPT apps using OpenAI Apps SDK

Project description

ChatGPT App Scaffold

A CLI tool for quickly scaffolding ChatGPT applications using the OpenAI Apps SDK and Model Context Protocol (MCP).

Features

  • Quick Start: Generate a complete ChatGPT app in seconds
  • Widget Templates: Support for CDN, inline, and local widget types
  • Extensible: Easy to add new widgets and tools
  • Docker Ready: Includes Dockerfile and Docker configuration
  • Testing: Pre-configured test structure with pytest
  • Well Documented: Comprehensive documentation and code comments
  • Interactive CLI: Guided prompts for setup

Installation

pip install create-chatgpt-app

From Source

git clone https://github.com/hemanth/create-chatgpt-app.git
cd create-chatgpt-app
pip install -e .

Quick Start

Create a New Project

create-chatgpt-app init my-app

This will:

  1. Create a new directory with your project
  2. Generate all necessary files (main.py, requirements.txt, Dockerfile, etc.)
  3. Set up a basic widget
  4. Provide next steps to get started

Interactive Mode

Run without arguments for an interactive experience:

create-chatgpt-app init

You'll be prompted for:

  • Project name
  • App description
  • Initial widget configuration
  • Port and host settings

Usage

Initialize a New Project

# Basic usage
create-chatgpt-app init my-app

# With options
create-chatgpt-app init my-app --name "My App" --description "My ChatGPT app"

# Custom port and host
create-chatgpt-app init my-app --port 3000 --host localhost

# Skip Docker files
create-chatgpt-app init my-app --no-docker

# Skip test files
create-chatgpt-app init my-app --no-tests

Add a Widget

Navigate to your project directory and add widgets:

cd my-app

# Interactive mode
create-chatgpt-app add-widget

# With options
create-chatgpt-app add-widget --identifier my-widget --title "My Widget" --type inline

Widget Types

  1. CDN: Load widget from external CDN

    create-chatgpt-app add-widget --type cdn
    
  2. Inline: Simple HTML inline widget

    create-chatgpt-app add-widget --type inline
    
  3. Local: Load from local static files

    create-chatgpt-app add-widget --type local
    

Add a Tool

# Interactive mode
create-chatgpt-app add-tool

# With options
create-chatgpt-app add-tool --identifier my-tool --title "My Tool"

# Tool without widget
create-chatgpt-app add-tool --identifier data-processor --no-widget

List Available Templates

create-chatgpt-app list-templates

Project Structure

After running create-chatgpt-app init my-app, you'll get:

my-app/
├── main.py              # Main MCP server implementation
├── requirements.txt     # Python dependencies
├── README.md           # Project documentation
├── .gitignore          # Git ignore patterns
├── Dockerfile          # Docker configuration
├── .dockerignore       # Docker ignore patterns
└── tests/              # Test directory
    ├── __init__.py
    └── test_main.py    # Unit tests

Example Workflow

# Create a new project
create-chatgpt-app init my-app

# Navigate to the project
cd my-app

# Set up virtual environment
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

# Install dependencies
pip install -r requirements.txt

# Add more widgets
create-chatgpt-app add-widget --identifier map-widget --title "Map Widget" --type cdn

# Run the server
python main.py

# Test with MCP Inspector
npm install -g @modelcontextprotocol/inspector
mcp-inspector
# Connect to http://localhost:8000/mcp

Generated Code Structure

Main Components

The generated main.py includes:

  1. Widget Definitions: Data structures for your widgets
  2. MCP Protocol Handlers:
    • list_tools(): Register available tools
    • list_resources(): Expose widgets as resources
    • list_resource_templates(): Define resource templates
    • _handle_read_resource(): Serve widget HTML
    • _call_tool_request(): Execute tool logic
  3. Input Validation: Pydantic models for type-safe inputs
  4. FastAPI App: HTTP/SSE transport layer
  5. CORS Configuration: For local development

Customization Points

Edit the generated main.py to:

  1. Add Business Logic: Implement your tool's functionality in _call_tool_request()
  2. Modify Input Schema: Update ToolInput class and TOOL_INPUT_SCHEMA
  3. Customize Widgets: Edit widget HTML, CSS, and JavaScript
  4. Add Middleware: Include authentication, rate limiting, etc.
  5. Connect to Services: Add database, API calls, file processing

Widget Development

CDN Widget Example

AppWidget(
    identifier="my-dashboard",
    title="Analytics Dashboard",
    template_uri="ui://widget/dashboard.html",
    invoking="Loading dashboard",
    invoked="Dashboard loaded",
    html=(
        "<div id=\"dashboard-root\"></div>\n"
        "<link rel=\"stylesheet\" href=\"https://cdn.example.com/dashboard.css\">\n"
        "<script type=\"module\" src=\"https://cdn.example.com/dashboard.js\"></script>"
    ),
    response_text="Dashboard rendered successfully!",
)

Inline Widget Example

AppWidget(
    identifier="simple-card",
    title="Info Card",
    template_uri="ui://widget/card.html",
    invoking="Creating card",
    invoked="Card created",
    html=(
        "<div style='padding: 20px; border: 1px solid #ccc; border-radius: 8px;'>"
        "  <h2>Hello from MCP!</h2>"
        "  <p>This is a simple inline widget.</p>"
        "</div>"
    ),
    response_text="Info card displayed",
)

Testing

The generated project includes a test structure:

# Install test dependencies
pip install pytest pytest-asyncio httpx

# Run tests
pytest

# Run with coverage
pip install pytest-cov
pytest --cov=. --cov-report=html

Docker Support

Build and Run

# Build the image
docker build -t my-app .

# Run the container
docker run -p 8000:8000 my-app

# Run with environment variables
docker run -p 8000:8000 -e PORT=3000 my-app

Docker Compose

Create a docker-compose.yml:

version: '3.8'

services:
  app:
    build: .
    ports:
      - "8000:8000"
    environment:
      - PORT=8000
      - HOST=0.0.0.0
    restart: unless-stopped

Troubleshooting

Widget Not Rendering

Check:

  1. template_uri matches between widget and metadata
  2. HTML is valid and includes root element
  3. External CSS/JS URLs are accessible (for CDN widgets)
  4. MIME type is text/html+skybridge
  5. Metadata includes openai/widgetAccessible: true

Input Validation Errors

Verify:

  1. Field names match between schema and Pydantic model
  2. Required fields are marked correctly
  3. Test validation independently

Server Won't Start

Check:

  1. Port is not already in use: lsof -i :8000 (macOS/Linux)
  2. All dependencies are installed: pip list
  3. Virtual environment is activated
  4. Python version is 3.10+: python --version

Contributing

Contributions are welcome. Please feel free to submit a Pull Request.

Resources

License

MIT License - see LICENSE file for details

Support

For issues and questions:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

create_chatgpt_app-0.1.1.tar.gz (17.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

create_chatgpt_app-0.1.1-py3-none-any.whl (18.6 kB view details)

Uploaded Python 3

File details

Details for the file create_chatgpt_app-0.1.1.tar.gz.

File metadata

  • Download URL: create_chatgpt_app-0.1.1.tar.gz
  • Upload date:
  • Size: 17.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for create_chatgpt_app-0.1.1.tar.gz
Algorithm Hash digest
SHA256 67b06fcce9aeb7c07e19dc2f47525e3fdab6a77ee3a50eb1cf68a2334c10c14a
MD5 148d975d17d8e84e48fdd21ec8365da5
BLAKE2b-256 4685584f309975fd7e5c0aa2ff57ff024d6a89a4255ab605da2e7789056cabb0

See more details on using hashes here.

File details

Details for the file create_chatgpt_app-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for create_chatgpt_app-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2982d2a1a34b24d69f395e2189847aaa781195f2851c58165af04f3836a6a171
MD5 1fd04b99f877469739e3ffb5ff455636
BLAKE2b-256 a79bc8781e79397bc6a8f8b3fdb24e671ec693be4d8478a5fddf7f12ee653e8f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page