上一章 目录 下一章

第37章:MCP服务器开发实战

学习目标

  • 掌握使用FastMCP快速构建MCP Server
  • 理解MCP Server的核心组成部分
  • 学会定义Tool、Resource、Prompt三种能力
  • 了解MCP Server的测试验证方法

前置要求

  • 已完成第36章MCP协议的学习
  • 有Python或TypeScript基础开发能力
  • 理解JSON-RPC协议基本概念
MCP服务器开发架构示意图
图37-1 MCP Server架构:通过JSON-RPC协议向AI客户端暴露Tools(工具)、Resources(资源)、Prompts(提示词)三类能力,实现模型与外部系统的标准化连接

开发工具选型

工具 语言 特点 适用场景
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定义、执行正确、错误处理、性能表现
上一章 目录 下一章