MCP HubMCP Hub
스킬 목록으로 돌아가기

scaffold-mcp-server

pjt222
업데이트됨 5 days ago
11 조회
17
2
17
GitHub에서 보기
테스팅aitestingmcp

정보

이 스킬은 공식 TypeScript 또는 Python SDK를 사용하여 도구 명세로부터 바로 사용 가능한 MCP 서버 프로젝트를 생성합니다. 적절한 구조를 만들어주는데, 여기에는 전송 구성, 도구 핸들러, 테스트 하네스가 포함됩니다. 새로운 MCP 서버를 시작할 때, 기존 도구를 MCP로 마이그레이션할 때, 또는 Claude Code로 테스트하기 위한 도구 표면을 프로토타이핑할 때 사용하세요.

빠른 설치

Claude Code

추천
기본
npx skills add pjt222/agent-almanac -a claude-code
플러그인 명령대체
/plugin add https://github.com/pjt222/agent-almanac
Git 클론대체
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/scaffold-mcp-server

Claude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요

문서

構建 MCP 伺服器腳手架

依工具規格文件以官方 MCP SDK(TypeScript 或 Python)產生完整、可執行之 MCP 伺服器項目。

適用時機

  • 已有工具規格(來自 analyze-codebase-for-mcp 或手寫)並需可運行之伺服器
  • 新建 MCP 伺服器項目並欲從一開始有正確結構
  • 將既有工具整合遷移至 MCP 協議
  • 於完整實作前以工具表面原型測試 Claude Code
  • 同時需伺服器骨架與 CI 之測試框架

輸入

  • 必要:工具規格文件(YAML 或 JSON,含工具名、參數、回傳類型)
  • 必要:目標語言(typescriptpython
  • 必要:傳輸類型(stdiosse
  • 選擇性:輸出目錄(預設:當前目錄)
  • 選擇性:套件名與版本
  • 選擇性:認證方式(nonebearer-tokenapi-key
  • 選擇性:Docker 打包(truefalse,預設:false

步驟

步驟一:選擇 SDK 語言與傳輸

1.1. 依項目情境選擇實作語言:

  • TypeScript:適合 Node.js 生態、近 web 工具、JSON 重之工作負載
  • Python:適合資料科學、ML 與科學計算工具表面

1.2. 選擇傳輸機制:

  • stdio:本地工具執行之預設。Claude Code 將伺服器作為子程序啟動。
  • SSE(Server-Sent Events):用於遠端/共享伺服器。需 HTTP 託管。

1.3. 決定認證需求:

  • none:本地 stdio 伺服器(程序級信任)
  • bearer-token:遠端 SSE 伺服器,靜態 token
  • api-key:遠端伺服器,每客戶之鑰匙

預期: 語言、傳輸與認證選擇已書面記錄。

失敗時: 若需求不明,預設 TypeScript + stdio + 無認證以最快達成可運行之伺服器。

步驟二:初始化項目結構

2.1. 建立項目目錄並初始化:

TypeScript:

mkdir -p $PROJECT_NAME && cd $PROJECT_NAME
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node tsx
npx tsc --init --target ES2022 --module nodenext --moduleResolution nodenext --outDir dist

Python:

mkdir -p $PROJECT_NAME && cd $PROJECT_NAME
python -m venv .venv
source .venv/bin/activate
pip install mcp pydantic

2.2. 建立標準目錄結構:

$PROJECT_NAME/
├── src/
│   ├── index.ts|main.py      # Server entry point
│   ├── tools/                 # One file per tool category
│   │   ├── index.ts|__init__.py
│   │   └── [category].ts|.py
│   └── utils/                 # Shared utilities
│       └── validation.ts|.py
├── test/
│   ├── harness.ts|.py         # MCP test harness
│   └── tools/
│       └── [category].test.ts|.py
├── package.json|pyproject.toml
├── tsconfig.json              # TypeScript only
├── Dockerfile                 # If Docker requested
└── README.md

2.3. 為 npm(TypeScript)加 bin 入口或為 Python 加入口點:

TypeScript package.json:

{
  "name": "$PACKAGE_NAME",
  "version": "1.0.0",
  "type": "module",
  "bin": { "$PACKAGE_NAME": "./dist/index.js" },
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js",
    "dev": "tsx src/index.ts",
    "test": "tsx test/harness.ts"
  }
}

預期: 可建構之項目骨架,所有依賴皆已安裝。

失敗時: 若 npm/pip 安裝失敗,檢查網路連線與註冊表存取。TypeScript 需 Node.js >= 18。Python 需 Python >= 3.10。

步驟三:依規格實作工具處理器

3.1. 解析工具規格文件,並為每工具產生處理器:

TypeScript 處理器範本:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";

export function registerTools(server: McpServer): void {
  server.tool(
    "tool_name",
    "Tool description from spec",
    {
      param1: z.string().describe("Parameter description"),
      param2: z.number().optional().default(10).describe("Optional param"),
    },
    async ({ param1, param2 }) => {
      try {
        // TODO: Implement tool logic
        const result = await performAction(param1, param2);
        return {
          content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
        };
      } catch (error) {
        return {
          content: [{ type: "text", text: `Error: ${(error as Error).message}` }],
          isError: true,
        };
      }
    }
  );
}

Python 處理器範本:

from mcp.server import Server
from mcp.types import Tool, TextContent
from pydantic import BaseModel

class ToolNameParams(BaseModel):
    param1: str
    param2: int = 10

async def handle_tool_name(params: ToolNameParams) -> list[TextContent]:
    try:
        result = await perform_action(params.param1, params.param2)
        return [TextContent(type="text", text=json.dumps(result, indent=2))]
    except Exception as e:
        return [TextContent(type="text", text=f"Error: {e}")]

3.2. 由規格為每工具類別產生一處理器文件。

3.3. 於類型檢查之外加入輸入驗證:

  • 字串長度限制
  • 數值範圍邊界
  • 列舉值約束
  • 必填欄位強制

3.4. 為所有預期之失敗模式加入結構化錯誤回應。

預期: 每類別一處理器文件,附類型化參數與錯誤處理。

失敗時: 若規格含模糊類型,預設 string 並加 TODO 註解供手動細修。

步驟四:配置傳輸

4.1. 以所選傳輸建立伺服器入口點:

stdio(TypeScript):

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { registerTools } from "./tools/index.js";

const server = new McpServer({
  name: "$PACKAGE_NAME",
  version: "1.0.0",
});

registerTools(server);

const transport = new StdioServerTransport();
await server.connect(transport);

SSE(TypeScript):

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
import { registerTools } from "./tools/index.js";

const server = new McpServer({
  name: "$PACKAGE_NAME",
  version: "1.0.0",
});

registerTools(server);

const transport = new SSEServerTransport("/messages", response);
await server.connect(transport);

4.2. 若需認證,加入中介層:

  • Bearer token:驗證 Authorization 標頭
  • API key:驗證 X-API-Key 標頭

4.3. 為 stdio 伺服器加 shebang 行以啟用直接執行:

#!/usr/bin/env node

預期: 可運作之入口點於配置之傳輸啟動 MCP 伺服器。

失敗時: 若 SDK 版本與引入路徑不符,檢查 @modelcontextprotocol/sdk 版本並調整引入。SDK 於版本間重整路徑。

步驟五:建立測試框架

5.1. 建構測試框架以驗證每工具:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
import { Client } from "@modelcontextprotocol/sdk/client/index.js";

async function runTests(): Promise<void> {
  const server = createServer();
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();

  await server.connect(serverTransport);
  const client = new Client({ name: "test-client", version: "1.0.0" });
  await client.connect(clientTransport);

  // Test: tools/list returns all expected tools
  const tools = await client.listTools();
  console.assert(tools.tools.length === EXPECTED_TOOL_COUNT);

  // Test: each tool with valid input
  for (const tool of tools.tools) {
    const result = await client.callTool({
      name: tool.name,
      arguments: getTestInput(tool.name),
    });
    console.assert(!result.isError, `${tool.name} failed`);
  }

  // Test: each tool with invalid input returns isError
  for (const tool of tools.tools) {
    const result = await client.callTool({
      name: tool.name,
      arguments: getInvalidInput(tool.name),
    });
    console.assert(result.isError, `${tool.name} should reject invalid input`);
  }

  console.log("All tests passed");
}

5.2. 為每工具建立測試夾具:有效輸入、無效輸入與邊緣案例。

5.3. 加 test 腳本至 package.jsonpyproject.toml

預期: 測試框架以有效與無效輸入皆運用每工具。

失敗時: 若 SDK 版本中無 InMemoryTransport,退回將伺服器作為子程序啟動並透過 stdio 管道通訊。

步驟六:產生文件與配置

6.1. 產生 README.md,含:

  • 項目描述
  • 安裝指引
  • Claude Code 配置命令
  • Claude Desktop JSON 配置片段
  • 工具列表附描述與參數架構
  • 開發與測試指引

6.2. 產生 Claude Code 註冊命令:

# stdio transport
claude mcp add $PACKAGE_NAME stdio "node" "dist/index.js"

# SSE transport
claude mcp add $PACKAGE_NAME -e API_KEY=your_key -- mcp-remote http://localhost:3000/mcp

6.3. 產生 Claude Desktop 配置片段:

{
  "mcpServers": {
    "$PACKAGE_NAME": {
      "command": "node",
      "args": ["path/to/dist/index.js"]
    }
  }
}

6.4. 若已要求 Docker,產生 Dockerfile

FROM node:20-slim AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-slim
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/package.json .
ENTRYPOINT ["node", "dist/index.js"]

預期: 完整文件與配置文件可立即使用。

失敗時: 若產生之 README 含佔位值,搜尋項目以代換實際值。若 Docker 建構失敗,驗證基底映像符合所用之 Node.js/Python 版本。

驗證

  • 項目無錯誤建構(npm run build 或等效)
  • 伺服器啟動並回應 tools/list JSON-RPC 請求
  • 規格中每工具皆已註冊且可發現
  • 測試框架以有效輸入對所有工具通過
  • 測試框架對無效輸入確認錯誤回應
  • Claude Code 可經 claude mcp add 命令連接
  • README 含可運作之安裝與配置指引
  • 所有產生之代碼通過 linting(若已配置)

常見陷阱

  • SDK 引入路徑變化@modelcontextprotocol/sdk 套件於版本間重整其匯出。應始終檢查已安裝版本之實際匯出路徑。
  • 遺忘 shebang:直接呼叫之 stdio 伺服器需 #!/usr/bin/env node 作首行以可執行。
  • 阻塞事件迴圈:TypeScript 之工具處理器須為 async。同步操作阻塞伺服器上所有其他工具呼叫。
  • package.json 中遺漏 type: "module":MCP SDK 用 ESM 引入。無 "type": "module",Node.js 將文件視為 CommonJS 而引入失敗。
  • Zod 架構漂移:若工具規格演進而 Zod 架構未更新,驗證不匹配引發靜默失敗。應由單一真實源產生架構。
  • stdout 污染:stdio 傳輸用 stdout 作 JSON-RPC。工具處理器中任何 console.log 將腐蝕協議流。應改用 console.error 或文件記錄器。

相關技能

  • analyze-codebase-for-mcp - 產生此技能消費之工具規格
  • build-custom-mcp-server - 複雜情況之手動伺服器實作
  • configure-mcp-server - 將腳手架伺服器連至 Claude Code/Desktop
  • troubleshoot-mcp-connection - 部署後除錯連線問題
  • containerize-mcp-server - 將伺服器以 Docker 打包用於分發

GitHub 저장소

pjt222/agent-almanac
경로: i18n/wenyan-lite/skills/scaffold-mcp-server
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

연관 스킬

evaluating-llms-harness

테스팅

이 Claude Skill은 MMLU, GSM8K를 포함한 60개 이상의 표준화된 학술 과제에서 LLM 성능을 벤치마크하기 위해 lm-evaluation-harness를 실행합니다. 개발자들이 모델 품질을 비교하고, 학습 진행 상황을 추적하거나 학술 결과를 보고할 수 있도록 설계되었습니다. 이 도구는 HuggingFace와 vLLM 모델을 포함한 다양한 백엔드를 지원합니다.

스킬 보기

cloudflare-cron-triggers

테스팅

이 스킬은 cron 표현식을 사용하여 Worker를 스케줄링하기 위한 Cloudflare Cron Triggers 구현에 관한 포괄적인 지식을 제공합니다. 주기적 작업, 유지보수 작업, 자동화된 워크플로우 설정 방법을 다루며, 잘못된 cron 표현식이나 시간대 문제 같은 일반적인 이슈들을 해결하는 방법을 포함합니다. 개발자들은 이를 통해 스케줄된 핸들러 구성, cron 트리거 테스트, Workflows 및 Green Compute와의 연동 작업을 수행할 수 있습니다.

스킬 보기

webapp-testing

테스팅

이 Claude Skill은 Python 스크립트를 통해 로컬 웹 애플리케이션을 테스트하기 위한 Playwright 기반 툴킷을 제공합니다. 프론트엔드 검증, UI 디버깅, 스크린샷 캡처, 로그 확인 기능을 지원하며 서버 라이프사이클을 관리합니다. 브라우저 자동화 작업에 사용하되 컨텍스트 오염을 방지하기 위해 소스 코드를 읽지 않고 스크립트를 직접 실행하세요.

스킬 보기

finishing-a-development-branch

테스팅

이 스킬은 테스트 통과를 확인한 후 체계적인 통합 옵션을 제시하여 개발자가 완성된 작업을 마무리하도록 돕습니다. 구현이 완료된 후 머지, PR 생성, 브랜치 정리와 같은 워크플로우를 안내합니다. 코드가 준비되고 테스트가 완료되었을 때 개발 프로세스를 체계적으로 마무리하기 위해 사용하세요.

스킬 보기