MeteoSwiss Open Data for weather, climate normals, warnings
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
MCP server for Swiss weather and climate data from MeteoSwiss.
Connects AI models to the SwissMetNet measurement network (160+ stations, 10-minute interval), MeteoSwiss ICON-CH1/CH2-EPS forecasts and climate normals 1991β2020. Part of the swiss-public-data-mcp portfolio.
π©πͺ Deutsche Version
β meteo_school_check(location="ZΓΌrich Oerlikon", activity="Sporttag") returns a π’/π‘/π΄ traffic light for each day of the coming week β straight from the MeteoSwiss ICON model.
Combined with swiss-environment-mcp:
β meteo_current(station='REH') + env_nabel_current(station='ZUE') = a complete environmental picture.
β More use cases by audience β
| Tool | Description | Data source |
|---|---|---|
meteo_stations | List SwissMetNet stations (filterable by canton) | Embedded |
meteo_current | Current 10-min observations for a station | BGDI STAC API |
meteo_forecast | 1β16 day forecast for a place or coordinates | Open-Meteo / MeteoSwiss ICON |
meteo_school_check | π’/π‘/π΄ traffic light for outdoor school events | Open-Meteo / MeteoSwiss ICON |
meteo_climate_normals | Monthly climate normals 1991β2020 | Embedded (KLO, SMA, BER, LUG, GVE) |
meteo_warnings | Active official weather warnings (storm, thunderstorm, heat, forest fire, β¦) β nationwide, by canton, or by PLZ | MeteoSwiss App-API + opendata.swiss |
All tools carry explicit MCP annotations β relevant for the client approval UI and for the LLM's safety decisions.
| Tool | readOnlyHint | destructiveHint | idempotentHint | openWorldHint |
|---|---|---|---|---|
meteo_stations | β | β | β | β (curated list) |
meteo_current | β | β | β (live data) | β (upstream STAC) |
meteo_forecast | β | β | β (live data) | β (upstream Open-Meteo) |
meteo_school_check | β | β | β (live data) | β (geocoding + forecast) |
meteo_climate_normals | β | β | β | β (embedded normals) |
meteo_warnings | β | β | β (live data) | β (MeteoSwiss App-API) |
Read rules: all 6 tools are readOnly + non-destructive β the server fundamentally cannot write or delete anything. idempotentHint=False marks tools that return different values depending on when they are called.
| Aspect | Value |
|---|---|
| Tested spec versions | 2024-11-05, 2025-03-26, 2025-06-18 (via the mcp[cli] SDK) |
| MCP SDK version | see pyproject.toml β mcp[cli]>=2.0.0,<3 (the MCPServer API from mcp.server.mcpserver) |
| Update policy | Dependabot watches mcp[cli]; spec bumps are documented in the CHANGELOG with a "Tool Definition Changes" marker |
β Full roadmap & update strategy: docs/roadmap.md
Configuration via ENV variables (the CLI flags --http / --port N still work as an override):
| Variable | Default | Meaning |
|---|---|---|
MCP_TRANSPORT | stdio | stdio or streamable-http |
MCP_HOST | 127.0.0.1 | Bind address β never change locally |
MCP_PORT | 8000 | Port |
MCP_ALLOW_ANY_HOST | unset | Must be set to 1 to allow the server to bind to 0.0.0.0 (containers/cloud only) |
MCP_LOG_LEVEL | INFO | DEBUG / INFO / WARNING / ERROR β structured JSON logs on stderr |
MCP_ALLOWED_ORIGINS | unset | Comma-separated list of allowed origins for CORS. Empty = CORS disabled (same-origin only). Mcp-Session-Id is exposed automatically. |
MCP_API_KEY | unset | If set: every request except /health requires X-API-Key: <key> or Authorization: Bearer <key>. Constant-time comparison. |
MCP_STATELESS_HTTP | 0 | 1 enables the SDK's stateless mode β each HTTP request opens a new session. Prerequisite for multi-replica deploys without sticky sessions (SCALE-002/003). |
OTEL_EXPORTER_OTLP_ENDPOINT | unset | If set + pip install meteoswiss-mcp[otel]: OpenTelemetry spans per tool call + automatic httpx instrumentation are sent as OTLP-HTTP to the collector. |
OTEL_SERVICE_NAME | meteoswiss_mcp | Service name in the OTel resources |
MCP_CACHE_ENABLED | 1 | 0 disables the TTL cache entirely (e.g. for end-to-end tests) |
MCP_CACHE_TTL_STAC | 300 | TTL in seconds for STAC SMN observations (default 5 min) |
MCP_CACHE_TTL_OPEN_METEO | 600 | TTL for ICON forecasts (default 10 min) |
MCP_CACHE_TTL_GEOCODING | 3600 | TTL for geocoding lookups (default 1 h) |
MCP_CACHE_TTL_OPENDATA | 3600 | TTL for the opendata.swiss catalogue (default 1 h) |
MCP_CACHE_TTL_WARNINGS | 300 | TTL for warnings (MeteoSwiss App-API / structured override; default 5 min) |
MCP_CLIMATE_NORMALS_PATH | unset | Path to a JSON file with additional climate normals β see data/climate-normals.example.json |
MCP_WARNINGS_API_URL | unset | Override for the default MeteoSwiss App-API source: URL of a structured MeteoSwiss warnings API (e.g. the future OGD warnings REST endpoint). The host must be on the egress allow-list. Schema-tolerant (GeoJSON features, a warnings array or items). Unset β live App-API. |
MCP_CLIMATE_NORMALS_URL_TEMPLATE | unset | URL template for runtime lookup of climate normals (for stations without embedded or JSON values). Tokens: {station} (lowercase), {STATION} (uppercase), {param} (MeteoSwiss code tre200m0/rre150m0/sre000m0). Example: https://data.geo.admin.ch/.../{station}/{param}.txt. The host must be on the egress allow-list. |
The repo includes a production-ready multi-stage Dockerfile (non-root user, HEALTHCHECK) and a render.yaml blueprint:
On Render: "New β Blueprint" β select the repo. Defaults (plan starter, Frankfurt, single instance) are set in render.yaml.
Important: numInstances: 1 is set deliberately β sticky-session routing for multi-replica (audit SCALE-002/003) is not yet implemented.
All tool invocations, upstream failures and egress blocks are emitted as JSON events on stderr (stdio-transport safe). Example:
MCP_HOST deliberately defaults to 127.0.0.1 so that --http on a dev laptop is not accidentally exposed to the local subnet (audit finding SEC-016).data.geo.admin.ch, api.open-meteo.com, geocoding-api.open-meteo.com, opendata.swiss. Other hosts and IP literals (in particular 169.254.169.254, RFC1918) are rejected with EgressBlocked (SEC-004 / SEC-021).MCP_ALLOWED_ORIGINS=<csv> β the Mcp-Session-Id header is then automatically in Access-Control-Expose-Headers (SDK-004).MCP_API_KEY=<random> β requests without a valid X-API-Key or Authorization: Bearer β¦ are rejected with 401 (SEC-009 / SEC-013). /health stays open for container health probes.No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/meteoswiss-mcp)<a href="https://allmcps.com/mcp/meteoswiss-mcp"><img src="https://allmcps.com/api/badge/meteoswiss-mcp?style=directory" alt="Meteoswiss MCP on AllMCPs" /></a>