MCP气象服务器
基于FastAPI的天气服务器,使用模型上下文协议(MCP)与家庭助理集成。该服务器使用OpenWeatherMap的One Call API 3.0提供全面的天气信息,包括任何位置的当前状况、每日预报和每小时预报。
先决条件
- Python 3.7+
- OpenWeatherMap API密钥(具有One Call API 3.0访问权限)
设置
- 克隆此存储库
- 安装依赖项:
pip install -r requirements.txt- 使用以下方法之一配置OpenWeather API密钥:
- 设置环境变量(推荐):
export OPENWEATHER_API_KEY=your_api_key_here- 或将其添加到 config.yaml:
settings:
api_key: your_api_key_here注意:环境变量优先于配置文件。
- (可选)在中配置其他设置
config.yaml:
# General settings
settings:
units: "imperial" # Optional: "metric" (default) or "imperial"
api_key: "your_api_key_here" # Alternative to environment variable
server:
host: "0.0.0.0" # Optional: Interface to listen on (default: "0.0.0.0")
port: 8000 # Optional: Port to listen on (default: 8000)
# Location overrides (optional)
overrides:
"lafayette": "Lafayette, CA, US"
# Add more overrides as needed配置
API密钥
OpenWeather API密钥可以通过两种方式进行配置:
- 环境变量
OPENWEATHER_API_KEY(出于安全考虑建议) config.yaml在...之下settings.api_key
服务器设置
在中配置服务器的侦听接口和端口 config.yaml:
settings:
server:
host: "0.0.0.0" # Listen on all interfaces (default)
port: 8000 # Port number (default)host:要监听的网络接口
- "0.0.0.0":在所有接口上监听(默认) - "127.0.0.1":仅在本地主机上监听 - "192.168.1.100":在特定界面上收听
port:要监听的端口号(默认值:8000)
单位
您可以在公制和英制单位之间进行选择 config.yaml:
metric(如果未指定,则默认):
- 温度:摄氏度 - 风速:米每秒
imperial:
- 温度:华氏度 - 风速:英里/小时
位置覆盖
可选 overrides 部分在 config.yaml 允许您为不明确的城市名称指定默认位置。例如:
overrides:
"lafayette": "Lafayette, CA, US"
"springfield": "Springfield, IL, US"默认配置
如果没有 config.yaml 如果文件存在,服务器将:
- 使用公制单位
- 在所有接口上监听(0.0.0.0:8000)
- 没有位置覆盖
- 要求在环境中设置API密钥
运行服务器
使用以下命令启动服务器:
python server.py服务器将在配置的主机和端口上运行(默认值:http://0.0.0.0:8000)
API终点
传统REST API
这些端点提供传统的HTTP访问:
当前天气
GET /api/current-weather/{location}返回当前天气,包括温度、温度、湿度、风速、紫外线指数和云覆盖率。
每日预报
GET /api/daily-forecast/{location}?days={number_of_days}返回长达7天的每日预报,包括日/分/最高温度、降水概率和紫外线指数。
逐时预报
GET /api/hourly-forecast/{location}?hours={number_of_hours}返回长达48小时的每小时预报,包括温度、降水概率和紫外线指数。
MCP集成
服务器实现了模型上下文协议(MCP),以便与家庭助理无缝集成。MCP端点位于:
/mcp/sse可用的MCP工具:
current_weather(location: str):获取当前天气状况hourly_forecast(location: str, hours: int = 24):获取每小时预测daily_forecast(location: str, days: int = 7):获取每日预报
位置分辨率
服务器使用灵活的位置解析系统:
- 如果位置与中的条目匹配
overridesconfig,使用覆盖 - 对于没有州/国家的城市名称,它试图直接解析
- 对于“城市,州”格式,它假设美国(例如,“波特兰,俄勒冈州”→ “美国俄勒冈州波特兰市”)
- 完整的“城市、州、国家”格式始终受到尊重
示例:
- “伦敦”→ 英国伦敦
- “拉斐特”→ “美国加利福尼亚州拉斐特”(如果在覆盖中配置)
- 俄勒冈州波特兰→ 美国俄勒冈州波特兰市
- “澳大利亚墨尔本”→ 澳大利亚维多利亚州墨尔本
API响应格式
根据配置,天气数据以公制或英制单位返回:
度量(默认):
- 温度:摄氏度
- 风速:米每秒
- 湿度:百分比
- 紫外线指数:0-11+刻度
- 降水概率:0-1(0-100%)
- 云覆盖率:百分比
帝国的:
- 温度:华氏度
- 风速:英里/小时
- 其他单位与公制单位相同
当前天气响应示例:
{
"resolved_location": "London, England, GB",
"temperature": 17.88,
"feels_like": 17.29,
"description": "few clouds",
"humidity": 60,
"wind_speed": 5.14,
"uvi": 0,
"clouds": 11,
"timestamp": "2024-04-30T13:10:15"
}每日预测响应示例:
{
"resolved_location": "London, England, GB",
"forecast": [
{
"date": "2024-04-30",
"temp_day": 20.3,
"temp_min": 15.1,
"temp_max": 22.4,
"description": "scattered clouds",
"humidity": 70,
"wind_speed": 4.2,
"precipitation_probability": 0.3,
"uvi": 6.1
}
]
}