modelcontextprotocol/ext-apps/create-mcp-app
- community
Checking that the SKILL.md file is still in the repository.
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.
Install
npx vskill@latest install modelcontextprotocol/ext-apps/create-mcp-appSKILL.md
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:
- Tool - Called by the LLM/host, returns data
- 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,registerAppResourcefrom 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:
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.tswithregisterAppToolandregisterAppResourcemain.tsentry 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.csswith global styles and host style variable fallbacksvite.config.tsusingvite-plugin-singlefilepackage.jsonwithnpm runscripts and required dependencies.gitignoreexcludingnode_modules/anddist/
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:
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:
[!NOTE]The SDK examples usebunbut generated projects should default totsxfor broader compatibility.
Handler Registration Order
Register ALL handlers BEFORE calling app.connect():
Common Mistakes to Avoid
- No text fallback - Always provide
contentarray for non-UI hosts - Missing CSP configuration - MCP Apps HTML is served as an MCP resource with no same-origin server; ALL network requests—even to
localhost—require a CSP configuration - CSP or CORS config in wrong _meta object -
_meta.ui.cspand_meta.ui.domaingo in thecontents[]objects returned byregisterAppResource()'s read callback, not inregisterAppResource()'s config object - Handlers after app.connect() - Register ALL handlers BEFORE calling
app.connect() - No streaming for large inputs - Use
ontoolinputpartialto show progress during input generation
Testing
Using basic-host
Test MCP Apps locally with the basic-host example:
Configure SERVERS with a JSON array of your server URLs (default: http://localhost:3001/mcp).
Debug with sendLog
Send debug logs to the host application (rather than just the iframe's dev console):
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingplugins/mcp-apps/skills/create-mcp-app/SKILL.md
Popularity
- Repository stars
- 2,790
- Repository forks
- 375
- Repository npm downloads, 7 days
- 918,170
- 7-day trend score
- 70
Stars and forks are for the whole GitHub repository, not this skill alone. Downloads are for the repository's npm package. Refreshed 19 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/modelcontextprotocol/ext-apps/create-mcp-app)