使用说明
MCP气象服务器
模型上下文协议(MCP)服务器,通过Open-Meteo API提供天气数据。使用FastMCP和Python构建,提供实时天气信息、预报和位置搜索功能。
特性
- 当前天气:实时天气状况,包括温度、湿度、风和降水
- 天气预报:多日预报(1-16天),包括每日温度范围和条件
- 位置搜索:地理编码服务,用于查找全球城市和地点的坐标
- 不需要API密钥:使用免费的Open-Meteo API
- 全面的错误处理:强大的日志记录和异常管理
- 符合PEP8标准:干净、可维护的Python代码
可用工具
get_current_weather(纬度、经度)
检索指定坐标的当前天气状况,包括:
- 温度、表观温度、湿度
- 风速、风向和阵风
- 降水、降雨、降雪
- 大气压力和云量
- 天气代码和昼夜状态
get_forecast(纬度、经度、天数=7)
提供1-16天的天气预报,包括:
- 日最高和最低温度
- 降水总量
- 最大风速
- 天气状况代码
get_location(名称)
按名称搜索位置并返回:
- 地理坐标(纬度/经度)
- 位置详细信息和管理信息
- 多个匹配结果用于消歧
技术细节
- 语言:Python 3.8+
- 框架:FastMCP
- HTTP客户端:支持异步的httpx
- 应用程序编程接口:开放Meteo天气和地理编码API
- 运输:stdio(标准输入/输出)
- 日志记录:带错误跟踪的结构化日志记录
安装和设置
1.安装依赖项
使用紫外线(推荐):
cd mcp-example
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r requirements.txt
使用标准venv:
cd mcp-example
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -r requirements.txt
2.运行测试
pytest test_server.py -v
3.测试服务器
python server.py
4.配置MCP客户端
添加到MCP客户端配置中:
选项1:直接使用Python(推荐)
{
"weather": {
"command": "python",
"args": ["/path/to/mcp-example/server.py"],
"env": {},
"working_directory": "/path/to/mcp-example"
}
}
选项2:使用紫外线(如果已安装)
{
"weather": {
"command": "/opt/homebrew/bin/uv",
"args": [
"run",
"--with",
"mcp[cli]",
"mcp",
"run",
"/path/to/mcp-example/server.py"
],
"env": {},
"working_directory": null
}
}
使用示例
配置后,您可以通过MCP客户端与天气服务器交互:
- “东京现在的天气怎么样?”
- “获取纽约5天天气预报”
- “找到英国伦敦的坐标”
- “纬度40.7128,经度-74.0060的天气怎么样?”
依赖项
httpx:API请求的异步HTTP客户端mcp:模型上下文协议框架pytest:测试框架pytest-asyncio:异步测试支持
项目结构
mcp-example/
├── server.py # Main MCP server implementation
├── test_server.py # Test suite
├── requirements.txt # Python dependencies
└── README.md # This documentation
测试
运行测试套件以验证功能:
# Activate virtual environment first
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pytest test_server.py -v
测试套件包括:
- API请求处理和错误案例
- 所有天气工具功能
- 输入验证和参数夹紧
- 网络超时和HTTP错误情况
测试计划
| 测试用例 | 描述 | 预期结果 |
|---|---|---|
test_make_openmeteo_request_timeout |
API请求超时 | 返回 None |
test_make_openmeteo_request_http_error |
HTTP状态错误 | 返回 None |
test_make_openmeteo_request_json_error |
JSON解析错误 | 返回 None |
test_get_current_weather_success |
有效坐标 | 返回JSON天气数据 |
test_get_current_weather_failure |
API失败 | 返回错误消息 |
test_get_current_weather_exception |
意外异常 | 返回错误消息 |
test_get_current_weather_invalid_latitude |
纬度无效 | 返回验证错误 |
test_get_current_weather_invalid_longitude |
经度无效 | 返回验证错误 |
test_get_forecast_success |
有效的预测请求 | 返回JSON预测数据 |
test_get_forecast_days_clamping |
天数参数>16 | 最多可夹紧16天 |
test_get_forecast_exception |
意外异常 | 返回错误消息 |
test_get_forecast_invalid_coordinates |
坐标无效 | 返回验证错误 |
test_get_location_success |
有效的位置名称 | 返回JSON位置数据 |
test_get_location_empty_name |
空位置字符串 | 返回验证错误 |
test_get_location_failure |
API失败 | 返回错误消息 |
test_get_location_exception |
意外异常 | 返回错误消息 |
错误处理
服务器包括全面的错误处理:
- 网络超时和连接错误
- HTTP状态码验证
- 输入参数验证(空名称、参数夹紧)
- 用于调试的结构化日志记录
- API故障的优雅回退
测试覆盖率
覆盖率:96%(73/76行)
- API集成:超时、HTTP错误、JSON解析错误
- 输入验证:空字符串、参数边界、坐标验证
- 功能逻辑:所有三个气象工具都有成功和失败的路径
- 错误场景:网络故障、无效响应、意外异常
- 参数处理:夹紧天数(1-16),坐标验证
- 异常处理:全面覆盖所有错误路径
测试统计:
- 总测试次数:16
- 覆盖范围:73/76
- 缺失覆盖率:只有3行(非关键日志语句)
