**MANDATORY for ALL MCP server work** - mcp-use framework best practices and patterns. **READ THIS FIRST** before any MCP server work, including: - Creating new MCP servers - Modifying existing MCP servers (adding/updating tools, resources, prompts, widgets) - Debugging MCP server issues or errors - Reviewing MCP server code for quality, security, or performance - Answering questions about MCP development or mcp-use patterns - Making ANY changes to server.tool(), server.resource(), server.prompt(), or widgets This skill contains critical architecture decisions, security patterns, and common pitfalls. Always consult the relevant reference files BEFORE implementing MCP features.
Guides MCP server development with best practices, reference files, and decision trees for tools, resources, prompts, and widgets.
/plugin marketplace add mcp-use/mcp-use/plugin install all-skills@mcp-useThis skill inherits all available tools. When active, it can use any tool Claude has access to.
LICENSE.txtreferences/authentication/custom.mdreferences/authentication/overview.mdreferences/authentication/supabase.mdreferences/authentication/workos.mdreferences/foundations/architecture.mdreferences/foundations/concepts.mdreferences/foundations/deployment.mdreferences/foundations/quickstart.mdreferences/patterns/common-patterns.mdreferences/server/prompts.mdreferences/server/resources.mdreferences/server/response-helpers.mdreferences/server/tools.mdreferences/widgets/advanced.mdreferences/widgets/basics.mdreferences/widgets/interactivity.mdreferences/widgets/state.mdreferences/widgets/ui-guidelines.mdThis file provides a NAVIGATION GUIDE ONLY. Before implementing any MCP server features, you MUST:
Do NOT rely solely on the quick reference examples in this file - they are minimal examples only. The reference files contain critical best practices, security considerations, and advanced patterns.
Comprehensive guide for building production-ready MCP servers with tools, resources, prompts, and widgets using mcp-use.
Before doing anything else, determine whether you are inside an existing mcp-use project.
Detection: Check the workspace for a package.json that lists "mcp-use" as a dependency, OR any .ts file that imports from "mcp-use/server".
├─ mcp-use project FOUND → Do NOT scaffold. You are already in a project.
│ └─ Skip to "Quick Navigation" below to add features.
│
├─ NO mcp-use project (empty dir, unrelated project, or greenfield)
│ └─ Scaffold first with npx create-mcp-use-app, then add features.
│ See "Scaffolding a New Project" below.
│
└─ Inside an UNRELATED project (e.g. Next.js app) and user wants an MCP server
└─ Ask the user where to create it, then scaffold in that directory.
Do NOT scaffold inside an existing unrelated project root.
NEVER manually create MCPServer boilerplate, package.json, or project structure by hand. The CLI sets up TypeScript config, dev scripts, inspector integration, hot reload, and widget compilation that are difficult to replicate manually.
npx create-mcp-use-app my-server
cd my-server
npm run dev
For full scaffolding details and CLI flags, see quickstart.md.
Choose your path based on what you're building:
When: ALWAYS read these first when starting MCP work in a new conversation. Reference later for architecture/concept clarification.
Load these before diving into tools/resources/widgets sections.
When: Protecting your server with OAuth (WorkOS, Supabase, or custom)
ctx.auth, or choosing a provideroauth config, user context shape, provider comparison, common mistakesWhen: Implementing MCP features (actions, data, templates). Read the specific file for the primitive you're building.
text(), object(), markdown(), image(), error(), mix()When: Creating React-based visual interfaces for browsing, comparing, or selecting data
useWidget() hook, isPending checks, props handlinguseState, setState, state persistence, when to use tool vs widget stateuseCallTool(), form handling, action buttons, optimistic updatesuseWidgetTheme(), light/dark mode, autoSize, layout patterns, CSS best practicesWhen: You want to see full implementations of common use cases
What do you need?
├─ New project from scratch
│ └─> quickstart.md (scaffolding + setup)
│
├─ OAuth / user authentication
│ └─> authentication/overview.md → provider-specific guide
│
├─ Simple backend action (no UI)
│ └─> Use Tool: server/tools.md
│
├─ Read-only data for clients
│ └─> Use Resource: server/resources.md
│
├─ Reusable prompt template
│ └─> Use Prompt: server/prompts.md
│
├─ Visual/interactive UI
│ └─> Use Widget: widgets/basics.md
│
└─ Deploy to production
└─> deployment.md (cloud deploy, self-hosting, Docker)
Avoid these anti-patterns found in production MCP servers:
text(), object(), widget(), error() helpers.describe() on every field
error() helper
error("message") for graceful error responsesprops without checking isPending
if (isPending) return <Loading/>useStateMcpUseProvider wrapper or autoSize
<McpUseProvider autoSize>useWidgetTheme() for light/dark mode supportprocess.env.API_KEY, document in .env.exampleerror() on failureOpinionated architectural guidelines:
Split broad actions into focused tools:
manage-users (too vague)create-user, delete-user, list-usersTool calls are expensive. Avoid lazy-loading:
list-products + get-product-details (2 calls)list-products returns full data including detailsUI state lives in the widget, not in separate tools:
select-item tool, set-filter tooluseState or setStateexposeAsTool Defaults to falseWidgets are registered as resources only by default. Use a custom tool (recommended) or set exposeAsTool: true to expose a widget to the model:
// ✅ ALL 4 STEPS REQUIRED for proper type inference:
// Step 1: Define schema separately
const propsSchema = z.object({
title: z.string(),
items: z.array(z.string())
});
// Step 2: Reference schema variable in metadata
export const widgetMetadata: WidgetMetadata = {
description: "...",
props: propsSchema, // ← NOT inline z.object()
exposeAsTool: false
};
// Step 3: Infer Props type from schema variable
type Props = z.infer<typeof propsSchema>;
// Step 4: Use typed Props with useWidget
export default function MyWidget() {
const { props, isPending } = useWidget<Props>(); // ← Add <Props>
// ...
}
⚠️ Common mistake: Only doing steps 1-2 but skipping 3-4 (loses type safety)
When in doubt, add a widget. Visual UI improves:
import { MCPServer, text } from "mcp-use/server";
import { z } from "zod";
const server = new MCPServer({
name: "my-server",
title: "My Server",
version: "1.0.0"
});
server.tool(
{
name: "greet",
description: "Greet a user",
schema: z.object({ name: z.string().describe("User's name") })
},
async ({ name }) => text("Hello " + name + "!"),
);
server.listen();
| Helper | Use When | Example |
|---|---|---|
text() | Simple string response | text("Success!") |
object() | Structured data | object({ status: "ok" }) |
markdown() | Formatted text | markdown("# Title\nContent") |
widget() | Visual UI | widget({ props: {...}, output: text(...) }) |
mix() | Multiple contents | mix(text("Hi"), image(url)) |
error() | Error responses | error("Failed to fetch data") |
resource() | Embed resource refs | resource("docs://guide", "text/markdown") |
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.