Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Scaffolds MCP App project structure with correct directory layout, dependencies, entry points, and framework-specific templates. Handles React (useApp hook), Vanilla JS, Vue, Svelte, Preact, and Solid.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 237% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 41% | 0% |
Scaffold MCP App projects from scratch with correct structure, dependencies, and framework-specific templates following the reference-code-first methodology.
MCP Apps are interactive UIs that render inline in MCP-enabled hosts (Claude Desktop, ChatGPT, VS Code, Goose, Postman). Every MCP App requires:
registerAppToolregisterAppResource_meta.ui.resourceUri references the resource's URIThis skill handles the initial project scaffolding: cloning the SDK reference code, selecting a framework, generating the directory structure, and creating all entry points.
examples/basic-server-{framework}/src/docs/patterns.mdexamples/basic-host/useApp hook, useHostStyles, useHostStyleVariables, useHostFontssrc/, build configs, entry points.gitignore for build artifacts@modelcontextprotocol/ext-apps, @modelcontextprotocol/sdk, zodtypescript, vite, vite-plugin-singlefile, tsx, concurrentlyreact, react-dom, @types/react, @types/react-dom (for React)npm install -- never hardcode version numbersbash# Clone SDK at the exact version published to npm git clone --branch "v$(npm view @modelcontextprotocol/ext-apps version)" \ --depth 1 https://github.com/modelcontextprotocol/ext-apps.git /tmp/mcp-ext-apps
Key reference locations: | Path | Content | |------|---------| | /tmp/mcp-ext-apps/examples/basic-server-react/ | React template | | /tmp/mcp-ext-apps/examples/basic-server-vanillajs/ | Vanilla JS template | | /tmp/mcp-ext-apps/examples/basic-server-vue/ | Vue template | | /tmp/mcp-ext-apps/examples/basic-server-svelte/ | Svelte template | | /tmp/mcp-ext-apps/examples/basic-server-preact/ | Preact template | | /tmp/mcp-ext-apps/examples/basic-server-solid/ | Solid template | | /tmp/mcp-ext-apps/src/app.ts | App class API | | /tmp/mcp-ext-apps/src/server/index.ts | Server registration helpers | | /tmp/mcp-ext-apps/src/react/useApp.tsx | React useApp hook | | /tmp/mcp-ext-apps/src/styles.ts | Host styling helpers | | /tmp/mcp-ext-apps/docs/patterns.md | Advanced patterns | | /tmp/mcp-ext-apps/examples/basic-host/ | Test host |
Is the team familiar with React?
YES -> Use React with useApp hook (SDK-provided, first-class)
NO -> Is this a simple app with minimal UI?
YES -> Use Vanilla JS with manual lifecycle
NO -> Use team's preferred framework (Vue/Svelte/Preact/Solid)
with manual App lifecycle managementbashmkdir my-mcp-app && cd my-mcp-app npm init -y # Core dependencies npm install @modelcontextprotocol/ext-apps @modelcontextprotocol/sdk zod # Dev dependencies npm install -D typescript vite vite-plugin-singlefile tsx concurrently @types/node # React-specific (if using React) npm install react react-dom npm install -D @types/react @types/react-dom
my-mcp-app/
├── src/
│ ├── server.ts # MCP server with registerAppTool + registerAppResource
│ ├── main.ts # Client UI entry (or main.tsx for React)
│ └── global.css # Styles with host CSS variable fallbacks
├── mcp-app.html # HTML entry point for Vite (or mcp-app.tsx for React)
├── vite.config.ts # Vite + vite-plugin-singlefile
├── tsconfig.json # TypeScript configuration
├── package.json # Scripts: build:ui, build:server, build, dev
└── .gitignore # dist/, node_modules/, /tmp/json{ "scripts": { "build:ui": "vite build", "build:server": "tsc --project tsconfig.server.json", "build": "npm run build:ui && npm run build:server", "dev": "concurrently \"vite\" \"tsx watch src/server.ts\"", "serve": "tsx src/server.ts" } }
json{ "compilerOptions": { "target": "ES2022", "module": "ESNext", "moduleResolution": "bundler", "strict": true, "esModuleInterop": true, "jsx": "react-jsx", "outDir": "dist", "rootDir": "src" }, "include": ["src/**/*.ts", "src/**/*.tsx"], "exclude": ["node_modules", "dist"] }
npm install (no manual versions)server.ts)main.ts / main.tsx)mcp-app.html / mcp-app.tsx)vite-plugin-singlefile presentbuild:ui, build:server, build).gitignore includes dist/ and node_modules/javascriptconst mcpAppScaffoldingTask = defineTask({ name: 'mcp-app-scaffolding', description: 'Scaffold MCP App project structure with framework-specific templates', inputs: { appName: { type: 'string', required: true }, framework: { type: 'string', default: 'react' }, description: { type: 'string', default: '' }, transport: { type: 'string', default: 'stdio' }, existingServer: { type: 'boolean', default: false } }, outputs: { projectDir: { type: 'string' }, framework: { type: 'string' }, files: { type: 'array' }, artifacts: { type: 'array' } }, async run(inputs, taskCtx) { return { kind: 'skill', title: `Scaffold MCP App: ${inputs.appName} (${inputs.framework})`, skill: { name: 'mcp-app-scaffolding', context: { appName: inputs.appName, framework: inputs.framework, description: inputs.description, transport: inputs.transport, existingServer: inputs.existingServer, instructions: [ 'Clone SDK reference code at published npm version', 'Execute framework selection decision tree', 'Generate project directory structure', 'Install all dependencies via npm install', 'Create server and client entry points', 'Configure Vite with vite-plugin-singlefile', 'Set up TypeScript and build scripts' ] } }, io: { inputJsonPath: `tasks/${taskCtx.effectId}/input.json`, outputJsonPath: `tasks/${taskCtx.effectId}/result.json` } }; } });
Other measured skills in the registry, with their headline benchmark lift.