mcp-use/mcp-apps-builder
Build, modify, debug, migrate, or review TypeScript MCP servers and interactive MCP Apps using mcp-use v2. Use for tools, resources, prompts, Views, React host interactions, OAuth, middleware, Inspector workflows, package-boundary migrations, and release-ready verification in an mcp-use project.
npx skills add https://github.com/mcp-use/mcp-use --skill mcp-apps-builder
Treat the installed mcp-use package, its generated types, and the project's existing exports as the source of truth. Check the installed version before changing code; do not assume APIs from mcp-use v1.
package.json, the server entry, exported tool refs, views/, and the installed mcp-use version.npx create-mcp-use-app@latest; do not hand-build framework boilerplate.mcp-use; provider adapters come from mcp-use/oauth/*; React APIs come from mcp-use/react.inputSchema; add outputSchema when returning structured data or binding a View.content, structuredContent, and optionally _meta or isError.views/<name>/view.tsx and bind it with view: { name: "<name>" }.useToolContext; use focused hooks such as useCallTool, useViewState, useHostContext, and useDisplayMode for additional behavior.mcp-use dev, build, and start own framework lifecycle and View compilation.import { MCPServer } from "mcp-use";
import { z } from "zod";
const server = new MCPServer({ name: "catalog", version: "1.0.0" });
export const showProduct = server.tool(
{
name: "show-product",
description: "Show one catalog product",
inputSchema: z.object({ id: z.string() }),
outputSchema: z.object({ id: z.string(), name: z.string() }),
view: { name: "product" },
},
async ({ id }) => {
const product = { id, name: "Example product" };
return {
content: [{ type: "text", text: JSON.stringify(product) }],
structuredContent: product,
};
},
);
export default server;
// views/product/view.tsx
import { ThemeProvider, useToolContext } from "mcp-use/react";
export default function ProductView() {
const view = useToolContext<"show-product">();
if (view.status === "pending") return <p>Loading…</p>;
if (view.status === "error") return <p>{view.error.message}</p>;
return <ThemeProvider>{view.toolOutput.name}</ThemeProvider>;
}
outputSchema and matching structuredContent.Run node <skill-dir>/scripts/check-v2.mjs <project-root> during migrations and reviews, then complete the focused checks in Verification.
Take mcp-use/mcp-apps-builder from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npx.
Without those the skill loads but fails at the first command.