assistant-ui logo/
MCP Apps

Build MCP apps once, run them anywhere

Build locally with hot reload. Export once for any MCP host. Optional ChatGPT extension features are detected at runtime.

Try the workbench

A local simulator for MCP apps and optional ChatGPT extensions. Preview your app, mock tool calls, and export for production.

mcp-app-studio-starter.vercel.app

Best on desktop

Open this page on a larger screen to run the demo.

Everything you need to ship assistant apps

A local workbench with a production-ready export flow.

Live Preview

See changes instantly. Test desktop, tablet, and mobile viewports with hot reload.

Mock Tool Responses

Simulate tool calls with configurable JSON. Cover success, error, and edge cases without a backend.

MCP Server Scaffold

Optional MCP server template included. Run frontend and tools with a single command.

Production Export

Export a deployable widget bundle (index.html + widget.js/widget.css) with optional --inline output.

Display Modes

Preview inline, PiP, and fullscreen. See exactly how it looks in target hosts.

Universal SDK

MCP-first bridge with optional ChatGPT extensions, feature-detected at runtime.

Know what works where

One API surface with capability gating across MCP hosts and optional ChatGPT extensions.

Capability
ChatGPT ext.
MCP host
App state
Persist and restore app state via ChatGPT widget state APIs.
Model context
Read and write model context via MCP (`ui/update-model-context`) on hosts that implement it.
Host modal
Use `window.openai.requestModal` in ChatGPT when available; fallback to local modals elsewhere.
Tool mocking
Mock tool responses locally while you build.

Export and ship

Your production-ready bundle, ready for MCP hosts like Claude, with optional ChatGPT extensions.

export/

Deploy export/widget/ to any static host, then update export/manifest.json with the hosted URL and register it with your target host. The same widget works across MCP hosts (for example, Claude) and ChatGPT extensions. By default export emits index.html, widget.js, widget.css, with optional --inline for single-file HTML. It’s the same app either way; the host controls which capabilities are available.