mcpField
S
Swiss Weather

Swiss Weather

本地服务
github.com/cuolm地图与出行12 天前更新

关于 Swiss Weather

为需要瑞士地点天气和天文信息的 AI 应用提供 MCP 服务。它汇集 MeteoSwiss 预报与气象站测量数据、瑞士地名查询,并附带用于测试服务的客户端。

主要功能

  1. 01提供最长九天的每日预报
  2. 02预报降雨、气温、日照和风
  3. 03查询气象站当前测量值及极值
  4. 04查询日出、曙暮光和月相信息
  5. 05查询瑞士地名

适用场景

  1. 01查询瑞士某地的天气预报
  2. 02比较气象站当前读数
  3. 03查看各站当前天气极值
  4. 04查询指定日期的日月时间

MCP 相关

向 MCP 客户端提供瑞士天气预报、测量数据、地名查询和天文数据工具。支持 stdio 与 streamable HTTP 传输方式。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"cuolm-swiss-weather": {
"command": "uvx",
"args": [
"swiss-weather-mcp"
]
}
}
}
启动命令uvx swiss-weather-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiswiss-weather-mcp0.4.0

工具

12

收录的工具列表 · 更新于 3 天前

参数类型必填说明
daysinteger否
nearany否仅当多个地点同名时:指用户所指地点旁边的村庄。例如,对于“Bettmeralp 附近的 Blausee”,使用 location "Blausee",near 使用 "Bettmeralp"。其他情况省略。
locationstring是
start_datestring是

详细介绍

Swiss Weather MCP Server

Logo PyPI License Release Tests

一个 Model Context Protocol (MCP) 服务,为 AI 应用提供瑞士境内任意地点的天气信息。

  • 来自 MeteoSwiss 本地预报的今日及未来 8 天预报,每小时更新
  • 来自约 160 个 SwissMetNet 气象站的测量数据,每 10 分钟更新
  • 瑞士国家地图上的地点,例如城镇、区、湖泊和山峰,数据来自 swissNAMES3D
  • 计算任意日期某地的日出日落、月出月落、民用曙暮光、月相及月面照亮比例
  • 内置用于测试的 MCP 客户端

数据来源。 本项目不是 MeteoSwiss 的官方产品。

目录

项目结构

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

LMStudioMCPServer

资源

许可证

根据 Apache License 2.0 授权。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

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