Skip to main content
Glama

Server Details

Smarter Weather MCP: forecasts, alerts, outlooks, observations, AQI, grids, and map imagery.

Ownership verified
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

A4.2/5.0

Scored across 14 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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 tools
describe_datasetDescribe datasetA
Read-onlyIdempotent
Inspect

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"}.

NameRequiredDescriptionDefault
dataset_idYesPipeline dataset identifier (e.g. "nbm_conus", "mrms_reflectivity_conus"). Discover valid values with list_datasets; inspect variables with describe_dataset.

Output Schema

NameRequiredDescription
detailYes
dataset_idYes
attributionNoAttribution the dataset licence requires. Cite it when quoting these values.
data_statusNoPresent only when the data service could not answer: a cached copy, or catalog facts without freshness.
example_queryNoquery_dataset arguments for this dataset; add a location.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 alertsA
Read-onlyIdempotent
Inspect

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"]}.

NameRequiredDescriptionDefault
atNoISO-8601 UTC past instant for the in-effect snapshot. Ignored with alert_id.
latNoLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonNoLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).
bboxNoBounding box {west,south,east,north}; west/east are negative in the US. Skips geocoding; intersecting polygons.
eventsNoOptional event-name filter, e.g. ["Tornado Warning"].
alert_idNoAlert identifier for detail mode. When set, location is ignored.
locationNoFree-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

NameRequiredDescription
alertNo
alertsNo
widgetNosw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore.
alert_idNo
locationNo
valid_timeNoEcho of at when an as-of snapshot was requested.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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 conditionsA
Read-onlyIdempotent
Inspect

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"}.

NameRequiredDescriptionDefault
latNoLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonNoLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).
unitsNoimperial (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
locationNoFree-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

NameRequiredDescription
unitsYes
analysisYes
locationYes
nearest_stationYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 forecastA
Read-onlyIdempotent
Inspect

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}.

NameRequiredDescriptionDefault
latNoLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonNoLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).
daysNoNumber of forecast days (1-14). Default 10.
viewNoconcise (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.
unitsNoUnits 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
includeNoComma-separated sections: current, daily, hourly, alerts, outlooks. Default "current,daily,alerts,outlooks". Use get_hourly_forecast for hourly detail.current,daily,alerts,outlooks
locationNoFree-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_levelNoDeprecated alias of view.

Output Schema

NameRequiredDescription
unitsYes
widgetNosw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore.
forecastYes
locationYes
data_statusNoPresent 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

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 distributionA
Read-onlyIdempotent
Inspect

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}.

NameRequiredDescriptionDefault
latNoLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonNoLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).
hoursNoForecast hours; default 48-72 by aspect.
unitsNoimperial (default; °F, mph, in) or metric. si is deprecated and will be removed; use metric.imperial
aspectYesDistribution family (see description).
locationNoFree-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

NameRequiredDescription
dailyNo
hoursYes
unitsYes
aspectYes
seriesYes
locationYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 forecastA
Read-onlyIdempotent
Inspect

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}.

NameRequiredDescriptionDefault
latNoLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonNoLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).
daysNoDays of hourly data (1-7). Default 2. Widened when hours_to reaches further.
viewNoconcise (default) samples past 24h; detailed adds CAPE, ceiling, UV, gust and thunderstorm probability for 48h.
unitsNoUnits 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_toNoWindow end, in hours from now, exclusive. 36 to 48 is hours 36-47.
locationNoFree-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_fromNoWindow start, in hours from now (0 = the current hour).
detail_levelNoDeprecated alias of view.

Output Schema

NameRequiredDescription
unitsYes
widgetNosw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore.
forecastYes
locationYes
data_statusNoPresent 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

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 precipitationA
Read-onlyIdempotent
Inspect

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).

NameRequiredDescriptionDefault
atNoRFC3339 end time within the last 33 h. Default: latest.
latNoLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonNoLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).
unitsNoUnits 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
windowsNoAccumulation windows ending at the latest frame (or at `at`).
locationNoFree-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_nowcastNoNext-hour radar nowcast (CONUS; ignored with `at`).

Output Schema

NameRequiredDescription
as_ofNo
notesNo
unitsYes
derivedYes
nowcastNo
windowsYes
_sourcesYes
locationYes
data_statusNo
quantization_stepYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 statusA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
include_okNotrue: list every monitored source including healthy ones. false (default): only sources that are not ok, keeping the response compact.

Output Schema

NameRequiredDescription
noteNo
overallYesWorst state across customer-facing data sources; "unknown" when status is unavailable.
sourcesNo
advisoriesNo
generated_atNoWhen the status document was generated (UTC).

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 contextA
Read-onlyIdempotent
Inspect

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"}.

NameRequiredDescriptionDefault
latNoLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonNoLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).
locationNoFree-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

NameRequiredDescription
moonYes
calendarYes
daylightYes
locationYes
current_timeYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 datasetsA
Read-onlyIdempotent
Inspect

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"}.

NameRequiredDescriptionDefault
latNoLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonNoLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).
locationNoFree-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_freshnessNoInclude latest model run and data age where tracked. Default true.

Output Schema

NameRequiredDescription
noteNo
domainNo
datasetsYes
locationNo
data_statusNoPresent only when freshness was asked for and the data service did not provide it, or answered from a cached copy.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 datasetA
Read-onlyIdempotent
Inspect

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}.

NameRequiredDescriptionDefault
latNoLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonNoLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).
hoursNoHours from now (1-264): ahead, or back on analyses (default: newest 166 frames); from the run start with reference_time.
unitsNoimperial
cursorNonext_cursor of the previous page.
latestNoOnly the newest value (analyses like RTMA/MRMS).
locationNoFree-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_endNoISO 8601 window end (with time_start).
variablesYesStandard names (e.g. temperature_2m, precipitation); see describe_dataset.
dataset_idNoDefault: the NBM dataset for the location (nbm_conus/nbm_alaska/nbm_hawaii). Discover with list_datasets.
time_startNoISO 8601 window start (with time_end).
reference_timeNoPin a specific model run (ISO 8601). Default: latest run.

Output Schema

NameRequiredDescription
unitsYes
seriesYes
locationYes
truncatedYes
attributionNoAttribution the dataset licence requires. Cite it when quoting these values.
data_statusNoPresent only when the data service did not answer and a cached copy was served.
next_cursorYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 geocodeA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
latYesLatitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.
lonYesLongitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).

Output Schema

NameRequiredDescription
latYes
lonYes
placeYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 catalogA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
latNoLatitude of the place (with lon).
lonNoLongitude of the place (with lat).
kindNoOnly this dataset kind.
limitNoHits to return (1-10, default 5).
queryYesThe question or keywords, in the user's words.
domainNoCoverage filter when there is no point; not with lat/lon.
familyNoOnly this source family (e.g. "nbm", "mrms").

Output Schema

NameRequiredDescription
hitsYes
noteNo
queryYes
domainNoThe coverage filter applied: the point's domain, or `domain`.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 locationsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
fuzzyNoAutosuggest mode for partial/misspelled input. Default false (exact search).
limitNoMaximum candidates to return (1-10). Default 5.
queryYesPlace query: city, "city, state", ZIP, partial text, or venue/address where enabled.
near_latNoRank venues/addresses near this point; pair with near_lon.
near_lonNo

Output Schema

NameRequiredDescription
queryYes
partialNoSections that did not finish, e.g. {"poi": "timeout"}; the list may be incomplete.
candidatesYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 14 tool updates
    • Changeddescribe_dataset2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_alerts2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_current_conditions2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_forecast2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_forecast_distribution2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_hourly_forecast2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_observed_precipitation2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_platform_status2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_time_context2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedlist_datasets2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedquery_dataset2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedreverse_geocode2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedsearch_catalog2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedsearch_locations2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
  2. 14 tool updates
    • Changeddescribe_dataset4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / data_status / properties
        Added value: +{}
      • addedOutput schema / properties / detail / properties
        Added value: +{}
      • addedOutput schema / properties / example_query / properties
        Added value: +{}
    • Changedget_alerts21 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / bbox / additionalProperties
        Removed value: -false
      • changedInput schema / properties / bbox / description
        Previous 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."
      • removedInput schema / properties / bbox / properties / east / $ref
        Removed value: -"#/properties/lon"
      • addedInput schema / properties / bbox / properties / east / maximum
        Added value: +180
      • addedInput schema / properties / bbox / properties / east / minimum
        Added value: +-180
      • addedInput schema / properties / bbox / properties / east / type
        Added value: +"number"
      • removedInput schema / properties / bbox / properties / north / $ref
        Removed value: -"#/properties/lat"
      • addedInput schema / properties / bbox / properties / north / maximum
        Added value: +90
      • addedInput schema / properties / bbox / properties / north / minimum
        Added value: +-90
      • addedInput schema / properties / bbox / properties / north / type
        Added value: +"number"
      • removedInput schema / properties / bbox / properties / south / $ref
        Removed value: -"#/properties/lat"
      • addedInput schema / properties / bbox / properties / south / maximum
        Added value: +90
      • addedInput schema / properties / bbox / properties / south / minimum
        Added value: +-90
      • addedInput schema / properties / bbox / properties / south / type
        Added value: +"number"
      • removedInput schema / properties / bbox / properties / west / $ref
        Removed value: -"#/properties/lon"
      • addedInput schema / properties / bbox / properties / west / maximum
        Added value: +180
      • addedInput schema / properties / bbox / properties / west / minimum
        Added value: +-180
      • addedInput schema / properties / bbox / properties / west / type
        Added value: +"number"
      • addedOutput schema / properties / alert / properties
        Added value: +{}
      • addedOutput schema / properties / widget / properties / entries / items / properties / props / properties
        Added value: +{}
    • Changedget_current_conditions3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / analysis / anyOf
        Previous 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"
        +  }
        +]
      • changedOutput schema / properties / nearest_station / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": {},
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedget_forecast4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / data_status / properties
        Added value: +{}
      • addedOutput schema / properties / forecast / properties
        Added value: +{}
      • addedOutput schema / properties / widget / properties / entries / items / properties / props / properties
        Added value: +{}
    • Changedget_forecast_distribution8 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedOutput schema / properties / daily / properties / days / items / properties / low / $ref
        Removed value: -"#/properties/daily/properties/days/items/properties/high"
      • addedOutput schema / properties / daily / properties / days / items / properties / low / additionalProperties
        Added value: +false
      • addedOutput schema / properties / daily / properties / days / items / properties / low / properties
        Added value: +{
        +  "p10": {
        +    "type": "number"
        +  },
        +  "p50": {
        +    "type": "number"
        +  },
        +  "p90": {
        +    "type": "number"
        +  },
        +  "stddev": {
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / daily / properties / days / items / properties / low / required
        Added value: +[
        +  "p50"
        +]
      • addedOutput schema / properties / daily / properties / days / items / properties / low / type
        Added value: +"object"
      • addedOutput schema / properties / series / items / properties / data / properties
        Added value: +{}
      • addedOutput schema / properties / series / items / properties / unit_labels / properties
        Added value: +{}
    • Changedget_hourly_forecast4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / data_status / properties
        Added value: +{}
      • addedOutput schema / properties / forecast / properties
        Added value: +{}
      • addedOutput schema / properties / widget / properties / entries / items / properties / props / properties
        Added value: +{}
    • Changedget_observed_precipitation2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / data_status / properties
        Added value: +{}
    • Changedget_platform_status3 fields changed
      • changedOutput schema / properties / advisories / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedOutput schema / properties / sources / items / additionalProperties
        Previous value: -trueNew value: +{}
      • changedOutput schema / properties / sources / items / properties / incident / additionalProperties
        Previous value: -trueNew value: +{}
    • Changedget_time_context5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / calendar / items / properties
        Added value: +{}
      • addedOutput schema / properties / current_time / properties
        Added value: +{}
      • addedOutput schema / properties / daylight / properties
        Added value: +{}
      • addedOutput schema / properties / moon / properties
        Added value: +{}
    • Changedlist_datasets4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / data_status / properties
        Added value: +{}
      • changedOutput schema / properties / datasets / additionalProperties / properties / data_age_seconds / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / datasets / properties
        Added value: +{}
    • Changedquery_dataset5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / data_status / properties
        Added value: +{}
      • addedOutput schema / properties / series / items / properties / data / properties
        Added value: +{}
      • changedOutput schema / properties / series / items / properties / data_age_seconds / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / series / items / properties / unit_labels / properties
        Added value: +{}
    • Changedreverse_geocode2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / place / additionalProperties
        Previous value: -trueNew value: +{}
    • Changedsearch_catalog2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / hits / items / properties / call / properties / arguments / properties
        Added value: +{}
    • Changedsearch_locations3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / candidates / items / additionalProperties
        Previous value: -trueNew value: +{}
      • addedOutput schema / properties / partial / properties
        Added value: +{}
  3. 1 tool update
    • Changedlist_datasets2 fields changed
      • addedOutput schema / properties / data_status
        Added 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"
        +}
      • removedOutput schema / properties / freshness
        Removed 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"
        -}
  4. 1 tool update
    • Changeddescribe_dataset2 fields changed
      • addedOutput schema / properties / data_status
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present only when the data service could not answer: a cached copy, or catalog facts without freshness.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / example_query
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "query_dataset arguments for this dataset; add a location.",
        +  "type": "object"
        +}
  5. 1 tool update
    • Changedquery_dataset17 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "next_cursor of the previous page.",
        +  "type": "string"
        +}
      • changedInput schema / properties / dataset_id / description
        Previous 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."
      • changedInput schema / properties / hours / description
        Previous 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."
      • changedInput schema / properties / latest / description
        Previous value: -"Return only the most recent value (analysis datasets like RTMA/MRMS)."New value: +"Only the newest value (analyses like RTMA/MRMS)."
      • addedInput schema / properties / units
        Added value: +{
        +  "default": "imperial",
        +  "enum": [
        +    "imperial",
        +    "metric"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / variables / description
        Previous 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."
      • addedOutput schema / properties / data_status
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present only when the data service did not answer and a cached copy was served.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / series / items / properties / data_age_seconds
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / series / items / properties / freshness_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "fresh",
        +        "stale",
        +        "missing"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / series / items / properties / related
        Added value: +{
        +  "description": "With out_of_domain: a dataset that covers the point.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / series / items / properties / status
        Added value: +{
        +  "description": "ok, unavailable, out_of_domain (see related) or not_public.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / series / items / properties / unit_labels
        Added value: +{
        +  "additionalProperties": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "description": "Unit of each variable in data.",
        +  "type": "object"
        +}
      • changedOutput schema / properties / series / items / required
        Previous value: -[
        -  "dataset_id",
        -  "valid_times",
        -  "data"
        -]New value: +[
        +  "dataset_id",
        +  "valid_times",
        +  "data",
        +  "unit_labels",
        +  "status",
        +  "data_age_seconds",
        +  "freshness_status"
        +]
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / units
        Added value: +{
        +  "enum": [
        +    "imperial",
        +    "metric"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "location",
        -  "series"
        -]New value: +[
        +  "location",
        +  "units",
        +  "series",
        +  "truncated",
        +  "next_cursor"
        +]
  6. 1 tool update
    • Changedlist_datasets3 fields changed
      • removedInput schema / properties / location / minLength
        Removed value: -1
      • addedOutput schema / properties / note
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "location",
        -  "datasets"
        -]New value: +[
        +  "datasets"
        +]

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables to interact with comprehensive weather data through the MCP protocol, including current conditions, multi-day forecasts, hourly forecasts, and geocoding.
    8 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides 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.
    9
    4
    ISC
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP 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.
    -
  • A
    license
    A
    quality
    D
    maintenance
    A 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.
    7
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.