Skip to main content
Glama

meteoswissLocalForecast

Get a multi-day weather forecast for any Swiss location. Returns daily summaries (temperature, precipitation, sunshine, wind, weather icon) plus a hierarchical hourly breakdown of every series.

This uses official MeteoSwiss Open Data — the same forecasts powering the MeteoSwiss app and website.

Accepts:

  • Postal codes: "8001" (Zurich), "3000" (Bern), "1200" (Geneva)

  • Station abbreviations: "SMA" (Zurich Fluntern), "BER" (Bern)

  • Place names: "Zurich", "Basel", "Lugano"

Coverage: ~6000 Swiss locations (all postal codes + weather stations + mountain points). Forecast horizon: up to 9 days. Updated hourly.

Each day's summary fields: temperature_min_c, temperature_max_c, precipitation_total_mm, sunshine_total_minutes, wind_avg_kmh, wind_gust_max_kmh, weather, weather_icon_url.

Each day also includes "hourly": one array of per-hour objects covering every series together — { time, temperature_c, precip_mm, sunshine_minutes, wind_kmh, wind_gust_kmh } — useful for judging when rain, sun, or wind is expected, not just the daily summary:

  • Each entry's "time" is already local wall-clock time for the location (Europe/Zurich), with the UTC offset included, e.g. "2026-07-09T14:00:00+02:00". It is NOT UTC — do not convert it.

  • A dry/calm/sunless hour is reported as its measured value (often 0), not omitted. A fully dry day is still a full array of zero-precipitation hours, not an empty array.

  • Each field is independently null if just THAT series has no reading for a given hour — the other fields for that same hour are still populated. An hour is omitted entirely only when every series is missing for it.

  • "hourly" itself is null when no hourly breakdown exists for this location at all (a total data gap); [] only when this location supports hourly data but none was available for that specific day.

  • For weather stations, temperature_min_c/temperature_max_c/precipitation_total_mm are MeteoSwiss's own official daily aggregates — a different, separately-curated product from the hourly series shown alongside them. They can legitimately NOT match summing/ averaging the hourly entries for that day; this is expected, not a data error. sunshine_total_minutes/wind_avg_kmh/wind_gust_max_kmh have no official daily product for stations and are always derived from the hourly series. For postal codes/mountain points, every summary field is derived from the same hourly series shown alongside it, so it always matches summing/averaging that series exactly.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
daysNoNumber of forecast days (1-9, default 5)
locationYesSwiss location: postal code (e.g., "8001"), station abbreviation (e.g., "SMA"), or place name (e.g., "Zurich")

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
sourceYesData attribution
forecastYesOne entry per forecast day, in date order
locationYes
generatedYesTimestamp the forecast was generated (ISO 8601)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / location / description
      Previous value: -"Swiss location: postal code (e.g., \"8001\"), station abbreviation (e.g., \"ZUE\"), or place name (e.g., \"Zurich\")"New value: +"Swiss location: postal code (e.g., \"8001\"), station abbreviation (e.g., \"SMA\"), or place name (e.g., \"Zurich\")"
    • addedInput schema / properties / location / maxLength
      Added value: +200
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "forecast": {
      +      "description": "One entry per forecast day, in date order",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "date": {
      +            "description": "Local Europe/Zurich calendar date (YYYY-MM-DD) for postal codes/mountain points; the station data source's native daily date for weather stations.",
      +            "type": "string"
      +          },
      +          "hourly": {
      +            "anyOf": [
      +              {
      +                "items": {
      +                  "additionalProperties": false,
      +                  "properties": {
      +                    "precip_mm": {
      +                      "anyOf": [
      +                        {
      +                          "type": "number"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ],
      +                      "description": "Precipitation sum for this hour, in mm"
      +                    },
      +                    "sunshine_minutes": {
      +                      "anyOf": [
      +                        {
      +                          "type": "number"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ],
      +                      "description": "Sunshine duration within this hour, in minutes"
      +                    },
      +                    "temperature_c": {
      +                      "anyOf": [
      +                        {
      +                          "type": "number"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ],
      +                      "description": "Temperature at this hour, in °C"
      +                    },
      +                    "time": {
      +                      "description": "ISO 8601 timestamp with UTC offset, in local Europe/Zurich time (e.g. \"2026-03-28T09:00:00+01:00\")",
      +                      "type": "string"
      +                    },
      +                    "wind_gust_kmh": {
      +                      "anyOf": [
      +                        {
      +                          "type": "number"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ],
      +                      "description": "Peak wind gust for this hour, in km/h"
      +                    },
      +                    "wind_kmh": {
      +                      "anyOf": [
      +                        {
      +                          "type": "number"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ],
      +                      "description": "Mean wind speed for this hour, in km/h"
      +                    }
      +                  },
      +                  "required": [
      +                    "time",
      +                    "temperature_c",
      +                    "precip_mm",
      +                    "sunshine_minutes",
      +                    "wind_kmh",
      +                    "wind_gust_kmh"
      +                  ],
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Per-hour breakdown across every series, keyed to the local Europe/Zurich calendar day this `date` represents (each entry's `time` always falls within this day). `null` when no hourly breakdown exists for this location at all (a total data gap); `[]` when the point type supports hourly data but none was available for this specific day. A dry/calm/sunless hour still appears with its measured 0 value — 0-valued readings are kept, not omitted."
      +          },
      +          "precipitation_total_mm": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Daily precipitation total, mm. For postal codes/mountain points, the sum of `hourly`'s `precip_mm` (cannot disagree with the series). For weather stations, MeteoSwiss's official daily aggregate (`rka150d0`) — a *different* product than re-summing the station's hourly series, so it may legitimately NOT equal `sum(hourly precip_mm)` for stations. This is expected, not a data inconsistency."
      +          },
      +          "sunshine_total_minutes": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Daily sunshine total, minutes. Derived from `hourly`'s `sunshine_minutes` for every point type (no official daily aggregate exists for this parameter)."
      +          },
      +          "temperature_max_c": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Daily temperature maximum, °C. Same sourcing rules as temperature_min_c (station aggregate: `tre200dx`)."
      +          },
      +          "temperature_min_c": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Daily temperature minimum, °C. For postal codes/mountain points, derived from the same hourly series as `hourly` (so they cannot disagree). For weather stations, MeteoSwiss's official daily aggregate (`tre200dn`) — may capture sub-hourly extremes the hourly series alone wouldn't show."
      +          },
      +          "weather": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Human-readable weather description"
      +          },
      +          "weather_icon_url": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "URL of the official MeteoSwiss weather icon"
      +          },
      +          "wind_avg_kmh": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Daily mean wind speed, km/h. Derived from `hourly`'s `wind_kmh` for every point type."
      +          },
      +          "wind_gust_max_kmh": {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Daily peak wind gust, km/h. Derived from `hourly`'s `wind_gust_kmh` for every point type."
      +          }
      +        },
      +        "required": [
      +          "date",
      +          "weather",
      +          "weather_icon_url",
      +          "temperature_min_c",
      +          "temperature_max_c",
      +          "precipitation_total_mm",
      +          "sunshine_total_minutes",
      +          "wind_avg_kmh",
      +          "wind_gust_max_kmh",
      +          "hourly"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "generated": {
      +      "description": "Timestamp the forecast was generated (ISO 8601)",
      +      "type": "string"
      +    },
      +    "location": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "coordinates": {
      +          "additionalProperties": false,
      +          "description": "WGS84 coordinates of the resolved point",
      +          "properties": {
      +            "lat": {
      +              "type": "number"
      +            },
      +            "lon": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "lat",
      +            "lon"
      +          ],
      +          "type": "object"
      +        },
      +        "elevation": {
      +          "description": "Elevation in metres above sea level",
      +          "type": "number"
      +        },
      +        "name": {
      +          "description": "Resolved location name",
      +          "type": "string"
      +        },
      +        "type": {
      +          "description": "Point type: \"station\", \"postal_code\", or \"mountain\"",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "type",
      +        "elevation",
      +        "coordinates"
      +      ],
      +      "type": "object"
      +    },
      +    "source": {
      +      "description": "Data attribution",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "location",
      +    "generated",
      +    "forecast",
      +    "source"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral transparency burden. It explains timezone handling ('NOT UTC — do not convert it'), zero-hour inclusion, null-field semantics, empty-array vs null distinctions, and the expected mismatch between official station daily aggregates and hourly-derived values.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but it is well-structured with clear paragraphs and bullet-like lists. Every section addresses a real need for safe invocation and output interpretation, and the core purpose is front-loaded in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for this tool's complexity, covering input variants, output structure, edge cases, and data quirks. Given the output schema exists, the description goes beyond what is minimally required and would allow an agent to correctly invoke the tool and interpret results without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema description coverage is 100%, the description adds substantial meaning beyond the schema by providing concrete location examples, forecast horizon details, field definitions for the returned summaries, and hourly object semantics. This helps an agent accurately construct inputs and interpret outputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get a multi-day weather forecast for any Swiss location', and explicitly lists what is returned (daily summaries plus a hierarchical hourly breakdown). This clearly differentiates the tool from siblings like meteoswissCurrentWeather and meteoswissClimateData.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: multi-day forecasts for Swiss locations, including accepted input formats, coverage of ~6000 locations, forecast horizon, and update frequency. However, it does not explicitly name sibling alternatives or state when not to use this tool, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.