대규모 조사나 생성 작업을 여러 AI 모델에 분담해 계획 검토, 병렬 실행, 결과 검증과 통합을 진행합니다. 담당별 진행 상황과 재시도도 기록합니다.
- 여러 경쟁사를 병렬로 조사
- 대규모 생성 작업 분담
- 조언자에게 계획이나 초안 검토 요청
mcp-use로 AI가 외부 작업과 데이터를 이용하는 MCP 서버를 설계하고 구현하도록 안내합니다. 인증, 조작 화면, 오류 처리와 배포를 다룹니다.
**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.
mcp-apps-builder는 mcp-use로 MCP 서버를 설계하고 구현하는 가이드입니다. MCP는 AI가 외부 작업과 데이터를 이용하게 하는 방식입니다. 작업을 실행하는 Tool, 읽기 전용 데이터를 제공하는 Resource, 문구를 재사용하는 Prompt, React 조작 화면인 Widget의 역할을 구분합니다. 입력 검증, 응답 형식, 오류 처리, 인증, 화면 상태 관리, 테마 지원과 배포 방법도 다룹니다.
새 서버를 만들거나 기존 mcp-use 프로젝트에 기능을 추가할 때 참고합니다. 데이터를 나열하고 비교하며 선택하는 화면을 만들거나 코드의 보안과 성능을 검토할 때도 활용합니다.
mcp-use로 MCP 서버를 새로 만들어 주세요.”본문은 참고 자료를 안내하므로 구현할 때는 기능별 첨부 자료도 함께 사용합니다. 새 프로젝트는 npx create-mcp-use-app 사용을 전제로 합니다. Widget 예시는 React를, 입력 검증 예시는 Zod를 사용합니다. 인증 정보는 환경 변수로 관리하는 방침입니다.
이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.
AI가 SKILL.md의 내용만을 근거로 4가지 관점에서 판정했습니다. 스타 수나 인기도는 판정에 넣지 않았습니다.
총점은 각 항목을 A=25점, B=15점, C=5점으로 더한 값입니다. 2026년 10월 20일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
This 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") |
아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
대규모 조사나 생성 작업을 여러 AI 모델에 분담해 계획 검토, 병렬 실행, 결과 검증과 통합을 진행합니다. 담당별 진행 상황과 재시도도 기록합니다.
ChatGPT 안에서 조작하는 앱의 구상부터 React 위젯과 상태 공유 구현까지 안내합니다. 현재는 사용이 권장되지 않으며 후속 스킬로 전환하도록 안내합니다.
로컬 Git 기록에서 코드가 추가된 배경과 변경 의도를 조사합니다. 최초 커밋과 반복해서 함께 바뀐 파일을 추적하고 수정 전에 확인할 사항을 정리합니다.
Python과 JavaScript 의존성 파일의 버전 미지정, 중복, 고정 버전 충돌, 오래된 호환 패키지를 점검합니다. 문제의 영향을 쉽게 설명하고 검토하기 쉬운 수정안을 제시합니다.
공개 전 원고를 예상 독자의 관점에서 읽고, 읽기 시작할지, 어디서 관심이 줄어드는지, 무엇을 기억하는지 확인합니다. 글을 고치지 않고 독자의 반응을 보고합니다.
mcp-use로 MCP 서버의 작업, 데이터, 재사용 프롬프트와 조작 화면을 설계하는 이전 가이드입니다. 현재는 사용이 권장되지 않으며 mcp-app-builder로 전환하도록 안내합니다.