Skip to content
Frontend
Skill

/create-mcp-app

This skill should be used when the user asks to "create an MCP App", "add a UI to an MCP tool", "build an interactive MCP View", "scaffold an MCP App", or needs guidance on MCP Apps SDK patterns, UI-resource registration, MCP App lifecycle, or host integration. Provides

From plugin
ext-apps
3.1k4 skills

Claude Code

$ npx -y skills add modelcontextprotocol/ext-apps --skill create-mcp-app --agent claude-code

SKILL.md

create-mcp-app.SKILL.md
name: create-mcp-app
description: This skill should be used when the user asks to "create an MCP App", "add a UI to an MCP tool", "build an interactive MCP View", "scaffold an MCP App", or needs guidance on MCP Apps SDK patterns, UI-resource registration, MCP App lifecycle, or host integration. Provides comprehensive guidance for building MCP Apps with interactive UIs.

Create MCP App

Build interactive UIs that run inside MCP-enabled hosts like Claude Desktop. An MCP App combines an MCP tool with an HTML resource to display rich, interactive content.

Core Concept: Tool + Resource

Every MCP App requires two parts linked together:

1. **Tool** - Called by the LLM/host, returns data 2. **Resource** - Serves the bundled HTML UI that displays the data

The tool's `_meta.ui.resourceUri` references the resource's URI.

Host calls tool → Host renders resource UI → Server returns result → UI receives result.

Quick Start Decision Tree

Framework Selection

| Framework | SDK Support | Best For | |-----------|-------------|----------| | React | `useApp` hook provided | Teams familiar with React | | Vanilla JS | Manual lifecycle | Simple apps, no build complexity | | Vue/Svelte/Preact/Solid | Manual lifecycle | Framework preference |

Project Context

**Adding to existing MCP server:**

  • Import `registerAppTool`, `registerAppResource` from SDK
  • Add tool registration with `_meta.ui.resourceUri`
  • Add resource registration serving bundled HTML

**Creating new MCP server:**

  • Set up server with transport (stdio or HTTP)
  • Register tools and resources
  • Configure build system with `vite-plugin-singlefile`

Getting Reference Code

Clone the SDK repository for working examples and API documentation:

git clone --branch "v$(npm view @modelcontextprotocol/ext-apps version)" --depth 1 https://github.com/modelcontextprotocol/ext-apps.git /tmp/mcp-ext-apps

Framework Templates

Learn and adapt from `/tmp/mcp-ext-apps/examples/basic-server-{framework}/`:

| Template | Key Files | |----------|-----------| | `basic-server-vanillajs/` | `server.ts`, `src/mcp-app.ts`, `mcp-app.html` | | `basic-server-react/` | `server.ts`, `src/mcp-app.tsx` (uses `useApp` hook) | | `basic-server-vue/` | `server.ts`, `src/App.vue` | | `basic-server-svelte/` | `server.ts`, `src/App.svelte` | | `basic-server-preact/` | `server.ts`, `src/mcp-app.tsx` | | `basic-server-solid/` | `server.ts`, `src/mcp-app.tsx` |

Each template includes:

  • `server.ts` with `registerAppTool` and `registerAppResource`
  • `main.ts` entry point with HTTP and stdio transport setup
  • Client-side app (e.g., `src/mcp-app.ts`, `src/mcp-app.tsx`) with lifecycle handlers
  • `src/global.css` with global styles and host style variable fallbacks
  • `vite.config.ts` using `vite-plugin-singlefile`
  • `package.json` with `npm run` scripts and required dependencies
  • `.gitignore` excluding `node_modules/` and `dist/`

API Reference (Source Files)

Read JSDoc documentation directly from `/tmp/mcp-ext-apps/src/`:

| File | Contents | |------|----------| | `src/app.ts` | `App` class, handlers (`ontoolinput`, `ontoolresult`, `onhostcontextchanged`, `onteardown`, etc.), lifecycle | | `src/server/index.ts` | `registerAppTool`, `registerAppResource`, helper functions | | `src/spec.types.ts` | All type definitions: `McpUiHostContext`, `McpUiStyleVariableKey` (CSS variable names), `McpUiResourceCsp` (CSP configuration), etc. | | `src/styles.ts` | `applyDocumentTheme`, `applyHostStyleVariables`, `applyHostFonts` | | `src/react/useApp.tsx` | `useApp` hook for React apps |

Advanced Patterns

See `/tmp/mcp-ext-apps/docs/patterns.md` for detailed recipes:

  • **App-only tools** — `visibility: ["app"]`, hiding tools from model
  • **Polling** — real-time dashboards, interval management
  • **Chunked responses** — large files, pagination, base64 encoding
  • **Error handling** — `isError`, informing model of failures
  • **Binary resources** — audio/video/etc via `resources/read`, blob field
  • **Network requests** — assets, fetch, CSP, `_meta.ui.csp`, CORS, `_meta.ui.domain`
  • **Host context** — theme, styling, fonts, safe area insets
  • **Fullscreen mode** — `requestDisplayMode`, display mode changes
  • **Model context** — `updateModelContext`, `sendMessage`, keeping model informed
  • **View state** — `viewUUID`, localStorage, state recovery
  • **Visibility-based pause** — IntersectionObserver, pausing animations/WebGL
  • **Streaming input** — `ontoolinputpartial`, progressive rendering

Reference Host Implementation

`/tmp/mcp-ext-apps/examples/basic-host/` shows one way an MCP Apps-capable host could be implemented. Real-world hosts like Claude Desktop are more sophisticated—use basic-host for local testing and protocol understanding, not as a guarantee of host behavior.

Critical Implementation Notes

Adding Dependencies

**Always** use `npm install` to add dependencies rather than manually writing version numbers:

npm install @modelcontextprotocol/ext-apps @modelcontextprotocol/client@^2.0.0 @modelcontextprotocol/server@^2.0.0 @modelcontextprotocol/node@^2.0.0 @modelcontextprotocol/express@^2.0.0 zod@^4.2.0 express cors
npm install -D typescript vite vite-plugin-singlefile concurrently cross-env @types/node @types/express @types/cors

ext-apps 2.x requires the split base MCP SDK packages (`@modelcontextprotocol/client`, `server`, `node`, `express`) at `^2.0.0`; `@modelcontextprotocol/core` comes in transitively. Do not add the legacy `@modelcontextprotocol/sdk` v1 package or substitute unpublished local packages.

TypeScript Server Execution

Unless the user has specified otherwise, use `tsx` for running TypeScript server files. For example:

npm install -D tsx

npm pkg set scripts.dev="cross-env NODE_ENV=development concurrently 'cross-env INPUT=mcp-app.html vite build --watch' 'tsx --watch main.ts'"

> [!NOTE] > The SDK examples use `bun` but generated projects should default to `tsx` for broader compatib

Read more
@modelcontextprotocol
Ships withext-apps

Official repo for spec & SDK of MCP Apps protocol - standard for UIs embedded AI chatbots, served by MCP servers

Stars on GitHub

Momentum

stars in total
3.1k
Star history of modelcontextprotocol/ext-apps on GitHub, a chart by star-history.com

Other skills on ext-apps.

More skills from other plugins.

next-bundle-optimizer
Auto-invoked

next-bundle-optimizer

Audit and reduce Next.js browser initial-load work. Use for slow route startup, oversized client bundles, duplicate browser…

nextjs2d143k
@vercel@vercelInstall Skill
migrate-radix-to-base

migrate-radix-to-base

Migrates React projects and components from Radix UI to Base UI. Use when asked to migrate from radix, move to base-ui, convert…

ui11d127k
@shadcn-ui@shadcn-uiInstall Skill
chrome-release-cls

chrome-release-cls

Given a Chrome Releases blog post URL (chromereleases.googleblog.com), extract every CVE/bug and find the underlying Gerrit CL…

electron2d124k
@electron@electronInstall Skill
taste-skill
Auto-invoked

taste-skill

tasteskill v2, the anti-slop frontend skill. Art direction for websites, distilled from a study of 247 curated gallery sites (One…

@leonxlnx@leonxlnxInstall Skill

Questions about create-mcp-app.

Which coding agents can use create-mcp-app?
create-mcp-app installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.