FastMCP实战案例:从简单回显到智能家居系统

【免费下载链接】fastmcp The fast, Pythonic way to build Model Context Protocol servers 🚀 【免费下载链接】fastmcp 项目地址: https://gitcode.com/GitHub_Trending/fa/fastmcp

本文通过四个完整的实战案例,系统性地介绍了FastMCP框架从基础到高级的应用。从最简单的回显服务器开始,逐步深入到复杂输入验证、智能家居多服务器协同架构设计,最后展示了与社交媒体API的高级集成。每个案例都包含详细的设计理念、实现代码和最佳实践,帮助开发者全面掌握FastMCP的核心功能和高级特性。

基础案例:回显服务器设计与实现

在FastMCP框架中,回显服务器是最基础也是最核心的入门示例。它展示了如何快速构建一个MCP服务器,通过工具、资源和提示三个核心组件来暴露功能。让我们深入探讨回显服务器的设计理念、实现细节以及最佳实践。

回显服务器的核心架构

回显服务器基于FastMCP的核心组件构建,主要包括三个部分:

mermaid

完整实现代码分析

让我们详细分析回显服务器的完整实现:

"""
FastMCP Echo Server
"""

from fastmcp import FastMCP

# 创建服务器实例
mcp = FastMCP("Echo Server")

@mcp.tool
def echo_tool(text: str) -> str:
    """Echo the input text"""
    return text

@mcp.resource("echo://static")
def echo_resource() -> str:
    return "Echo!"

@mcp.resource("echo://{text}")
def echo_template(text: str) -> str:
    """Echo the input text"""
    return f"Echo: {text}"

@mcp.prompt("echo")
def echo_prompt(text: str) -> str:
    return text

组件功能详解

1. 工具(Tools) - 执行操作

工具是MCP的核心功能组件,允许LLM执行具体的操作。在回显服务器中:

@mcp.tool
def echo_tool(text: str) -> str:
    """Echo the input text"""
    return text

关键特性:

  • 使用 @mcp.tool 装饰器注册
  • 自动生成JSON Schema用于参数验证
  • 支持同步和异步函数
  • 提供详细的文档字符串用于LLM理解功能
2. 资源(Resources) - 提供数据

资源提供只读数据访问,类似于REST API的GET端点:

@mcp.resource("echo://static")
def echo_resource() -> str:
    return "Echo!"

@mcp.resource("echo://{text}")
def echo_template(text: str) -> str:
    """Echo the input text"""
    return f"Echo: {text}"

URI模式说明:

URI模式 类型 描述
echo://static 静态资源 固定内容,无需参数
echo://{text} 模板资源 动态内容,需要text参数
3. 提示(Prompts) - 定义交互

提示定义LLM交互的模板模式:

@mcp.prompt("echo")
def echo_prompt(text: str) -> str:
    return text

运行与测试

启动回显服务器非常简单:

fastmcp run echo.py

或者使用Python直接运行:

python echo.py

客户端交互示例

使用FastMCP客户端与回显服务器交互:

from fastmcp import Client

async def test_echo_server():
    async with Client("echo.py") as client:
        # 调用工具
        result = await client.call_tool("echo_tool", {"text": "Hello World"})
        print(f"Tool result: {result.text}")
        
        # 读取资源
        static_content = await client.read_resource("echo://static")
        print(f"Static resource: {static_content}")
        
        # 使用模板资源
        dynamic_content = await client.read_resource("echo://Hello")
        print(f"Dynamic resource: {dynamic_content}")
        
        # 获取提示
        prompt_result = await client.get_prompt("echo", {"text": "Test prompt"})
        print(f"Prompt: {prompt_result.messages[0].content}")

协议交互流程

回显服务器的MCP协议交互遵循标准流程:

mermaid

最佳实践与设计考虑

1. 错误处理机制

虽然基础回显服务器很简单,但生产环境需要考虑错误处理:

@mcp.tool
def echo_tool(text: str) -> str:
    """Echo the input text"""
    if not text:
        raise ValueError("Text cannot be empty")
    return text
2. 性能优化建议

对于高频使用的回显服务:

  • 使用异步函数处理并发请求
  • 实现缓存机制减少重复计算
  • 添加速率限制保护服务器
3. 安全考虑
  • 验证输入参数的有效性
  • 限制资源访问频率
  • 使用适当的认证机制

扩展功能示例

回显服务器可以轻松扩展为更复杂的功能:

@mcp.tool
def advanced_echo(text: str, repeat: int = 1, uppercase: bool = False) -> str:
    """Advanced echo with formatting options"""
    result = text * repeat
    if uppercase:
        result = result.upper()
    return result

@mcp.resource("echo://formatted/{text}")
def formatted_echo(text: str, format_type: str = "normal") -> str:
    """Echo with formatting options"""
    if format_type == "upper":
        return text.upper()
    elif format_type == "lower":
        return text.lower()
    else:
        return text

调试与监控

FastMCP提供内置的调试功能:

# 启用详细日志
mcp = FastMCP("Echo Server", debug=True)

# 添加自定义中间件
from fastmcp.server.middleware import LoggingMiddleware
mcp.add_middleware(LoggingMiddleware())

回显服务器虽然简单,但完整展示了FastMCP的核心概念和设计模式。通过这个基础案例,开发者可以快速理解MCP协议的工作原理,并为构建更复杂的智能应用打下坚实基础。

复杂输入验证:Pydantic模型集成技术

在FastMCP的实际开发中,处理复杂数据结构输入是一个常见需求。通过Pydantic模型的深度集成,FastMCP为开发者提供了强大的类型验证和数据结构管理能力,让复杂输入验证变得简单而可靠。

Pydantic与FastMCP的无缝集成

FastMCP内置了对Pydantic的全面支持,允许开发者使用Pydantic模型作为工具函数的参数类型。这种集成不仅提供了强大的数据验证能力,还能自动生成详细的JSON Schema,为LLM客户端提供清晰的输入结构信息。

from typing import Annotated
from pydantic import BaseModel, Field
from fastmcp import FastMCP

mcp = FastMCP("智能家居控制中心")

class DeviceStatus(BaseModel):
    device_id: str = Field(..., description="设备唯一标识符")
    power: bool = Field(False, description="设备电源状态")
    temperature: float = Field(ge=16, le=30, description="温度设置,范围16-30℃")
    mode: str = Field("auto", pattern="^(auto|cool|heat|fan)$")

@mcp.tool
def set_device_status(status: DeviceStatus) -> str:
    """设置智能设备状态"""
    # 自动验证输入数据,确保符合DeviceStatus模型定义
    return f"设备 {status.device_id} 状态已更新"

嵌套模型的复杂验证

对于更复杂的场景,FastMCP支持多层嵌套的Pydantic模型,构建完整的数据验证体系:

class RoomEnvironment(BaseModel):
    class SensorReading(BaseModel):
        temperature: float = Field(..., ge=-10, le=50)
        humidity: float = Field(..., ge=0, le=100)
        co2_level: int = Field(..., ge=300, le=2000)
    
    room_id: str
    sensors: dict[str, SensorReading]
    timestamp: str = Field(..., pattern="^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$")

@mcp.tool
def analyze_room_environment(env_data: RoomEnvironment) -> dict:
    """分析房间环境数据"""
    # 复杂的嵌套数据自动验证
    avg_temp = sum(s.temperature for s in env_data.sensors.values()) / len(env_data.sensors)
    return {
        "room": env_data.room_id,
        "average_temperature": round(avg_temp, 1),
        "sensor_count": len(env_data.sensors)
    }

字段级验证与约束

Pydantic的Field参数提供了丰富的验证选项,FastMCP能够充分利用这些特性:

约束类型 示例 说明
数值范围 Field(ge=0, le=100) 数值在0到100之间
字符串模式 Field(pattern="^[A-Za-z]+$") 只允许字母字符
长度限制 Field(min_length=1, max_length=50) 字符串长度限制
默认值 Field(default="unknown") 设置默认值
描述信息 Field(description="用户姓名") 为LLM提供上下文
class UserProfile(BaseModel):
    username: str = Field(..., min_length=3, max_length=20, pattern="^[a-zA-Z0-9_]+$")
    email: str = Field(..., pattern="^[^@]+@[^@]+\\.[^@]+$")
    age: int = Field(..., ge=0, le=150)
    preferences: dict[str, str] = Field(default_factory=dict)

@mcp.tool
def update_user_profile(profile: UserProfile) -> str:
    """更新用户配置信息"""
    # 所有字段自动验证
    return f"用户 {profile.username} 配置已更新"

高级验证场景

FastMCP支持Pydantic的自定义验证器和复杂验证逻辑:

from pydantic import field_validator
from datetime import datetime

class ScheduleEvent(BaseModel):
    event_name: str
    start_time: str
    end_time: str
    
    @field_validator('start_time', 'end_time')
    @classmethod
    def validate_time_format(cls, v):
        try:
            datetime.strptime(v, "%H:%M")
            return v
        except ValueError:
            raise ValueError("时间格式必须为 HH:MM")
    
    @field_validator('end_time')
    @classmethod
    def validate_time_sequence(cls, v, info):
        start_time = info.data.get('start_time')
        if start_time and v <= start_time:
            raise ValueError("结束时间必须晚于开始时间")
        return v

@mcp.tool
def create_schedule(event: ScheduleEvent) -> dict:
    """创建日程安排"""
    return {
        "event": event.event_name,
        "duration": "有效日程已创建"
    }

错误处理与用户体验

当输入验证失败时,FastMCP会提供清晰的错误信息,帮助LLM理解问题所在:

mermaid

实际应用案例

在智能家居系统中,复杂的设备控制需要严格的数据验证:

class SmartHomeCommand(BaseModel):
    class DeviceCommand(BaseModel):
        action: str = Field(..., pattern="^(on|off|toggle|set)$")
        value: float | None = Field(None, ge=0)
    
    home_id: str
    commands: list[DeviceCommand]
    priority: int = Field(1, ge=1, le=10)

@mcp.tool
def execute_home_automation(command: SmartHomeCommand) -> list:
    """执行智能家居自动化命令"""
    results = []
    for cmd in command.commands:
        if cmd.action == "set" and cmd.value is None:
            raise ValueError("set操作需要提供value参数")
        results.append(f"执行{cmd.action}操作")
    return results

性能优化建议

对于高频调用的工具,可以考虑使用Pydantic的模型配置优化:

class OptimizedModel(BaseModel):
    model_config = {
        "strict": True,
        "validate_default": True,
        "extra": "forbid"  # 禁止额外字段
    }
    
    required_field: str
    optional_field: str | None = None

## 智能家居系统:多服务器协同架构设计

在现代智能家居系统中,多设备协同和模块化设计是构建可扩展、易维护系统的关键。FastMCP通过其强大的服务器组合(Composition)和挂载(Mounting)能力,为智能家居系统提供了优雅的多服务器协同架构解决方案。

### 架构设计理念

智能家居系统的多服务器架构遵循微服务设计原则,将不同的功能模块拆分为独立的MCP服务器,通过中心枢纽(Hub)进行统一管理和协调。这种设计带来了以下优势:

- **模块化开发**:每个功能模块可以独立开发、测试和部署
- **技术异构性**:不同模块可以使用最适合的技术栈
- **故障隔离**:单个模块的故障不会影响整个系统
- **弹性扩展**:可以根据需求动态添加或移除功能模块

### 核心架构组件

![mermaid](https://kroki.io/mermaid/svg/eNpLy8kvT85ILCpRCHHhUgACx-hnM3e9aN77dN22pxtbn-xY-3R_87N5i57v2qvgUZoUq6Cra6fgFP28cf3T1s5nfcufdmx7Nqf3adfCWIhusLxz9LMdK4GSmDIu0U_Xdb6csQlTxjUaaOmzXROer1v4fEIbsjyYcAIrcosOyMjMySwoBrolVcGpKDMlPRWiyBks7w51_LPGSUAXPJ25AiLpApb0iH42seVpc__TJVueb979fPd8iKQrWNITqvP5lK0vFq5Asri4pDInFejGtMycHCvlVMM007RUJAknqESacappmimShDNMh0WaaaoFkoQLTEcaUI8BkoQrTCI51SQ1GQC9lqE4)

### 技术实现细节

#### 中心枢纽设计

中心枢纽作为系统的协调中心,负责挂载和管理所有子服务:

```python
from fastmcp import FastMCP
from smart_home.lights.server import lights_mcp
from smart_home.thermostat.server import thermostat_mcp
from smart_home.security.server import security_mcp

# 创建中心枢纽
hub_mcp = FastMCP(
    "智能家居中心枢纽",
    description="统一管理所有智能家居设备的MCP服务器"
)

# 挂载各个功能模块
hub_mcp.mount("lights", lights_mcp)        # 灯光控制服务
hub_mcp.mount("thermostat", thermostat_mcp) # 温控服务  
hub_mcp.mount("security", security_mcp)    # 安防服务

# 枢纽级状态检查
@hub_mcp.tool
def system_status() -> dict:
    """检查整个智能家居系统的状态"""
    status = {
        "hub": "在线",
        "timestamp": datetime.now().isoformat(),
        "services": {}
    }
    
    # 这里可以添加各个服务的状态检查逻辑
    return status
服务间通信模式

多服务器架构支持多种通信模式,满足不同场景的需求:

通信模式 适用场景 实现方式
直接调用 实时控制操作 ctx.call_tool()
事件广播 状态变更通知 MCP资源订阅
数据共享 传感器数据聚合 共享资源模板
工作流协调 复杂场景执行 多工具链式调用
灯光控制服务实现

以Philips Hue灯光系统为例,展示专业级智能家居服务的实现:

from typing import Annotated, Literal, TypedDict
from pydantic import Field
from fastmcp import FastMCP

lights_mcp = FastMCP("Hue灯光控制服务")

class LightAttributes(TypedDict):
    """灯光属性类型定义"""
    brightness: Annotated[int, Field(ge=0, le=100, description="亮度百分比")]
    color_temp: Annotated[int, Field(ge=2000, le=6500, description="色温值")]
    transition: Annotated[int, Field(ge=0, le=60, description="过渡时间秒数")]

@lights_mcp.tool
def set_light_scene(
    room: str,
    scene_type: Literal["relax", "focus", "energize", "reading"],
    attributes: LightAttributes
) -> dict:
    """设置房间灯光场景"""
    # 实现具体的Hue Bridge控制逻辑
    return {
        "room": room,
        "scene": scene_type,
        "status": "success",
        "attributes": attributes

【免费下载链接】fastmcp The fast, Pythonic way to build Model Context Protocol servers 🚀 【免费下载链接】fastmcp 项目地址: https://gitcode.com/GitHub_Trending/fa/fastmcp

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐