FastMCP实战案例:从简单回显到智能家居系统
FastMCP实战案例:从简单回显到智能家居系统【免费下载链接】fastmcpThe fast, Pythonic way to build Model Context Protocol servers ????项目地址: ht...
FastMCP实战案例:从简单回显到智能家居系统
本文通过四个完整的实战案例,系统性地介绍了FastMCP框架从基础到高级的应用。从最简单的回显服务器开始,逐步深入到复杂输入验证、智能家居多服务器协同架构设计,最后展示了与社交媒体API的高级集成。每个案例都包含详细的设计理念、实现代码和最佳实践,帮助开发者全面掌握FastMCP的核心功能和高级特性。
基础案例:回显服务器设计与实现
在FastMCP框架中,回显服务器是最基础也是最核心的入门示例。它展示了如何快速构建一个MCP服务器,通过工具、资源和提示三个核心组件来暴露功能。让我们深入探讨回显服务器的设计理念、实现细节以及最佳实践。
回显服务器的核心架构
回显服务器基于FastMCP的核心组件构建,主要包括三个部分:
完整实现代码分析
让我们详细分析回显服务器的完整实现:
"""
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协议交互遵循标准流程:
最佳实践与设计考虑
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理解问题所在:
实际应用案例
在智能家居系统中,复杂的设备控制需要严格的数据验证:
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)进行统一管理和协调。这种设计带来了以下优势:
- **模块化开发**:每个功能模块可以独立开发、测试和部署
- **技术异构性**:不同模块可以使用最适合的技术栈
- **故障隔离**:单个模块的故障不会影响整个系统
- **弹性扩展**:可以根据需求动态添加或移除功能模块
### 核心架构组件

### 技术实现细节
#### 中心枢纽设计
中心枢纽作为系统的协调中心,负责挂载和管理所有子服务:
```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
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)