返回市场
气象服务器

气象服务器

作者:isdaniel28 星标更新:2025-11-14

项目介绍

天气MCP服务器

这是一个使用Open-Meteo API提供天气信息的Model Context Protocol (MCP)服务器。此服务器支持多种传输模式:标准stdio、HTTP Server-Sent Events (SSE)以及新的适用于web集成的Streamable HTTP协议。

功能

天气与空气质量

  • 获取当前天气信息,包括全面的指标:
    • 温度、湿度、露点温度
    • 风速、风向及阵风
    • 降水(雨/雪)及其概率
    • 大气压力及云量
    • 紫外线指数及能见度
    • “体感”温度
  • 获取指定日期范围内的天气数据,包括每小时细节
  • 获取空气质量信息,包括:
    • PM2.5和PM10颗粒物
    • 臭氧、二氧化氮、一氧化碳
    • 二氧化硫、氨、尘埃
    • 气溶胶光学深度
    • 健康建议和推荐

时间与时区

  • 获取任意时区的当前日期/时间
  • 在不同时区之间转换时间
  • 获取时区信息

传输模式

  • 多种传输模式:
    • stdio - 标准MCP用于桌面客户端(如Claude Desktop等)
    • SSE - 适用于web应用的Server-Sent Events
    • streamable-http - 具有状态化或非状态化选项的现代MCP Streamable HTTP协议
  • 通过Starlette集成的RESTful API端点

安装

通过Smithery安装

要通过Smithery自动安装Weather MCP Server:

npx -y @smithery/cli install @isdaniel/mcp_weather_server

标准安装(适用于MCP客户端如Claude Desktop)

可以使用pip安装此包:

pip install mcp_weather_server

手动配置MCP客户端

此服务器设计为通过在cline_mcp_settings.json文件中添加其配置来手动安装。

  1. 在您的cline_mcp_settings.json文件中的mcpServers对象中添加以下条目:
{
  "mcpServers": {
    "weather": {
      "command": "python",
      "args": [
        "-m",
        "mcp_weather_server"
      ],
      "disabled": false,
      "autoApprove": []
    }
  }
}
  1. 保存cline_mcp_settings.json文件。

HTTP服务器安装(适用于web应用)

对于HTTP SSE或Streamable HTTP支持,您需要额外的依赖项:

pip install mcp_weather_server starlette uvicorn

服务器模式

此MCP服务器支持在单一统一服务器上运行stdioSSEstreamable-http模式:

模式比较

特性stdioSSEstreamable-http
用例桌面MCP客户端web应用(传统)web应用(现代)
协议标准I/O流Server-Sent EventsMCP Streamable HTTP
会话管理不适用状态化状态化或非状态化
端点不适用/sse, /messages//mcp(单个)
最佳选择Claude Desktop, Cline基于浏览器的应用现代web应用、API
状态选项不适用仅状态化状态化或非状态化

1. 标准MCP模式(默认)

标准模式通过stdio进行通信,并且兼容像Claude Desktop这样的MCP客户端。

# 默认模式(stdio)
python -m mcp_weather_server

# 显式指定stdio模式
python -m mcp_weather_server.server --mode stdio

2. HTTP SSE模式(web应用)

SSE模式运行一个HTTP服务器,通过Server-Sent Events提供MCP功能,使其可被web应用访问。

# 在默认主机/端口(0.0.0.0:8080)启动SSE服务器
python -m mcp_weather_server --mode sse

# 指定自定义主机和端口
python -m mcp_weather_server --mode sse --host localhost --port 3000

# 启用调试模式
python -m mcp_weather_server --mode sse --debug

SSE端点:

  • GET /sse - MCP通信的SSE端点
  • POST /messages/ - 发送MCP请求的消息端点

3. Streamable HTTP模式(现代MCP协议)

Streamable-http模式实现了具有单个/mcp端点的新MCP Streamable HTTP协议。此模式支持状态化(默认)和非状态化操作。

# 在默认主机/端口(0.0.0.0:8080)启动Streamable HTTP服务器
python -m mcp_weather_server --mode streamable-http

# 指定自定义主机和端口
python -m mcp_weather_server --mode streamable-http --host localhost --port 3000

# 启用非状态化模式(每次请求创建新的传输,不跟踪会话)
python -m mcp_weather_server --mode streamable-http --stateless

# 启用调试模式
python -m mcp_weather_server --mode streamable-http --debug

Streamable HTTP特性:

  • 状态化模式(默认):使用会话ID跨请求维护会话状态
  • 非状态化模式:每次请求创建新的传输,不跟踪会话
  • 单个端点:所有MCP通信都通过/mcp进行
  • 现代协议:实现最新的MCP Streamable HTTP规范

Streamable HTTP端点:

  • POST /mcp - 所有MCP通信的单个端点(初始化、工具列表、工具调用等)

命令行选项:

--mode {stdio,sse,streamable-http}  服务器模式:stdio(默认)、sse或streamable-http
--host HOST                          绑定到的主机(仅限HTTP模式,默认:0.0.0.0)
--port PORT                          监听的端口(仅限HTTP模式,默认:8080)
--stateless                          运行在非状态化模式(仅限streamable-http)
--debug                              启用调试模式

示例SSE用法:

// 连接到SSE端点
const eventSource = new EventSource('http://localhost:8080/sse');

// 发送MCP工具请求
fetch('http://localhost:8080/messages/', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    type: 'tool_call',
    tool: 'get_weather',
    arguments: { city: 'Tokyo' }
  })
});

示例Streamable HTTP用法:

// 使用Streamable HTTP协议初始化会话并调用工具
async function callWeatherTool() {
  const response = await fetch('http://localhost:8080/mcp', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      jsonrpc: '2.0',
      method: 'tools/call',
      params: {
        name: 'get_current_weather',
        arguments: { city: 'Tokyo' }
      },
      id: 1
    })
  });

  const result = await response.json();
  console.log(result);
}

配置

此服务器不需要API密钥。它使用免费开源的Open-Meteo API。

使用

此服务器提供了多个工具以执行与天气和时间相关的操作:

可用工具

天气工具

  1. get_current_weather - 获取城市的当前天气信息,包括全面的指标
  2. get_weather_by_datetime_range - 获取指定日期范围内的天气数据,包括每小时细节
  3. get_weather_details - 获取结构化的JSON格式的详细天气信息

空气质量工具

  1. get_air_quality - 获取空气质量信息,包括污染物水平和健康建议
  2. get_air_quality_details - 获取结构化的JSON格式的详细空气质量数据

时间与时区工具

  1. get_current_datetime - 获取任意时区的当前时间
  2. get_timezone_info - 获取时区信息
  3. convert_time - 在不同时区之间转换时间

工具详情

get_current_weather

获取给定城市的全面当前天气信息,包括增强的指标。

参数:

  • city(字符串,必需):城市名称(仅限英文)

返回值: 详细的天气数据,包括:

  • 温度和“体感”温度
  • 湿度、露点温度
  • 风速、风向(罗盘方向)及阵风
  • 降水详情(雨/雪)及其概率
  • 大气压力及云量
  • 紫外线指数及其警告级别
  • 能见度

示例响应:

东京的天气主要是晴朗,气温为22.5°C(体感温度为21.0°C),相对湿度为65%,露点温度为15.5°C。东北风速为12.5公里/小时,阵风可达18.5公里/小时。大气压力为1013.2百帕,云量为25%。紫外线指数为5.5(中等)。能见度为10.0公里。

get_weather_by_datetime_range

获取指定城市在起始日期和结束日期之间的每小时天气信息,包括全面的指标。

参数:

  • city(字符串,必需):城市名称(仅限英文)
  • start_date(字符串,必需):起始日期,格式为YYYY-MM-DD(ISO 8601)
  • end_date(字符串,必需):结束日期,格式为YYYY-MM-DD(ISO 8601)

返回值: 全面的天气分析,包括:

  • 每小时天气数据,包含所有增强的指标
  • 温度趋势(最高、最低、平均值)
  • 降水模式及其概率
  • 风况评估
  • 紫外线指数趋势
  • 天气警告和建议

示例响应:

[2024年1月1日至2024年1月7日的天气趋势分析]
- 温度范围从5°C到15°C
- 1月3日和1月5日预计有降水(概率60%)
- 平均风速为15公里/小时,来自西南方向
- 整个期间紫外线指数中等(3-5)
- 建议:周三需要带伞

get_weather_details

获取指定城市的详细天气信息作为结构化的JSON数据,以便程序使用。

参数:

  • city(字符串,必需):城市名称(仅限英文)

返回值: 包含所有天气指标的原始JSON数据,适合处理和分析

get_air_quality

获取指定城市的当前空气质量信息,包括污染物水平和健康建议。

参数:

  • city(字符串,必需):城市名称(仅限英文)
  • variables(数组,可选):要检索的具体污染物。选项:
    • pm10 - 小于等于10微米的颗粒物
    • pm2_5 - 小于等于2.5微米的颗粒物
    • carbon_monoxide - CO水平
    • nitrogen_dioxide - NO2水平
    • ozone - O3水平
    • sulphur_dioxide - SO2水平
    • ammonia - NH3水平
    • dust - 尘埃粒子水平
    • aerosol_optical_depth - 大气浑浊度

返回值: 全面的空气质量报告,包括:

  • 当前污染物水平及其单位
  • 空气质量分类(良好/中等/不健康/危险)
  • 对一般人群的健康建议
  • 对敏感群体的具体警告
  • 与WHO和EPA标准的对比

示例响应:

北京(纬度:39.90,经度:116.41)的空气质量:
PM2.5: 45.3 μg/m³(对敏感群体不健康)
PM10: 89.2 μg/m³(中等)
臭氧(O3): 52.1 μg/m³
二氧化氮(NO2): 38.5 μg/m³
一氧化碳(CO): 420.0 μg/m³

健康建议:敏感群体(儿童、老年人、患有呼吸系统疾病的人)应限制户外活动。

get_air_quality_details

获取详细空气质量信息作为结构化的JSON数据,以便程序分析。

参数:

  • city(字符串,必需):城市名称(仅限英文)
  • variables(数组,可选):要检索的具体污染物(与get_air_quality相同选项)

返回值: 包含完整空气质量指标和每小时数据的原始JSON数据

get_current_datetime

获取指定时区的当前时间。

参数:

  • timezone_name(字符串,必需):IANA时区名称(例如,'America/New_York','Europe/London')。如果没有提供时区,则使用UTC。

返回值: 指定时区的当前日期和时间

示例:

{
  "timezone": "America/New_York",
  "current_time": "2024-01-15T14:30:00-05:00",
  "utc_time": "2024-01-15T19:30:00Z"
}

get_timezone_info

获取特定时区的信息。

参数:

  • timezone_name(字符串,必需):IANA时区名称

返回值: 包括偏移量和夏令时信息的时区详情

convert_time

在不同的时区之间转换时间。

参数:

  • time_str(字符串,必需):要转换的时间(ISO格式)
  • from_timezone(字符串,必需):源时区
  • to_timezone(字符串,必需):目标时区

返回值: 目标时区的转换后的时间

MCP客户端使用示例

与Claude Desktop或其他MCP客户端一起使用

<use_mcp_tool>
<server_name>weather</server_name>
<tool_name>get_current_weather</tool_name>
<arguments>
{
  "city": "Tokyo"
}
</arguments>
</use_mcp_tool>
<use_mcp_tool>
<server_name>weather</server_name>
<tool_name>get_weather_by_datetime_range</tool_name>
<arguments>
{
  "city": "Paris",
  "start_date": "2024-01-01",
  "end_date": "2024-01-07"
}
</arguments>
</use_mcp_tool>
<use_mcp_tool>
<server_name>weather</server_name>
<tool_name>get_current_datetime</tool_name>
<arguments>
{
  "timezone_name": "Europe/Paris"
}
</arguments>
</use_mcp_tool>
<use_mcp_tool>
<server_name>weather</server_name>
<tool_name>get_air_quality</tool_name>
<arguments>
{
  "city": "Beijing"
}
</arguments>
</use_mcp_tool>
<use_mcp_tool>
<server_name>weather</server_name>
<tool_name>get_air_quality</tool_name>
<arguments>
{
  "city": "Los Angeles",
  "variables": ["pm2_5", "pm10", "ozone"]
}
</arguments>
</use_mcp_tool>

Web集成(SSE模式)

当以SSE模式运行时,您可以将天气服务器与web应用集成:

HTML/JavaScript示例

<!DOCTYPE html>
<html>
<head>
    <title>Weather MCP客户端</title>
</head>
<body>
    <div id="weather-data"></div>
    <script>
        // 连接到SSE端点
        const eventSource = new EventSource('http://localhost:8080/sse');

        eventSource.onmessage = function(event) {
            const data = JSON.parse(event.data);
            document.getElementById('weather-data').innerHTML = JSON.stringify(data, null, 2);
        };

        // 获取天气的函数
        async function getWeather(city) {
            const response = await fetch('http://localhost:8080/messages/', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    jsonrpc: '2.0',
                    method: 'tools/call',
                    params: {
                        name: 'get_current_weather',
                        arguments: { city: city }
                    },
                    id: 1
                })
            });
        }

        // 示例:获取东京的天气
        getWeather('Tokyo');

        // 示例:获取空气质量
        async function getAirQuality(city) {
            const response = await fetch('http://localhost:8080/messages/', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    jsonrpc: '2.0',
                    method: 'tools/call',
                    params: {
                        name: 'get_air_quality',
                        arguments: { city: city }
                    },
                    id: 2
                })
            });
        }

        getAirQuality('Beijing');
    </script>
</body>
</html>

Docker部署

该项目作为Docker镜像发布在