这是一个使用Open-Meteo API提供天气信息的Model Context Protocol (MCP)服务器。此服务器支持多种传输模式:标准stdio、HTTP Server-Sent Events (SSE)以及新的适用于web集成的Streamable HTTP协议。
要通过Smithery自动安装Weather MCP Server:
npx -y @smithery/cli install @isdaniel/mcp_weather_server
可以使用pip安装此包:
pip install mcp_weather_server
此服务器设计为通过在cline_mcp_settings.json文件中添加其配置来手动安装。
cline_mcp_settings.json文件中的mcpServers对象中添加以下条目:{
"mcpServers": {
"weather": {
"command": "python",
"args": [
"-m",
"mcp_weather_server"
],
"disabled": false,
"autoApprove": []
}
}
}
cline_mcp_settings.json文件。对于HTTP SSE或Streamable HTTP支持,您需要额外的依赖项:
pip install mcp_weather_server starlette uvicorn
此MCP服务器支持在单一统一服务器上运行stdio、SSE和streamable-http模式:
| 特性 | stdio | SSE | streamable-http |
|---|---|---|---|
| 用例 | 桌面MCP客户端 | web应用(传统) | web应用(现代) |
| 协议 | 标准I/O流 | Server-Sent Events | MCP Streamable HTTP |
| 会话管理 | 不适用 | 状态化 | 状态化或非状态化 |
| 端点 | 不适用 | /sse, /messages/ | /mcp(单个) |
| 最佳选择 | Claude Desktop, Cline | 基于浏览器的应用 | 现代web应用、API |
| 状态选项 | 不适用 | 仅状态化 | 状态化或非状态化 |
标准模式通过stdio进行通信,并且兼容像Claude Desktop这样的MCP客户端。
# 默认模式(stdio)
python -m mcp_weather_server
# 显式指定stdio模式
python -m mcp_weather_server.server --mode stdio
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请求的消息端点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特性:
/mcp进行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。
此服务器提供了多个工具以执行与天气和时间相关的操作:
get_current_weather - 获取城市的当前天气信息,包括全面的指标get_weather_by_datetime_range - 获取指定日期范围内的天气数据,包括每小时细节get_weather_details - 获取结构化的JSON格式的详细天气信息get_air_quality - 获取空气质量信息,包括污染物水平和健康建议get_air_quality_details - 获取结构化的JSON格式的详细空气质量数据get_current_datetime - 获取任意时区的当前时间get_timezone_info - 获取时区信息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 - 大气浑浊度返回值: 全面的空气质量报告,包括:
示例响应:
北京(纬度: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(字符串,必需):目标时区返回值: 目标时区的转换后的时间
<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>
当以SSE模式运行时,您可以将天气服务器与web应用集成:
<!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镜像发布在