天气数据服务

一个基于Open-Meteo API的天气数据服务,提供实时天气、7天预报和空气质量信息,适用于需要精确天气数据的应用场景。

  • by dimonets
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 dimonets/mcp-weather-server

使用说明

MCP气象服务器

模型上下文协议(MCP)服务器,使用Open-Meteo API为任何城市提供详细的天气信息。

特性

  • 🌤️ 实时天气数据 适用于全球任何城市
  • 📅 七天天气预报 每日气温和降水量
  • 🌬️ 空气质量信息 包括欧洲空气质量指数
  • 📍 自动地理编码 -只需提供城市名称
  • 🌡️ 现状 包括温度、湿度和降水
  • 📊 每小时预报 接下来的24小时
  • 🌅 日出和日落时间 用于规划户外活动
  • 🎯 人类可读的天气描述 而不是原始代码
  • ⚡ 稳健的错误处理 具有重试逻辑和超时
  • 🛡️ 类型安全 完全支持TypeScript
  • 🎨 结构化JSON输出 便于编程访问

安装

npm install

用法

发展

npm run dev

生产

npm start

构建

npm run build

MCP检验员测试

您可以使用MCP Inspector测试天气服务器,这是一个用于测试MCP服务器的GUI工具。

1.安装并运行MCP检查器

npx -y @modelcontextprotocol/inspector

2.配置服务器

在MCP检查器设置中:

  • 命令: npx
  • 参数: tsx main.ts

3.测试工具

连接后,您可以测试所有三个工具:

获取天气信息:获取当前天气状况和每小时预报

  1. 选择 get-weather 从可用工具列表中选择工具
  2. 输入城市名称(例如,“纽约”、“伦敦”、“东京”)
  3. 点击“呼叫工具”查看当前天气数据

获取预报:获取7天天气预报

  1. 选择 get-forecast 从可用工具列表中选择工具
  2. 输入城市名称
  3. 点击“呼叫工具”查看7天天气预报,包括每日温度和日出/日落时间

获得空气质量:获取空气污染数据

  1. 选择 get-air-quality 从可用工具列表中选择工具
  2. 输入城市名称
  3. 点击“呼叫工具”查看空气质量指数和污染物水平

检查器将显示JSON响应,其中包含每个工具的所有结构化数据。

API

该服务器提供三种工具来获取全面的天气和空气质量信息:

1. get-weather

获取任何城市的详细当前天气信息。

参数:

  • city (string,必填):要获取天气的城市名称
    • 示例:“纽约”、“伦敦”、“东京”、“巴黎”

2. get-forecast

获取任何城市的7天天气预报。

参数:

  • city (string,必填):要获取预测的城市名称
    • 示例:“纽约”、“伦敦”、“东京”、“巴黎”

3. get-air-quality

获取任何城市的空气污染数据。

参数:

  • city (string,必填):要获取空气质量的城市名称
    • 示例:“纽约”、“伦敦”、“东京”、“巴黎”

输出示例

get-weather 输出

返回包含当前条件和每小时预测的结构化JSON数据:

{
  "location": {
    "name": "New York",
    "fullName": "New York, New York, United States",
    "latitude": 40.7128,
    "longitude": -74.006,
    "country": "United States",
    "admin1": "New York"
  },
  "current": {
    "time": "2024-01-15T14:30:00",
    "formattedTime": "2:30 PM",
    "temperature": 22.5,
    "formattedTemperature": "22.5°C",
    "feelsLike": 24.1,
    "formattedFeelsLike": "24.1°C",
    "humidity": 65,
    "precipitation": 0,
    "formattedPrecipitation": "No precipitation",
    "weatherCode": 2,
    "weatherDescription": "Partly cloudy"
  },
  "hourly": [
    {
      "time": "2024-01-15T15:00:00",
      "formattedTime": "3:00 PM",
      "temperature": 22.8,
      "formattedTemperature": "22.8°C",
      "precipitation": 0,
      "formattedPrecipitation": "No precipitation"
    }
  ],
  "raw": {
    // Original Open-Meteo API response for compatibility
  }
}

get-forecast 输出

返回7天预报,包括每日温度、降水量和日出/日落时间:

{
  "location": {
    "name": "New York",
    "fullName": "New York, New York, United States",
    "latitude": 40.7128,
    "longitude": -74.006,
    "country": "United States",
    "admin1": "New York"
  },
  "daily": [
    {
      "date": "2024-01-15",
      "formattedDate": "Monday, Jan 15",
      "maxTemperature": 25.2,
      "formattedMaxTemperature": "25.2°C",
      "minTemperature": 18.5,
      "formattedMinTemperature": "18.5°C",
      "precipitation": 2.1,
      "formattedPrecipitation": "2.1mm",
      "weatherCode": 3,
      "weatherDescription": "Overcast",
      "sunrise": "2024-01-15T07:15:00",
      "formattedSunrise": "7:15 AM",
      "sunset": "2024-01-15T16:45:00",
      "formattedSunset": "4:45 PM"
    }
  ],
  "raw": {
    // Original Open-Meteo API response for compatibility
  }
}

get-air-quality 输出

返回欧洲空气质量指数和污染物水平的空气污染数据:

{
  "location": {
    "name": "New York",
    "fullName": "New York, New York, United States",
    "latitude": 40.7128,
    "longitude": -74.006,
    "country": "United States",
    "admin1": "New York"
  },
  "current": {
    "time": "2024-01-15T14:30:00",
    "formattedTime": "2:30 PM",
    "europeanAqi": 35,
    "aqiLevel": "Fair",
    "aqiDescription": "Air quality is acceptable",
    "pm25": 28,
    "pm10": 42,
    "no2": 45,
    "o3": 32,
    "so2": 8
  },
  "hourly": [
    {
      "time": "2024-01-15T15:00:00",
      "formattedTime": "3:00 PM",
      "europeanAqi": 38,
      "aqiLevel": "Fair",
      "pm25": 30,
      "pm10": 45,
      "no2": 48,
      "o3": 35,
      "so2": 9
    }
  ],
  "raw": {
    // Original Open-Meteo API response for compatibility
  }
}

所做的改进

1. 增强的数据结构

  • 将原始API JSON替换为结构化、经过处理的天气数据
  • 添加了原始值和格式化字符串以提高灵活性
  • 包括坐标和全名的位置详细信息
  • 以结构化数组格式提供每小时预测
  • 与原始API响应保持向后兼容性

2. 稳健的错误处理

  • 实现了具有指数回退的重试逻辑
  • 添加请求超时以防止挂起请求
  • 针对不同故障场景提供更好的错误消息
  • 优雅处理城市未发现错误

3. 类型安全

  • 为所有API响应添加了全面的TypeScript接口
  • 对地理编码和天气数据进行正确的类型检查
  • 更好的IntelliSense支持和编译时错误检测

4. 配置管理

  • 集中配置对象,便于维护
  • 可配置的超时、重试次数和API终结点
  • 无需接触核心逻辑即可轻松修改设置

5. 性能和可靠性

  • 请求超时处理(10秒)
  • 失败请求的自动重试(最多3次尝试)
  • 城市名称的正确URL编码
  • 中止控制器以取消请求

6. 数据处理

  • 天气代码映射到人类可读的描述
  • 温度、降水和时间的正确格式
  • 可用时,使用州/省设置位置名称格式
  • 时区感知时间格式

7. 代码组织

  • 将关注点分解为实用函数
  • 明确的功能命名和文档
  • 模块化设计,便于测试和维护
  • 一致的错误处理模式

技术细节

  • 框架:模型上下文协议(MCP)SDK
  • 语言:TypeScript
  • 应用程序编程接口:Open Meteo(地理编码和天气)
  • 运输: StdioServerTransport
  • 验证:Zod模式验证
  • 运行时:带ES模块的Node.js

错误处理

服务器处理各种错误情况:

  • 未找到城市:返回一条包含拼写建议的有用消息
  • 网络错误:最多可退回3次,呈指数级回退
  • API错误:提供用户友好的错误消息
  • 超时错误:10秒后中止请求

许可证

国际协调委员会