A domain-agnostic template for building ChatGPT Apps and MCP Apps with:
- Skybridge
- OpenAI Apps SDK UI
- React + Vite + Tailwind CSS
- Biome for linting and formatting
- Storybook for isolated component development
Skybridge provides the abstraction layer so app code can focus on widget components and tool behavior instead of low-level MCP plumbing.
Skybridge supports both MCP Apps and ChatGPT Apps. Background on MCP Apps: MCP Apps: The next chapter for MCP.
- Build once for both ChatGPT App and MCP App use cases.
- Keep architecture simple and typed end to end.
- Develop UI in Storybook (fast, isolated feedback) instead of depending on chat-only render loops.
- Use Skybridge devtools tooling locally during non-production runs (including inspector/debug workflows).
server/src/server.tscreates anMcpServerand registers widgets/tools.server/src/index.tscallsserver.run()to start the server with built-in MCP middleware, devtools, and asset serving.web/src/widgets/starter.tsxmounts a widget entrypoint withmountWidget.web/src/helpers.tsusesgenerateHelpers<AppType>()to type frontend tool output from server definitions.
For deeper docs, see /docs.
web/src/widgets/starter.tsx- widget entrypoint mounted by Skybridgeweb/src/widgets/StarterAlertSection.tsx- primary starter alert blockweb/src/widgets/StarterNextStepsSection.tsx- suggested next customization stepsweb/src/widget.tsx- required root wrapper that importsindex.css
- Node.js 24+
- pnpm
pnpm install
pnpm devLocal endpoints:
- App/devtools: http://localhost:3000
- MCP endpoint: http://localhost:3000/mcp
- Storybook (separate process): http://localhost:6006
pnpm dev- run local Skybridge dev stackpnpm prepare- install git hooks vialefthookpnpm check- TypeScript type-check (tsc --noEmit)pnpm lint- check code with Biome linterpnpm format- check code formatting with Biomepnpm biome:check- run both lint and format checkspnpm biome:fix- automatically fix lint and format issuespnpm build- production build via Skybridgepnpm start- run built apppnpm start.local- run built app with.envsupportpnpm preview- build + start locallypnpm storybook- run Storybook onhttp://localhost:6006pnpm build-storybook- build Storybook static output
server/src/index.ts- Entry point that callsserver.run()to start the serverserver/src/server.ts- Starter widget registration and tool handler outputweb/src/helpers.ts- Typed helper generation from serverAppTypeweb/src/widget.tsx- Root style import wrapperweb/src/widgets/- Widget entrypoints, UI components, and stories.storybook/- Storybook config (Tailwind + alias + static assets)docs/- Architecture and development documentation
- Register or update tools/widgets in
server/src/server.ts. - Create matching widget entrypoints and UI components in
web/src/widgets/. - Add or update stories near components (
*.stories.tsx) and iterate in Storybook first. - Validate with
pnpm check,pnpm biome:check, andpnpm build. - Run
pnpm prepareonce per clone so pre-commit checks run automatically.