geosphere-mcp-server
A read-only weather MCP server serving high-resolution GeoSphere Austria data (1 km AROME/INCA/nowcast, C-LAEF ensemble, WRF-Chem) for Austria and the Alpine region only, returning compact emoji-markdown with metric units.
get_current_weather— current temperature, feels-like, condition (Home Assistant vocabulary), humidity, wind + gusts, last-hour precipitation, pressure, cloud cover; observations decide whether/what is falling.get_hourly_forecast— hour-by-hour rows up to ~60 h (default 24, clamped 1–60), optional ISO 8601start; per-hour condition, wind, precipitation with C-LAEF-derived chance estimate, and snow limit, grouped by local-time day headers.get_storm_outlook— peak gusts for the next 1 h/12 h, thunderstorm expected next hour, next thunderstorm timestamp with signal (symbol/ensemble/both), max CAPE; reports figures, never a severity verdict.get_air_quality— current NO₂/O₃/PM10/PM2.5 concentrations plus European AQI (1–6 EEA bands) for today, tomorrow and in two days (model forecasts, not station measurements).Coverage-limited by design — no global fallback: out-of-coverage points return a distinct permanent ⚠️ notice (grid differs per tool), separate from transient failures like timeouts or stale runs.
No multi-day forecast — nothing beyond a run's ~52–60 h hourly horizon; longer requests append a note naming where the horizon ends.
LLM/voice/smart-home oriented — plain decimal lat/lon only (no geocoder; the caller geocodes), terse markdown output, every response naming the datasets that produced it.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@geosphere-mcp-serverweather in Vienna"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
geosphere-mcp-server
MCP server for weather: current conditions, hourly forecasts, storm outlooks, and air quality for Austria and the Alpine region, via the Model Context Protocol.
It serves high-resolution GeoSphere Austria data — the 1 km numerical forecast (nwp-v2-1h-1km, the deterministic run of the C-LAEF AlpeAdria ensemble, called AROME here), the INCA analysis/nowcast, the C-LAEF ensemble for the precipitation-chance estimate and a thunderstorm signal, and the WRF-Chem air-quality forecast. There is no worldwide fallback: a point outside the AROME grid returns an out-of-coverage notice, so pair this with a global weather source if you need one. Every response states which datasets produced it.
Output is compact emoji-markdown with metric units — built for smart-home and voice-assistant LLM pipelines where a terse, readable answer beats a JSON blob. Weather conditions follow GeoSphere's own weather symbol and are reported with the Home Assistant condition vocabulary (sunny, clear-night, partlycloudy, cloudy, fog, rainy, pouring, snowy, snowy-rainy, lightning-rainy); for the current condition, observations decide whether and what is falling.
Coverage
Where |
|
|
|
|
Austria | INCA + nowcast + AROME | AROME (≤60 h) + C-LAEF chance estimate | AROME symbol + C-LAEF ensemble | WRF-Chem (3 km) |
Alps (non-AT) | AROME only | AROME (≤60 h) + C-LAEF chance estimate | AROME symbol + C-LAEF ensemble | WRF-Chem (3 km) |
Rest of world | not served | not served | not served | not served |
Coverage is decided by the API, not by a bounding box you configure: GeoSphere answers HTTP 400 for a point outside the grid, and the server renders that as
⚠️ Outside coverage — this server only serves Austria and the Alpine region.That line is deliberately distinct from the transient failures (⚠️ Timeout…, ⚠️ No weather data available): being outside coverage is a permanent property of the location, so retrying will never help. It names no grid on purpose — the forecast tools query the 1 km forecast grid and get_air_quality queries WRF-Chem (3 km), so a point can be inside one and outside the other.
There is no multi-day forecast. GeoSphere publishes nothing beyond the forecast run's ~60 h, and a run is only available several hours after its start, so the longest answer this server can give is typically 52–55 hours of hourly rows.
Related MCP server: wetter-mcp-server
Installation
Pass decimal latitude/longitude to every tool. There is no geocoder in the server — the calling LLM geocodes city names to coordinates itself.
Claude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"geosphere": {
"command": "uvx",
"args": ["geosphere-mcp-server"]
}
}
}Claude Code
claude mcp add geosphere -- uvx geosphere-mcp-serverFrom source (development)
{
"mcpServers": {
"geosphere": {
"command": "uvx",
"args": ["--from", "/path/to/geosphere-mcp-server", "geosphere-mcp-server"]
}
}
}Home Assistant
It is a standard stdio MCP server, so it runs anywhere an stdio MCP server can be hosted — including alongside Home Assistant's Assist pipeline (register it the same way as any other stdio MCP server). Give the voice agent the coordinates of the places it should answer for, or let it geocode names.
Tools
get_current_weather
Current conditions for a point, from INCA, the 15-minute nowcast, and AROME. The nowcast decides whether and what is falling; the rest of the condition is GeoSphere's weather symbol for the current hour, so with nothing falling under a rain or thunder symbol it reads cloudy.
Parameter | Type | Default | Description |
| float | required | Decimal latitude (e.g. |
| float | required | Decimal longitude (e.g. |
# Current Weather at 48.2208, 16.3738
🌡️ Temperature: 24.7°C (feels like 24.2°C)
🌤️ Condition: partlycloudy
💧 Humidity: 52%
💨 Wind: 2.9 m/s from 135° (gusts 7 m/s)
🌧️ Precipitation (last hour): 0 mm
📊 Pressure: 1016 hPa
☁️ Cloud cover: 30%
🕐 Timezone: Europe/Vienna (CEST)
📡 Source: GeoSphere (INCA + nowcast + AROME) — observed 15:20get_hourly_forecast
Hour-by-hour forecast from AROME, up to ~60 h. Each hour's condition is GeoSphere's weather symbol; the precipitation chance is an estimate derived from the C-LAEF ensemble percentiles (stepped 0/30/70/95 %), not a probability GeoSphere publishes.
Parameter | Type | Default | Description |
| float | required | Decimal latitude (e.g. |
| float | required | Decimal longitude (e.g. |
| int | 24 | Forecast hours (clamped to 1–60) |
| string | now | Optional ISO 8601 start (e.g. |
# 3-Hour Forecast for 48.2208, 16.3738
AROME model, reference 2026-07-22 12:00 CEST · Source: GeoSphere (AROME + C-LAEF ensemble)
Wed 2026-07-22
15:00: 24.7°C — partlycloudy, wind 3 m/s, snow limit 3410 m
16:00: 23.9°C — rainy, 1.2 mm (70% chance), wind 4 m/s, snow limit 3380 m
17:00: 22.5°C — cloudy, wind 3 m/s, snow limit 3350 m
Precipitation chance is an estimate derived from the C-LAEF ensemble percentiles (0/30/70/95 %), not a probability GeoSphere publishes.The hours are grouped under a day-divider header (%a %Y-%m-%d in the point's local timezone) that repeats whenever the local date changes, so a window crossing midnight stays unambiguous. Requesting more hours than the AROME horizon provides appends a note naming where the horizon ends — there is nothing further ahead to reach for. Dry hours, and hours whose amount rounds to 0 mm, omit the precipitation and chance parts; the estimate note appears only when a chance is shown. Each hour ends with the forecast snow limit in metres, omitted when the run has none.
get_storm_outlook
Severe-weather outlook: peak gusts and thunderstorm timing. Reports figures, never a severity verdict — what counts as dangerous is the caller's judgement.
Parameter | Type | Default | Description |
| float | required | Decimal latitude (e.g. |
| float | required | Decimal longitude (e.g. |
# Storm Outlook for 48.2208, 16.3738
AROME model, reference 2026-08-10 14:00 CEST · Source: GeoSphere (AROME + C-LAEF ensemble)
💨 Max gust next 1 h: 12 m/s (at Mon 2026-08-10 17:00)
💨 Max gust next 12 h: 24 m/s (at Mon 2026-08-10 20:00)
⛈️ Thunderstorm expected next 1 h: no
⚡ Next thunderstorm: Mon 2026-08-10 20:00 (signal: symbol)
🌡️ Max CAPE next 12 h: 1800 J/kg
🕐 Timezone: Europe/Vienna (CEST)
Horizons round up to whole hours: the "1 h" window covers the hour already under way plus the next one. A thunderstorm timestamp at or before now means one is already in progress.
A thunderstorm hour is one whose GeoSphere weather symbol is a thunderstorm, or where the C-LAEF ensemble's 90th percentiles reach 1000 J/kg CAPE and 0.1 mm precipitation; `signal` names which fired (symbol, ensemble or both). Max CAPE is a diagnostic and decides nothing.Three behaviours are worth knowing before you build on this:
Horizons round up to whole hours. The window starts at the top of the current hour, so the "next 1 h" figure covers the hour already under way plus the next one, and can report an event up to ~2 h out. Compare the returned timestamps yourself if you need a strict 60-minute answer.
Next thunderstormcan be in the past, by up to 59 minutes, when the storm hour is the one already under way. That means a storm is in progress — clamp a negative lead time to zero rather than assuming the stamp is in the future.An all-clear names its horizon (
none in the next 54 h). The run nominally covers ~60 h, but it is published hours after its start and a stale or truncated run reaches less far, so the span is measured from the rows actually returned. It is not an all-clear beyond the stated span.
A thunderstorm hour is one whose GeoSphere weather symbol is a thunderstorm (codes 26–32), or one where the C-LAEF ensemble's 90th percentiles reach 1000 J/kg CAPE and 0.1 mm of precipitation — the ensemble counts only while its run is less than 12 h old. Either signal suffices, and every thunderstorm answer names it: signal: symbol, ensemble or both. Without a current ensemble run the outlook says so (ℹ️ Ensemble signal: unavailable …) and rests on the symbol alone. Thunderstorm expected reads unknown (no forecast hours in the window) only when no forecast hour falls in the window; an hour with a missing symbol counts as no storm. Max CAPE is the deterministic run's CAPE, a diagnostic that decides nothing.
get_air_quality
Pollutant concentrations now, plus the European Air Quality Index for today, tomorrow and in two days.
Parameter | Type | Default | Description |
| float | required | Decimal latitude (e.g. |
| float | required | Decimal longitude (e.g. |
# Air Quality at 48.2208, 16.3738
🏷️ European AQI: 2 (fair) today · 3 (moderate) tomorrow · 2 (fair) in 2 days
🌫️ Concentrations (16:00): NO₂ 18 µg/m³ · O₃ 92 µg/m³ · PM10 21 µg/m³ · PM2.5 12 µg/m³
🕐 Timezone: Europe/Vienna (CEST)
📡 Source: GeoSphere (WRF-Chem + daily AQI, 3 km)The AQI is reported as its 1–6 EEA band (1 good … 6 extremely poor), which is what GeoSphere publishes — there is no underlying numeric index to show alongside it. These are model forecasts, not station measurements — expect them to track a nearby monitoring station without matching it.
A point inside the 3 km grid can still come back empty when a WRF-Chem run is stale or incomplete; the response then says No air-quality data available for this location and still names the source, which is a different answer from being out of coverage.
Data sources & attribution
GeoSphere Austria Dataset API — the 1 km forecast (
nwp-v2-1h-1km) and C-LAEF ensemble (ensemble-v2-1h-1km), INCA analysis/nowcast, WRF-Chem air quality. Data licensed under CC-BY 4.0. © GeoSphere Austria.
The API is keyless and intended for non-commercial use. When you redistribute its data, keep the attribution.
Rate limits
The GeoSphere Dataset API allows 5 requests/second and 240 requests/hour. Each call issues a small burst of concurrent requests (three for current weather, two each for the hourly forecast, the storm outlook and air quality); on an HTTP 429 the server retries once (when the API asks for a short wait) and otherwise returns a rate-limit notice.
Development
# Install dependencies (creates .venv from the locked versions)
uv sync
# Lint & format
ruff check .
ruff format .
# Run unit tests
pytest -m "not integration"
# Run integration tests (hits the live GeoSphere API)
pytest -m integrationLicense
MIT
Available Tools
4 toolsget_air_qualityA
Get air quality for a location: pollutants now and the AQI outlook.
Reports current NO₂, O₃, PM10 and PM2.5 surface concentrations plus the
European Air Quality Index (1-6 EEA bands) for today, tomorrow and in two
days.
GeoSphere's WRF-Chem forecast (3 km) serves Austria and the Alpine region
only; a point outside that grid returns an out-of-coverage notice. These
are model forecasts, not station measurements.
An in-coverage point can still come back empty when a WRF-Chem run is
stale or incomplete — the response then says so and names the source that
drew the blank, which is a different answer from being out of coverage.
Args:
latitude: Decimal latitude (e.g. 48.2208 for Vienna). Geocode city
names to coordinates yourself.
longitude: Decimal longitude (e.g. 16.3738 for Vienna).
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | ||
| longitude | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and excels: it discloses the geographic coverage limitation, the model-forecast nature, the possibility of an empty response due to stale/incomplete runs, and that an out-of-coverage notice differs from a blank response. This goes well beyond basic behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: a one-line summary, followed by output specifics, coverage/limitations, edge-case behavior, and parameter notes. Every sentence adds relevant information without redundancy, achieving conciseness through organization rather than brevity for its own sake.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and the existence of an output schema (which covers return values), the description covers all necessary context: what it returns, geographic coverage, data source caveats, how to handle edge cases, and parameter preparation. It leaves no obvious gaps for an agent to misuse the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. The Args section provides decimal examples for latitude/longitude (Vienna coordinates) and explicitly states 'Geocode city names to coordinates yourself,' giving meaningful semantic guidance beyond the bare number type in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 air quality for a location: pollutants now and the AQI outlook.' It further details the exact pollutants (NO₂, O₃, PM10, PM2.5) and the European Air Quality Index bands, making it unmistakably distinct from sibling weather/storm tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context and restrictions: 'serves Austria and the Alpine region only,' 'model forecasts, not station measurements,' and instructs users to geocode city names themselves. However, it does not explicitly name alternatives or state when not to use this tool versus its siblings, stopping 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.
get_current_weatherA
Get current weather conditions for a location.
High-resolution GeoSphere Austria data (AROME/INCA/nowcast). Serves Austria
and the Alpine region only; a point outside that grid returns an
out-of-coverage notice. The response states which datasets served it.
Observations decide whether and what is falling; the rest of the condition
comes from GeoSphere's weather symbol for the current hour.
Args:
latitude: Decimal latitude (e.g. 48.2208 for Vienna). Geocode city
names to coordinates yourself.
longitude: Decimal longitude (e.g. 16.3738 for Vienna).
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | ||
| longitude | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it names the underlying datasets (AROME/INCA/nowcast), discloses that out-of-grid requests yield an out-of-coverage notice rather than an error, and says the response states which datasets served it. It omits latency, caching, or rate-limit behavior, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and resource, then layers scope, provenance, and semantics in short paragraphs; each block is load-bearing. The brief note on how falling precipitation is decided is slightly tangential but reinforces trust in the result, so it earns most of its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with an output schema already present, the description covers everything an agent needs: what it returns conceptually, geographic limits, failure mode outside coverage, and parameter format. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema supplies only bare 'number' types, so the description does the real work: it specifies decimal latitude/longitude semantics, gives concrete Vienna values for both fields, and tells the agent to resolve place names itself. Without this text the parameters would be effectively undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get current weather conditions') and immediately scopes it by data source and geography. The word 'current' plus the observation/symbol explanation clearly separates it from siblings like get_hourly_forecast and get_air_quality without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a hard applicability rule (Austria and the Alpine region only, out-of-coverage point returns a notice) and an explicit responsibility for the caller (geocode city names to coordinates yourself). It stops short of routing advice such as when to prefer get_hourly_forecast or get_storm_outlook instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hourly_forecastA
Get an hour-by-hour weather forecast for a location.
High-resolution GeoSphere AROME data (1 km, up to ~60 h). Each hour's
condition is GeoSphere's own weather symbol; the precipitation chance is an
estimate derived from C-LAEF ensemble percentiles (0/30/70/95 %), not a
probability GeoSphere publishes. Serves Austria and the Alpine region only;
a point outside that grid returns an out-of-coverage notice.
Args:
latitude: Decimal latitude (e.g. 48.2208 for Vienna). Geocode city
names to coordinates yourself.
longitude: Decimal longitude (e.g. 16.3738 for Vienna).
hours: Number of forecast hours (default 24, clamped to 1–60).
start: Optional ISO 8601 start time (e.g. "2026-07-22T15:00"); the
forecast begins at/after this instant instead of now. Without
an offset it is Vienna local time, like the times in the output.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| start | No | ||
| latitude | Yes | ||
| longitude | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden, and it does disclose valuable non-obvious traits: the precipitation chance is a C-LAEF ensemble-derived estimate (0/30/70/95 %) rather than a published probability, coverage is limited and out-of-grid points yield a notice, and times are Vienna local. It does not describe errors, ordering, or rate behavior, so it is solid but not exhaustive for an annotation-free tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then a compact paragraph of caveats, then per-argument notes in a conventional Args block. The provenance paragraph is long but each sentence (resolution, symbol source, precipitation derivation, coverage, timezone) carries information an agent cannot get from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter read tool with an output schema (so return fields needn't be explained), the description covers the remaining unknowns: data source and resolution, forecast horizon, geographic coverage and failure mode, timezone convention, and clamping. Nothing material is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates: it explains latitude/longitude with concrete Vienna examples, hours with its default and 1–60 clamp, and start as an optional ISO 8601 instant with the crucial detail that a missing offset means Vienna local time matching output times.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('hour-by-hour weather forecast for a location') and immediately narrows the product: GeoSphere AROME at 1 km resolution, up to ~60 h. Combined with sibling names like get_current_weather, an agent can tell this is the multi-hour forecast tool rather than a current-conditions or air-quality tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the operative preconditions for calling it: coordinates must be supplied by the caller ('Geocode city names to coordinates yourself') and the point must fall in the Austria/Alpine grid or an out-of-coverage notice is returned. It does not explicitly say 'use get_current_weather instead when you only need present conditions', so routing to siblings is left implied by names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storm_outlookA
Get the severe-weather outlook for a location: gusts and thunderstorms.
Reports the peak wind gust within the next hour and the next 12 hours,
whether a thunderstorm is expected within the next hour, when the next
thunderstorm is expected across the whole forecast horizon, and the peak
CAPE over the next 12 hours as a diagnostic. Deliberately reports no
severity verdict — what counts as dangerous is the caller's judgement.
An hour counts as a thunderstorm when GeoSphere's weather symbol for it is
a thunderstorm, or when the C-LAEF ensemble's 90th percentiles reach
1000 J/kg CAPE and 0.1 mm precipitation (only from an ensemble run less
than 12 h old). Each thunderstorm answer names its signal: symbol,
ensemble or both. CAPE does not decide anything on its own.
High-resolution GeoSphere AROME data (1 km) and the C-LAEF ensemble. Serves
Austria and the Alpine region only; a point outside that grid returns an
out-of-coverage notice.
The thunderstorm scan covers the forecast horizon, nominally ~60 h but
shorter after publication lag or when a run is stale or truncated. A "none
in the next N h" answer names the horizon it actually covered; it is not
an all-clear beyond that. "Thunderstorm expected" is unknown only when no
forecast hour falls in its window.
Horizons round up to whole hours: the "next hour" window covers the hour
already under way plus the next one. A thunderstorm timestamp at or before
the current time means one is already in progress.
Args:
latitude: Decimal latitude (e.g. 48.2208 for Vienna). Geocode city
names to coordinates yourself.
longitude: Decimal longitude (e.g. 16.3738 for Vienna).
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | ||
| longitude | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantially well: it discloses the coverage boundary and the out-of-coverage notice, the definition logic for a thunderstorm hour, stale-run handling, truncated horizons, and the "already in progress" timestamp semantics. It omits units for peak gust and CAPE (km/h vs m/s, J/kg is stated only for CAPE thresholds) and says nothing about error or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line summary, then structured into return content, detection logic, data sources/coverage, horizon semantics, and args. It is on the long side, and the opening enumeration of return values partly duplicates what the output schema already declares — that portion is the weakest use of space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema, the description covers what the schema cannot: detection criteria, coverage limits, horizon rounding, staleness, and the deliberately verdict-free contract. Missing units and any error-mode detail are the remaining gaps, but nothing needed to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description is the only source of parameter meaning — and it supplies it: decimal degrees with concrete Vienna examples, plus the explicit instruction to geocode city names to coordinates yourself, and a note that points outside the grid are rejected. It does not state valid ranges or what happens with malformed input, but the essential semantics are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ("Get the severe-weather outlook") and immediately enumerates the distinct outputs — peak gust, thunderstorm presence/timing, peak CAPE — which separates it from get_current_weather and get_hourly_forecast in substance. It never names the siblings explicitly, so an agent must infer that this is the gust/storm-specific tool rather than a general forecast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied rather than stated: it makes clear the tool is diagnostic-only ("Deliberately reports no severity verdict") and geographically restricted to Austria/Alpine, which does route some callers away. But there is no explicit comparison to get_hourly_forecast or get_current_weather — the agent is left to infer that hourly conditions belong to the sibling and storm/convective signals belong here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.4.0- Added
get_air_quality - Removed
get_daily_forecast - Added
get_storm_outlook
3 tool updates
v0.1.0- First observed
get_current_weather - First observed
get_daily_forecast - First observed
get_hourly_forecast
TDQS
Scored across 4 tools
Each tool has a distinct role: current conditions, air quality, general hourly forecasts, or specialized severe-weather diagnostics. Although the forecast tools share underlying data and overlapping time windows, their outputs and intended uses are clearly differentiated.
All four tools use consistent snake_case names with the same get_ prefix. The remaining name components clearly identify the weather product being retrieved.
Four tools are appropriate for this tightly scoped Austria and Alpine weather service. Each addresses a meaningful workflow without adding redundant or overly granular operations.
The set covers current weather, short-range hourly forecasting, severe-weather outlooks, and air quality, which supports the core read-only workflows well. Coordinate-only location inputs require external geocoding, and there is no longer-range or daily forecast summary, but these are minor limitations that agents can work around.
Maintenance
Related MCP Connectors
MCP server for weather with reasoning — umbrella advice, outdoor checks, city comparisons.
Hosted MCP server for Xweather weather data: conditions, forecasts, alerts, and more.
An MCP server for weather information by @kulybaba
An MCP server for weather information by @kulybaba
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server that provides current weather and forecasts via Open-Meteo API, with an optional ML-based next-day max temperature prediction.-
- AlicenseAqualityCmaintenanceMCP server for weather forecasts via Open-Meteo (no API key needed), providing current weather, hourly, and daily forecasts with geocoding support.3MIT
- AlicenseNot gradedqualityDmaintenanceMCP server providing weather data via the Open-Meteo API, including geocoding, current conditions, daily and hourly forecasts, and city lookup. No API key required, with support for multiple units and transport types.1MIT
- FlicenseNot gradedqualityCmaintenanceMCP server that provides current weather, multi-day forecasts, umbrella recommendations, severe weather alerts (US), and side-by-side city comparisons using Open-Meteo and NWS APIs, with no API key required.-