第37章:MCP服务器开发实战
学习目标
- 掌握使用FastMCP快速构建MCP Server
- 理解MCP Server的核心组成部分
- 学会定义Tool、Resource、Prompt三种能力
- 了解MCP Server的测试验证方法
前置要求
- 已完成第36章MCP协议的学习
- 有Python或TypeScript基础开发能力
- 理解JSON-RPC协议基本概念
开发工具选型
| 工具 | 语言 | 特点 | 适用场景 |
|---|---|---|---|
| FastMCP | Python | 装饰器语法,极简开发 | 快速原型、数据工具、脚本集成 |
| @modelcontextprotocol/sdk | TypeScript | 官方SDK,类型安全 | 生产环境、复杂工具链 |
| mcp-go | Go | 高性能,并发友好 | 高并发场景、系统工具 |
FastMCP快速入门(推荐)
为什么推荐FastMCP?
FastMCP用装饰器语法简化MCP开发,几行代码就能定义一个工具,非常适合快速原型和测试场景。
Bash - 安装FastMCP
# 安装 FastMCP
pip install fastmcp
# 或使用 uv(推荐)
uv add fastmcp
最小MCP Server示例
Python - 最小MCP Server
from fastmcp import FastMCP
# 创建 MCP Server
mcp = FastMCP("测试工具服务")
# 定义一个简单的工具
@mcp.tool()
def get_test_status(test_id: str) -> str:
"""查询测试执行状态
Args:
test_id: 测试任务ID
Returns:
测试状态描述
"""
# 模拟查询逻辑
status_map = {
"test_001": "运行中 - 已完成 75%",
"test_002": "已完成 - 通过",
"test_003": "已完成 - 失败"
}
return status_map.get(test_id, f"未找到测试 {test_id}")
# 运行 Server
if __name__ == "__main__":
mcp.run()
定义Tool:核心能力
Tool是MCP Server最核心的能力——AI可以调用的具体功能。每个Tool需要定义名称、参数Schema和执行逻辑。
Python - 定义多个Tool
from fastmcp import FastMCP
import json
mcp = FastMCP("测试管理平台")
@mcp.tool()
def list_test_cases(project: str, status: str = "all") -> list:
"""获取项目的测试用例列表
Args:
project: 项目名称
status: 过滤状态(all/pass/fail/pending)
Returns:
测试用例列表
"""
# 模拟数据
cases = [
{"id": "TC001", "name": "登录功能测试", "status": "pass"},
{"id": "TC002", "name": "支付流程测试", "status": "fail"},
{"id": "TC003", "name": "搜索功能测试", "status": "pending"},
]
if status != "all":
cases = [c for c in cases if c["status"] == status]
return cases
@mcp.tool()
def run_test_case(case_id: str) -> dict:
"""执行指定测试用例
Args:
case_id: 测试用例ID
Returns:
执行结果(状态、耗时、日志)
"""
return {
"case_id": case_id,
"status": "pass",
"duration": "2.5s",
"log": "测试执行完成,所有断言通过"
}
@mcp.tool()
def create_bug_report(title: str, description: str, severity: str = "medium") -> dict:
"""创建缺陷报告
Args:
title: 缺陷标题
description: 缺陷描述
severity: 严重程度(low/medium/high/critical)
Returns:
创建结果(缺陷ID、链接)
"""
bug_id = f"BUG-{hash(title) % 10000:04d}"
return {
"bug_id": bug_id,
"title": title,
"severity": severity,
"link": f"https://jira.company.com/bug/{bug_id}"
}
定义Resource:数据访问
Resource让AI可以读取Server提供的数据,如配置文件、测试报告、知识库文档等。
Python - 定义Resource
from fastmcp import FastMCP
mcp = FastMCP("测试数据服务")
@mcp.resource("config://test-settings")
def get_test_settings() -> str:
"""获取测试配置信息"""
config = {
"timeout": 30,
"retry_count": 3,
"parallel_workers": 4,
"report_format": "html"
}
return json.dumps(config, indent=2)
@mcp.resource("report://daily-summary")
def get_daily_summary() -> str:
"""获取每日测试汇总报告"""
report = """
## 今日测试汇总
- 执行总数:125
- 通过:118
- 失败:5
- 跳过:2
- 通过率:94.4%
### 失败用例
1. TC-045: 支付接口超时
2. TC-078: 数据同步失败
...
"""
return report
@mcp.resource("data://test-results/{test_id}")
def get_test_result(test_id: str) -> str:
"""获取指定测试的详细结果"""
# 动态参数示例
return f"测试 {test_id} 的详细结果数据..."
定义Prompt:预设模板
Prompt提供预设的提示词模板,AI可以快速使用这些模板生成规范的输出。
Python - 定义Prompt
from fastmcp import FastMCP
mcp = FastMCP("测试助手")
@mcp.prompt()
def test_case_template(feature: str) -> str:
"""生成测试用例模板
Args:
feature: 要测试的功能名称
"""
return f"""
请为以下功能生成测试用例:
功能:{feature}
请按照以下格式输出:
1. 测试用例ID
2. 测试场景描述
3. 前置条件
4. 测试步骤
5. 预期结果
6. 优先级
"""
@mcp.prompt()
def bug_report_template() -> str:
"""缺陷报告模板"""
return """
请按照以下格式编写缺陷报告:
## 缺陷标题
[简洁描述问题]
## 环境信息
- 版本:[版本号]
- 环境:[测试/生产]
- 浏览器:[浏览器信息]
## 问题描述
[详细描述缺陷现象]
## 复现步骤
1. [步骤1]
2. [步骤2]
...
## 期望行为
[描述正确行为]
## 截图/日志
[附上证据]
## 严重程度
[low/medium/high/critical]
"""
运行与调试MCP Server
Bash - 运行MCP Server
# 方式1:直接运行(stdio模式)
python my_mcp_server.py
# 方式2:指定传输方式
python my_mcp_server.py --transport stdio
# 方式3:HTTP模式(用于远程访问)
python my_mcp_server.py --transport http --port 8080
# 调试:使用 MCP Inspector 工具
npx @anthropic-ai/mcp-inspector python my_mcp_server.py
MCP Inspector调试技巧
MCP Inspector是官方提供的调试工具,可以可视化查看Server提供的所有能力:
- 查看Tool列表和参数Schema
- 直接调用Tool测试执行结果
- 查看Resource内容
- 测试Prompt模板生成效果
测试视角:MCP Server质量验证
| 测试项 | 验证内容 | 测试方法 |
|---|---|---|
| 协议合规 | 消息格式符合MCP规范 | 用Inspector发送标准请求,验证返回 |
| Tool定义 | 参数Schema正确、描述清晰 | 检查tools/list返回的JSON Schema |
| 执行正确 | Tool执行结果符合预期 | 调用各Tool,验证返回数据格式和内容 |
| 错误处理 | 异常场景有正确错误返回 | 发送无效参数,验证错误消息格式 |
| 性能表现 | 响应时间在合理范围 | 测量各Tool调用延迟 |
本章小结
- FastMCP用装饰器语法简化开发,几行代码即可定义Tool
- Tool定义需要:名称、参数Schema(自动推断)、描述、执行函数
- Resource提供数据访问能力,适合暴露配置、报告、知识库
- Prompt提供预设模板,帮助AI生成规范输出
- MCP Inspector是调试利器,可视化测试所有能力
- Server质量需验证协议合规、Tool定义、执行正确、错误处理、性能表现
扩展阅读
- 第38章:Skills技能体系 - MCP之上的能力封装
- Anthropic MCP官方仓库
- FastMCP官方文档