Smarter Weather
Server Details
Smarter Weather MCP: forecasts, alerts, outlooks, observations, AQI, grids, and map imagery.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- smarterweather/developer
- GitHub Stars
- 1
Available Tools
32 toolscompare_locationsCompare locationsARead-onlyIdempotentInspect
Compare forecast variables across multiple locations side-by-side in one batched call. Returns a distilled per-location series matrix for direct comparison -- prefer this over N sequential forecast calls. Locations accept place names directly. Example: {"locations": [{"location": "Denver"}, {"location": "Boulder, CO"}], "variables": ["temperature_2m", "precipitation_probability"], "hours": 48}.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | Forecast hours. Default 24. | |
| locations | Yes | Locations to compare (2-10). Each takes location OR lat/lon, optional label. | |
| variables | Yes | Standard variable names (e.g. temperature_2m, precipitation). | |
| dataset_id | No | Dataset override. Default: auto-resolved NBM per location. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hours | Yes | |
| variables | Yes | |
| comparisons | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it is a batched call, returns a distilled per-location matrix, and accepts place names directly. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: main capability first, output behavior second, usage note third, and a concrete example last. Every sentence contributes useful information without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, output schema, and read-only/idempotent annotations, the description covers the core behavioral contract completely: batched multi-location comparison, direct place-name input, matrix output, and preference over sequential calls. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all parameters already documented clearly. The description's example reinforces the expected shape but adds little semantic meaning beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: compare forecast variables across multiple locations in one batched call. It also differentiates itself from sequential forecast calls by emphasizing the 'distilled per-location series matrix' return, which separates it from sibling tools like get_forecast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to prefer this tool over N sequential forecast calls, which conveys the primary comparison use case. It does not name a specific sibling alternative or state when to use a single-location tool instead, but the guidance is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_datasetDescribe datasetARead-onlyIdempotentInspect
Variables available in a dataset, with standard names, units, descriptions, and the time range of available data. Use before query_dataset to discover valid variable names. Example: {"dataset_id": "nbm_conus"}.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Pipeline dataset identifier (e.g. "nbm_conus", "mrms_reflectivity_conus"). Discover valid values with list_datasets; inspect variables with describe_dataset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| detail | Yes | |
| dataset_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds useful context about what information is returned (names, units, descriptions, time range) but does not disclose additional behavioral traits such as response shape nuances or potential edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core output defined first and a concrete example second. Every sentence earns its place, and the example is directly actionable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one simple parameter, rich annotations, an output schema, and a description that explains both the returned content and the intended usage sequence. Nothing essential is missing for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter dataset_id is already well documented with examples and cross-references to list_datasets and describe_dataset. The description adds an example value ('nbm_conus') but does not materially expand beyond what the schema already provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (dataset) and a specific purpose: listing available variables with standard names, units, descriptions, and time range. It also distinguishes itself from query_dataset by saying it is meant to discover valid variable names before querying.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use before query_dataset to discover valid variable names,' giving clear when-to-use guidance and naming the key alternative. It does not enumerate when not to use it or contrast with list_datasets, but the core usage direction is present and unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_best_windowFind best weather windowARead-onlyIdempotentInspect
Find the optimal time window for an activity based on weather criteria. Scans the forecast and returns daylight-aware periods matching all conditions. Criteria are expressed in the selected units system (default imperial: °F, mph, miles, feet). Example: {"location": "Boulder, CO", "criteria": {"min_temperature": 55, "max_wind_speed": 15, "max_precipitation_probability": 20}, "hours": 72, "activity_duration_hours": 3}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| hours | No | Hours to search. Default 72. | |
| units | No | Unit system for all values in the request and response: imperial (°F, mph, inches), metric (°C, km/h, mm), or si (K, m/s, mm). Defaults to imperial. | imperial |
| criteria | Yes | Weather criteria defining acceptable conditions (all optional). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| daylight_only | No | Only consider daylight hours (sunrise to sunset). Default true. | |
| activity_duration_hours | No | Minimum consecutive hours meeting criteria. Default 2. |
Output Schema
| Name | Required | Description |
|---|---|---|
| units | Yes | |
| message | No | |
| windows | Yes | |
| location | Yes | |
| sun_times | No | |
| daylight_only | Yes | |
| criteria_applied | Yes | |
| activity_duration_hours | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the readOnly/idempotent annotations: it 'scans the forecast,' returns 'daylight-aware periods,' and requires periods to match 'all conditions.' This clarifies that the tool performs analysis and filtering rather than a simple lookup. It does not conflict with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then the key behavioral refinement, then a compact example. The example is long but earns its place by demonstrating the nested criteria structure. There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is largely complete given the output schema and rich parameter schema: it covers units, daylight-awareness, and required criteria matching. One communication gap remains: 'optimal' is not defined (e.g., earliest window? longest? best combined score?), and there is no explicit note about behavior when no window is found. These are not fatal but keep it from being fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies, but the description adds a concrete JSON example showing how criteria, location, hours, and activity_duration_hours fit together. This is especially helpful because criteria is a nested object with multiple optional fields. The example clarifies the intended usage pattern beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Find the optimal time window for an activity based on weather criteria.' It clearly distinguishes the tool from raw forecast/data-access siblings by emphasizing criteria-based window selection, daylight awareness, and matching all conditions. This makes its purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when an activity needs a weather-compliant time window rather than just forecast data. It does not explicitly name alternatives or exclusion conditions, but the behavioral contrast with the many raw get_* forecast tools is apparent. A small missed opportunity is not saying 'use get_forecast if you only need raw conditions.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_air_qualityGet air qualityARead-onlyIdempotentInspect
AirNow air quality at a location (CONUS): current overall AQI plus per-pollutant detail (PM2.5, ozone, PM10 concentrations) and the AirNow AQI forecast. AQI scale: 0-50 good, 51-100 moderate, 101-150 unhealthy for sensitive groups, 151-200 unhealthy, 201-300 very unhealthy, 301+ hazardous. pollutants=["aqi"] (default) is the cheap headline call; add pollutant keys or include_forecast=true when the user digs in. Example: {"location": "Boise", "pollutants": ["aqi", "pm25"], "include_forecast": true}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| pollutants | No | Which measurements to return. aqi = combined AQI index. Default: ["aqi"]. | |
| include_forecast | No | Also return the AirNow next-day AQI forecast. |
Output Schema
| Name | Required | Description |
|---|---|---|
| widget | No | sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore. |
| current | Yes | |
| forecast | No | |
| location | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior; the description adds genuine behavioral context: the AirNow source, the CONUS geographic limitation, the AQI band scale, and that forecast is opt-in. No statement in the description contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Each of the four sentences earns its place: resource and return scope, AQI scale, default-versus-expanded usage guidance, and a concrete example. The identifying scope is front-loaded, and there is no filler or repetition of schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-format details need not be repeated. The description covers data source, geography, default behavior, optional expansions, and an example, while the schema covers coordinate/location validation and constraints. An agent has what it needs to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes all five parameters at 100% coverage, so the baseline is 3. The description adds strategy on top of the schema by labeling the default call as 'cheap' and showing a complete example combining location, pm25, and include_forecast, which helps an agent compose parameter combinations rather than merely filling names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete resource and scope: 'AirNow air quality at a location (CONUS)' and lists exactly what is returned: current overall AQI, per-pollutant detail, and forecast. It is clearly distinct from sibling weather tools because it identifies the AirNow source and AQI domain rather than generic current conditions or observations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool (for AirNow AQI at a location) and provides parameter-selection guidance: the default ['aqi'] is the 'cheap headline call', and additional pollutants or include_forecast should be added 'when the user digs in'. It does not explicitly name alternative sibling tools or state exclusion criteria, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_alertsGet NWS alertsARead-onlyIdempotentInspect
NWS watches, warnings, advisories. Point (city/ZIP/lat+lon): containing polygons. BBox or US state/DC/CONUS (codes, full names, US/national): intersecting polygons. A city miss is not a statewide all-clear — query the state or a bbox; never say regional inventory is impossible. NY/WA and "New York State"/"Washington State" are states; "New York"/"Washington" stay cities. Omit at for now; at (ISO-8601 UTC) is the snapshot then. Empty = all-clear or purged (~24h). alert_id = detail+geometry, ignores at. Ex: {"location":"WI","events":["Tornado Warning"]}.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | ISO-8601 UTC past instant for the in-effect snapshot. Ignored with alert_id. | |
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| bbox | No | Bounding box {west,south,east,north}. Skips geocoding; intersecting polygons. | |
| events | No | Optional event-name filter, e.g. ["Tornado Warning"]. | |
| alert_id | No | Alert identifier for detail mode. When set, location is ignored. | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| alert | No | |
| alerts | No | |
| widget | No | sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore. |
| alert_id | No | |
| location | No | |
| valid_time | No | Echo of at when an as-of snapshot was requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description reveals important behavioral traits: empty results mean all-clear or data purged around 24 hours, alert_id switches to detail mode and ignores at, and location parsing treats NY/WA as states while New York/Washington remain cities. It also warns against claiming regional inventory is impossible, reinforcing the open-world hint with concrete guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient, packing multiple query modes, edge cases, state-name disambiguation, temporal semantics, empty-result meaning, and an example into a few telegraphic sentences. Nothing is wasted, and the most important product-level information comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and all parameters already documented, the description covers the remaining ambiguities an agent would face: location naming pitfalls, bbox and point semantics, alert_id detail mode, at behavior, and the meaning of empty results. There is no obvious missing context needed to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already documents all parameters at 100% coverage, the description adds real semantic value: it explains the point-versus-bbox containment distinction, clarifies that at is a snapshot selector and should be omitted for current alerts, defines alert_id behavior, and gives concrete location disambiguation rules plus a full example. This goes well beyond the baseline for fully covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title "Get NWS alerts" plus the opening phrase 'NWS watches, warnings, advisories' makes the verb and resource unmistakable. It is clearly distinct from sibling forecast, observation, and climate tools because it specifically targets alert products, not general weather data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong operational guidance: point queries return containing polygons, bbox/state/CONUS return intersecting polygons, city misses must not be treated as statewide all-clear, and at should be omitted for current snapshots. It does not explicitly name sibling alternatives, but the tool's domain is unique enough that the routing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_climate_normalsGet climate normalsARead-onlyIdempotentInspect
Day-of-year climate normals (NCEI 1991-2020 30-year averages) for a US location, from the nearest station with a record. Returns normal high, normal low, and normal mean for each date in the window, plus the station and how far away it is. Use this whenever a question needs a baseline rather than a forecast: "is this warm for October?", "what is a typical high here in January?", "how does this week compare to normal?". Pair it with get_forecast to say how far above or below normal the coming days run. Covers dates by day of year, so it answers for any date, past or future -- these are long-period averages, not a forecast and not observed history for a specific year.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Inclusive range end as YYYY-MM-DD. Must be supplied with start. | |
| lat | Yes | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | Yes | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| days | No | Range length in days when start/end are omitted; the window opens today (default 14). | |
| unit | No | Unit system for the normals. Default imperial (°F). | |
| start | No | Inclusive range start as YYYY-MM-DD. Must be supplied with end. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, so the description's job is to add behavioral context. It does: returns data from the nearest station with a record, includes station distance, covers any date by day of year, and explicitly states these are long-period averages, not forecasts or single-year observations. This goes well beyond the annotation metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: definition, return values, usage trigger, pairing guidance, and the day-of-year caveat. The most important scoping information is front-loaded in the first sentence, and despite its length, the description remains efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description fully covers what an agent needs to select and call it correctly: what it returns, when to use it, how it relates to forecasts, and the key conceptual caveat about day-of-year averaging. No critical decision-relevant context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds temporal semantics not present in the schema: dates are interpreted by day of year, making any past or future date valid. It also clarifies the meaning of the returned 'normal' values in terms of 30-year averages, which helps the agent reason about start/end/days parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific definition: 'Day-of-year climate normals (NCEI 1991-2020 30-year averages) for a US location, from the nearest station with a record.' It names the resource (climate normals), the scope (US location), and the return values (normal high, low, mean, station and distance). It also distinguishes itself from siblings by noting it is not a forecast and not observed history for a specific year, which differentiates it from get_forecast and get_climate_records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: 'Use this whenever a question needs a baseline rather than a forecast,' with concrete examples. It also gives pairing guidance: 'Pair it with get_forecast to say how far above or below normal the coming days run.' This gives the agent clear decision criteria versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_climate_recordsGet climate reports and recordsARead-onlyIdempotentInspect
NWS daily climate data: type=reports returns CLI daily climate reports (observed high/low/precip vs normals per station); type=records returns RER record event reports (record highs/lows/rainfall actually set). Filter by wfo (3-letter office, e.g. DMX), station, date (YYYY-MM-DD), start/end range, or hours lookback. Examples: {"type": "records", "hours": 48} or {"type": "reports", "wfo": "DMX", "date": "2026-07-04"}.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Range end date, YYYY-MM-DD. | |
| wfo | No | WFO office filter (e.g. DMX, OUN). | |
| date | No | Single date, YYYY-MM-DD. | |
| type | Yes | reports = CLI daily climate reports; records = RER record events. | |
| hours | No | Lookback window in hours (1-168) when no date/range is given. | |
| start | No | Range start date, YYYY-MM-DD. | |
| station | No | Station identifier filter (reports only). | |
| record_type | No | Record type filter (records only), e.g. HIGH, LOW, RAIN. |
Output Schema
| Name | Required | Description |
|---|---|---|
| type | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, openWorldHint, and non-destructive behavior. The description adds meaningful behavioral context by explaining what each type actually returns (observed vs normals for reports; actually set records for records) and by showing example filter combinations. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it starts with the core resource, immediately distinguishes the two type modes, then lists filters, and finishes with concrete JSON examples. Every sentence contributes value and the examples make invocation behavior unambiguous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema with full parameter documentation, strong annotations, and an output schema, the description is complete enough for an agent to call this tool correctly. It covers the key selection logic between reports and records, available filters, and representative example calls. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% description coverage for all eight parameters, including formats, constraints, and type-specific applicability. The description reinforces wfo format and date format and gives examples, but it does not add substantial meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this tool returns NWS daily climate data, and explicitly breaks out the two modes: type=reports returns CLI daily climate reports (observed values vs normals) and type=records returns RER record event reports. This makes the resource and the distinction between report types clear, and it differentiates the tool from climate-normals-focused siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context by listing allowed filters (wfo, station, date, start/end range, hours lookback) and provides two concrete examples showing valid payloads. It does not explicitly name alternatives or state when not to use this tool, but the scope is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_conditionsGet current conditionsARead-onlyIdempotentInspect
Current weather right now at a location from two independent sources in one call: the RTMA gridded analysis (exact-point values, updated sub-hourly) and the nearest METAR station observation (ground truth with raw METAR, flight category). Use the analysis for point-accurate values and the station for verification. For a forecast, use get_forecast. Example: {"location": "Pella, IA"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| analysis | Yes | |
| location | Yes | |
| nearest_station | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds meaningful behavioral context by disclosing that the tool combines two independent sources, that RTMA is updated sub-hourly, and that the METAR portion includes raw METAR and flight category. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: three sentences and one example, with the core action front-loaded in the first sentence. Every clause contributes information—source types, update cadence, interpretation guidance, and the forecast alternative—without filler or schema repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich output schema and fully documented parameters, the description covers the remaining contextual needs: what the tool returns conceptually, which source to trust for what purpose, and when to use a sibling tool instead. The example call further reduces ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters at 100% coverage, so the description carries little parameter burden. The example call {'location': 'Pella, IA'} reinforces that free-text location is supported, but it does not materially add meaning beyond the schema descriptions. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly identifies the operation and resource: retrieving current weather conditions at a location, using two independent sources (RTMA gridded analysis and nearest METAR station). It explicitly contrasts with a forecast need via 'For a forecast, use get_forecast,' which distinguishes it from an important sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when to use this tool ('Current weather right now at a location') and explicitly routes forecast requests to get_forecast. It also provides internal usage guidance: use the RTMA analysis for point-accurate values and the METAR station for verification, helping the agent interpret the dual-source response.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forecastGet forecastARead-onlyIdempotentInspect
Complete weather overview for a location: current conditions, daily forecast (day/night periods, SPC threats, severity, CAPE, UV), active alerts, and convective outlooks in one call. Data is pre-aggregated across NBM, HRRR, GFS, RTMA, and SPC and unit-converted server-side. This is the primary weather tool; reach for lower-level tools only when you need raw observations or a specific dataset. Accepts a place name directly. Examples: {"location": "Denver"} or {"location": "Portland, OR", "days": 5} or {"lat": 41.4, "lon": -92.9}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| days | No | Number of forecast days (1-14). Default 10. | |
| units | No | Unit system for all values in the request and response: imperial (°F, mph, inches), metric (°C, km/h, mm), or si (K, m/s, mm). Defaults to imperial. | imperial |
| include | No | Comma-separated sections: current, daily, hourly, alerts, outlooks. Default "current,daily,alerts,outlooks". Use get_hourly_forecast for hourly detail. | current,daily,alerts,outlooks |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| detail_level | No | standard: compact response (~5-10KB); daily includes day_precip_probability / night_precip_probability when available (precip_probability is max of day/night). detailed: also preserves CAPE, UV, full day/night period objects, extra hourly fields (~12-20KB). | standard |
Output Schema
| Name | Required | Description |
|---|---|---|
| units | Yes | |
| widget | No | sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore. |
| forecast | Yes | |
| location | Yes | |
| data_status | No | Present only when the platform reports degraded/outage data sources: overall state, a caveat note, and the affected sources. Absent means no advisory was available -- not a freshness guarantee. See get_platform_status for the full document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, non-destructive, idempotent behavior. The description adds useful behavioral context by explaining data is pre-aggregated across NBM, HRRR, GFS, RTMA, and SPC and unit-converted server-side. Minor flaw: listing CAPE and UV as part of the daily forecast slightly overstates what the default standard detail_level may include.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the core purpose, then adds behavioral context, routing guidance, and examples in a compact format. Every sentence contributes meaning; the JSON examples are especially efficient for showing valid parameter combinations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich output schema, 100% parameter coverage, and helpful annotations, the description fully covers what the tool does, when to use it, and how to call it. It also provides enough sibling differentiation to guide tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters. The description adds value with concrete usage examples, clarification that location accepts a place name directly, and the note about server-side unit conversion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it returns a complete weather overview for a location, explicitly listing current conditions, daily forecast, alerts, and outlooks. It also distinguishes itself as the primary weather tool, separating it from lower-level siblings like get_current_conditions and get_alerts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly positions itself as the default weather tool and tells agents to reach for lower-level tools only when raw observations or a specific dataset is needed. It also cross-references get_hourly_forecast for hourly detail, giving concrete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forecast_discussionGet forecast discussionARead-onlyIdempotentInspect
Expert forecaster text products. type=afd: Area Forecast Discussion. type=hwo: Hazardous Weather Outlook. type=now: WFO short-term NOW. type=fwf/hls/esf: local fire weather / hurricane local statement / hydrologic discussion. type=mcd: SPC Mesoscale Discussion. type=mpd: WPC Mesoscale Precipitation Discussion (flash flood). type=swo/fwd/ero: national outlook discussions. type=tcd/tcp/tcm/twd/two: NHC tropical text (type=two is the text TWO, not GIS nhc_two). type=pmd: WPC/CPC desk discussion (pass awips_id for a specific desk, e.g. PMDSPD). type=pwo: SPC public weather outlook. National types (swo/fwd/ero/tcd/tcp/tcm/twd/two/pmd/pwo) need no location; day selects the outlook day for swo and fwd. summary_only=true returns the pipeline LLM summary without the full body. Examples: {"location": "Des Moines", "type": "afd"} or {"type": "swo", "day": 2, "summary_only": true}.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | Outlook day for type=swo or type=fwd (1-8). Ignored for the other types; WPC files ERO days 1-3 under one product. | |
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| wfo | No | WFO identifier override (e.g. BOU). Default: resolved from the location. | |
| type | Yes | Product type: afd (WFO discussion), hwo (hazard outlook), now (short-term NOW), fwf/hls/esf (local WFO), mcd (SPC mesoscale), mpd (WPC precipitation discussion), swo (SPC convective outlook), fwd (SPC fire weather), ero (WPC excessive rainfall), tcd/tcp/tcm/twd/two (NHC tropical text; two is text TWO not GIS), pmd (desk discussion), pwo (SPC public outlook). | |
| limit | No | Number of recent products (1-10). Default 1 (latest). | |
| awips_id | No | Full AWIPS identifier (e.g. TCDAT1, PMDSPD). More specific than type + location. Exact source_ref match. | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| summary_only | No | Return only the LLM summary + sections, omitting the full body text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| type | Yes | |
| location | No | |
| products | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several non-obvious behaviors: type=two is the text TWO not the GIS product, pmd requires an awips_id for a specific desk, WPC files ERO days 1-3 under one product, summary_only returns the pipeline LLM summary, and national types accept no location. These details go well beyond the annotations (readOnly, idempotent, non-destructive) and materially improve correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but necessarily so, since it must document 18 product type codes. It is front-loaded with the core purpose and uses a compact semicolon-separated style with concrete examples at the end. A small deduction for redundancy: much of the type-by-type explanation is duplicated in the input schema's enum descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters, 1 required, a rich enum, and an output schema, the description covers all critical invocation aspects: type selection, location options, day semantics, summary_only, and representative examples. The presence of an output schema means the response format need not be described. No notable gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by giving concrete invocation examples, clarifying that national types require no location, and explaining the pmd desk-desk behavior with a sample awips_id. It partially repeats schema descriptions for the type enum, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Expert forecaster text products' and enumerates every product type with a one-line explanation, making it clear this tool retrieves NWS/SPC/WPC/NHC text forecast discussions, not gridded forecast data. The name and title align with the described content, and the level of detail distinguishes it from sibling tools like get_forecast and get_current_conditions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool and how to select among its many type values, including the rule that national types need no location and that `day` only applies to swo/fwd. It does not explicitly name sibling alternatives or state when not to use it, but the context is concrete enough that an agent can infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forecast_distributionGet forecast distributionARead-onlyIdempotentInspect
Probabilistic forecast guidance from NBM for one aspect of the weather: percentile ranges (p10-p90), exceedance probabilities, and ensemble spread. Use this for any question about odds, ranges, potential or confidence ("how much could we get", "worst case for the wind", "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 is the reasonable worst case when the risk is the low end (cold, minimum 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), ice (freezing rain, accretion), temperature (temp/dewpoint + stddev), wind (speed/gust percentiles), severe (hail/tornado/damaging-wind probabilities), aviation (LIFR/IFR/MVFR visibility + ceiling probabilities), confidence (ensemble stddev; low spread = settled forecast, high spread = details still in play). Examples: {"location": "Denver", "aspect": "snow", "hours": 72} or {"lat": 32.9, "lon": -97.0, "aspect": "severe"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| hours | No | Forecast hours (1-264). Default varies by aspect (48-72). | |
| aspect | Yes | Which distribution family to return (see tool description). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hours | Yes | |
| aspect | Yes | |
| series | Yes | |
| location | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds substantial behavioral context beyond annotations: how to interpret p50/p10/p90, that a single percentile is not the forecast, and how ensemble spread maps to forecast confidence. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely packed with necessary information: use cases, percentile interpretation, aspect families, and examples. It is front-loaded with purpose and when-to-use guidance, and every section earns its place given the tool's complexity. Slightly more structure, such as bulleted aspects, could improve scannability but the current prose is not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a probabilistic forecast tool with five parameters and eight aspects, the description is remarkably complete. It covers when to use it, how to read percentiles, what each aspect contains, interpretation caveats, and examples. Output schema handles return-value details, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters well. The description adds value beyond the schema by providing example payloads and expanding on what each aspect family includes, such as snow accumulation percentiles and severe-weather probabilities. This raises it above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: probabilistic forecast guidance for one weather aspect, including percentile ranges, exceedance probabilities, and ensemble spread. It clearly distinguishes this from deterministic forecasts and enumerates the eight aspects it supports. The tool is easy to differentiate from siblings like get_forecast and get_hourly_forecast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool for questions about odds, ranges, potential, or confidence, and notes that a deterministic forecast value cannot answer such questions. It provides interpretation guidance for percentiles and concrete examples, which effectively routes an agent away from deterministic forecast tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forecast_skillGet forecast skillARead-onlyIdempotentInspect
How accurate our forecasts have actually been near a location, measured against observed analysis truth. Returns bias (positive = the model runs high), mean absolute error, RMSE, and a skill score against local climatology, per model, weather variable, and forecast lead time; continuous and vector entries also carry persistenceSkillScore, skill against the analysis at forecast issue time (null means not enough persist pairs, not zero skill -- do not compare it to skillScore as if they shared a denominator), and analysisDisagreementMae, the analyses' own disagreement at that lead -- a floor on how good the forecast can look, not a skill score and not an excuse (null means the sibling row is missing or below minimumSamples); for probability forecasts, the Brier score and a reliability breakdown. Use this to qualify a forecast rather than assert it -- "NBM has been running 1.8F warm at 3-day leads near you, so treat that 72 as around 70" -- and to answer "how much should I trust this forecast", "is the model biased here", or "how accurate were you last month". Evidence is reported at three scopes side by side: the exact point (strongest, slowest to accumulate), the ~50km neighborhood, and the ~300km region. Prefer the most specific scope that has samples. Metrics below minimumSamples observations are withheld and listed under insufficientHistory with their count -- say that history is still accumulating rather than treating thin numbers as evidence. Coverage is a rolling recent window over verified US variables, not all of history. Entries are per model and their samples are not matched, so never conclude that one model beats another by comparing their numbers here. Each entry states the truth field it was measured against -- one designated analysis per variable -- so never compare numbers carrying different truth values either. Each entry also states the regime it was measured under: ALL for every observation regardless of weather, or a conditioned tier such as SEA:DJF (winter), SCN1:WINDY / SCN1:WET / SCN1:QUIET (what the forecast was showing), or JC1:NW (a circulation pattern). Pass the regime parameter to ask for a conditioned track record. It falls back, so asking for SCN1:WINDY and getting back regime ALL is a successful answer, not a missing one -- always read the regime field and qualify the claim with it, because "NBM runs warm here when it shows windy" and "NBM runs warm here" are different statements. Regimes overlap by construction across families, so entries under different regimes are alternative answers to one question and must never be compared or added; within SCN1: the labels are mutually exclusive. Entries with a categorical block answer a yes/no question instead of an error magnitude -- did it rain, at the thresholdMm stated on the entry -- with pod (of the times it happened, how often we called it), far (of the times we called it, how often it did not happen), and frequencyBias (above 1 = we call it too often). Use these for "will it actually rain" questions, where a small average error means nothing if the rain lands in the wrong hour. A null rate means the sample cannot answer it -- the event has not happened, or been forecast, enough times to divide by -- and must be reported as unknown, never as zero. The counts beside it are still evidence, and for a rare event they are often the whole answer: "it has only rained twice here in the record" is a useful thing to say.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| unit | No | Units for the error magnitudes. Default imperial (bias/MAE/RMSE in °F, mph, in). | |
| model | No | Narrow to one model, e.g. nbm or rrfs. | |
| truth | No | Measure against a named truth source instead of the default one for each variable, e.g. urma. Only pass this if the user asked which analysis was used or named one; the default is already the designated source, and the analyses disagree, so switching changes the numbers. | |
| regime | No | Ask for a track record measured only under particular conditions, as a comma-separated preference chain, most specific first, e.g. "SCN1:WINDY,SEA:JJA". SEA: is the meteorological season (DJF, MAM, JJA, SON); SCN1: is a forecast-conditioned scenario (WINDY, WET, QUIET — mutually exclusive within the family); JC1: is a circulation pattern. The most specific tier with enough observations answers and the unconditioned record is the last resort, so this never empties a result the way truth does -- it degrades. Read the regime field on each entry to see which tier actually answered. Pass this when the question is conditional ("is it worse in winter", "how does it do when the model shows windy"); omit it otherwise, since conditioned tiers are thinner and slower to earn numbers. | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| variable | No | Narrow to one variable, e.g. temperature_2m, dew_point_2m, wind_speed_10m, wind_gusts_10m, wind_vector_10m, cloud_cover, precipitation, precipitation_probability, or a thresholded rain event such as precipitation_gt_0p254mm (any measurable rain) or precipitation_gt_2p54mm. Omit for everything measured at the location. | |
| lead_hours | No | Narrow to the lead time being asked about, in hours; the containing lead bucket is selected for you (60 gives the 48-72h bucket). Use the lead of the forecast you are qualifying: ~24 for tomorrow, ~72 for three days out. Never approximated -- a lead we have not verified returns no entries rather than a nearby bucket, so an empty result means we cannot speak to that range. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cells | No | |
| skill | Yes | |
| units | Yes | |
| tracked | Yes | Whether this exact coordinate is one the verification pipeline tracks. |
| location | Yes | |
| minimumSamples | Yes | |
| insufficientHistory | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint/openWorldHint/idempotentHint and the description agrees with no contradiction. Beyond annotations it discloses exceptional behavioral depth: null means 'not enough persist pairs, not zero skill — do not compare it to skillScore'; regime queries degrade to ALL rather than erroring; metrics below minimumSamples are withheld into insufficientHistory; coverage is a rolling recent window over verified US variables, not all history; samples are not matched across models so cross-model comparison is invalid; entries under different regimes are alternative answers that must never be compared. This far exceeds what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose, return values, and the usage example are front-loaded before the caveat sections, and nearly every sentence carries real interpretive weight given the tool's complexity. It loses a point for sheer length — roughly 700 words, at the extreme end of what an agent can scan efficiently — where tighter bulleted structure would improve parsability. Every section earns its place, but the whole is longer than ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no required parameters and an output schema present, the description covers everything needed for correct invocation and result interpretation: three scopes with a preference rule ('prefer the most specific scope that has samples'), minimumSamples withholding, null semantics for multiple field types, regime fallback behavior, and three separate incomparability constraints (model, truth, regime). The output schema carries return structure, so nothing critical for correct use is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds genuine interpretive semantics beyond the field-level text: model and truth carry comparability constraints ('never conclude that one model beats another', 'never compare numbers carrying different truth values'), regime gains cross-family overlap and within-family mutual exclusivity ('within SCN1: the labels are mutually exclusive'), and lead_hours gains the 'never approximated — a lead we have not verified returns no entries' warning. This is meaningful added value, though not organized parameter-by-parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb+resource — measuring forecast accuracy near a location against observed analysis truth — and enumerates the concrete outputs (bias, MAE, RMSE, skill score). The phrase 'qualify a forecast rather than assert it' plus the worked example ('NBM has been running 1.8F warm at 3-day leads') sharply separates this from forecast-content siblings like get_forecast or get_hourly_forecast. An agent can identify what this tool is for without inspecting sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use signals: qualify a forecast rather than assert it, and answer 'how much should I trust this forecast', 'is the model biased here', or 'how accurate were you last month'. It also provides an example of how the answer should be phrased. However, it never names alternatives or states when-not-to-use conditions (e.g., nothing says 'for the actual forecast values, use get_forecast'), so routing relies on clear context rather than explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forecast_skill_mapGet forecast skill mapARead-onlyIdempotentInspect
Measured forecast skill as a map of res-4 hexes inside a bounding box, sliced from the public skill map. Use this when the question is spatial ("where is NBM temperature skill weak across Colorado"), not "how good is the forecast at this point" — that is get_forecast_skill. Requires model, variable, lead_hours, and bbox {west,south,east,north}. lead_hours selects the containing published bucket (20 → NBM 24); a lead we have not published returns no slices rather than a nearby one. A hex is included when its center is inside the box; edge-overlapping hexes are dropped. The box cannot wrap the dateline. Each cell is [h3, samples, skill_score]; skill_score is unitless (fraction of climatological variance explained) and already gated at n ≥ 30. withheld lists hexes still accumulating. Do not compare slices across models or truths. This is CELL# only — never treat a hex as a person.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | Bounding box {west,south,east,north}. Hexes whose H3 center falls inside are returned. | |
| model | Yes | Model id, e.g. nbm, gfs, hrrr, or rrfs. | |
| domain | No | Optional domain (conus, alaska, hawaii). Omit unless you already know it. | |
| variable | Yes | Verified variable, e.g. temperature_2m, dew_point_2m, precipitation, or precipitation_gt_0p254mm. | |
| lead_hours | Yes | Lead time in hours; the containing published bucket is selected. Never approximated. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bbox | Yes | |
| slices | Yes | |
| generated_at | Yes | |
| atom_resolution | Yes | |
| minimum_samples | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses lead-time bucket selection, hex-center inclusion rules, dateline restrictions, cell shape [h3, samples, skill_score], the n ≥ 30 gating, withheld hexes, and the warning not to compare slices across models or truths. This is substantial behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the core purpose and spatial-vs-point routing. Nearly every sentence carries behavioral or usage value; only the line "Requires model, variable, lead_hours, and bbox" is somewhat redundant with the required fields in the schema, and "CELL#" is slightly cryptic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nested bbox parameter, output schema, and nuanced slicing behavior, the description covers all the important call-time concerns: spatial interpretation, lead bucketing, inclusion rules, dateline restriction, return cell format, and gating. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics: lead_hours "selects the containing published bucket (20 → NBM 24)", no-slice behavior for unpublished leads, and bbox interpretation via hex center. These details go beyond the schema's property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: "Measured forecast skill as a map of res-4 hexes inside a bounding box," which clearly distinguishes it from the point-based sibling. It also explicitly contrasts itself with get_forecast_skill, so an agent can disambiguate without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to use this tool: "Use this when the question is spatial ... not 'how good is the forecast at this point' — that is get_forecast_skill." It also gives exclusionary edge cases, such as "returns no slices rather than a nearby one" and "The box cannot wrap the dateline," which tell an agent when the tool will not behave as expected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_growing_degree_daysGet growing degree daysARead-onlyIdempotentInspect
Growing Degree Units (GDU / GDD) for a US location (CONUS, Alaska, Hawaii), computed from daily max/min temperatures. Pass a crop id (e.g. "corn", "soybean", "wheat") to use calibrated base/upper thresholds, or crop="custom" with base_temp_c (and optional upper_temp_c / method). Without season_start you get per-day GDU across the forecast horizon; WITH season_start (YYYY-MM-DD) you get the cumulative season-to-date total (observed history + today + forecast) plus a per-day cumulative series -- the number a grower tracks against crop milestones. Answers "how many growing degree days has my corn accumulated since May 1?" and "what's the GDU forecast this week?".
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | Yes | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| crop | Yes | Crop id from the catalog (e.g. "corn", "soybean", "wheat") or "custom" to supply your own thresholds via base_temp_c. | |
| days | No | Forecast horizon in days (default 10). | |
| unit | No | Unit system for GDU + temps. Default imperial (°F-days). | |
| method | No | GDU method for custom crops. Defaults from whether upper_temp_c is set. | |
| base_temp_c | No | Custom base threshold in °C. Required when crop="custom". | |
| season_start | No | Season/planting start as YYYY-MM-DD (local date). Presence switches the response to a cumulative season-to-date GDU total. Must be within the ~180-day observed window. | |
| upper_temp_c | No | Custom upper cutoff in °C (enables the modified method). Optional. | |
| day_definition | No | Daily boundary: "nws" (default; NBM MaxT/MinT period extremes) or "local_calendar" (midnight-to-midnight local day). | |
| include_milestones | No | Include the crop's growth-stage GDU milestones in the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already mark this as read-only, idempotent, and non-destructive, the description adds substantial behavioral context: the response differs based on season_start, the cumulative mode includes observed history plus today plus forecast, and the tool supports calibrated crop thresholds. This goes well beyond what annotations convey and is particularly valuable with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph with no wasted words. It front-loads the tool's core function and geographic scope, then explains the two modes and ends with concrete example questions. Every sentence contributes useful decision-making information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing both response shapes: per-day GDU across the forecast horizon versus cumulative season-to-date totals with a per-day cumulative series. It also covers default crop behavior, custom thresholds, optional milestones, and the USA-only geographic limitation. For an 11-parameter tool, this is complete enough to guide correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the crop='custom' plus base_temp_c flow, the behavior switch triggered by season_start, and the effect of upper_temp_c on method selection. Not every parameter is elaborated in the description, but the most semantically complex ones are clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Growing Degree Units (GDU / GDD) for a US location (CONUS, Alaska, Hawaii), computed from daily max/min temperatures.' It also gives two concrete representative questions, 'how many growing degree days has my corn accumulated since May 1?' and 'what's the GDU forecast this week?', making the tool's purpose unmistakable and distinct from siblings like get_forecast or get_climate_normals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly explains when to use each mode: without season_start you get per-day GDU, with season_start you get cumulative season-to-date totals, and it explains when to use a predefined crop id versus crop='custom'. It does not explicitly name sibling tools or when-not-to-use cases, but the mode-based guidance is strong enough that an agent can decide how to invoke it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hourly_forecastGet hourly forecastARead-onlyIdempotentInspect
Blended hourly forecast: temperature, feels-like, humidity, wind, precipitation probability/amount, conditions, and icon per hour. Snapped to the current hour so hourly[0] is "now". Timestamps are UTC ISO 8601; convert to the local timezone before presenting. Ask for the days you need up front -- one call with days: 4 beats four calls. ALWAYS check hourly_coverage before answering about a specific hour: it reports first_time and last_time (the window the rows actually span), sample_interval_hours (past the first day rows are every 2-3h, not every hour), and truncated: true when upstream returned less than you asked for. If the hour the user cares about is after last_time, say the forecast does not reach that far yet rather than answering from the nearest row you do have. For one stretch of time ask for that stretch with hours_from/hours_to: it comes back hour by hour even where the full range would be sampled. Accepts a place name or coordinates. Examples: {"location": "Portland, OR", "days": 2} or {"lat": 41.88, "lon": -87.63, "hours_from": 36, "hours_to": 48}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| days | No | Days of hourly data (1-7). Default 2. Widened when hours_to reaches further. | |
| units | No | Unit system for all values in the request and response: imperial (°F, mph, inches), metric (°C, km/h, mm), or si (K, m/s, mm). Defaults to imperial. | imperial |
| hours_to | No | Window end, in hours from now, exclusive. 36 to 48 is hours 36-47. | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| hours_from | No | Window start, in hours from now (0 = the current hour). | |
| detail_level | No | standard: compact hourly data (sampled past 24h). detailed: preserves CAPE, ceiling, UV, gust, thunderstorm probability for the first 48h. | standard |
Output Schema
| Name | Required | Description |
|---|---|---|
| units | Yes | |
| widget | No | sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore. |
| forecast | Yes | |
| location | Yes | |
| data_status | No | Present only when the platform reports degraded/outage data sources: overall state, a caveat note, and the affected sources. Absent means no advisory was available -- not a freshness guarantee. See get_platform_status for the full document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses important behaviors: rows are snapped to the current hour, timestamps are UTC ISO 8601, hourly_coverage reports the actual window, sampling drops to every 2-3 hours after the first day, and truncated signals upstream shortfalls. This is exactly the kind of context an agent needs to avoid answering incorrectly from a sparse or partial result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: the first sentence defines the payload, the second defines temporal snapping and timezone handling, and the remaining sentences cover the coverage/truncation pitfalls and parameter combinations. It is front-loaded with the most important facts and contains no filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover safety/idempotency, the description covers the remaining gaps: timezone conversion expectations, sampling intervals, truncated responses, how to interpret hourly_coverage, and how to request either a full multi-day range or a specific hour window. An agent calling this tool has the information needed to interpret results correctly and choose sensible parameter combinations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all parameters at 100% coverage, so the baseline is 3. The description adds meaningful beyond-schema semantics: the relationship between days and hours_from/hours_to, the 'one call with days: 4 beats four calls' guidance, the sampling behavior difference when using a window, and concrete JSON examples showing locations and hour ranges. This elevates it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely: 'Blended hourly forecast: temperature, feels-like, humidity, wind, precipitation probability/amount, conditions, and icon per hour.' This is a specific, informative statement of what the tool returns. It does not explicitly contrast with sibling tools like get_forecast or get_current_conditions, but the emphasis on hourly rows and 'Snapped to the current hour' makes the tool's role clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage advice: ask for days up front to avoid multiple calls, check hourly_coverage before answering about a specific hour, use hours_from/hours_to for a contiguous stretch, and treat truncation explicitly. It lacks explicit when-not-to-use guidance against sibling tools, but the usage context is strong and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lightning_activityGet lightning activityARead-onlyIdempotentInspect
Real-time lightning near a location: GLM satellite flash count (30km/10min) and MRMS ground-truth lightning density + 30-minute probability. The summary field is ready-to-use. A zero flash count means no lightning inside that window -- report it as a quiet observation scoped to the window in scope, never as a data gap. Only call when storms may be active or the user asks about lightning. Example: {"location": "Tampa"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| scope | Yes | Area and time window searched, so a zero count is unambiguous to report. |
| location | Yes | |
| lightning | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already providing readOnly, idempotent, and non-destructive hints, the description adds valuable interpretation context: a zero flash count means a quiet observation within the window, not a data gap, and the `summary` field is ready to use. It also explains the temporal/spatial window of the data, which is not in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and front-loaded, leading with the core function and data types before adding interpretive guidance and usage conditions. Every sentence earns its place, and the example is compact and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given rich annotations, a fully described input schema, and an output schema, the description covers the remaining context an agent needs: what the data represents, how to interpret zero values, the appropriate invocation window, and an example. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage with clear descriptions for lat, lon, and location. The description adds a practical example ({"location": "Tampa"}) and reinforces that the tool is location-oriented, helping agents choose between coordinate and place-name inputs, though it does not introduce deep semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly identifies the tool as retrieving real-time lightning activity near a location, with specific data sources (GLM satellite flash count, MRMS lightning density) and a 30-minute probability. It distinguishes itself from sibling weather-data tools by naming the exact resource and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States an explicit trigger condition: 'Only call when storms may be active or the user asks about lightning.' This tells an agent when the tool is appropriate, but it does not name alternative sibling tools for non-lightning weather queries, so it stops short of full alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_map_snapshotGet map snapshotARead-onlyIdempotentInspect
Render a weather map image for visual analysis. Simple form: pass product (a viz-catalog product_id like "mrms_qpe_01h_pass2_conus", "goes_truecolor_conus", "spc_day1_categorical", "hrrr_precip_hybrid_derived_conus" (future radar), "hrrr_subhourly_conus" (15-min Future Radar), "mrms_radar_nowcast_conus", "rtma_conus", "nbm_daily_temps", or "nexrad_l3:{SITE}:{PRODUCT}" for single-site radar, e.g. "nexrad_l3:TLX:N0B") plus a location and zoom (5=regional, 8=metro, 10=city). Composed form: pass scene -- a declarative scene document layering basemap + multiple weather products + active alerts + storm features + inline GeoJSON in one image (layers draw bottom-to-top, under basemap labels). Example scene: {"scene":"1.0","view":{"center":{"lat":43.8,"lon":-91.2},"zoom":8},"layers":[{"type":"weather","product":"goes_truecolor_conus"},{"type":"weather","product":"nexrad_l3:ARX:N0B"},{"type":"alerts","filter":{"events":["Tornado Warning"]},"onError":"skip"}]}. Alert filters (all optional, AND-combined): ids (specific alerts), events, severities, minSeverity (Extreme>Severe>Moderate>Minor>Unknown). Single-site radar keys: the address is nexrad_l3:{SITE}:{KEY} where KEY is N{tilt}{measurement} and tilt 0 is the 0.5 degree sweep -- N0B reflectivity (dBZ, where and how heavy), N0G base velocity (knots toward/away from the radar), N0S storm-relative velocity (storm motion removed, so a couplet is rotation rather than translation -- prefer it for rotation questions), N0C correlation coefficient (0-1, debris and hail), N0X differential reflectivity (dB). Legacy codes (N0V, N0R, N0Q) are accepted as aliases. Not every site produces every key; when a render reports which keys a site has, retry with one of those. Optional time (unix seconds): closest frame. Forecast (HRRR/nowcast/NBM) honors future times; analysis (MRMS/NEXRAD/RTMA/GOES) clamps to latest past. Pass time for future-radar asks — do not claim that capability is missing. Product ids must be real viz-catalog entries -- shorthand like "radar" or "reflectivity" is not one. Omit product for the default hybrid precip still. For Alaska and Hawaii prefer a local site or mrms_precip_hybrid_derived_alaska over CONUS mosaics, which do not cover them. Returns the rendered image plus per-layer resolved valid times.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| time | No | Unix seconds; closest frame (default: latest). Forecasts honor future times. | |
| zoom | No | Map zoom (simple form) | |
| scene | No | Full scene document (composed form). When set, product/location/zoom are ignored. | |
| width | No | ||
| height | No | ||
| opacity | No | Weather layer opacity | |
| product | No | viz-catalog product_id or nexrad_l3:{SITE}:{KEY} (simple form) | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description adds substantial behavior beyond that: forecast products honor future times while analysis products clamp to the latest past, the return includes per-layer resolved valid times, layers draw bottom-to-top under basemap labels, and NEXRAD site-key availability may require retrying. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence earns its place given 10 parameters and no output schema. It is front-loaded with the purpose and the simplest form, then moves to composed scenes, then edge cases and region-specific guidance. The structure makes the dense detail navigable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 10-parameter tool with nested scene objects and no output schema, the description is exceptionally complete: it documents the return value ('rendered image plus per-layer resolved valid times'), parameter interactions, product-id validity requirements, time semantics, and regional caveats. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 80%, the description greatly expands meaning: it gives concrete product_id examples, explains the entire NEXRAD key format (tilt, measurement, and legacy aliases), defines alert filter fields and AND-combination semantics, provides a full scene example, and clarifies interactions like `scene` overriding product/location/zoom. The schema descriptions alone would not enable correct invocation nearly as well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Render a weather map image for visual analysis.' It clearly distinguishes the simple form (single `product` plus location and zoom) from the composed form (`scene` document), which separates it from all sibling data/forecast tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to guidance: use the composed scene form for layering multiple products/alerts, pass `time` for future-radar asks, prefer local sites or Alaska-specific products over CONUS mosaics, and omit `product` for the default hybrid precip. It even warns against claiming future-radar capability is missing. While it doesn't name sibling tools, the map-rendering purpose is unambiguous among the listed siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_observationsGet station observationsARead-onlyIdempotentInspect
METAR surface observations from weather stations: temperature, wind, visibility, ceiling, flight category, raw METAR. Nearest mode (default) returns the closest N stations to a location; station mode returns history for a specific ICAO identifier. Examples: {"location": "Denver", "n": 3} or {"station": "KJFK", "hours": 6}.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Number of nearest stations (1-10). Default 1. Ignored in station mode. | |
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| hours | No | Hours of history in station mode (1-24). | |
| station | No | ICAO station identifier (e.g. KJFK). Switches to station-history mode. | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| station | No | |
| location | No | |
| observations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/destructive hints, so the bar is lower. The description adds behavioral detail beyond annotations by explaining the default nearest mode, the switch to station-history mode when an ICAO is provided, and what fields the observations contain. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, information-dense, and front-loaded with the core resource before moving to modes and examples. Every sentence earns its place and the two short examples make the schema concrete without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a 100%-covered schema, an output schema, and safety-relevant annotations, the description fills the remaining gap by explaining mode semantics and typical use cases. It is complete enough for an agent to invoke the tool correctly in either mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining how the parameters interact (nearest mode vs station mode) and by giving working examples for each mode, which helps an agent choose between location/station and n/hours. This goes beyond the individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise definition: METAR surface observations from weather stations, listing the data fields (temperature, wind, visibility, ceiling, flight category, raw METAR). It clearly distinguishes the tool's two modes and differentiates it from the many forecast/alerts siblings by anchoring on surface observations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear mode-selection guidance: nearest mode for closest N stations and station mode with hours for ICAO history, along with concrete JSON examples. It does not explicitly contrast the tool with sibling tools such as get_current_conditions, but the mode guidance is enough for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_outlooksGet hazard outlooksARead-onlyIdempotentInspect
Hazard outlooks affecting a location. hazard=severe returns SPC convective outlooks (Day 1-8 categorical risk + tornado/wind/hail probabilities); hazard=fire returns SPC fire weather outlooks; hazard=rain returns WPC Excessive Rainfall Outlook polygons (days 1-3); hazard=heat returns the NWS HeatRisk index at the point (0 none .. 4 extreme, days 1-3). include_narrative=true adds the forecaster discussion for severe (SWO), fire (FWD), or rain (QPF/QPFERD; one PIL for all days). An empty result means no outlook covers the point -- not a failure. Examples: {"location": "Moore, OK", "hazard": "severe", "include_narrative": true} or {"location": "Phoenix", "hazard": "heat"}.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | Outlook day for the narrative filter (1-8). Default 1. | |
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| hazard | No | Hazard family: severe = SPC convective, fire = SPC fire weather, rain = WPC excessive rainfall, heat = NWS HeatRisk index. (Winter/WSSI is a planned expansion.) | severe |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| include_narrative | No | Include the forecaster narrative for the requested day (severe, fire, and rain). |
Output Schema
| Name | Required | Description |
|---|---|---|
| day | Yes | |
| hazard | Yes | |
| location | Yes | |
| outlooks | Yes | |
| heat_risk | No | |
| narrative | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description goes beyond them by disclosing that an empty result means no outlook covers the point, not an error, and by clarifying narrative behavior for severe/fire/rain. This is meaningful behavioral context without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose first, then hazard-specific behavior, then the empty-result caveat, then examples. There is no filler and no restating of what the schema already provides.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema and an output schema present, the description adds what remains necessary: per-hazard return semantics, narrative behavior, empty-result semantics, and representative usage examples. An agent has enough to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning: severe returns Day 1-8 categorical risk plus tornado/wind/hail probabilities, rain returns Day 1-3 polygons, heat returns a 0-4 index, and narrative returns specific PILs. The examples also make valid parameter combinations concrete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with "Hazard outlooks affecting a location" and then precisely maps each hazard value to a concrete product family (SPC convective, SPC fire weather, WPC Excessive Rainfall, NWS HeatRisk). This is specific enough to distinguish the tool from the forecast, alerts, and observation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to call the tool: when a user needs hazard outlooks at a point, and it explains how the hazard parameter selects among severe/fire/rain/heat. It does not explicitly name alternatives or when-not conditions, so it misses the top tier, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_period_totalsGet period totalsARead-onlyIdempotentInspect
Aggregate a weather variable over one or more time periods. Returns server-computed totals, maxima, minima, or averages per period. Period start/end times should use the user's local timezone boundaries (not UTC midnight). Response includes the converted value and unit per period. Ideal for questions like "total rainfall today and tomorrow" or "peak wind speed this weekend". Accepts a place name directly. Example: {"location": "Portland, OR", "variable": "precipitation", "aggregation": "sum", "periods": [{"start": "2026-07-08T07:00:00Z", "end": "2026-07-09T07:00:00Z", "label": "Today"}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| units | No | Unit system for all values in the request and response: imperial (°F, mph, inches), metric (°C, km/h, mm), or si (K, m/s, mm). Defaults to imperial. | imperial |
| periods | Yes | Time periods to aggregate over (1-14). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| variable | Yes | Standard variable name (e.g. precipitation, snowfall, temperature_2m, wind_speed_10m, cape). | |
| dataset_id | No | Dataset override. Default: auto-resolved NBM for the location. | |
| aggregation | No | Aggregation function. Default sum. Use sum for precipitation/snowfall, max for temperature/wind, min for low temperatures, avg for humidity/cloud cover. | sum |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| periods | Yes | |
| location | Yes | |
| variable | Yes | |
| aggregation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful behavioral context beyond those annotations: values are server-computed, period boundaries should use the user's local timezone rather than UTC midnight, and the response includes the converted value and unit per period. This is valuable, non-redundant information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is composed of four focused sentences plus a concrete JSON example. The core action and the important timezone caveat are front-loaded, and the example earns its place by showing how parameters combine. It is slightly long due to the example but contains no fluff or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with a fully documented input schema and an output schema present, the description is largely complete: it explains the aggregation behavior, the timezone handling, response contents, and use cases. Details like maxItems and dataset_id are already covered by the schema, so nothing critical is missing. It could mention more explicit limitations, but overall it is self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since schema description coverage is 100%, every parameter is already documented at a baseline level. The description adds a concrete example payload and clarifies the timezone semantics of period boundaries, but it does not introduce new parameter-level guidance beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Aggregate'), a clear resource (weather variable), and a well-defined scope (one or more time periods). It distinguishes itself from siblings by emphasizing server-computed totals/maxima/minima/averages and giving concrete example questions like 'total rainfall today and tomorrow' and 'peak wind speed this weekend', making its unique role immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: when aggregating a variable over time periods, when local timezone boundaries matter, and when the user wants a single place name as input. It includes ideal-use examples but does not explicitly name alternatives or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_platform_statusGet platform statusARead-onlyIdempotentInspect
Current data-freshness status of the weather platform: overall state, per-source states (ok / degraded / outage / no_signal), open incidents with cause attribution (provider outage vs internal processing delay), and active provider advisories. Use this when a user asks whether data is current, when other tools return surprisingly stale data, or before presenting time-critical weather. If a source is degraded or in outage, tell the user their data may be stale rather than presenting it as live. No inputs. Refreshed about every 5 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| include_ok | No | true: list every monitored source including healthy ones. false (default): only sources that are not ok, keeping the response compact. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| overall | Yes | Worst state across customer-facing data sources; "unknown" when status is unavailable. |
| sources | No | |
| advisories | No | |
| generated_at | No | When the status document was generated (UTC). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds useful behavioral context beyond that: the status refreshes every ~5 minutes, incidents are categorized by cause, and the agent should warn users about potentially stale data. The phrase 'No inputs' is slightly misleading given the optional include_ok parameter, but this is more of a parameter-semantics issue than a behavioral one.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it front-loads the purpose, then gives usage guidance and an important staleness caveat, and ends with refresh cadence. The 'No inputs' sentence is inaccurate and unnecessary, but the rest is tight and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description does not need to explain return values in depth. It covers when to use the tool, what the status categories mean, and how to handle degraded/outage states. The only notable gap is the misleading 'No inputs' statement, which is offset by the fully described input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents include_ok with a clear description and default, so schema coverage is 100%. The description's 'No inputs' line is imprecise because the tool does accept an optional boolean, though it may be intended to mean 'no required inputs.' Overall, the description adds no real parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns 'current data-freshness status of the weather platform' and lists the specific contents: overall state, per-source states, open incidents, and provider advisories. This distinguishes it from sibling tools like get_current_conditions or get_observations, which return weather data rather than platform freshness.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases: when a user asks whether data is current, when other tools return surprisingly stale data, or before presenting time-critical weather. It does not name alternatives or state when not to use the tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_population_exposureGet population exposureARead-onlyIdempotentInspect
National population-exposure headline for a risk-zone outlook product: how many people are inside risk bands at or above min_level. Powers headlines like "~57M people under major heat risk tomorrow". hazard=heat covers NWS HeatRisk days 1-3 (levels: 1 minor, 2 moderate, 3 major, 4 extreme). Pass product_id directly for other risk-zone products. Example: {"hazard": "heat", "min_level": 3}.
| Name | Required | Description | Default |
|---|---|---|---|
| hazard | No | Hazard family (expands the day-1..3 product set). Currently: heat (HeatRisk). | |
| min_level | No | Minimum risk level to count (>=). Default 1 (any elevated risk). | |
| product_id | No | Explicit risk-zone product ID (overrides hazard), e.g. heatrisk_day1_conus. |
Output Schema
| Name | Required | Description |
|---|---|---|
| min_level | Yes | |
| summaries | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral context beyond that: it counts people at or above a minimum risk level, covers only NWS HeatRisk days 1-3, and explains that product_id overrides hazard. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences plus a JSON example. The core behavior is front-loaded, the hazard scope is defined, and the product_id path is stated without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, all parameters are documented with 100% schema coverage, and annotations cover safety traits, the description completes the picture: it explains the product context, level semantics, hazard coverage, and how to handle other risk-zone products. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents hazard, min_level, and product_id with clear semantics. The description adds a worked example and reinforces the override relationship, but it does not materially expand on the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: get a national population-exposure headline counting people inside risk bands at or above min_level. It also grounds the purpose with a concrete example headline and separates it from generic forecasting tools by calling out risk-zone outlook products.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: hazard=heat covers NWS HeatRisk days 1-3, and product_id should be passed for other risk-zone products. It does not explicitly name sibling alternatives or state when not to use this tool, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_soundingGet radiosonde soundingARead-onlyIdempotentInspect
Nearest RAOB (radiosonde) vertical soundings to a point. Each sounding carries: profile (pressure-indexed thermodynamics: pressure_hpa, height_m, temperature_c, dewpoint_c, wind arrays), wind_profile (height-indexed winds for hodographs/shear), and derived indices (sbcape/mucape/mlcape + cin, lifted_index, k_index, total_totals, pwat_mm, freezing_level_m, lcl/lfc/el, bulk_shear_0_6km_kt). Soundings launch at 00Z/12Z so data can be hours old. Example: {"location": "Norman, OK"}.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Number of nearest soundings (1-5). Default 1. | |
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| location | Yes | |
| soundings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, openWorld, idempotent, and non-destructive behavior, so the bar is lower. The description adds useful behavioral context beyond annotations: soundings launch only at 00Z/12Z and can be hours old, and the result is the nearest sounding rather than an exact point measurement. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation and then gives a dense but useful breakdown of the returned data, followed by a compact example. The long data-fields sentence is somewhat verbose but earns its place by showing the tool's output shape and capabilities.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage and an output schema present, the description is nearly complete: it explains what the tool returns, gives an example, and warns about data freshness. The main gap is the lack of explicit routing between get_sounding and get_sounding_chart, and the n parameter is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with n, lat, lon, and location all described, so the baseline is 3. The description adds a concrete locator example ("Norman, OK") but does not independently clarify parameter semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the nearest RAOB vertical soundings to a point and enumerates the contained data, so the core purpose is unambiguous. It does not explicitly contrast itself with sibling get_sounding_chart, so it falls just short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: call this when you need the nearest radiosonde profile data for a point, and it warns about data being hours old. However, it does not explicitly say when to prefer this over get_sounding_chart or mention any alternative tools or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sounding_chartGet sounding chartARead-onlyIdempotentInspect
Render the nearest RAOB (radiosonde) sounding as a Skew-T log-P + hodograph chart image for visual analysis: temperature/dewpoint traces, wind barbs, height-banded hodograph, and a derived-indices table (CAPE/CIN, lifted index, PWAT, shear, LCL). Soundings launch at 00Z/12Z so data can be hours old. Use get_sounding for the raw profile numbers. Example: {"location": "Norman, OK"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| unit | No | Temperature axis display unit | fahrenheit |
| scale | No | Raster scale factor (2 = retina; higher = larger image payload) | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate this is a read-only, idempotent, non-destructive operation. The description adds useful behavioral context beyond annotations by warning that 'Soundings launch at 00Z/12Z so data can be hours old,' which is critical for interpreting the chart's freshness. It also discloses what the rendered chart contains, giving agents realistic expectations about the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and efficient: the first sentence defines the tool and output contents, the second provides a critical staleness caveat, and the third routes to the sibling tool. Every sentence contributes actionable information without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool returns, the data source, the staleness caveat, and the relationship to get_sounding. With no output schema present, the listing of chart elements (temperature/dewpoint traces, wind barbs, hodograph, indices table) gives the agent a solid mental model of the result. Minor details like image format or error behavior are absent but not critical for invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter in detail. The description adds only the concrete example '{"location": "Norman, OK"}', which demonstrates valid usage but does not materially enhance parameter understanding beyond the schema. A baseline of 3 is appropriate because the description does not need to compensate for missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and object: 'Render the nearest RAOB (radiosonde) sounding as a Skew-T log-P + hodograph chart image.' It enumerates the visual contents and explicitly separates itself from get_sounding by saying 'Use get_sounding for the raw profile numbers.' This makes the tool's purpose unmistakable and distinct among the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly frames the intended use case ('for visual analysis') and provides an explicit alternative ('Use get_sounding for the raw profile numbers'). It does not fully spell out when not to use this tool, but the visual-vs-raw distinction is enough to guide an agent's selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storm_cellsGet storm cellsARead-onlyIdempotentInspect
Radar-identified storm cells near a location, merging NEXRAD Level III algorithm output from the nearest radar site: storm tracks (cell position, movement, forecast positions), hail index (probability of hail/severe hail + max expected size), mesocyclone detections (rotation), and TVS (tornado vortex signatures). Use during active convection to see what the radar algorithms flag. An empty result means no detected cells -- common outside active storms. Example: {"location": "Norman, OK"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| include | No | Which detection families to include. Default: all. | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tracks | No | |
| summary | Yes | Ready-to-use one-liner. States explicitly when nothing was detected. |
| location | Yes | |
| detections | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description discloses that output is merged from the nearest NEXRAD site and that empty results are normal outside storms. This prevents misinterpretation and adds real behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: result contents, usage condition, and empty-result interpretation. The product list is formatted with clear parenthetical details and the example is inline rather than an extra paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description doesn't need to restate return fields. It covers what the tool does, when to use it, and how to read an empty response, leaving no essential gap for an agent invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline applies. The description's mention of product families mirrors the `include` enum and adds an example, but it doesn't materially extend the parameter explanations already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (radar-identified storm cells) and enumerates the algorithm outputs it returns (storm tracks, hail index, mesocyclone detections, TVS). This clearly distinguishes it from weather siblings like get_storm_reports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit use condition ('Use during active convection') and explains what an empty result means, which is essential for interpreting the tool. It doesn't name alternatives or exclusion criteria, but the context is sufficient for an agent to decide when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storm_reportsGet storm reportsARead-onlyIdempotentInspect
Recent NWS Local Storm Reports (LSRs) -- verified reports of tornadoes, hail, damaging winds, flooding near a location. Use to confirm severe weather occurrence or assess reported damage. valid_time is event occurrence (UTC); cite in local time. Example: {"location": "Wichita", "hours": 12, "type": "H"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| type | No | Report type filter: T=tornado, H=hail, W=wind, F=flood, D=damage, S=snow. | |
| hours | No | Lookback window in hours (1-24). Default 6. | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hours | Yes | |
| reports | Yes | |
| location | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=true, idempotentHint=true, non-destructive), so the bar is lower. The description adds value beyond annotations by flagging that valid_time is event occurrence in UTC and should be cited locally, and by characterizing reports as 'verified' — a meaningful data-quality trait. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: definition, use case, time-zone caveat, and a concrete example. The core definition is front-loaded and the example is compact and illustrative without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema and strong annotations, the description correctly focuses on what structure cannot convey: the UTC time semantics and the tool's evidentiary role for confirming severe weather. The only gap is the lack of explicit routing versus siblings such as get_alerts or get_storm_cells, which slightly weakens completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (lat, lon, type, hours, location) are already documented in structure. The description's example ('location: Wichita, hours: 12, type: H') shows composition of the params but adds no new meaning beyond the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise resource ('NWS Local Storm Reports (LSRs)') with a specific verb ('get' implied by the name but the description defines the subject matter) and enumerates the content: verified reports of tornadoes, hail, damaging winds, flooding near a location. This clearly distinguishes it from siblings like get_storm_cells (radar storm features) and get_alerts (warnings/advisories), since LSRs are a distinct NWS post-event product.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states an explicit use case: 'Use to confirm severe weather occurrence or assess reported damage.' This tells an agent when this tool is the right choice. It does not name alternative tools or explicit exclusions, so agents might not know to prefer get_alerts for impending warnings or get_storm_cells for active tracking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_time_contextGet time contextARead-onlyIdempotentInspect
Complete temporal context for a location: local time, timezone, 14-day calendar with day names and Today/Tomorrow offsets, sunrise/sunset/solar times (from the weather pipeline's astro product), and moon phase. Use whenever you need to reason about dates, times, or daylight for a location -- including "what time is sunset?", "is it dark there now?", or "what day of the week is the 4th-day forecast?". Accepts a place name directly. Example: {"location": "Seattle"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| moon | Yes | |
| calendar | Yes | |
| daylight | Yes | |
| location | Yes | |
| current_time | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, and non-destructive behavior. The description adds context beyond that: solar times come from the weather pipeline's astro product, it returns a 14-day calendar with Today/Tomorrow offsets, and it accepts a place name directly. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded: the first sentence states the resource and full contents, the second gives usage guidance with examples, and the third demonstrates the input format. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only/idempotent annotations, 100% schema coverage, and presence of an output schema, the description fully supports tool selection and invocation. It covers what the tool returns, when to use it, and how to pass a location; structured fields handle the remaining return-format details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without additional parameter detail. The description's 'Accepts a place name directly' and example add marginal nuance, but the schema already documents lat/lon and location semantics thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: returns complete temporal context for a location, enumerating local time, timezone, 14-day calendar, solar times, and moon phase. The rich content list and concrete example queries distinguish it clearly from sibling tools about forecasts, observations, alerts, and climate data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use whenever you need to reason about dates, times, or daylight for a location' and gives natural-language trigger examples like 'what time is sunset?' or 'is it dark there now?'. It does not name alternative tools or when-not-to-use conditions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tropicalGet tropical activityARead-onlyIdempotentInspect
Active NHC (National Hurricane Center) tropical systems: forecast cones, track lines, forecast points, coastal watches/warnings, and 7-day Tropical Weather Outlook formation areas -- Atlantic + East Pacific. Each feature carries a kind (cone | track | points | watch_warning | outlook_area) plus storm name, intensity, and timing properties. include_geometry=true adds full GeoJSON geometries (large). An empty result means no active tropical activity. Example: {} or {"include_geometry": true}.
| Name | Required | Description | Default |
|---|---|---|---|
| include_geometry | No | Include full GeoJSON geometries (cone/track polygons). Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| active | Yes | |
| features | Yes | |
| feature_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description adds useful behavioral detail: an empty result means no active tropical activity, and include_geometry=true returns large GeoJSON geometries. This warns the agent about payload size and result interpretation without contradicting any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description adds value: scope, feature structure, parameter behavior, empty-result semantics, and a usage example. It is front-loaded with the resource identity and avoids any unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one optional parameter, rich annotations, and an output schema available, the description covers the essential call semantics completely: what data is returned, what each feature contains, how the geometry flag changes the response, and how to interpret a nempty result. Nothing critical is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents include_geometry with a default and description, so baseline is 3. The description adds extra meaning by warning that geometry is large and by providing concrete example invocations ({} vs. {include_geometry: true}), which helps the agent choose the safe default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource—active NHC tropical systems—and enumerates the exact content types returned (forecast cones, track lines, points, watches/warnings, outlook areas) and basins covered. This clearly distinguishes it from the many sibling weather tools even without naming one explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by defining its scope (active NHC tropical activity) and explains the empty-result semantics. However, it does not explicitly state when not to use it or mention alternative tools such as get_storm_cells or get_outlooks for non-tropical severe weather.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datasetsList datasetsARead-onlyIdempotentInspect
Discover the datasets (model grids, analyses, observations) available at a location, with per-dataset freshness (data age, latest model run). Datasets vary by domain (CONUS/Alaska/Hawaii). Use this to find dataset_id values for query_dataset and describe_dataset, or to assess whether data is current before making decisions. Example: {"location": "Anchorage"}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| include_freshness | No | Include per-dataset data age and run times. Default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| datasets | Yes | |
| location | Yes | |
| freshness | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish safety and idempotence (readOnlyHint, openWorldHint, idempotentHint, destructiveHint: false). The description adds useful behavioral context beyond annotations, including per-dataset freshness, latest model run, and the fact that datasets vary by CONUS/Alaska/Hawaii domain, without contradicting any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences front-load the core behavior, then provide practical usage guidance and a concrete example. Every sentence earns its place and there is no redundant restatement of schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, an output schema, and annotations covering safety and idempotence, the description adds the remaining needed context: what datasets are listed, why the freshness matters, how to use it with related tools, and a concrete invocation example. This is complete for correct tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with detailed descriptions of lat, lon, location, and include_freshness, so the description is not required to repeat parameter details. The description adds no substantive parameter meaning beyond the example location, which is sufficient given the schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Discover') and a specific resource ('datasets available at a location'), naming the dataset categories (model grids, analyses, observations) and the freshness information returned. It is clearly distinct from siblings like get_forecast or query_dataset, and it also explains its downstream relationship to query_dataset and describe_dataset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: to find dataset_id values for query_dataset/describe_dataset and to assess data currency. It does not explicitly describe when not to use it, but the intended use cases are clear enough to guide selection among a large sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_datasetQuery datasetARead-onlyIdempotentInspect
Raw time series from a specific dataset for specific variables at a point. Power-user access to any gridded product (NBM, HRRR, RRFS, GFS, RTMA, MRMS, air quality, ...). Time modes: hours (next N hours, default 24), time_start+time_end (explicit ISO-8601 window), or latest=true (single most-recent value). reference_time pins a specific model run, and each returned series reports the run that served it (reference_time, or reference_times when a series mixes runs) — check it before comparing two runs, since a run older than about 48 hours may no longer be available. For blended forecasts use get_forecast instead. Examples: {"location": "Denver", "dataset_id": "rrfs_surface", "variables": ["temperature_2m"], "hours": 18} or {"lat": 41.4, "lon": -92.9, "dataset_id": "rtma_conus", "variables": ["temperature_2m"], "latest": true}.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | No | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). | |
| hours | No | Forecast/lookahead hours from now (1-264). Default 24 when no other time mode set. | |
| latest | No | Return only the most recent value (analysis datasets like RTMA/MRMS). | |
| location | No | Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both. | |
| time_end | No | ISO 8601 window end (with time_start). | |
| variables | Yes | Standard variable names (e.g. temperature_2m, precipitation). Discover with describe_dataset. | |
| dataset_id | No | Dataset to query. Default: the NBM dataset for the location domain (nbm_conus/nbm_alaska/nbm_hawaii). Discover options with list_datasets. | |
| time_start | No | ISO 8601 window start (with time_end). | |
| reference_time | No | Pin a specific model run (ISO 8601). Default: latest run. |
Output Schema
| Name | Required | Description |
|---|---|---|
| series | Yes | |
| location | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so no safety concerns need repeating. The description adds valuable behavioral context: run availability (a run older than about 48 hours may no longer be available), returned series reports reference_time or reference_times, and that results may mix runs. This goes beyond the annotations' safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it opens with the core purpose, then covers time modes, run-pinning caveat, sibling routing, and examples. Every sentence earns its place. Slightly dense, but effective for a power-user tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the key usage patterns (hours, window, latest), the reference_time caveat, and sibling differentiation. The output schema exists, so return format details are not the description's job. The only minor gap is that it doesn't explain what happens if no time mode is specified beyond hours defaulting to 24, but the schema covers hours default. Overall nearly complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 10 parameters. The description adds context by explaining time modes and reference_time semantics, but doesn't need to repeat parameter definitions. Baseline 3 is appropriate since the schema carries the heavy lifting and the description supplements with usage context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: query raw time series from a specific dataset for specific variables at a point, and explicitly names the power-user scope (NBM, HRRR, RRFS, GFS, RTMA, MRMS, air quality). It distinguishes itself from get_forecast by saying blended forecasts should use get_forecast instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool vs alternatives: 'For blended forecasts use get_forecast instead.' It also explains the three time modes (hours, time_start+time_end, latest=true) and reference_time behavior, which tells an agent exactly which parameters to set for a given scenario. The examples further illustrate valid usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reverse_geocodeReverse geocodeARead-onlyIdempotentInspect
Resolve coordinates to a human-readable place (city, state, county, timezone). Use when you have lat/lon but need a display name or the local timezone. Example: {"lat": 39.74, "lon": -104.99} -> Denver, Colorado, America/Denver.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon. | |
| lon | Yes | Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian). |
Output Schema
| Name | Required | Description |
|---|---|---|
| lat | Yes | |
| lon | Yes | |
| place | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is known. The description adds concrete behavioral output (including timezone) and an example, with no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose, usage condition, example. Every sentence earns its place; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only tool with an output schema, the description conveys purpose, usage, and a worked example. It does not explicitly correct the misleading 'location' note in the schema or address edge cases, so it falls just short of full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters with ranges and descriptions (100% coverage), so baseline is 3. The description adds a concrete example mapping lat/lon to a result, though the schema's lat description misleadingly mentions a 'location' string that additionalProperties=false contradicts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Resolve') and resource ('coordinates') and enumerates the output categories (city, state, county, timezone). The example concretely differentiates it from forward geocoding (search_locations) and weather-focused siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The instruction 'Use when you have lat/lon but need a display name or the local timezone' provides an explicit condition for selection. It does not name sibling alternatives or exclusions, but the condition is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_locationsSearch locationsARead-onlyIdempotentInspect
Resolve a place query to candidate locations with coordinates. Accepts city names ("Denver"), city+state ("Portland, OR" via query), ZIP codes ("50219"), or partial input with fuzzy=true for autosuggest-style matching ("bost" -> Boston). Returns ranked candidates with lat/lon. Most weather tools accept a location string directly and geocode internally -- use this tool only to disambiguate ("which Springfield?") or to present location choices to the user. Example: {"query": "Springfield"} returns all major Springfields ranked by place importance.
| Name | Required | Description | Default |
|---|---|---|---|
| fuzzy | No | Autosuggest mode for partial/misspelled input. Default false (exact search). | |
| limit | No | Maximum candidates to return (1-10). Default 5. | |
| query | Yes | Place query: city, "city, state", ZIP, or partial text with fuzzy=true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| candidates | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds behavioral detail beyond that: accepted query formats, fuzzy matching behavior, ranked candidates, and lat/lon output. It does not contradict annotations and gives useful operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose. Every sentence adds useful information: accepted formats, fuzzy behavior, output type, usage boundaries, and a concrete example. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema, and annotations, the description covers the remaining context an agent needs: when to invoke it, what inputs are accepted, what output shape to expect, and how it relates to sibling tools. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds extra semantic value by giving concrete examples such as 'Portland, OR' via query, '50219', and 'bost' -> Boston with fuzzy=true, plus an example explaining that Springfields are ranked by importance. This goes beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Resolve a place query to candidate locations with coordinates.' It clearly states what the tool does and distinguishes it from siblings by noting that most weather tools geocode internally and this tool is only for disambiguation or presenting choices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'use this tool only to disambiguate' or 'to present location choices to the user,' and contrasts with most weather tools that accept a location string directly. This gives an agent clear routing guidance and prevents unnecessary calls.
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. Dates show when Glama detected each change.
1 tool update
- Added
get_forecast_skill_map
3 tool updates
- Changed
get_forecast_skill3 fields changed- changed
Input schema / properties / model / descriptionPrevious value: -"Narrow to one model, e.g. nbm."New value: +"Narrow to one model, e.g. nbm or rrfs." - changed
Output schema / properties / insufficientHistory / items / additionalPropertiesPrevious value: -falseNew value: +true - changed
Output schema / properties / skill / items / additionalPropertiesPrevious value: -falseNew value: +true
- Changed
get_platform_status3 fields changed- changed
Output schema / properties / advisories / items / additionalPropertiesPrevious value: -falseNew value: +true - changed
Output schema / properties / sources / items / additionalPropertiesPrevious value: -falseNew value: +true - changed
Output schema / properties / sources / items / properties / incident / additionalPropertiesPrevious value: -falseNew value: +true
- Changed
search_locations1 field changed- changed
Output schema / properties / candidates / items / additionalPropertiesPrevious value: -falseNew value: +true
2 tool updates
- Changed
get_alerts3 fields changed- added
Input schema / properties / bboxAdded value: +{ + "additionalProperties": false, + "description": "Bounding box {west,south,east,north}. Skips geocoding; intersecting polygons.", + "properties": { + "east": { + "$ref": "#/properties/lon" + }, + "north": { + "$ref": "#/properties/lat" + }, + "south": { + "$ref": "#/properties/lat" + }, + "west": { + "$ref": "#/properties/lon" + } + }, + "required": [ + "west", + "south", + "east", + "north" + ], + "type": "object" +} - added
Input schema / properties / eventsAdded value: +{ + "description": "Optional event-name filter, e.g. [\"Tornado Warning\"].", + "items": { + "type": "string" + }, + "type": "array" +} - removed
Output schema / properties / location / requiredRemoved value: -[ - "lat", - "lon" -]
- Changed
get_map_snapshot2 fields changed- changed
Input schema / properties / height / defaultPrevious value: -560New value: +440 - changed
Input schema / properties / width / defaultPrevious value: -900New value: +720
1 tool update
- Changed
get_forecast_skill4 fields changed- added
Output schema / properties / skill / items / properties / continuous / properties / analysisDisagreementMaeAdded value: +{ + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / skill / items / properties / continuous / properties / analysisDisagreementSamplesAdded value: +{ + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / skill / items / properties / vector / properties / analysisDisagreementMaeAdded value: +{ + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / skill / items / properties / vector / properties / analysisDisagreementSamplesAdded value: +{ + "type": [ + "number", + "null" + ] +}
2 tool updates
- Changed
get_alerts2 fields changed- added
Input schema / properties / atAdded value: +{ + "description": "ISO-8601 UTC past instant for the in-effect snapshot. Ignored with alert_id.", + "type": "string" +} - added
Output schema / properties / valid_timeAdded value: +{ + "description": "Echo of at when an as-of snapshot was requested.", + "type": "string" +}
- Changed
get_forecast_skill2 fields changed- changed
Input schema / properties / regime / descriptionPrevious value: -"Ask for a track record measured only under particular conditions, as a comma-separated preference chain, most specific first, e.g. \"SCN1:WINDY,SEA:JJA\". SEA: is the meteorological season (DJF, MAM, JJA, SON); SCN1: is a forecast-conditioned scenario (WINDY, WET, QUIET — mutually exclusive within the family); JC: is a circulation pattern. The most specific tier with enough observations answers and the unconditioned record is the last resort, so this never empties a result the way truth does -- it degrades. Read the regime field on each entry to see which tier actually answered. Pass this when the question is conditional (\"is it worse in winter\", \"how does it do when the model shows windy\"); omit it otherwise, since conditioned tiers are thinner and slower to earn numbers."New value: +"Ask for a track record measured only under particular conditions, as a comma-separated preference chain, most specific first, e.g. \"SCN1:WINDY,SEA:JJA\". SEA: is the meteorological season (DJF, MAM, JJA, SON); SCN1: is a forecast-conditioned scenario (WINDY, WET, QUIET — mutually exclusive within the family); JC1: is a circulation pattern. The most specific tier with enough observations answers and the unconditioned record is the last resort, so this never empties a result the way truth does -- it degrades. Read the regime field on each entry to see which tier actually answered. Pass this when the question is conditional (\"is it worse in winter\", \"how does it do when the model shows windy\"); omit it otherwise, since conditioned tiers are thinner and slower to earn numbers." - added
Output schema / properties / skill / items / properties / vector / properties / persistenceSkillScoreAdded value: +{ + "type": [ + "number", + "null" + ] +}
1 tool update
- Changed
get_forecast_skill2 fields changed- changed
Input schema / properties / variable / descriptionPrevious value: -"Narrow to one variable, e.g. temperature_2m, dew_point_2m, wind_speed_10m, wind_gusts_10m, cloud_cover, precipitation, precipitation_probability, or a thresholded rain event such as precipitation_gt_0p254mm (any measurable rain) or precipitation_gt_2p54mm. Omit for everything measured at the location."New value: +"Narrow to one variable, e.g. temperature_2m, dew_point_2m, wind_speed_10m, wind_gusts_10m, wind_vector_10m, cloud_cover, precipitation, precipitation_probability, or a thresholded rain event such as precipitation_gt_0p254mm (any measurable rain) or precipitation_gt_2p54mm. Omit for everything measured at the location." - added
Output schema / properties / skill / items / properties / vectorAdded value: +{ + "additionalProperties": false, + "properties": { + "samples": { + "type": "number" + }, + "skillScore": { + "type": [ + "number", + "null" + ] + }, + "vectorRmse": { + "type": "number" + } + }, + "required": [ + "samples", + "vectorRmse" + ], + "type": "object" +}
1 tool update
- Changed
get_forecast_skill1 field changed- added
Output schema / properties / skill / items / properties / continuous / properties / persistenceSkillScoreAdded value: +{ + "type": [ + "number", + "null" + ] +}
1 tool update
- Changed
search_locations1 field changed- added
Output schema / properties / candidates / items / properties / place_idAdded value: +{ + "type": "string" +}
1 tool update
- Changed
get_forecast_discussion3 fields changed- added
Input schema / properties / awips_idAdded value: +{ + "description": "Full AWIPS identifier (e.g. TCDAT1, PMDSPD). More specific than type + location. Exact source_ref match.", + "maxLength": 12, + "minLength": 3, + "type": "string" +} - changed
Input schema / properties / type / descriptionPrevious value: -"Product type: afd (WFO discussion), hwo (hazard outlook), mcd (SPC mesoscale), swo (SPC convective outlook), fwd (SPC fire weather), ero (WPC excessive rainfall)."New value: +"Product type: afd (WFO discussion), hwo (hazard outlook), now (short-term NOW), fwf/hls/esf (local WFO), mcd (SPC mesoscale), mpd (WPC precipitation discussion), swo (SPC convective outlook), fwd (SPC fire weather), ero (WPC excessive rainfall), tcd/tcp/tcm/twd/two (NHC tropical text; two is text TWO not GIS), pmd (desk discussion), pwo (SPC public outlook)." - changed
Input schema / properties / type / enumPrevious value: -[ - "afd", - "hwo", - "mcd", - "swo", - "fwd", - "ero" -]New value: +[ + "afd", + "hwo", + "now", + "fwf", + "hls", + "esf", + "mcd", + "mpd", + "swo", + "fwd", + "ero", + "tcd", + "tcp", + "tcm", + "twd", + "two", + "pmd", + "pwo" +]
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Hosted MCP server for Xweather weather data: conditions, forecasts, alerts, and more.
1NOAA Weather MCP — National Weather Service forecasts and alerts
NWS MCP — US National Weather Service (no auth)
Weather data, forecast API, climate data, historical weather, alerts, agricultural & travel weather.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables to interact with comprehensive weather data through the MCP protocol, including current conditions, multi-day forecasts, hourly forecasts, and geocoding.22MIT
- AlicenseAqualityCmaintenanceProvides real-time US weather data for AI assistants via MCP, including current conditions, forecasts, alerts, severe weather outlooks, radar, upper-air analysis, and surface analysis. Supports optional personal weather station integration.94ISC
- FlicenseNot gradedqualityCmaintenanceMCP server that provides current weather, multi-day forecasts, umbrella recommendations, severe weather alerts (US), and side-by-side city comparisons using Open-Meteo and NWS APIs, with no API key required.-
- FlicenseAqualityDmaintenanceA 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-
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Most tools have clearly distinct purposes, and the detailed descriptions generally prevent misselection. A few near-overlapping pairs exist — get_current_conditions vs get_observations, and get_forecast already bundling current conditions, alerts, and outlooks — so some ambiguity remains.
The overwhelming majority of tools follow a get_<object>_<modifier> pattern in snake_case, and the non-get tools still use an imperative verb_noun form. The mix of verbs (get, list, describe, find, query, search, reverse) is a minor inconsistency, but the overall pattern is predictable.
At 32 tools, the surface is heavy and exceeds the 25+ threshold for a large tool set. The weather domain justifies much of the breadth, but several tools overlap in scope and could plausibly be consolidated, making the count feel higher than necessary.
The tool set comprehensively covers current conditions, forecasts, hourly data, climate, alerts, severe weather, air quality, tropical systems, upper-air soundings, maps, model data, geocoding, and platform status. There are no obvious dead-end workflows, and raw access via query_dataset fills most remaining gaps.