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. Changed17 schema fields changed
    • changedOutput schema / properties / forecast / items / properties / hourly / anyOf
      Previous value: -[
      -  {
      -    "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"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "precip_mm": {
      +          "description": "Precipitation sum for this hour, in mm",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "sunshine_minutes": {
      +          "description": "Sunshine duration within this hour, in minutes",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "temperature_c": {
      +          "description": "Temperature at this hour, in °C",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "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": {
      +          "description": "Peak wind gust for this hour, in km/h",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "wind_kmh": {
      +          "description": "Mean wind speed for this hour, in km/h",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "time",
      +        "temperature_c",
      +        "precip_mm",
      +        "sunshine_minutes",
      +        "wind_kmh",
      +        "wind_gust_kmh"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / forecast / items / properties / precipitation_total_mm / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / forecast / items / properties / precipitation_total_mm / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / forecast / items / properties / sunshine_total_minutes / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / forecast / items / properties / sunshine_total_minutes / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / forecast / items / properties / temperature_max_c / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / forecast / items / properties / temperature_max_c / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / forecast / items / properties / temperature_min_c / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / forecast / items / properties / temperature_min_c / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / forecast / items / properties / weather / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / forecast / items / properties / weather / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / forecast / items / properties / weather_icon_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / forecast / items / properties / weather_icon_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / forecast / items / properties / wind_avg_kmh / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / forecast / items / properties / wind_avg_kmh / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / forecast / items / properties / wind_gust_max_kmh / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / forecast / items / properties / wind_gust_max_kmh / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  2. 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"
      +}
  3. First observed

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and largely succeeds: it discloses timezone handling (local wall-clock, do not convert), null-vs-empty semantics for hourly data, per-field null behavior, and the caveat that station daily aggregates may not match the hourly series. It does not address error behavior for invalid locations, though that omission is minor for a read forecast.

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

Conciseness4/5

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

Purpose is front-loaded and the rest is organized into clear labeled blocks and bullets, so it is navigable. It is long, and some return-value detail overlaps with the output schema, but the edge-case notes are hard to express structurally and each earns much of its place.

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?

For a two-parameter forecast tool with an output schema and no annotations, the definition is thorough: it covers inputs, coverage, horizon, update cadence, and the subtle data semantics an agent would otherwise misread. Nothing essential to correct invocation is missing.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented with examples and the 1-9 range. The description reinforces the accepted location forms and adds coverage figures (~6000 locations), but largely restates what the schema already contains, so the baseline of 3 is appropriate.

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 first sentence gives a specific verb and resource ('Get a multi-day weather forecast') plus scope ('any Swiss location'), which cleanly separates it from sibling tools like meteoswissCurrentWeather or meteoswissClimateData. The multi-day vs current-data distinction is unambiguous without opening any schema.

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

Usage Guidelines3/5

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

Usage is implied through the described coverage, forecast horizon (up to 9 days), and accepted input formats, but there is no explicit when-to-use / when-not-to-use guidance and no sibling is named as an alternative. An agent can infer the context but must reason about it rather than being told.

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.