mcp-app-demo
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-app-demoshow me the hello_world tool"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP App Template
Official starter for building MCP Apps on deco — interactive UIs powered by the Model Context Protocol.
Quick Start
# Clone the template
git clone https://github.com/decocms/mcp-app.git my-mcp-app
cd my-mcp-app
# Install dependencies
bun install
# Start development
bun run devRelated MCP server: MCP App Workers Template
Project Structure
├── api/ # MCP server (platform-agnostic)
│ ├── app.ts # App core — tools, resources, middleware
│ ├── main.bun.ts # Bun entrypoint (local dev)
│ ├── tools/
│ │ ├── index.ts # Tool registry
│ │ └── hello.ts # Example tool (hello_world)
│ ├── resources/
│ │ └── hello.ts # MCP App resource (serves HTML)
│ └── types/
│ └── env.ts # StateSchema + Env type
├── web/ # React UI (MCP App)
│ ├── tools/ # One folder per tool UI (folder-based routing)
│ │ └── hello/ # hello_world tool UI
│ │ ├── main.tsx # React entry point
│ │ ├── bridge.ts # MCP App SDK integration
│ │ ├── context.tsx # React context for MCP state
│ │ ├── router.tsx # TanStack Router with UI
│ │ └── types.ts # UI state types
│ ├── entry.tsx # Build entry (imports @tool/main.tsx)
│ ├── components/ui/ # shadcn/ui components
│ ├── lib/utils.ts # cn() helper
│ └── globals.css # Tailwind base styles
├── index.html # Single Vite entry (shared by all tools)
├── package.json
├── tsconfig.json
├── biome.json
├── vite.config.ts
├── components.json # shadcn/ui config
├── app.json # Deco mesh config
└── .mcp.json # Local MCP server configDevelopment
# Run API server + web build concurrently
bun run dev
# API server only (port 3001)
bun run dev:api
# Web build only (watch mode)
bun run dev:webConnecting to deco Studio
To test your MCP App in deco Studio, expose your local server through a tunnel:
bun start
# Tunnel started -> 🌐 Preview: https://<your-id>.deco.hostThen connect in Studio using the MCP URL:
https://<your-id>.deco.host/api/mcpAdding a New Tool with UI
Each tool UI lives in web/tools/<name>/. The TOOL env var tells Vite which folder to build — one build per tool, output as dist/client/<name>.html.
Create the tool —
api/tools/my-tool.tsusingcreateToolRegister it — add to the
toolsarray inapi/tools/index.tsCreate the UI —
web/tools/my-tool/withmain.tsx,bridge.ts,context.tsx,router.tsx,types.tsCreate the resource —
api/resources/my-tool.tsservingdist/client/my-tool.htmlUpdate build scripts:
"build:web": "TOOL=hello vite build && TOOL=my-tool vite build", "dev:web": "concurrently \"TOOL=hello vite build --watch\" \"TOOL=my-tool vite build --watch\""
How the Tool Router Works
TOOL=hello vite build
→ resolves @tool/* → web/tools/hello/*
→ index.html imports web/entry.tsx imports @tool/main.tsx
→ outputs dist/client/hello.html (single-file bundle)Tech Stack
Runtime: Bun (default), deployable to any Web Standard runtime
Server: @decocms/runtime MCP server
UI: React 19 + TanStack Router (hash-based) + TanStack Query
Styling: Tailwind CSS v4 + shadcn/ui
MCP Apps: @modelcontextprotocol/ext-apps SDK
Build: Vite + vite-plugin-singlefile
Linting: Biome
How It Works
The app core (
api/app.ts) defines tools, resources, and middleware as a platform-agnosticfetchhandlerA platform entrypoint (
api/main.bun.ts) starts the server using the platform's APITools perform actions and can link to a UI via
_meta.ui.resourceUriResources serve single-file HTML bundles with
mimeType: "text/html;profile=mcp-app"The MCP App UI connects to the host via
@modelcontextprotocol/ext-apps, receives tool input/results, and renders an interactive displayVite builds each tool UI into a self-contained HTML file (CSS + JS inlined) using the
TOOLenv var to select whichweb/tools/<name>/folder to bundle
Deployment
Multi-Platform
The app uses a factory pattern that separates business logic (api/app.ts) from platform wiring. To deploy to a new platform, add a thin entrypoint file — see the add-deploy-target skill for step-by-step instructions.
Supported targets out of the box:
Bun —
api/main.bun.ts(default, used for local dev)
Easy to add:
Cloudflare Workers — ~5 lines +
wrangler.tomlDeno — ~5 lines
Node.js — ~5 lines +
@hono/node-serverAWS Lambda — ~5 lines +
hono/aws-lambda
Publish to deco
Update
app.jsonwith your app's name, description, and connection URLPush to your repository — CI will validate the build
Follow deco mesh publishing instructions to deploy
CI
GitHub Actions runs on every push and pull request:
bun run ci:check— Biome lint + format checkbun run check— TypeScript type checkingbun test— Unit testsbun run build— Production build
This server cannot be deployed
Maintenance
Related MCP Connectors
Build, deploy, and host full-stack web apps from any MCP client. DB, auth, storage, cron included.
- AuroraOAuthbuild.aurora
Create, edit, preview, and deploy full-stack web apps to a live URL from any MCP client.
Build multi-tenant apps over MCP. Schemas, CRUD, deploys — access control enforced server-side.
Our free Marketgenius investment tools as live, interactive React MCP Apps.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA full-stack template for building Model Context Protocol (MCP) servers with a modern React frontend, allowing developers to create AI agent tools and workflows while providing a beautiful web interface.1 npmISC
- FlicenseNot gradedqualityDmaintenanceA production-ready template for building MCP servers on Cloudflare Workers that expose server-side tools with rich, interactive React-based UI widgets using the MCP Extensions Apps API.13-
- FlicenseNot gradedqualityDmaintenanceAn MCP server template for building ChatGPT-compatible React widgets using the OpenAI Apps SDK. It automatically registers UI components as MCP tools and resources, featuring built-in support for theme detection and ecommerce-focused interactive elements.-
- AlicenseNot gradedqualityAmaintenanceA starter template for building MCP apps with React widgets, featuring tool execution, UI capability negotiation, and host integration.20Apache 2.0