天气数据服务

一个通过Open-Meteo API提供实时天气信息、天气预报和位置搜索功能的MCP服务器。

  • by ezetina86
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 ezetina86/mcp-example

使用说明

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行(非关键日志语句)