1 项目简介
什么是 MCP Builder?
MCP Builder 是一个 Claude Code 技能(Skill),专门用于指导开发者构建高质量的 Model Context Protocol (MCP) 服务器。MCP 服务器能让大语言模型(LLM)通过精心设计的工具与外部服务进行交互。
该技能来自 awesome-claude-skills 仓库,拥有 27.6k+ Stars。
核心理念
"为工作流而构建,而非仅仅包装 API 端点" — 设计工具时应优化 Agent 有限的上下文窗口,提供可操作的错误消息,并启用完整的工作流程。
支持的语言
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.0 和 mcp>=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_mcp、slack_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_more、next_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