Install Concierge
Start by installing the concierge-sdk package. This gives you the Concierge CLI for scaffolding projects, free cloud hosting, and built-in debugging tools.
pip install concierge-sdk
Scaffold Your Project
Create a new MCP server with one command. The --chatgpt flag adds widget support for building ChatGPT Apps.
concierge init --chatgpt
This creates a new folder with everything you need:
my-app/ ├── main.py # Your MCP server with widgets ├── assets/ # Widget source files (JSX, CSS) ├── requirements.txt # Dependencies ├── settings.json # Deploy config └── README.md
cd my-app
Deploy to Production
Deploy your app to the cloud with a single command. You'll get a live HTTPS URL instantly.
concierge deploy
You're Live!
Your app is now running at https://<project>.getconcierge.app/mcp
Want to see logs? Add the --logs flag:
concierge deploy --logs
Test & Evaluate
Before connecting to ChatGPT, test your tools and widgets with Concierge. Run AI-powered evaluations to ensure everything works correctly.
Open Concierge
Connect your server
Enter your deployment URL or select from deployed servers
Test tools manually
Browse tools and resources, execute them with custom inputs
Run evaluation
Use the Evaluate tab to run AI-powered test scenarios
Connect to ChatGPT
Add your MCP server as a ChatGPT connector to use it in conversations.
Enable Developer Mode
Go to Settings → Apps & Connectors → Advanced settings and enable Developer mode
Create a Connector
Click Create, paste your URL https://<project>.getconcierge.app/mcp, add a name and description
Start Chatting
Open a new chat, click More menu, add your connector, and start using your tools!
Build Widgets
Widgets are interactive UI components that render inside ChatGPT. The @mcp.widget() decorator binds HTML to a tool, so when ChatGPT calls it, the widget renders automatically.
from concierge import Concierge mcp = Concierge("my-app", stateless_http=True) PIZZA_HTML = """<!DOCTYPE html> <html><body style="font-family: system-ui; background: #1a1a2e; color: white; text-align: center; padding: 32px;"> <h1>Pizza Map</h1> <p>Finding the best pizza near you!</p> </body></html>""" @mcp.widget( uri="widget://pizza-map", html=PIZZA_HTML, title="Show Pizza Map", ) async def pizza_map(topping: str) -> dict: """Show pizza spots for a given topping.""" return {"topping": topping}
Widget Parameters
| Parameter | Type | Description |
|---|---|---|
uri |
str required | Unique identifier for the widget |
html |
str | Inline HTML content for the widget |
entrypoint |
str | Path to HTML in assets/entrypoints/ (for JSX widgets) |
url |
str | External URL to embed in iframe |
title |
str | Display name shown in ChatGPT UI |
Pro tip: Use entrypoint for React/JSX widgets. Concierge auto-builds them with Vite + Tailwind on deploy.
Congratulations!
You've built your first ChatGPT App. Now go build something amazing!