mcp — Claude Code skill: MCP Apps and installation
This skill helps build MCP servers that render interactive json-render UIs in Claude, ChatGPT, Cursor, and VS Code.
npx skills add vercel-labs/json-render --skill mcp -a claude-codeWhat mcp does
The skill covers @json-render/mcp with the Model Context Protocol. createMcpApp() creates the server, registers a render-ui tool, and exposes a ui:// HTML resource. The tool description carries the catalog prompt so the model can produce valid UI specs.
The client is a React app running inside an iframe. useJsonRenderApp() receives the spec through postMessage, while JSONUIProvider and Renderer turn it into the interface. Vite and vite-plugin-singlefile bundle the client into one HTML file.
The server uses @json-render/mcp, @json-render/core, and @modelcontextprotocol/sdk. The iframe needs @json-render/react, @json-render/shadcn, react, and react-dom; the build uses vite, @vitejs/plugin-react, and vite-plugin-singlefile. This requires a Node.js React project.
What it helps with
- build an MCP server with an interactive UI
- give the model a catalog of valid UI specs
- render an MCP App inside an iframe
- bundle a React client into one HTML file
Example prompts for the agent
- Build a Node.js MCP server with `createMcpApp()` and a `render-ui` tool for json-render.
- Add a React iframe client with `useJsonRenderApp()` and handle its loading and error states.
- Bundle `dist/index.html` with Vite and `vite-plugin-singlefile` for the MCP App.
How to install mcp
1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill mcp -a claude-code2Manually: put the files in place
~/.claude/skills/mcp/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/mcp/
1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill mcp -a codex2Manually: put the files in place
.agents/skills/mcp/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill mcp -a cursor2Manually: put the files in place
.cursor/skills/mcp/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install vercel-labs/json-render mcp2Manually: put the files in place
.github/skills/mcp/SKILL.md1Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill mcp -a gemini-cli2Platform CLI
gemini skills install https://github.com/vercel-labs/json-render --path skills/mcpManually: put the files in place
.devin/skills/mcp/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill mcp -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set20
The whole set →Similar
Questions about mcp
How do I install mcp in Claude Code?
Run npx skills add vercel-labs/json-render --skill mcp -a claude-code, then run npx skills add vercel-labs/json-render --skill mcp -a claude-code again. The skill file is at ~/.claude/skills/mcp/SKILL.md.
What does mcp do?
It connects json-render to MCP: the server registers render-ui, serves a UI resource, and the React iframe client renders the returned specification.
What is required to build an MCP App?
You need a React iframe client and a Vite build using vite-plugin-singlefile. The server uses @json-render/mcp, @json-render/core, and @modelcontextprotocol/sdk.
Source text
SKILL.md · Apache-2.0
---
name: mcp
description: MCP Apps integration for json-render. Use when building MCP servers that render interactive UIs in Claude, ChatGPT, Cursor, or VS Code, or when integrating json-render with the Model Context Protocol.
---
# @json-render/mcp
MCP Apps integration that serves json-render UIs as interactive MCP Apps inside Claude, ChatGPT, Cursor, VS Code, and other MCP-capable clients.
## Quick Start
### Server (Node.js)
```typescript
import { createMcpApp } from "@json-render/mcp";
import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/react/schema";
import { shadcnComponentDefinitions } from "@json-render/shadcn/catalog";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import fs from "node:fs";
const catalog = defineCatalog(schema, {
components: { ...shadcnComponentDefinitions },
actions: {},
});
const server = createMcpApp({
name: "My App",
version: "1.0.0",
catalog,
html: fs.readFileSync("dist/index.html", "utf-8"),
});
await server.connect(new StdioServerTransport());
```
### Client (React, inside iframe)
```tsx
import { useJsonRenderApp } from "@json-render/mcp/app";
import { JSONUIProvider, Renderer } from "@json-render/react";
function McpAppView({ registry }) {
const { spec, loading, error } = useJsonRenderApp();
if (error) return <div>Error: {error.message}</div>;
if (!spec) return <div>Waiting...</div>;
return (
<JSONUIProvider registry={registry} initialState={spec.state ?? {}}>
<Renderer spec={spec} registry={registry} loading={loading} />
</JSONUIProvider>
);
}
```
## Architecture
1. `createMcpApp()` creates an `McpServer` that registers a `render-ui` tool and a `ui://` HTML resource
2. The tool description includes the catalog prompt so the LLM knows how to generate valid specs
3. The HTML resource is a Vite-bundled single-file React app with json-render renderers
4. Inside the iframe, `useJsonRenderApp()` connects to the host via `postMessage` and renders specs
## Server API
- `createMcpApp(options)` - main entry, creates a full MCP server
- `registerJsonRenderTool(server, options)` - register a json-render tool on an existing server
- `registerJsonRenderResource(server, options)` - register the UI resource
## Client API (`@json-render/mcp/app`)
- `useJsonRenderApp(options?)` - React hook, returns `{ spec, loading, connected, error, callServerTool }`
- `buildAppHtml(options)` - generate HTML from bundled JS/CSS
## Building the iframe HTML
Bundle the React app into a single self-contained HTML file using Vite + `vite-plugin-singlefile`:
```typescript
// vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { viteSingleFile } from "vite-plugin-singlefile";
export default defineConfig({
plugins: [react(), viteSingleFile()],
build: { outDir: "dist" },
});
```
## Client Configuration
### Cursor (`.cursor/mcp.json`)
```json
{
"mcpServers": {
"my-app": {
"command": "npx",
"args": ["tsx", "server.ts", "--stdio"]
}
}
}
```
### Claude Desktop
```json
{
"mcpServers": {
"my-app": {
"command": "npx",
"args": ["tsx", "/path/to/server.ts", "--stdio"]
}
}
}
```
## Dependencies
```bash
# Server
npm install @json-render/mcp @json-render/core @modelcontextprotocol/sdk
# Client (iframe)
npm install @json-render/react @json-render/shadcn react react-dom
# Build tools
npm install -D vite @vitejs/plugin-react vite-plugin-singlefile
```
© vercel-labs · Apache-2.0 · vercel-labs/json-render