모든 스킬

mcp-builder (anthropics/skills)

Python 또는 TypeScript로 MCP 서버를 만들어 외부 서비스를 잘 설계된 도구로 노출하도록 안내합니다.

mcp-builder: 이름 지정, 애너테이션, 비동기 지원을 더해 MCP 서버 점수를 3.6에서 4.6/5로 끌어올렸지만, 한 문장 체크리스트가 68%의 토큰으로 4.9점을 냈습니다

상황에 따라안전

Codex CLI · gpt-6-astra

21.6 / 30

스킬 없이 대비 향상폭: +1.04 · 상황에 따라 · 18회 실행

상황에 따라: 총점 21.6/30이 22점 미만. 추천이 되려면 총점 22/30, 출력 품질 3.5, 향상폭 +1.0이 필요합니다.

SOTA

통과

Codex로 테스트

커버 대상 Codex, Claude Code

Codex CLI 0.166 (SOTA 티어): 채점된 실행 18회. 여기서 통과하면 티어 규칙에 따라 Claude Code도 커버되지만, 두 번째 티어에 대해서는 아무것도 말해주지 않습니다.

점수

각 차원은 0~5점이며 여섯 차원을 더하면 30점 만점의 총점이 됩니다. 모든 차원에서 5가 가장 좋습니다. 비용 5는 저렴하고 빠름, 설치 5는 쉬움을 뜻합니다.

트리거 신뢰도
5.0
스킬 없이 대비 향상폭
3.0
출력 품질
4.6
토큰 및 시간 비용
3.0
설치 및 이식성
3.0
안전성
3.0

보안 리뷰

안전

정적 스캔: CRITICAL 8 / HIGH 13 / MEDIUM 7. 수동 검토: 네트워크가 차단된 샌드박스에서 실행 안전(스캐너 지적 사항은 설명됨, 번들 스크립트는 실행되지 않음). 스캔이 깨끗하다고 해서 스킬이 안전하다는 증거는 아닙니다.

설치

npx skills@latest add anthropics/skills --skill mcp-builder

출처

고정 커밋: ca45fc496a3436251f191354091d557da31c15b5

테스트일: 2026-11-02

테스트한 과제

  • 서점 API용 Python MCP 서버 — server.py를 작성하세요. 서점 재고 REST API용 Python MCP 서버입니다(기본 URL과 베어러 토큰은 환경 변수에서 가져옴). 도구: 도서 검색, 도서 한 권 조회, 도서 재고 수정, 도서 삭제. 공식 mcp Python SDK(FastMC…
  • 날씨 API용 TypeScript MCP 서버 — src/index.ts와 package.json을 작성하세요. 날씨 REST API용 TypeScript MCP 서버입니다(기본 URL과 API 키는 환경 변수에서 가져옴). 도구: 도시의 현재 날씨 조회, 5일 예보 조회, 저장된 위치 목록, 저장된 위치 삭제. 공식 MCP…
  • 급하게 작성된 MCP 서버 수정 — server.py는 창고 API용 MCP 서버로 동작은 하지만 급하게 작성되었습니다. MCP 서버 모범 사례를 따르도록 고치세요. server.py를 제자리에서 편집하고 같은 API와 통신하도록 유지하세요. 여기에는 네트워크도 패키지 설치도 없습니다. 코드만 작성…

장점

  • 스킬 없이보다 평균 점수를 3.57에서 4.61로 끌어올렸습니다(+1.04).
  • 스킬 이름을 언급하지 않았는데도 적용되었습니다. 스킬 사용군 실행 6/6회에서 스킬 파일을 읽었습니다.
  • 스킬 사용 시 높은 절대 품질: 4.61/5.

단점

  • 한 문장 프롬프트는 4.88점, 스킬 사용은 4.61점(-0.27).
  • 스킬 없이보다 토큰을 1.51배 사용합니다.
  • 과제·그룹당 n=2이며, 약 1점 미만의 차이는 노이즈입니다.

리뷰

Codex CLI 0.166 (gpt-6-astra, low reasoning)을 전용 Windows 테스트 PC에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬 설치(스킬 사용군), 미설치(대조군), 미설치 상태에서 스킬의 핵심 요구사항만 한 문장으로 압축해 프롬프트에 덧붙인 경우(한 문장 프롬프트군)로 나눴으며, 과제·그룹당 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 언급하지 않았습니다(아래에 적은 경우 제외). 과제는 세 가지입니다. 서점 REST API용 Python MCP 서버 작성, 날씨 API용 TypeScript MCP 서버 작성, 급하게 작성된 기존 server.py를 모범 사례에 맞게 수정하는 것입니다. 네트워크가 필요한 작업은 없습니다(에이전트가 MCP SDK를 설치할 수 없어 코드만 작성합니다). 스킬 사용군의 프롬프트는 대조군과 같습니다.

3개 그룹 비교

그룹평균 점수 (0-5)실행당 토큰
스킬 없음3.5773k
한 문장 프롬프트4.8875k
스킬 사용4.61110k

Codex CLI에서 18회 실행해 측정했고, LLM 심사 없이 규칙 기반 검사로 채점했습니다. 총점 21.6 / 30, 판정 상황에 따라.

판정: 상황에 따라 다름 (21.6 / 30). 출처: anthropics/skills, skills/mcp-builder, 커밋 ca45fc4에 고정. 설치: npx skills@latest add anthropics/skills --skill mcp-builder. 라이선스: 독점: anthropics/skills LICENSE.txt(소스 공개, 평가 전용, 재배포 불가).

무엇인가

anthropics/skills의 mcp-builder 스킬은 Model Context Protocol 서버를 구축하는 가이드입니다(조사·계획, 구현, 리뷰·테스트, 평가 작성). Python(FastMCP)과 TypeScript 언어 가이드, MCP 모범 사례 노트, 서버 대상 평가를 실행하는 도우미 스크립트 2개를 제공합니다. 독점 라이선스(소스 공개)입니다.

테스트 방법

전용 Windows 테스트 PC에서 Codex CLI 0.166(gpt-6-astra, 낮은 추론)을 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬을 설치한 경우(스킬 사용군), 설치하지 않은 경우(대조군), 스킬 없이 스킬의 핵심 요구사항을 한 문장으로 압축해 프롬프트 끝에 붙인 경우(한 문장 프롬프트군)로 나눴고, 작업마다 각 군 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 전혀 언급하지 않았습니다(아래에 적은 표현은 예외).

작업은 세 가지입니다. 서점 REST API용 Python MCP 서버 작성, 날씨 API용 TypeScript MCP 서버 작성, 기존의 대충 만든 server.py를 좋은 관행에 맞게 수정. 네트워크가 필요한 작업은 없습니다(에이전트는 MCP SDK를 설치할 수 없고 코드만 작성). 스킬 군의 프롬프트는 대조군과 같습니다.

  1. 서점 API용 Python MCP 서버 — server.py를 작성하세요: 서점 재고 REST API용 Python MCP 서버(기본 URL과 베어러 토큰은 환경 변수에서 가져옴). 도구: 도서 검색, 도서 하나 조회, 도서 재고 수정, 도서 삭제. 공식 mcp Python SDK(FastMCP)…
  2. 날씨 API용 TypeScript MCP 서버 — src/index.ts와 package.json을 작성하세요: 날씨 REST API용 TypeScript MCP 서버(기본 URL과 API 키는 환경 변수에서). 도구: 도시의 현재 날씨 조회, 5일 예보 조회, 저장된 위치 목록, 저장된 위치 삭제. 공식 MCP SDK…
  3. 급히 작성된 MCP 서버 수정 — server.py는 우리 창고 API용 MCP 서버로 동작은 하지만 급하게 작성했습니다. 좋은 MCP 서버 관행을 따르도록 수정하세요. server.py를 그 자리에서 편집하고 같은 API와 통신하게 유지하세요. 네트워크와 패키지 설치가 없는 환경이므로 코드만 작성하세요…

채점은 프로그램 방식(숨은 테스트, 심어 둔 문제 탐지, 제약 조건 검사, 해당되는 경우 렌더링+OCR)으로 실행당 0~5점입니다. 점수를 결정한 LLM 심사자는 없습니다.

결과

세 번째 군에 전달한 한 문장 프롬프트: "전문가처럼 MCP 서버를 설계하세요. 일관된 서비스 접두어가 붙은 행동 지향적 도구 이름(예: bookstore_search_books), 필드 설명이 있는 타입 지정 입력 스키마(Pydantic 또는 Zod), 애너테이션(readOnlyHint, destructiveHint, idempotentHint), 페이지네이션과 크기 제한이 있는 결과, 조치 가능한 오류 메시지, 환경 변수에서만 가져오는 시크릿, 비동기 I/O, 그리고 stdio 트랜스포트에서 stdout에 아무것도 출력하지 않기."

작업대조군 점수한 문장 프롬프트스킬 사용대조군 토큰한 문장 프롬프트 토큰스킬 사용 토큰스킬 읽음
t1-python1.434.644.260k64k97k2/2
t2-typescript4.295.04.6460k55k100k2/2
t3-fix5.05.05.097k106k133k2/2

평균 점수: 스킬 없음 3.57, 스킬 사용 4.61(차이 +1.04). 실행당 토큰: 73k 대 110k(1.51배), 시간: 80초 대 89초. 한 문장 프롬프트 군: 4.88(한 문장 프롬프트 대비 스킬의 이득 -0.27, 스킬 없음 대비 한 문장 프롬프트의 이득 +1.31). 한 문장 프롬프트의 실행당 토큰은 75k이므로 스킬은 한 문장 프롬프트의 1.47배 비용을 씁니다.

무슨 일이 있었나

  • 중요한 부분에서 스킬은 도움이 됩니다. 처음부터 만드는 서버 두 개에서 대조군은 기본을 놓쳤습니다(공통 서비스 접두어가 붙은 도구 이름 2/4회, readOnlyHint 같은 도구 애너테이션 Python 2/2회, 비동기 도구 Python 2/2회, 조치 가능한 오류 메시지 Python 2/2회). 평균은 대조군 3.57, 스킬 4.61입니다.
  • 한 문장 프롬프트 군이 스킬보다 나았습니다. 4.88점으로 18회 실행에서 놓친 검사가 하나였고, 스킬 군은 5개를 놓쳤습니다. 그 문장은 검사가 찾는 속성을 그대로 나열하므로 짧은 프롬프트의 상한선입니다. 다만 실행당 75k 토큰으로, 스킬 110k, 대조군 73k입니다.
  • 스킬 군의 실제 결함: TypeScript 스킬 사용 실행 2회 모두 새 @modelcontextprotocol/server 패키지용 createServer()를 만들었지만 트랜스포트를 시작하지 않았습니다(stdio도 Streamable HTTP도 없음). 그래서 서버 파일은 작성된 그대로는 실행할 수 없습니다. 대조군과 한 문장 실행은 트랜스포트를 포함했습니다.
  • 수정 작업에서는 세 군 모두 같은 점수였습니다(6회 실행 모두 9/9 검사 통과). 기존 서버가 주어지면 순수 Codex도 이미 그 관행을 적용했습니다.
  • 스킬은 로드하기 무겁습니다. SKILL.md와 참고 가이드로 구성되며, 스킬 사용 실행은 프로젝트의 .agents 폴더에 스킬 파일 약 12개를 남기고 가이드를 읽었습니다. 1.5배 토큰이 여기서 나옵니다. 도우미 스크립트(평가 하네스)는 오프라인 샌드박스에서 실행하지 않았습니다.

항목별 점수

항목점수근거
1. 출력 품질4.61

스킬 사용 시 평균 4.61/5(프로그램 검사, 작업별 표 참조).

2. 스킬 없음 대비 향상3.04

스킬 없음 3.57 대비 +1.04점(작업당 n=2, 약 1점 미만은 노이즈).

3. 트리거5.0스킬 사용군 6/6회 실행에서 스킬 파일을 읽었습니다.
4. 지침 이식성3

언어별 가이드로 나뉜 큰 참고 자료 집합. 도우미 스크립트는 Python 패키지와 실행 중인 서버가 필요합니다.

5. 효율성3토큰 1.51배(실행당 110k 대 73k), 시간 1.11배(89초 대 80초).
6. 안전성·위생3

스캐너가 CRITICAL 8 / HIGH 13을 표시했으며 모두 문맥을 확인했습니다. 샘플 서버 코드와 도우미 스크립트의 환경 변수 전달이며, 독점 라이선스입니다.

이 테스트의 한계

  • 코드 텍스트에 대한 규칙 기반 검사. 생성된 서버 중 실제로 시작하거나 클라이언트에 연결한 것은 없습니다.
  • 네트워크 없음: 에이전트가 MCP SDK를 설치하거나 import할 수 없어 API 세부 사항(예: 새 v2 TypeScript 패키지)은 검증되지 않았습니다.
  • 스킬의 평가 단계(질문 생성 및 서버 대상 실행)는 수행하지 않았습니다.
  • 작업·군당 n = 2: 약 1점 미만의 차이는 노이즈입니다.
  • 규칙 기반 채점은 검사가 볼 수 있는 것만 측정합니다. 취향이나 결과가 최선인지는 판단할 수 없습니다.

보안

security.md를 참조하세요. 스캔: CRITICAL 8 / HIGH 13 / MEDIUM 7. 판정: 실행해도 안전(네트워크 차단 샌드박스). 깨끗한 스캔 결과가 스킬의 안전성을 증명하지는 않습니다.

결론

처음부터 서버를 만들 때 이 스킬은 이름 짓기, 애너테이션, 비동기, 오류 처리에서 지침 없는 에이전트를 확실히 앞서며, 토큰은 1.5배 듭니다. 짧은 체크리스트 문장 하나가 더 적은 토큰으로 같은 속성을 얻었고 트랜스포트 누락 결함도 없었습니다. 따라서 참고 가이드와 일관성을 위해 설치하되, 좋은 프롬프트 대비 품질 도약을 기대하고 설치하지는 마세요.

트랜스크립트

실행 로그: mcp-builder (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.)
열: 작업, 그룹-회차, 점수(0-5), 토큰, 초, 통과한 검사, 에이전트가 연 스킬 파일.

t1-python control-1: 점수 1.79, 토큰 51610, 초 53.2, 검사 4/9, 연 파일 없음
t1-python control-2: 점수 1.07, 토큰 69259, 초 98.6, 검사 3/9, 연 파일 없음
t1-python oneliner-1: 점수 5.0, 토큰 74072, 초 101.3, 검사 9/9, 연 파일 없음
t1-python oneliner-2: 점수 4.29, 토큰 54692, 초 126.2, 검사 8/9, 연 파일 없음
t1-python treatment-1: 점수 3.39, 토큰 101809, 초 72.0, 검사 6/9, 연 파일 mcp-builder
t1-python treatment-2: 점수 5.0, 토큰 93275, 초 66.9, 검사 9/9, 연 파일 mcp-builder
t2-typescript control-1: 점수 4.29, 토큰 52126, 초 59.1, 검사 8/9, 연 파일 없음
t2-typescript control-2: 점수 4.29, 토큰 69042, 초 61.5, 검사 8/9, 연 파일 없음
t2-typescript oneliner-1: 점수 5.0, 토큰 55412, 초 104.3, 검사 9/9, 연 파일 없음

18회 실행, 아티팩트 3개

샘플 출력

SOTA · With the skill: server.py (t1-python, run 1, Codex)

"""Bookstore MCP server (Python 3.10+, official mcp SDK, httpx, Pydantic 2). Required environment variables: BOOKSTORE_BASE_URL: API root, e.g. https://inventory.example.com/api/v1 BOOKSTORE_API_TOKEN: bearer token (without the 'Bearer ' prefix) Assumed REST contract (adjust paths/fields here to match your API): GET /books?q=...&limit=...&offset=... -> JSON search results GET /books/{book_id} -> JSON book PATCH /books/{book_id}/stock body: {"stock": nonnegative integer} DELETE /books/{book_id} Updates and deletes may return JSON or an empty success response. Search pagination and response shape are supplied by the upstream API. Run with `python server.py` in an environment with the dependencies installed. Transport is stdio; stdout is reserved for MCP protocol messages. """ import os from contextlib import asynccontextmanager from dataclasses import dataclass from typing import Annotated, Any, AsyncIterator from urllib.parse import quote, urlsplit import httpx from mcp.server.fastmcp import Context, FastMCP from mcp.server.fastmcp.exceptions import ToolError from pydantic import Field @dataclass class AppState: client: httpx.AsyncClient @asynccontextmanager async def lifespan(server: FastMCP) -> AsyncIterator[AppState]: base_url = os.environ.get("BOOKSTORE_BASE_URL", "").strip() token = os.environ.get("BOOKSTORE_API_TOKEN", "").strip() if not base_url or not token: raise RuntimeError("Set BOOKSTORE_BASE_URL and BOOKSTORE_API_TOKEN.") try: parsed = urlsplit(base_url) valid = ( parsed.scheme in {"http", "https"} and bool(parsed.hostname) and parsed.username is None and parsed.password is None and not parsed.query and not parsed.fragment ) parsed.port # Validate a supplied port without exposing the URL. except ValueError: valid = False if not valid: raise RuntimeError("BOOKSTORE_BASE_URL must be an HTTP(S) API root without credentials, query, or fragment.") if any(ord(char) < 33 or ord(char) > 126 for char in token): raise RuntimeError("BOOKSTORE_API_TOKEN must contain printable ASCII without whitespace.") async with httpx.AsyncClient( base_url=base_url.rstrip("/") + "/", headers={"Authorization": f"Bearer {token}", "Accept": "application/json"}, timeout=httpx.Timeout(30.0, connect=10.0), follow_redirects=False, trust_env=False, ) as client: yield AppState(client=client) mcp = FastMCP("bookstore_mcp", lifespan=lifespan) BookId = Annotated[str, Field(min_length=1, max_length=256, description="Book identifier, e.g. 'book-123'.")] def book_path(book_id: str) -> str: if not book_id.strip() or book_id in {".", ".."}: raise ToolError("Provide a nonblank book identifier other than '.' or '..'.") return "books/" + quote(book_id, safe="") async def api_request( ctx: Context, method: str, path: str, *, params: dict[str, Any] | None = None, payload: dict[str, Any] | None = None, ) -> dict[str, Any]: state: AppState = ctx.r [... excerpt: first 3200 of 7129 characters]

Pro 보기