Smarter Weather
Server Details
Smarter Weather MCP: forecasts, alerts, outlooks, observations, AQI, grids, and map imagery.
- Status
- Healthy
- Uptime
- 94.2% over 66 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- smarterweather/developer
- GitHub Stars
- 1
TDQS
Scored across 14 tools
The forecast family is well delineated: get_forecast is the aggregated overview, get_hourly_forecast is hourly, get_forecast_distribution is probabilistic, and query_dataset is raw series. Geocoding tools cleanly split place-to-coordinates (search_locations) from coordinates-to-place (reverse_geocode). Minor overlap remains because get_forecast bundles current conditions, alerts, and daily outlooks that dedicated tools also surface, though the descriptions explicitly tell agents when to prefer the lower-level tools.
All 14 tools use snake_case with a predictable verb_noun structure (get_*, list_*, search_*, describe_*, query_*, reverse_geocode). No camelCase or mixed conventions appear, and the verbs accurately signal each tool's action.
Fourteen tools fit comfortably within the well-scoped 3-15 range and each supports a distinct capability: forecasts, observations, alerts, dataset discovery/querying, geocoding, and platform/freshness context. The set does not feel padded; low-level dataset tools are justified by the server's gridded-data scope.
Core weather workflows are covered: current conditions, forecast, hourly, probabilistic guidance, alerts, observed precipitation, platform status, and location resolution. However, descriptions reference tools that are not present in this set — get_observations, get_period_totals, and get_outlooks — creating dead ends for station observations, planning totals, and SPC severe outlooks that an agent may need.
Available Tools
14 toolsdescribe_datasetDescribe datasetARead-onlyIdempotentInspect
A dataset's variables (standard names, units, display units, categories, bands), horizon, step, cadence, freshness, cost class and an example_query for query_dataset. Example: {"dataset_id": "nbm_conus"}.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Pipeline dataset identifier (e.g. "nbm_conus", "mrms_reflectivity_conus"). Discover valid values with list_datasets; inspect variables with describe_dataset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| detail | Yes | |
| dataset_id | Yes | |
| attribution | No | Attribution the dataset licence requires. Cite it when quoting these values. |
| data_status | No | Present only when the data service could not answer: a cached copy, or catalog facts without freshness. |
| example_query | No | query_dataset arguments for this dataset; add a location. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), so the description's job is context — and it delivers by disclosing the full inventory of metadata fields returned, plus an example payload, which lets an agent judge whether the call is worth making. It doesn't discuss failure behavior for unknown dataset_ids or response size, keeping it short of 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-loaded with the highest-value information (what variables/fields you get), followed by a compact concrete example. The content list is dense but every item is informative; the only flaw is the missing verb that would make the opening sentence grammatical.
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?
An output schema exists, so return structure needn't be explained, and the description nonetheless summarizes the payload's contents; annotations cover the safety profile and the single parameter is fully documented in schema. Nothing an agent needs in order to call this correctly is missing.
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?
With 100% schema description coverage and a single required dataset_id that already carries examples ('nbm_conus', 'mrms_reflectivity_conus') and a pointer to list_datasets, the schema does the work. The description repeats the example value but adds no new semantics such as identifier stability or lookup behavior, so baseline 3 applies.
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 enumerates precisely what metadata is returned (variables with standard names/units/display units/categories/bands, horizon, step, cadence, freshness, cost class, plus an example_query), which is specific and distinguishable from the sibling query_dataset. It loses a point because it is written as a noun-phrase fragment with no leading verb ('Returns…'/'Describes…'), leaving the exact action slightly implicit.
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 is only implied: by naming 'example_query for query_dataset' it hints at the describe-then-query workflow, and the example call shows the shape of a correct invocation. There is no explicit statement of when to call this instead of list_datasets or query_dataset, and no exclusions or prerequisites are given in the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_alertsGet NWS alertsARead-onlyIdempotentInspect
NWS watches, warnings, advisories. Point (city/ZIP/lat+lon): containing polygons. BBox or US state/DC/CONUS (codes, full names, US/national): intersecting polygons. A city miss is not a statewide all-clear — query the state or a bbox; never say regional inventory is impossible. NY/WA and "New York State"/"Washington State" are states; "New York"/"Washington" stay cities. Omit at for now; at (ISO-8601 UTC) is the snapshot then. Empty = all-clear or purged (~24h). alert_id = detail+geometry, ignores at. Ex: {"location":"WI","events":["Tornado Warning"]}.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | ISO-8601 UTC past instant for the in-effect snapshot. Ignored with alert_id. | |
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| bbox | No | Bounding box {west,south,east,north}; west/east are negative in the US. Skips geocoding; intersecting polygons. | |
| events | No | Optional event-name filter, e.g. ["Tornado Warning"]. | |
| alert_id | No | Alert identifier for detail mode. When set, location is ignored. | |
| location | No | Free-text place: "City, ST" (e.g. "Portland, OR"), US ZIP, venue/address where enabled, or "lat,lon". Use this OR lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| alert | No | |
| alerts | No | |
| widget | No | sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore. |
| alert_id | No | |
| location | No | |
| valid_time | No | Echo of at when an as-of snapshot was requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only, idempotent annotations, it discloses important behavioral semantics: point queries use containment, bbox/state queries use intersection, empty results may mean all-clear or purged data (~24h), and `alert_id` mode returns detail plus geometry while ignoring `at`. This is substantive context an agent needs to interpret results correctly.
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 and front-loaded, with every clause carrying useful information. However, the fragmentary, telegraphic style makes some mode distinctions harder to parse than necessary, and a short structured list would improve scanability.
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 complex 7-parameter tool with multiple query modes, nested bbox, and no required parameters, the description covers the critical routing logic, spatial semantics, time behavior, alert-detail behavior, and empty-result interpretation. Since an output schema exists, it need not explain return fields.
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?
Although schema coverage is 100%, the description adds non-obvious parameter meaning: spatial containment vs intersection by mode, state-code/full-name handling for NY/WA versus city names, `at` as a snapshot time that should be omitted for current results, and `alert_id` ignoring `at`. It also gives a concrete `events` filter example.
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 makes clear that this returns NWS watches, warnings, and advisories, and it distinguishes point, bbox/state, and alert-detail query modes. It is specific about the resource but relies on a noun phrase rather than an explicit verb, and the telegraphic style slightly obscures the core action.
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 explicitly explains when to use point queries (containing polygons) versus bbox or state queries (intersecting polygons), warns that a city miss is not a statewide all-clear, and tells the agent to query the state or bbox instead. It also gives clear guidance on omitting `at` and on `alert_id` detail mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_conditionsGet current conditionsARead-onlyIdempotentInspect
Current weather right now at a location from two independent sources in one call: the RTMA gridded analysis (exact-point values, updated sub-hourly) and the nearest METAR station observation (ground truth with raw METAR, flight category). Use the analysis for point-accurate values and the station for verification. Analysis fields: temperature_2m, dew_point_2m, relative_humidity_2m (derived here from temperature and dew point; listed in analysis.derived), wind_speed_10m, wind_direction_10m, wind_gusts_10m, surface_pressure (station pressure at ground level, not sea-level pressure), visibility, cloud_cover, cloud_ceiling, in units (labels in analysis.unit_labels). nearest_station is the station's own report, unconverted. For a forecast, use get_forecast. Example: {"location": "Pella, IA"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| units | No | imperial (default; °F, mph, inHg, mi, ft) or metric (°C, km/h, hPa, km, m); si returns K, m/s, Pa, m. si is deprecated and will be removed; use metric. Not applied to nearest_station. | imperial |
| location | No | Free-text place: "City, ST" (e.g. "Portland, OR"), US ZIP, venue/address where enabled, or "lat,lon". Use this OR lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| units | Yes | |
| analysis | Yes | |
| location | Yes | |
| nearest_station | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, and non-destructive; the description adds meaningful provenance and semantics beyond that — sub-hourly update cadence, that relative_humidity_2m is derived rather than observed, that surface_pressure is station pressure not sea-level, and that nearest_station is unconverted by units. It does not disclose behavior when a source is unavailable (e.g., no nearby METAR station, RTMA coverage limits), which is the remaining gap for a dual-source 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?
The opening sentence and the get_forecast redirect are well front-loaded, but the long enumeration of analysis fields (temperature_2m, dew_point_2m, wind_speed_10m, etc.) duplicates the output schema and does not earn its space. The description is roughly twice the length needed given that a return schema exists.
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?
With an output schema present, the field list is redundant rather than necessary, and the core need — what the tool returns conceptually (two sources, one derived field, unit handling) and when to prefer it — is covered. The gap is failure/coverage behavior: nothing tells the agent what happens when no METAR station is nearby or when RTMA is out of coverage.
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 100%, so the schema already documents lat, lon, units, and location including formats, ranges, and the default. The description's parameter-relevant additions are marginal — the example shows the location form and it notes units labels live in analysis.unit_labels, but most of its detail is about output fields rather than inputs.
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 ('Current weather right now at a location') plus the scope differentiator that defines it: two independent sources (RTMA gridded analysis and nearest METAR station) in one call. The sibling get_forecast is explicitly carved out, so an agent can distinguish it from adjacent tools without opening a schema.
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 explicit routing: 'Use the analysis for point-accurate values and the station for verification' and 'For a forecast, use get_forecast.' It also provides a concrete invocation example, leaving nothing to inference about when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forecastGet forecastARead-onlyIdempotentInspect
Complete weather overview for a location: current conditions, daily forecast (SPC threats, severity; view "detailed" adds CAPE, UV, full day/night periods), active alerts, and outlooks in one call. Pre-aggregated across NBM, HRRR, GFS, RTMA, and SPC and unit-converted server-side. Primary weather tool; reach for lower-level tools only when you need raw observations or a specific dataset. Times are UTC ISO 8601; quote daily[].astro.local to users, not UTC. If forecast.location.timezone_resolved is false, zone unknown: state times as UTC, never as local. Accepts a place name directly. Examples: {"location": "Denver, CO"} or {"location": "Portland, OR", "days": 5} or {"lat": 41.4, "lon": -92.9}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| days | No | Number of forecast days (1-14). Default 10. | |
| view | No | concise (default; REST's is detailed), ~5-10KB: daily has day_precip_probability / night_precip_probability (precip_probability is their max). detailed, ~12-20KB: adds CAPE, UV, full day/night periods, extra hourly fields. | |
| units | No | Units of every value in and out: imperial (default; °F, mph, in) or metric (°C, km/h, mm). si is deprecated and will be removed; use metric. | imperial |
| include | No | Comma-separated sections: current, daily, hourly, alerts, outlooks. Default "current,daily,alerts,outlooks". Use get_hourly_forecast for hourly detail. | current,daily,alerts,outlooks |
| location | No | Free-text place: "City, ST" (e.g. "Portland, OR"), US ZIP, venue/address where enabled, or "lat,lon". Use this OR lat+lon, not both. | |
| detail_level | No | Deprecated alias of view. |
Output Schema
| Name | Required | Description |
|---|---|---|
| units | Yes | |
| widget | No | sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore. |
| forecast | Yes | |
| location | Yes | |
| data_status | No | Present only when the platform reports degraded/outage data sources: overall state, a caveat note, and the affected sources. Absent means no advisory was available -- not a freshness guarantee. See get_platform_status for the full document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent, so the description's job is to add operational context — and it does: server-side aggregation across NBM/HRRR/GFS/RTMA/SPC, server-side unit conversion, response size bands (~5-10KB vs ~12-20KB), and the timezone_resolved=false fallback requiring UTC-only phrasing. These are non-obvious behaviors an agent cannot infer from the schema.
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 purpose and the sibling routing rule, then constraints, then examples — a sensible order with no filler sentences. It is dense and on the long side, but nearly every clause carries usable information.
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?
With an output schema present the description needn't document return fields, yet it still flags the one output-derived hazard (timezone_resolved) and the per-day astro.local convention. Combined with the 8-param schema and rich annotations, an agent has everything needed to call this correctly.
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 100%, so the baseline is 3, but the description adds genuine meaning: it clarifies that a place name is accepted directly, shows three concrete invocation shapes, and notes the UTC/local quoting rule tied to the returned astro field. It stops short of deep per-parameter guidance beyond what the schema already documents.
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 ("Complete weather overview for a location") and enumerates exactly what comes back: current conditions, daily forecast with SPC threats, alerts, outlooks. It also positions itself against siblings explicitly as the "Primary weather tool" versus lower-level tools for raw observations.
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 clear when-to-use rule (primary tool; reach for lower-level tools only for raw observations or a specific dataset) and names the concrete alternative for hourly detail (get_hourly_forecast, repeated in the include param). The view="detailed" tradeoff is spelled out so the agent can pick a mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forecast_distributionGet forecast distributionARead-onlyIdempotentInspect
NBM probabilistic guidance for one weather aspect: percentiles (p10-p90), exceedance probabilities and ensemble spread. Use this for any question about odds, ranges, potential or confidence ("how much could we get", "range of possible highs", "how sure is this") -- a deterministic forecast value cannot answer one. Reading the percentiles: p50 is the most likely outcome, p90 is the reasonable worst case when the risk is the high end (snow totals, wind, rainfall), and p10 when the risk is the low end (cold, visibility, ceiling). A single percentile is not the forecast -- report the likely value with the tail that matters, and label which is which. Aspects: precip (PoP, QPF + percentiles), snow (accumulation percentiles, >1/2/4in probabilities, snow level, snow-type probability), ice (ice accretion, freezing-rain / ice-pellet probabilities), temperature (daily high/low p10/p50/p90: the NBM value -/+ 1.28 stddev; hourly temp + stddev), wind (speed/gust percentiles), severe (thunderstorm probability plus NBM CWASP, a severe-environment index, both in percent: severe_weather_prob_p50 is the median CWASP value and severe_weather_prob_above_75 the probability CWASP exceeds 75; NBM has no tornado, hail or damaging-wind odds; SPC's: get_outlooks (guidance) hazard=severe), aviation (LIFR/IFR/MVFR visibility + ceiling odds), confidence (ensemble stddev; low = settled, high = details still in play). Labels in unit_labels. Example: {"location": "Denver, CO", "aspect": "snow", "hours": 72}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| hours | No | Forecast hours; default 48-72 by aspect. | |
| units | No | imperial (default; °F, mph, in) or metric. si is deprecated and will be removed; use metric. | imperial |
| aspect | Yes | Distribution family (see description). | |
| location | No | Free-text place: "City, ST" (e.g. "Portland, OR"), US ZIP, venue/address where enabled, or "lat,lon". Use this OR lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| daily | No | |
| hours | Yes | |
| units | Yes | |
| aspect | Yes | |
| series | Yes | |
| location | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world behavior. The description adds substantial interpretation guidance beyond that, explaining how to read p10/p50/p90, that a single percentile is not the forecast, and what confidence spread means.
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 purpose and usage guidance are front-loaded, and most sentences earn their place by explaining interpretation or aspect coverage. It is dense and the aspect enumeration is somewhat run-on, but it is not padded with generic filler.
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?
An output schema exists, so the description is not obligated to explain return structure. It still completes the agent's context by explaining how to interpret probabilistic outputs, which aspects exist, and how to report percentile guidance correctly.
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 100%, so the schema already documents parameter names, ranges, and enums. The description adds useful meaning beyond that, especially by unpacking each aspect value (precip, snow, ice, temperature, wind, severe, aviation, confidence) and noting that output labels appear in unit_labels.
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 resource and output type: 'NBM probabilistic guidance for one weather aspect: percentiles (p10-p90), exceedance probabilities and ensemble spread.' It explicitly distinguishes itself from deterministic forecast siblings by saying a deterministic forecast value cannot answer odds/range/confidence questions.
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 gives explicit when-to-use criteria: 'Use this for any question about odds, ranges, potential or confidence' and rules out deterministic forecasts. It also names the alternative for severe-weather hazard odds with 'SPC's: get_outlooks (guidance) hazard=severe.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hourly_forecastGet hourly forecastARead-onlyIdempotentInspect
Blended hourly forecast: temperature, feels-like, humidity, wind, precipitation probability/amount, conditions, and icon per hour. hourly[0] is the current or next hour; hourly_coverage.first_time says which. Timestamps are UTC ISO 8601; convert to the local timezone before presenting. Ask for the days you need up front -- one call with days: 4 beats four calls. ALWAYS check hourly_coverage before answering about a specific hour: it reports first_time and last_time (the window the rows actually span), sample_interval_hours (past the first day rows are every 2-3h, not every hour), and truncated: true when upstream returned less than you asked for. If the hour the user cares about is after last_time, say the forecast does not reach that far yet rather than answering from the nearest row you do have. For one stretch of time ask for that stretch with hours_from/hours_to: it comes back hour by hour even where the full range would be sampled. Accepts a place name or coordinates. Examples: {"location": "Portland, OR", "days": 2} or {"lat": 41.88, "lon": -87.63, "hours_from": 36, "hours_to": 48}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| days | No | Days of hourly data (1-7). Default 2. Widened when hours_to reaches further. | |
| view | No | concise (default) samples past 24h; detailed adds CAPE, ceiling, UV, gust and thunderstorm probability for 48h. | |
| units | No | Units of every value in and out: imperial (default; °F, mph, in) or metric (°C, km/h, mm). si is deprecated and will be removed; use metric. | imperial |
| hours_to | No | Window end, in hours from now, exclusive. 36 to 48 is hours 36-47. | |
| location | No | Free-text place: "City, ST" (e.g. "Portland, OR"), US ZIP, venue/address where enabled, or "lat,lon". Use this OR lat+lon, not both. | |
| hours_from | No | Window start, in hours from now (0 = the current hour). | |
| detail_level | No | Deprecated alias of view. |
Output Schema
| Name | Required | Description |
|---|---|---|
| units | Yes | |
| widget | No | sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore. |
| forecast | Yes | |
| location | Yes | |
| data_status | No | Present only when the platform reports degraded/outage data sources: overall state, a caveat note, and the affected sources. Absent means no advisory was available -- not a freshness guarantee. See get_platform_status for the full document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnly/idempotent annotations: it discloses that rows beyond the first day are sampled every 2-3h, that hourly_coverage exposes first_time/last_time/sample_interval_hours/truncated, that timestamps are UTC, and that out-of-window hours should be refused rather than substituted. This is the kind of behavior an agent could not learn from the schema alone.
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 payload summary, then escalating operational rules, ending with examples. Fairly long at roughly 180 words, and the coverage/truncation guidance repeats the same idea across two sentences, but nearly every clause is actionable rather than filler.
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 9-parameter, fully-annotated, output-schema-backed read tool, nothing an agent needs is missing: coverage semantics, sampling caveats, timezone handling, and call-shaping advice are all present, and return-value shape is left to the output schema.
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 100%, so the baseline is 3; the description adds real meaning on top by explaining that hours_from/hours_to returns a dense hour-by-hour window even where the full range would be sampled, and by showing worked examples for both location and lat/lon invocation styles.
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+resource+field list: "Blended hourly forecast: temperature, feels-like, humidity, wind, precipitation..." and clarifies row zero semantics ("hourly[0] is the current or next hour"). The hourly granularity and 'blended' framing distinguish it from sibling daily/current tools like get_forecast and get_current_conditions.
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 concrete when-to-use rules: batch days up front ("one call with days: 4 beats four calls"), and use hours_from/hours_to for a contiguous stretch. It does not explicitly name sibling tools such as get_forecast or get_current_conditions, so the agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_observed_precipitationObserved precipitationARead-onlyIdempotentInspect
How much rain fell: observed precipitation totals at a location. Use for "did it rain", "how much rain fell", "rain in the last 24 hours / since yesterday". Source: MRMS MultiSensor QPE Pass2 (radar bias-corrected to rain gauges) over 1/3/6/24/48/72 h windows (CONUS; 1 h only in Alaska and Hawaii). Values have about 2 mm (0.08 in) resolution, so 0 means under about 1 mm; data runs about an hour behind real time. Pass at (within 33 h) for totals ending at a past time (newest frame up to 3 h before it). With include_nowcast (default) it also returns a next-hour radar nowcast (CONUS): peak intensity (light/moderate/heavy), type and start time, not an amount. Forecast totals past the next hour: get_period_totals (planning); station reports: get_observations (observed).
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | RFC3339 end time within the last 33 h. Default: latest. | |
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| units | No | Units of every value in and out: imperial (default; °F, mph, in) or metric (°C, km/h, mm). si is deprecated and will be removed; use metric. | imperial |
| windows | No | Accumulation windows ending at the latest frame (or at `at`). | |
| location | No | Free-text place: "City, ST" (e.g. "Portland, OR"), US ZIP, venue/address where enabled, or "lat,lon". Use this OR lat+lon, not both. | |
| include_nowcast | No | Next-hour radar nowcast (CONUS; ignored with `at`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| as_of | No | |
| notes | No | |
| units | Yes | |
| derived | Yes | |
| nowcast | No | |
| windows | Yes | |
| _sources | Yes | |
| location | Yes | |
| data_status | No | |
| quantization_step | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, yet the description still adds substantial behavior: data source (MRMS QPE Pass2, gauge bias-corrected), ~2 mm quantization meaning "0 means under about 1 mm", ~1 hour latency, the 33 h `at` bound and the 3 h staleness of the frame used for past times, and that include_nowcast is ignored when `at` is set.
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 plain-language purpose, then escalating detail (source, resolution, latency, parameter caveats, alternatives). Every sentence carries actionable information; nothing is boilerplate padding.
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?
An output schema exists, so return-value enumeration is unnecessary, and the description instead covers what the output schema can't (what a 0 value means, that nowcast is not an amount, spatial/temporal validity limits). For a 7-parameter, multi-region tool this leaves no meaningful gap for correct invocation.
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 100%, so the baseline is 3; the description goes beyond it by explaining the temporal semantics of `at` (totals ending at a past time, newest frame up to 3 h before it) and clarifying that the nowcast is an intensity/type/start-time signal rather than an accumulation. Some of this restates schema text (e.g., "ignored with `at`"), keeping it short of a 5.
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 quantity (observed precipitation totals at a location) with plain-language verb framing ("How much rain fell") and concrete query intents ("did it rain", "rain in the last 24 hours"). It explicitly distinguishes itself from get_period_totals (forecast past next hour) and get_observations (station reports), so an agent can route without opening sibling schemas.
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 explicit when-to-use phrasing plus named alternatives with the condition that selects them ("Forecast totals past the next hour: get_period_totals (planning); station reports: get_observations"). It also states coverage boundaries (CONUS; 1 h only in Alaska and Hawaii), which acts as a de facto when-not rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_platform_statusGet platform statusARead-onlyIdempotentInspect
Current data-freshness status of the weather platform: overall state, per-source states (ok / degraded / outage / no_signal), open incidents with cause attribution (provider outage vs internal processing delay), and active provider advisories. Use this when a user asks whether data is current, when other tools return surprisingly stale data, or before presenting time-critical weather. If a source is degraded or in outage, tell the user their data may be stale rather than presenting it as live. No inputs. Refreshed about every 5 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| include_ok | No | true: list every monitored source including healthy ones. false (default): only sources that are not ok, keeping the response compact. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| overall | Yes | Worst state across customer-facing data sources; "unknown" when status is unavailable. |
| sources | No | |
| advisories | No | |
| generated_at | No | When the status document was generated (UTC). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely useful context the annotations cannot carry: the ~5-minute refresh cadence and the meaning of the four source states. However, it doesn't state whether incidents/advisories are always present, how far back incidents are reported, or the response's size/shape despite the include_ok toggle doing exactly that.
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 payload is front-loaded (what it returns, then when to call it, then how to interpret it, then cadence), and each sentence adds a distinct fact. No filler or restatement of the tool name.
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?
An output schema exists and annotations cover the safety profile, so the description doesn't need to explain return values. What remains — the freshness semantics, the state vocabulary, the degradation message, and the refresh interval — is all present, which is exactly enough for an agent to call and interpret this correctly.
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 100% and the single include_ok parameter is fully documented in the schema, so the baseline applies. The description's 'No inputs' is slightly at odds with the existence of an optional parameter and could cause an agent to overlook the include_ok toggle when it wants a full source list, which is a minor loss of value rather than a gain.
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 names the specific resource and enumerates the four things it returns: overall state, per-source states, incidents with cause attribution, and provider advisories. That distinguishes it clearly from the data-fetching siblings (get_forecast, get_current_conditions), which return weather rather than platform health.
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 gives three explicit triggers (user asks whether data is current, other tools return surprisingly stale data, before presenting time-critical weather) and adds a behavioral instruction for the degraded case: tell the user data may be stale rather than presenting it as live. That is when-to-use plus how-to-act, not just context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_time_contextGet time contextARead-onlyIdempotentInspect
Complete temporal context for a location: local time, timezone, 14-day calendar with day names and Today/Tomorrow offsets, sunrise/sunset/solar times (from the weather pipeline's astro product), and moon phase. Use whenever you need to reason about dates, times, or daylight for a location -- including "what time is sunset?", "is it dark there now?", or "what day of the week is the 4th-day forecast?". If current_time.timezone_resolved is false, zone unknown: state times as UTC, never as local. Accepts a place name directly. Example: {"location": "Seattle, WA"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| location | No | Free-text place: "City, ST" (e.g. "Portland, OR"), US ZIP, venue/address where enabled, or "lat,lon". Use this OR lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| moon | Yes | |
| calendar | Yes | |
| daylight | Yes | |
| location | Yes | |
| current_time | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds genuinely non-obvious behavior: the fallback rule when current_time.timezone_resolved is false (report as UTC, never local) and the provenance of solar data via the weather pipeline's astro product.
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 sentences are front-loaded with the returned content and then the usage triggers, so the key information lands early. It is dense but nearly every clause carries useful detail, with only slight redundancy in the example after the schema already explains the location parameter.
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?
An output schema exists, so return-value structure need not be explained. Given that, the description is complete for a 3-param, zero-required, open-world lookup tool: it covers contents, invocation triggers, the timezone-unknown edge case, and accepted input forms.
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 100%, so lat, lon, and location are already fully documented, including the 'use this OR lat+lon' rule. The description only restates that a place name is accepted and adds a small example payload, which is marginal value over 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 names a specific resource and enumerates its contents: local time, timezone, 14-day calendar with Today/Tomorrow offsets, sunrise/sunset/solar times, and moon phase. This clearly separates it from siblings like get_current_conditions or get_forecast, which cover weather rather than temporal context.
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 gives explicit triggering conditions ('Use whenever you need to reason about dates, times, or daylight') plus three concrete example questions that map to the tool. It lacks an explicit exclusion or named alternative for overlapping cases, but the usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datasetsList datasetsARead-onlyIdempotentInspect
Discover the gridded datasets (model grids, analyses) available at a location, or every public one when none is given, keyed by dataset_id. At a point: its domain (CONUS/Alaska/Hawaii) plus global grids, with freshness where tracked (latest model run as latest_run, latest_time, data_age_seconds, freshness_status). Use this to find dataset_id values for query_dataset or check whether data is current. Variables, units and standard names come from describe_dataset. Example: {"location": "Anchorage, AK"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| location | No | Free-text place: "City, ST" (e.g. "Portland, OR"), US ZIP, venue/address where enabled, or "lat,lon". Use this OR lat+lon, not both. | |
| include_freshness | No | Include latest model run and data age where tracked. Default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| domain | No | |
| datasets | Yes | |
| location | No | |
| data_status | No | Present only when freshness was asked for and the data service did not provide it, or answered from a cached copy. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is read-only, idempotent, non-destructive, and open-world. The description adds meaningful behavioral context beyond those hints: behavior with versus without a location, inclusion of domain-specific and global grids, and freshness fields such as latest_run and data_age_seconds. It does not discuss auth or rate limits, but its behavioral disclosure is still strong.
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 front-loaded with the core purpose and scope, then adds freshness behavior, routing guidance, and a compact example. The density is appropriate for the amount of routing and freshness information an agent needs, with no filler sentences.
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?
Although this is a relatively complex discovery tool with freshness tracking, an output schema is present and annotations cover the safety profile. The description supplies the remaining decision-critical context: how location affects results, what freshness information appears, and which sibling tools consume the output.
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 100%, so the schema already documents the four parameters. The description nevertheless adds semantic meaning about what the absence of a location means (every public dataset) and how a point query scopes results to a domain plus global grids, which goes beyond the parameter descriptions alone.
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 uses a specific verb ('Discover') with a precise resource ('gridded datasets'), and it defines the tool's scope as location-scoped or all-public when no location is supplied. It also names the sibling tools it feeds into (query_dataset) and where variable metadata lives (describe_dataset), so an agent can distinguish it from siblings without opening schemas.
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 explicitly states when to use this tool: to find dataset_id values for query_dataset or to check whether data is current. It also routes variable/unit discovery to describe_dataset, giving a clear alternative and avoiding misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_datasetQuery datasetARead-onlyIdempotentInspect
Raw time series of one dataset's variables at a point, with unit labels: any gridded product (NBM, HRRR, RRFS, GFS, RTMA, MRMS, air quality, ...). Time modes: hours (default 24), time_start+time_end (ISO 8601), or latest=true (newest value). Up to 168 frames: when truncated, send next_cursor as cursor with the same arguments. reference_time pins a model run; each series reports its run (reference_time, or reference_times when runs mix); runs older than about 48 h may be gone. For blended forecasts use get_forecast. Examples: {"location": "Denver, CO", "dataset_id": "rrfs_surface", "variables": ["temperature_2m"], "hours": 18} or {"lat": 41.4, "lon": -92.9, "dataset_id": "rtma_conus", "variables": ["temperature_2m"], "latest": true}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| hours | No | Hours from now (1-264): ahead, or back on analyses (default: newest 166 frames); from the run start with reference_time. | |
| units | No | imperial | |
| cursor | No | next_cursor of the previous page. | |
| latest | No | Only the newest value (analyses like RTMA/MRMS). | |
| location | No | Free-text place: "City, ST" (e.g. "Portland, OR"), US ZIP, venue/address where enabled, or "lat,lon". Use this OR lat+lon, not both. | |
| time_end | No | ISO 8601 window end (with time_start). | |
| variables | Yes | Standard names (e.g. temperature_2m, precipitation); see describe_dataset. | |
| dataset_id | No | Default: the NBM dataset for the location (nbm_conus/nbm_alaska/nbm_hawaii). Discover with list_datasets. | |
| time_start | No | ISO 8601 window start (with time_end). | |
| reference_time | No | Pin a specific model run (ISO 8601). Default: latest run. |
Output Schema
| Name | Required | Description |
|---|---|---|
| units | Yes | |
| series | Yes | |
| location | Yes | |
| truncated | Yes | |
| attribution | No | Attribution the dataset licence requires. Cite it when quoting these values. |
| data_status | No | Present only when the data service did not answer and a cached copy was served. |
| next_cursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description adds real operational behavior beyond them: a 168-frame truncation limit with cursor reuse under the same arguments, run pinning via reference_time, and a retention caveat that runs older than ~48 h may be gone. It also discloses that each series carries reference_time (or reference_times when runs mix), which an agent must know to interpret mixed output.
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 core capability, then time modes, then pagination and retention, then two worked examples. Dense but every line carries operational information; the two full JSON examples are the only slightly expensive element, and they earn their space by showing location-vs-lat/lon usage.
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 12-parameter read tool with an output schema (so return shape need not be explained) and full annotation coverage, the description supplies exactly what is missing: time-mode selection, pagination recovery, run pinning and retention. Nothing needed to invoke it correctly is absent, aside from the minor hours-default ambiguity.
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 92%, so the baseline is 3; the description still adds cross-parameter meaning the schema lacks, notably that cursor must be re-sent with the identical arguments and how reference_time shifts the meaning of hours to run-relative. Minor friction: it states 'hours (default 24)' and 'up to 168 frames' while the schema says hours defaults to 'newest 166 frames' with a max of 264, and the units parameter is never mentioned in the description.
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 noun phrase: raw time-series of one dataset's variables at a point, with unit labels, and enumerates the product families covered (NBM, HRRR, RTMA, MRMS, etc.). It explicitly contrasts itself with get_forecast for blended forecasts, so an agent can separate it from that sibling without reading schemas.
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 concrete selection conditions: three time modes (hours, time_start+time_end, latest) and the rule to use get_forecast for blended output. It does not distinguish itself from other near siblings such as get_hourly_forecast or get_current_conditions, so the routing guidance is strong but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reverse_geocodeReverse geocodeARead-onlyIdempotentInspect
Resolve coordinates to a human-readable place (city, state, county, timezone). Use when you have lat/lon but need a display name or the local timezone. Example: {"lat": 39.74, "lon": -104.99} -> Denver, Colorado, America/Denver.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | Yes | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). |
Output Schema
| Name | Required | Description |
|---|---|---|
| lat | Yes | |
| lon | Yes | |
| place | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, open-world, non-destructive, so the safety profile is covered. The description adds useful behavioural detail beyond that: the concrete output example shows what a lookup actually yields, including the timezone string format, which tells the agent what to expect to consume. Auth, rate limits, and ambiguity handling are not mentioned.
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?
Three tight sentences: what it does, when to use it, then a worked example. Purpose and trigger are front-loaded and nothing is wasted.
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?
An output schema exists so return structure need not be documented, yet the description still previews the returned fields and gives an example mapping. For a two-parameter readonly lookup, nothing an agent needs in order to call it correctly is missing.
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 100%, so both lat and lon are already documented with ranges and sign conventions. The description only restates the pairing via the example call, adding little meaning beyond the schema; a baseline 3 is appropriate.
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 — resolve coordinates to a human-readable place — and enumerates the returned fields (city, state, county, timezone). It does not name the sibling search_locations, which is the obvious forward-geocoding counterpart, so the differentiation is implicit rather than explicit.
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?
"Use when you have lat/lon but need a display name or the local timezone" gives a clear selecting condition and cleanly implies this is for coordinate input rather than name input. There is no explicit when-not statement or named alternative tool, which keeps it 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.
search_catalogSearch catalogARead-onlyIdempotentInspect
Find which dataset answers a weather question when no dedicated tool fits: ranks the data catalog (model grids, radar, satellite, outlooks, observations) by the question's words and returns the best datasets with variable, units, cadence, a one-line why and the exact call (tool and arguments) to run next. Pass lat/lon, or domain, to keep only datasets covering the place; without one, Alaska/Hawaii twins fold into the CONUS dataset. Calls are ready for "now"; for a past time set time_start/time_end (or at where the tool supports it). Free; no network call.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude of the place (with lon). | |
| lon | No | Longitude of the place (with lat). | |
| kind | No | Only this dataset kind. | |
| limit | No | Hits to return (1-10, default 5). | |
| query | Yes | The question or keywords, in the user's words. | |
| domain | No | Coverage filter when there is no point; not with lat/lon. | |
| family | No | Only this source family (e.g. "nbm", "mrms"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes | |
| note | No | |
| query | Yes | |
| domain | No | The coverage filter applied: the point's domain, or `domain`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly/idempotent/non-destructive) by disclosing the ranking basis (question's words), the result payload (variable, units, cadence, why, exact follow-up `call`), a genuine behavioral quirk (Alaska/Hawaii twins fold into CONUS when no location filter is passed), and cost ("Free; no network call"). The AK/HI folding rule is non-obvious and would otherwise surprise an agent.
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 purpose and the routing condition, and each sentence carries real information. The closing sentence about past times is the weakest — it mixes guidance about the follow-up call into a description of this tool and creates mild ambiguity rather than removing it.
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?
An output schema exists, yet the description still usefully previews the shape of a hit and its ready-to-run `call`, covering the full search-then-execute loop. For a 7-parameter, free, offline ranking tool, nothing an agent needs in order to invoke it correctly is missing.
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 100%, so baseline is 3; the description earns above that by explaining the lat/lon-vs-domain interplay ("Pass lat/lon, or `domain`... not with lat/lon") and the consequence of omitting both. Slight deduction: the mention of `time_start`/`time_end`/`at` is ambiguous — those are arguments to the returned call, not parameters of this tool, and could be misread as search_catalog inputs.
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 ("ranks the data catalog") plus the exact problem it solves ("find which dataset answers a weather question when no dedicated tool fits"), and enumerates what the catalog contains (model grids, radar, satellite, outlooks, observations). This clearly separates it from siblings like list_datasets, describe_dataset, and query_dataset.
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 an explicit when-to-use condition ("when no dedicated tool fits") and describes the workflow: search, then run the returned `call`. However, it never names the concrete alternatives (describe_dataset, query_dataset, search_locations) an agent should prefer instead, so the routing decision still requires inference from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_locationsSearch locationsARead-onlyIdempotentInspect
Resolve a place to ranked candidates with lat/lon: city ("Denver"), "city, ST", ZIP ("50219"), or partial input with fuzzy=true ("bost" -> Boston); venues and addresses where enabled. Rows carry type place|zip|address|poi; pass a row's lat/lon to weather tools. matched_via: "autosuggest" marks rows found after the exact match missed; partial means a section timed out. Weather tools take location directly, venues included -- use this to disambiguate ("which Springfield?") or present choices.
| Name | Required | Description | Default |
|---|---|---|---|
| fuzzy | No | Autosuggest mode for partial/misspelled input. Default false (exact search). | |
| limit | No | Maximum candidates to return (1-10). Default 5. | |
| query | Yes | Place query: city, "city, state", ZIP, partial text, or venue/address where enabled. | |
| near_lat | No | Rank venues/addresses near this point; pair with near_lon. | |
| near_lon | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| partial | No | Sections that did not finish, e.g. {"poi": "timeout"}; the list may be incomplete. |
| candidates | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive behavior; the description adds meaningful fallback semantics: `matched_via: "autosuggest"` marks rows found after an exact miss, and `partial` means a section timed out. It also explains fuzzy/autosuggest mode without contradicting the annotations.
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 core purpose is front-loaded, and the sentences carry useful query formats, output flags, and weather-tool guidance without obvious filler. It is dense and semicolon-heavy, but still efficient for the amount of context it conveys.
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 rich annotations and an output schema, the description supplies enough context for correct invocation: purpose, accepted inputs, fallback flags, and how to use results with weather tools. The only remaining gap is minor `near_lon` detail, which is partly covered by the schema's `near_lat` pairing.
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 80% and the schema already documents `fuzzy`, `limit`, `query`, and `near_lat`, while `near_lon` lacks a description. The description reinforces query formats and fuzzy usage but does not add much beyond the schema or clarify the missing `near_lon` semantics, so the high-coverage baseline of 3 is appropriate.
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: 'Resolve a place to ranked candidates with lat/lon,' lists accepted query forms, and names the row types returned. It clearly establishes forward place search and its relation to weather tools, so an agent can distinguish it from reverse_geocode without opening the schema.
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?
Explicitly says weather tools take `location` directly and that this tool should be used to disambiguate or present choices, which gives a clear when-to-use vs. alternative condition. It also explains `fuzzy=true` for partial input, making the usage context concrete.
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.
14 tool updates
- Changed
describe_dataset2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_alerts2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_current_conditions2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_forecast2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_forecast_distribution2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_hourly_forecast2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_observed_precipitation2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_platform_status2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
get_time_context2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
list_datasets2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
query_dataset2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
reverse_geocode2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
search_catalog2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
search_locations2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
14 tool updates
- Changed
describe_dataset4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / data_status / propertiesAdded value: +{} - added
Output schema / properties / detail / propertiesAdded value: +{} - added
Output schema / properties / example_query / propertiesAdded value: +{}
- Changed
get_alerts21 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / bbox / additionalPropertiesRemoved value: -false - changed
Input schema / properties / bbox / descriptionPrevious value: -"Bounding box {west,south,east,north}. Skips geocoding; intersecting polygons."New value: +"Bounding box {west,south,east,north}; west/east are negative in the US. Skips geocoding; intersecting polygons." - removed
Input schema / properties / bbox / properties / east / $refRemoved value: -"#/properties/lon" - added
Input schema / properties / bbox / properties / east / maximumAdded value: +180 - added
Input schema / properties / bbox / properties / east / minimumAdded value: +-180 - added
Input schema / properties / bbox / properties / east / typeAdded value: +"number" - removed
Input schema / properties / bbox / properties / north / $refRemoved value: -"#/properties/lat" - added
Input schema / properties / bbox / properties / north / maximumAdded value: +90 - added
Input schema / properties / bbox / properties / north / minimumAdded value: +-90 - added
Input schema / properties / bbox / properties / north / typeAdded value: +"number" - removed
Input schema / properties / bbox / properties / south / $refRemoved value: -"#/properties/lat" - added
Input schema / properties / bbox / properties / south / maximumAdded value: +90 - added
Input schema / properties / bbox / properties / south / minimumAdded value: +-90 - added
Input schema / properties / bbox / properties / south / typeAdded value: +"number" - removed
Input schema / properties / bbox / properties / west / $refRemoved value: -"#/properties/lon" - added
Input schema / properties / bbox / properties / west / maximumAdded value: +180 - added
Input schema / properties / bbox / properties / west / minimumAdded value: +-180 - added
Input schema / properties / bbox / properties / west / typeAdded value: +"number" - added
Output schema / properties / alert / propertiesAdded value: +{} - added
Output schema / properties / widget / properties / entries / items / properties / props / propertiesAdded value: +{}
- Changed
get_current_conditions3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / analysis / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": { - "items": { - "type": [ - "number", - "null" - ] - }, - "type": "array" - }, - "type": "object" - }, - "dataset_id": { - "type": "string" - }, - "derived": { - "items": { - "type": "string" - }, - "type": "array" - }, - "notes": { - "items": { - "type": "string" - }, - "type": "array" - }, - "reference_time": { - "type": "string" - }, - "reference_times": { - "items": { - "type": "string" - }, - "type": "array" - }, - "unit_labels": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - "valid_times": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "dataset_id", - "valid_times", - "data" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": { + "items": { + "type": [ + "number", + "null" + ] + }, + "type": "array" + }, + "properties": {}, + "type": "object" + }, + "dataset_id": { + "type": "string" + }, + "derived": { + "items": { + "type": "string" + }, + "type": "array" + }, + "notes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "reference_time": { + "type": "string" + }, + "reference_times": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unit_labels": { + "additionalProperties": { + "type": "string" + }, + "properties": {}, + "type": "object" + }, + "valid_times": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "dataset_id", + "valid_times", + "data" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / nearest_station / anyOfPrevious value: -[ - { - "additionalProperties": {}, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_forecast4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / data_status / propertiesAdded value: +{} - added
Output schema / properties / forecast / propertiesAdded value: +{} - added
Output schema / properties / widget / properties / entries / items / properties / props / propertiesAdded value: +{}
- Changed
get_forecast_distribution8 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / daily / properties / days / items / properties / low / $refRemoved value: -"#/properties/daily/properties/days/items/properties/high" - added
Output schema / properties / daily / properties / days / items / properties / low / additionalPropertiesAdded value: +false - added
Output schema / properties / daily / properties / days / items / properties / low / propertiesAdded value: +{ + "p10": { + "type": "number" + }, + "p50": { + "type": "number" + }, + "p90": { + "type": "number" + }, + "stddev": { + "type": "number" + } +} - added
Output schema / properties / daily / properties / days / items / properties / low / requiredAdded value: +[ + "p50" +] - added
Output schema / properties / daily / properties / days / items / properties / low / typeAdded value: +"object" - added
Output schema / properties / series / items / properties / data / propertiesAdded value: +{} - added
Output schema / properties / series / items / properties / unit_labels / propertiesAdded value: +{}
- Changed
get_hourly_forecast4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / data_status / propertiesAdded value: +{} - added
Output schema / properties / forecast / propertiesAdded value: +{} - added
Output schema / properties / widget / properties / entries / items / properties / props / propertiesAdded value: +{}
- Changed
get_observed_precipitation2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / data_status / propertiesAdded value: +{}
- Changed
get_platform_status3 fields changed- changed
Output schema / properties / advisories / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Output schema / properties / sources / items / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Output schema / properties / sources / items / properties / incident / additionalPropertiesPrevious value: -trueNew value: +{}
- Changed
get_time_context5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / calendar / items / propertiesAdded value: +{} - added
Output schema / properties / current_time / propertiesAdded value: +{} - added
Output schema / properties / daylight / propertiesAdded value: +{} - added
Output schema / properties / moon / propertiesAdded value: +{}
- Changed
list_datasets4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / data_status / propertiesAdded value: +{} - changed
Output schema / properties / datasets / additionalProperties / properties / data_age_seconds / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - added
Output schema / properties / datasets / propertiesAdded value: +{}
- Changed
query_dataset5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / data_status / propertiesAdded value: +{} - added
Output schema / properties / series / items / properties / data / propertiesAdded value: +{} - changed
Output schema / properties / series / items / properties / data_age_seconds / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - added
Output schema / properties / series / items / properties / unit_labels / propertiesAdded value: +{}
- Changed
reverse_geocode2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / place / additionalPropertiesPrevious value: -trueNew value: +{}
- Changed
search_catalog2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Output schema / properties / hits / items / properties / call / properties / arguments / propertiesAdded value: +{}
- Changed
search_locations3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / candidates / items / additionalPropertiesPrevious value: -trueNew value: +{} - added
Output schema / properties / partial / propertiesAdded value: +{}
1 tool update
- Changed
list_datasets2 fields changed- added
Output schema / properties / data_statusAdded value: +{ + "additionalProperties": {}, + "description": "Present only when freshness was asked for and the data service did not provide it, or answered from a cached copy.", + "type": "object" +} - removed
Output schema / properties / freshnessRemoved value: -{ - "additionalProperties": { - "additionalProperties": false, - "properties": { - "age": { - "type": "string" - }, - "latest_time": { - "type": "string" - }, - "max_age": { - "type": "string" - }, - "status": { - "enum": [ - "fresh", - "stale", - "missing" - ], - "type": "string" - } - }, - "type": "object" - }, - "type": "object" -}
1 tool update
- Changed
describe_dataset2 fields changed- added
Output schema / properties / data_statusAdded value: +{ + "additionalProperties": {}, + "description": "Present only when the data service could not answer: a cached copy, or catalog facts without freshness.", + "type": "object" +} - added
Output schema / properties / example_queryAdded value: +{ + "additionalProperties": {}, + "description": "query_dataset arguments for this dataset; add a location.", + "type": "object" +}
1 tool update
- Changed
query_dataset17 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "next_cursor of the previous page.", + "type": "string" +} - changed
Input schema / properties / dataset_id / descriptionPrevious value: -"Dataset to query. Default: the NBM dataset for the location domain (nbm_conus/nbm_alaska/nbm_hawaii). Discover options with list_datasets."New value: +"Default: the NBM dataset for the location (nbm_conus/nbm_alaska/nbm_hawaii). Discover with list_datasets." - changed
Input schema / properties / hours / descriptionPrevious value: -"Forecast/lookahead hours from now (1-264). Default 24 when no other time mode set."New value: +"Hours from now (1-264): ahead, or back on analyses (default: newest 166 frames); from the run start with reference_time." - changed
Input schema / properties / latest / descriptionPrevious value: -"Return only the most recent value (analysis datasets like RTMA/MRMS)."New value: +"Only the newest value (analyses like RTMA/MRMS)." - added
Input schema / properties / unitsAdded value: +{ + "default": "imperial", + "enum": [ + "imperial", + "metric" + ], + "type": "string" +} - changed
Input schema / properties / variables / descriptionPrevious value: -"Standard variable names (e.g. temperature_2m, precipitation). Discover with describe_dataset."New value: +"Standard names (e.g. temperature_2m, precipitation); see describe_dataset." - added
Output schema / properties / data_statusAdded value: +{ + "additionalProperties": {}, + "description": "Present only when the data service did not answer and a cached copy was served.", + "type": "object" +} - added
Output schema / properties / next_cursorAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / series / items / properties / data_age_secondsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / series / items / properties / freshness_statusAdded value: +{ + "anyOf": [ + { + "enum": [ + "fresh", + "stale", + "missing" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / series / items / properties / relatedAdded value: +{ + "description": "With out_of_domain: a dataset that covers the point.", + "type": "string" +} - added
Output schema / properties / series / items / properties / statusAdded value: +{ + "description": "ok, unavailable, out_of_domain (see related) or not_public.", + "type": "string" +} - added
Output schema / properties / series / items / properties / unit_labelsAdded value: +{ + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "description": "Unit of each variable in data.", + "type": "object" +} - changed
Output schema / properties / series / items / requiredPrevious value: -[ - "dataset_id", - "valid_times", - "data" -]New value: +[ + "dataset_id", + "valid_times", + "data", + "unit_labels", + "status", + "data_age_seconds", + "freshness_status" +] - added
Output schema / properties / truncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / unitsAdded value: +{ + "enum": [ + "imperial", + "metric" + ], + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "location", - "series" -]New value: +[ + "location", + "units", + "series", + "truncated", + "next_cursor" +]
1 tool update
- Changed
list_datasets3 fields changed- removed
Input schema / properties / location / minLengthRemoved value: -1 - added
Output schema / properties / noteAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "location", - "datasets" -]New value: +[ + "datasets" +]
Related MCP Connectors
Hosted MCP server for Xweather weather data: conditions, forecasts, alerts, and more.
NOAA Weather MCP — National Weather Service forecasts and alerts
NWS MCP — US National Weather Service (no auth)
MET Norway (api.met.no) MCP — global weather, Nordics specials.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables to interact with comprehensive weather data through the MCP protocol, including current conditions, multi-day forecasts, hourly forecasts, and geocoding.8 npmMIT
- AlicenseAqualityBmaintenanceProvides real-time US weather data for AI assistants via MCP, including current conditions, forecasts, alerts, severe weather outlooks, radar, upper-air analysis, and surface analysis. Supports optional personal weather station integration.94ISC
- 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.-
- AlicenseAqualityDmaintenanceA comprehensive MCP server providing tools for real-time, forecast, and historical weather data, alongside air quality, marine conditions, and climate projections. It also includes geocoding services to search for locations and retrieve precise coordinates for environmental analysis.7MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.