天气服务API

基于FastAPI的天气服务,集成OpenWeatherMap API,提供当前天气、每日预报和每小时预报功能,支持Home Assistant集成。

  • by mr-ransel
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 mr-ransel/openweathermap-sse-mcp-server

使用说明

MCP气象服务器

基于FastAPI的天气服务器,使用模型上下文协议(MCP)与家庭助理集成。该服务器使用OpenWeatherMap的One Call API 3.0提供全面的天气信息,包括任何位置的当前状况、每日预报和每小时预报。

先决条件

  • Python 3.7+
  • OpenWeatherMap API密钥(具有One Call API 3.0访问权限)

设置

  1. 克隆此存储库

  2. 安装依赖项:

    pip install -r requirements.txt
    
  3. 使用以下方法之一配置OpenWeather API密钥:

    • 设置环境变量(推荐):
      export OPENWEATHER_API_KEY=your_api_key_here
      
    • 或将其添加到 config.yaml:
      settings:
        api_key: your_api_key_here
      

    注意:环境变量优先于配置文件。

  4. (可选)在中配置其他设置 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密钥可以通过两种方式进行配置:

  1. 环境变量 OPENWEATHER_API_KEY (出于安全考虑建议)
  2. 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):获取每日预报

位置分辨率

服务器使用灵活的位置解析系统:

  1. 如果位置与中的条目匹配 overrides config,使用覆盖
  2. 对于没有州/国家的城市名称,它试图直接解析
  3. 对于“城市,州”格式,它假设美国(例如,“波特兰,俄勒冈州”→ “美国俄勒冈州波特兰市”)
  4. 完整的“城市、州、国家”格式始终受到尊重

示例:

  • “伦敦”→ 英国伦敦
  • “拉斐特”→ “美国加利福尼亚州拉斐特”(如果在覆盖中配置)
  • 俄勒冈州波特兰→ 美国俄勒冈州波特兰市
  • “澳大利亚墨尔本”→ 澳大利亚维多利亚州墨尔本

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
        }
    ]
}