1 项目简介

什么是 MCP Builder?

MCP Builder 是一个 Claude Code 技能(Skill),专门用于指导开发者构建高质量的 Model Context Protocol (MCP) 服务器。MCP 服务器能让大语言模型(LLM)通过精心设计的工具与外部服务进行交互。

该技能来自 awesome-claude-skills 仓库,拥有 27.6k+ Stars。

核心理念

"为工作流而构建,而非仅仅包装 API 端点" — 设计工具时应优化 Agent 有限的上下文窗口,提供可操作的错误消息,并启用完整的工作流程。

支持的语言

🐍
Python
FastMCP 框架
📘
TypeScript
MCP SDK

2 安装配置

步骤 1:克隆技能仓库

# 克隆整个 awesome-claude-skills 仓库
git clone https://github.com/ComposioHQ/awesome-claude-skills.git

# 或者只获取 mcp-builder 目录
cd ~/.claude/skills
git clone --depth 1 --filter=blob:none --sparse \
  https://github.com/ComposioHQ/awesome-claude-skills.git
cd awesome-claude-skills
git sparse-checkout set mcp-builder

步骤 2:安装到 Claude Code

将技能文件复制到 Claude Code 的技能目录:

# 创建技能目录(如果不存在)
mkdir -p ~/.claude/skills

# 复制 mcp-builder 技能
cp -r awesome-claude-skills/mcp-builder ~/.claude/skills/

步骤 3:安装 Python 依赖(可选)

如果需要运行评估脚本,安装以下依赖:

# 进入脚本目录
cd ~/.claude/skills/mcp-builder/scripts

# 安装依赖
pip install -r requirements.txt

依赖包:anthropic>=0.39.0mcp>=1.1.0

目录结构

mcp-builder/
├── SKILL.md              # 技能主文档
├── LICENSE.txt           # 许可证
├── reference/            # 参考文档
│   ├── mcp_best_practices.md    # 最佳实践
│   ├── python_mcp_server.md     # Python 实现指南
│   ├── node_mcp_server.md       # Node.js 实现指南
│   └── evaluation.md            # 评估指南
└── scripts/              # 辅助脚本
    ├── connections.py           # MCP 连接处理
    ├── evaluation.py            # 评估工具
    ├── example_evaluation.xml   # 评估示例
    └── requirements.txt         # Python 依赖

3 开发工作流

MCP Builder 将开发过程分为四个主要阶段:

  • 学习以 Agent 为中心的设计原则
  • 审查 MCP 协议文档和框架指南
  • 深入研究目标 API 文档
  • 创建详细的实现计划(工具选择、工具函数、输入/输出设计、错误处理)
  • 设置语言特定的项目结构
  • 构建共享基础设施(API 帮助函数、错误处理、格式化函数)
  • 系统化实现工具(输入验证、文档、错误处理)
  • 遵循语言特定的最佳实践
  • 代码质量审查(DRY 原则、一致性、类型安全)
  • 使用评估工具或 tmux 安全测试(直接运行服务器会导致挂起)
  • 使用语言特定的质量检查清单
  • 开发 10 个独立的、只读的、复杂的测试问题
  • 通过手动探索验证答案
  • 输出 XML 格式的结果

4 Python 实现 (FastMCP)

命名约定

服务器遵循 {service}_mcp 模式(如 github_mcpslack_mcp)。

工具命名

使用 snake_case 并带有服务上下文前缀,避免命名冲突:

# ✅ 正确
slack_send_message
github_create_issue

# ❌ 错误
send_message  # 可能与其他服务冲突
createIssue   # 应使用 snake_case

输入验证 (Pydantic)

from pydantic import BaseModel, ConfigDict, Field

class SendMessageInput(BaseModel):
    model_config = ConfigDict(
        str_strip_whitespace=True,  # 自动去除空白
        validate_assignment=True,   # 赋值时验证
        extra='forbid'              # 禁止额外字段
    )

    channel: str = Field(..., min_length=1, description="频道 ID")
    message: str = Field(..., min_length=1, max_length=4000)

响应格式

工具应支持灵活的输出格式:

  • Markdown — 人类可读格式
  • JSON — 程序化使用格式
  • 超过 ~25,000 字符的响应需要截断并提供分页指南

5 TypeScript 实现 (MCP SDK)

命名约定

服务器遵循 {service}-mcp-server 模式。

推荐目录结构

slack-mcp-server/
├── src/
│   ├── index.ts       # 主入口
│   ├── tools/         # 工具实现
│   ├── services/      # API 客户端
│   └── schemas/       # Zod 验证模式
├── package.json
└── tsconfig.json

输入验证 (Zod)

import { z } from 'zod';

const SendMessageSchema = z.object({
    channel: z.string().min(1).describe("频道 ID"),
    message: z.string().min(1).max(4000).describe("消息内容")
}).strict();  // 禁止额外字段

重要提示

inputSchema 必须是 Zod schema 对象(而非 JSON schema)。启用严格 TypeScript 模式,避免使用 any 类型,改用 unknown

工具注解

每个工具需要明确的注解用于 UX 提示:

  • readOnlyHint — 只读操作
  • destructiveHint — 破坏性操作
  • idempotentHint — 幂等操作
  • openWorldHint — 开放世界操作

6 最佳实践

📝 工具描述

工具描述必须"精确且无歧义地描述功能",并与实际实现完全匹配。包含输入/输出类型和使用示例。

📄 分页处理

  • 尊重 limit 参数
  • 返回元数据:has_morenext_offset
  • 默认每次响应 20-50 条

🔒 安全要求

  • 根据 JSON schemas 验证所有输入
  • 清理文件路径以防止目录遍历攻击
  • 实现适当的身份验证
  • 不要向客户端暴露内部错误,在服务端记录日志

🚀 传输选项

传输方式 适用场景
Stdio 本地进程
HTTP 远程多客户端
SSE 实时流式传输

7 测试评估

评估标准

评估质量取决于"这些实现如何使 LLM 在没有其他上下文且仅能访问 MCP 服务器的情况下回答真实且困难的问题"。

  • 10 个问题,每个问题有单一可验证的答案
  • 仅只读操作 — 无破坏性或状态修改操作
  • 独立问题 — 不依赖先前的答案
  • 稳定答案 — 不会随时间变化
  • 复杂多步推理 — 可能需要几十次工具调用

评估示例格式

<qa>
  <question>
    计算 $10,000 以 5% 年利率,按月复利 3 年的复利是多少?
  </question>
  <answer>11614.72</answer>
</qa>

8 辅助脚本

connections.py — MCP 连接处理

提供三种连接类型的轻量级连接管理:

  • Stdio — 通过标准输入/输出管理本地进程
  • SSE — 通过服务器发送事件连接远程服务器
  • HTTP — 通过可流式 HTTP 协议通信
# 使用示例
connection = create_connection(
    transport="stdio",
    command="python",
    args=["my_server.py"]
)

async with connection:
    tools = await connection.list_tools()
    result = await connection.call_tool("my_tool", {"arg": "value"})

evaluation.py — 评估工具

使用 Claude API 对 MCP 服务器运行测试问题:

  • 解析包含问答对的 XML 评估文件
  • 通过 stdio、SSE 或 HTTP 传输连接到 MCP 服务器
  • 运行 Agent 循环让 Claude 使用可用工具回答问题
  • 生成包含准确率、响应时间和工具使用情况的详细报告
# 运行评估
python evaluation.py \
    --transport stdio \
    --command "python my_server.py" \
    --eval-file my_evaluation.xml