关于 Swiss Weather
为需要瑞士地点天气和天文信息的 AI 应用提供 MCP 服务。它汇集 MeteoSwiss 预报与气象站测量数据、瑞士地名查询,并附带用于测试服务的客户端。
主要功能
- 01提供最长九天的每日预报
- 02预报降雨、气温、日照和风
- 03查询气象站当前测量值及极值
- 04查询日出、曙暮光和月相信息
- 05查询瑞士地名
适用场景
- 01查询瑞士某地的天气预报
- 02比较气象站当前读数
- 03查看各站当前天气极值
- 04查询指定日期的日月时间
MCP 相关
向 MCP 客户端提供瑞士天气预报、测量数据、地名查询和天文数据工具。支持 stdio 与 streamable HTTP 传输方式。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
12收录的工具列表 · 更新于 3 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| days | integer | 否 | |
| near | any | 否 | 仅当多个地点同名时:指用户所指地点旁边的村庄。例如,对于“Bettmeralp 附近的 Blausee”,使用 location "Blausee",near 使用 "Bettmeralp"。其他情况省略。 |
| location | string | 是 | |
| start_date | string | 是 |
详细介绍
Swiss Weather MCP Server
一个 Model Context Protocol (MCP) 服务,为 AI 应用提供瑞士境内任意地点的天气信息。
- 来自 MeteoSwiss 本地预报的今日及未来 8 天预报,每小时更新
- 来自约 160 个 SwissMetNet 气象站的测量数据,每 10 分钟更新
- 瑞士国家地图上的地点,例如城镇、区、湖泊和山峰,数据来自 swissNAMES3D
- 计算任意日期某地的日出日落、月出月落、民用曙暮光、月相及月面照亮比例
- 内置用于测试的 MCP 客户端
数据来源。 本项目不是 MeteoSwiss 的官方产品。
- 天气预报和测量数据:MeteoSwiss Open Data。来源:MeteoSwiss
- 地名:swissNAMES3D。来源:Federal Office of Topography swisstopo
- 市镇和州:swissBOUNDARIES3D。来源:Federal Office of Topography swisstopo
目录
项目结构
swiss-weather-mcp/
├── src/swiss_weather_mcp/
│ ├── server.py # MCP server and its tools
│ ├── places/ # swisstopo place lookup
│ ├── forecast/ # MeteoSwiss local forecasts
│ ├── measurements/ # MeteoSwiss SwissMetNet measurements
│ ├── astronomy/ # Sunrise, sunset, moonrise, moonset and phase
│ ├── opendata.py # Downloads from data.geo.admin.ch
│ ├── formatting.py # Times, wind directions and height differences in the answers
│ ├── errors.py # The error for questions the data cannot answer
│ ├── log.py # Logging setup
│ └── client.py # MCP client
├── tests/swiss_weather_mcp/ # Tests
└── .github/workflows/ # CI and release pipelines
安装
# As a command line tool
uv tool install swiss-weather-mcp
# With the optional MCP client, which pulls in the OpenAI SDK
uv tool install 'swiss-weather-mcp[client]'
# As a library dependency
uv add swiss-weather-mcp # or: pip install swiss-weather-mcp
从源代码安装:
git clone https://github.com/cuolm/swiss-weather-mcp.git
cd swiss-weather-mcp
uv sync --extra client # or, in a virtual environment: pip install -e ".[client]"
无需进行任何配置,服务会从 MeteoSwiss 和 swisstopo 获取所需的所有数据。
使用方法
运行服务
# stdio (default)
swiss-weather-mcp-server
# streamable-http
swiss-weather-mcp-server --transport=streamable-http --host=localhost --port=8050
从源代码检出目录运行时,请在前面加上 uv run。--help 会列出所有标志。
有关服务存放文件的位置以及 --cache-all-forecast-points,请参阅缓存和下载。
使用 Docker 运行服务
GitHub Actions 会自动构建映像,并将其发布到项目的 GitHub Container Registry,标记为 :latest(最新版本)和对应的版本号。
# Published image
docker run -p 8050:8050 ghcr.io/cuolm/swiss-weather-mcp:latest
# Built from a source checkout
docker build -t swiss-weather-mcp .
docker run -p 8050:8050 swiss-weather-mcp
服务随后会在 http://localhost:8050/mcp/ 运行。
每次运行 docker run 都会启动一个缓存为空的新容器。可以挂载卷以保留缓存,例如
-v swiss-weather-cache:/root/.cache/swiss-weather-mcp。
运行 MCP 客户端
内置的 MCP 客户端通过 stdio 测试服务。它需要 client extra(请参阅安装),并会自行启动 MCP 服务,但不会启动大模型;大模型必须事先运行,例如在 llama-server 中运行。
# Install llama.cpp, which provides llama-server, here with Homebrew on macOS or Linux
brew install llama.cpp
# Start llama-server with a model in its own terminal; it downloads the model on first use
llama-server --jinja --no-mmproj -hf unsloth/Qwen3.5-4B-GGUF --port 8080
# Run the client against it in a second terminal
swiss-weather-mcp-client --model=unsloth/Qwen3.5-4B-GGUF --base-url=http://localhost:8080/v1
从源代码检出目录运行时,请在客户端命令前加上 uv run --extra client。安装 llama.cpp 的其他方法,请参阅其安装指南。
--jinja 使用模型的聊天模板,这是调用工具所必需的(当前 llama.cpp 中的默认设置),
而 --no-mmproj 会跳过视觉投影器。--base-url 是服务的 OpenAI 兼容 API 地址,--model 则是服务在 /v1/models 下列出的模型名称。
可用工具
时间均为瑞士当地时间(见 时间)。所有带有 location 的工具也接受可选参数
near,仅在多个地点同名时需要提供(见 地点)。
如果预报点不在地点附近,答案会注明预报点(见 预报点)。
| 工具 | 答案 |
|---|---|
forecast_daily(location, start_date, days) | 1 到 9 天:最低和最高气温、降雨,以及带表情符号的天气状况 |
forecast_rain(location, start, end) | 每 3 小时一段的降雨概率和降雨量 |
forecast_temperature(location, start, end) | 逐小时或单个小时的气温 |
forecast_sunshine(location, start, end) | 一段时间内或单个小时的日照时数 |
forecast_wind(location, when) | 平均风速、阵风和风向 |
forecast_cloud_cover(location, when) | 总云量,以及低、中、高云层的云量 |
forecast_freezing_level(location, when) | 0 °C 等温线的高度 |
measurements_current(location) | 地点附近的气象站当前测量值(见 实测数据) |
measurements_extremes(extreme) | 当前最暖、最冷、风最大、最潮湿或日照最充足的地点 |
astronomy_sun(location, date) | 日出、日落和民用晨昏 |
astronomy_moon(location, date) | 月出、月落、月相和受光比例 |
current_date_and_time() | 今天是星期几,以及当前瑞士时间 |
须知
时间
- 时间采用瑞士当地时间,格式为 ISO 8601,例如
"2026-09-23T14:00"。服务会自动处理 夏令时或冬令时。 - 答案中的时间会注明 UTC 偏移量,例如
2026-09-23T13:00+02:00。 - 标记为
14:00的逐小时数值表示 13:00 至 14:00。云量和冰冻层高度是该时刻的数值。 - 预报涵盖今天及之后 8 天。
current_date_and_time()会提供今天的日期,以便回答“明天”或“今晚”等问题。
地点
- 地点是 swissNAMES3D 中的地名,包括城镇、村庄、城市街区、山峰、山口、湖泊、
冰川、山谷或火车站,例如
Zürich、Oerlikon、Titlis或Zürichsee。 - 名称不区分大小写,也不区分重音符号;此外,一些英文名称也可用,例如
Geneva。 - 如果多个地点同名,例如
Blausee,就需要提供near:指定用户所指地点附近的村庄, 例如near="Riederalp"。如果未提供,工具会列出所有同名地点,按规模从大到小排列, 并显示用于选择该地点的调用,以及该地点所属的市镇和州:'Blausee' is the name of 6 places. [...] The biggest first: location="Blausee", near="Blausee-Mitholz": district and lake, fewer than 20 people, 887 m, municipality Kandergrund, canton Bern location="Blausee", near="Ramiswil": settlement, fewer than 20 people, 683 m, municipality Mümliswil-Ramiswil, canton Solothurn ... - 市镇和州使用 swisstopo 提供的当地语言名称,例如
Genève或Graubünden。后台启动时下载 swissBOUNDARIES3D GeoPackage 后,这些信息便会显示。 - 对于无法识别的名称,工具最多会提供 10 个建议,例如输入
Davos时,会建议Davos Dorf和Davos Platz。
预报点
- 预报数据来自地点附近的 MeteoSwiss 预报点。如果预报点距离地点超过 1 km,或高出、低于地点超过 50 m,答案会在 data_from 中注明该预报点。
- 气温随高度变化的速度比随距离变化更快:在标准大气(ISO 2533)中,海拔每升高 100 m, 气温下降 0.65 °C。
- 因此,在 5 km 范围内,服务会选择“距离加上高度差乘以 20”最小的预报点:高度差每 100 m 相当于距离增加 2 km。如果 5 km 范围内没有预报点,则选择最近的预报点。
- 系数 20 经真实数据测试得出:使用该系数后,湖泊和山峰的高度差影响会大幅降低, 同时人口达到 1,000 人或以上的所有城镇仍能在 3 km 内找到预报点。
实测数据
measurements_current使用 SwissMetNet 约 160 个站点之一:在距离加上高度差 20 倍后数值最小的 3 个站点中,选择最近一小时内发布过气温数据的第一个站点。站点数量远少于预报点,因此站点仍可能离地点很远,且海拔更高或更低。- 每个回答都以一句话说明这一点,例如:“Braunwald(1290 m)的实测数据来自距离 13.5 km、海拔低 332 m 的 MeteoSwiss Elm 站(958 m)。”
- 提供气温、湿度、露点、过去 10 分钟的降雨和日照、风、阵风、风向和海平面气压,以及过去 3 小时的气温和气压变化,还有过去一小时的降雨、日照和最强阵风。
measurements_extremes列出气温或阵风排名前 5 的站点。对于降雨最多的站点,会列出降雨量排名前 5 的站点,并统计瑞士及各州有降雨的站点数量。- 对于日照最充足的站点,会按过去 10 分钟的日照时长分组,采用 MeteoSwiss 的日照术语:大部分时间晴朗(8 至 10 分钟,80 至 100 %)、较为晴朗(5 至 7 分钟)、间有阳光(2 至 4 分钟)、只有少许阳光(1 分钟)和几乎没有阳光(0 分钟)。MeteoSwiss 的区间在 20、50 和 80 % 处相接;恰好处于这些数值的站点归入日照更多的术语,因此 2 分钟(20 %)属于“间有阳光”。各州按其站点的平均日照时长排序。
预报值是中位数
- 气温和降雨量是 MeteoSwiss 计算的多种可能结果的中位数,而非最可能值。
- 中位数不能相加:如果每个 3 小时区间都可能出现阵雨,但概率很低,那么每个区间都会显示 0 mm,而当天的中位数可能高于 0。
forecast_daily提供一天的降雨量,forecast_rain则提供降雨概率,以及有雨的小时可能带来的降雨量。
缓存和下载
- 缓存位于操作系统的缓存目录中,例如 macOS 上的
~/Library/Caches/swiss-weather-mcp,或 Linux 上的~/.cache/swiss-weather-mcp。SWISS_WEATHER_MCP_CACHE_DIR可将缓存移至其他位置。 - 首次启动时会下载 swissNAMES3D 归档文件(约 33 MB)和 swissBOUNDARIES3D GeoPackage(约 37 MB,解压后约 74 MB)。
- MeteoSwiss 每小时发布一次新的预报批次,每个小时参数对应一个包含所有预报点数据的文件,大小约为 30 至 34 MB。默认情况下,服务会为每个新的预报点下载此类文件,并且只保留该点对应的数据行。
- 使用
--cache-all-forecast-points后,服务会保留整个文件,因此同一批次中查询其他地点时无需再次下载。如果一小时内查询多个地点,这会很有帮助,但会占用更多磁盘空间。
LMStudio 使用示例
使用 streamable-http 传输层
在 LMStudio 中配置 mcp.json 文件:
{
"mcpServers": {
"swiss_weather_mcp_server": {
"url": "http://localhost:8050/mcp/"
}
}
}
按照运行服务中的说明,使用 streamable-http 传输方式运行 MCP 服务。
使用 stdio 传输层
在 LMStudio 中配置 mcp.json 文件。替换 <path-to>,使命令使用 which swiss-weather-mcp-server 输出的完整路径:
{
"mcpServers": {
"swiss_weather_mcp_server": {
"command": "<path-to>/swiss-weather-mcp-server"
}
}
}

资源
许可证
根据 Apache License 2.0 授权。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。