nws-weather-mcp-server
Server Details
Get US weather forecasts, active alerts, and current observations.
- Status
- Healthy
- Uptime
- 99.8% over 39 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/nws-weather-mcp-server
- GitHub Stars
- 1
- Server Listing
- @cyanheads/nws-weather-mcp-server
TDQS
Scored across 7 tools
Most tools have clearly distinct purposes: station discovery, observations, alerts, and alert-type listing are unambiguous. The three forecast-related tools (nws_get_forecast, nws_get_zone_forecast, nws_get_office_discussion) could be confused at a glance, but their descriptions clearly separate structured grid forecasts, zone text forecasts, and forecaster discussions.
All tools follow a consistent nws_ prefix with snake_case verb_noun naming: find_stations, get_forecast, get_observations, search_alerts, list_alert_types. The verb choices (get, find, list, search) are predictable and match each tool's action.
Seven tools is a well-scoped size for an NWS weather server. Each tool covers a major weather data category — stations, forecasts, observations, zone forecasts, office discussions, and alerts — without unnecessary redundancy or overwhelming count.
The tool set covers the core NWS workflow: discovering stations, getting forecasts and observations, reading forecaster discussions, and searching alerts with valid event types. Minor gaps like radar imagery or detailed station metadata exist, but they are not essential to the server's apparent purpose.
Available Tools
7 toolsnws_find_stationsNws Find StationsARead-onlyInspect
Find weather observation stations near a location. Returns stations sorted by proximity with distance and bearing. Use to discover station IDs for nws_get_observations.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max stations per page (1-50). totalCount still reports every station near the point, so pass the returned nextCursor as cursor to reach the rest. | |
| cursor | No | Opaque continuation token from a previous response's nextCursor. Omit for the first page. The token carries its own page size, so limit applies to the first page only. Every call re-fetches the station list, so pages are contiguous within one response; the registry changes rarely, but a later call can window an updated list. | |
| latitude | Yes | Center latitude for proximity search. | |
| longitude | Yes | Center longitude for proximity search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of stations returned in this page |
| notice | No | Guidance when no stations were found near the requested coordinates, when stations remain beyond this page, or when the supplied cursor points past the end of the list. |
| stations | No | Nearby stations sorted by distance |
| nextCursor | No | Opaque token for the next page of stations — pass it back as `cursor`. Omitted when this is the last page. |
| totalCount | No | Total observation stations available near this location before the page limit was applied — NOT the number returned in this page, which is shown. Same value on every page of one query; compare it against shown to tell whether stations were withheld. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already communicates safety, and the description adds meaningful behavioral detail: stations are returned sorted by proximity and include distance and bearing. This is useful beyond the annotation, though it does not discuss error conditions or rate limits.
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 with no filler: the core function, the output behavior, and the intended use case are all front-loaded. Every sentence earns its place.
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 is simple, annotations cover the read-only nature, the input schema is fully descriptive, and an output schema exists. The description provides the one missing piece—why an agent would call this tool and what it returns—making it complete for 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?
Schema description coverage is 100%, so the schema already fully documents latitude, longitude, limit, and cursor. The description adds no parameter-specific semantics beyond 'near a location', which maps to latitude/longitude but does not exceed what the schema 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 uses a specific verb ('Find') with a clear resource ('weather observation stations near a location') and clearly identifies the downstream purpose: discovering station IDs for nws_get_observations. This distinguishes it from the sibling forecast, alert, and discussion tools without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when this tool should be used: to discover station IDs for nws_get_observations. It does not list exclusions or alternative tools, but the discovery role is clear and sufficient for this simple tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nws_get_forecastNws Get ForecastARead-onlyInspect
Get the weather forecast for a US location. Returns either named 12-hour periods (default) or hourly breakdowns.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Opaque continuation token from a previous response's nextCursor, to retrieve the next 48 periods. Omit for the first page. Every call re-fetches the forecast, so consecutive periods are contiguous within one response; NWS reissues forecasts through the day, so a later call can window a regenerated period array. | |
| hourly | No | If true, returns hourly forecast (48 one-hour periods per page, ~156 available) instead of 12-hour named periods (14 periods). Hourly includes dewpoint and relative humidity. | |
| latitude | Yes | Latitude in decimal degrees (e.g., 47.6062). | |
| longitude | Yes | Longitude in decimal degrees (e.g., -122.3321). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | Forecast mode: "hourly" or "7-day" |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of forecast periods in this page (at most 48). |
| notice | No | Set when periods remain beyond this page, or when the supplied cursor points past the end of the period array. |
| periods | No | Forecast periods |
| location | No | Resolved location metadata |
| nextCursor | No | Opaque token for the next page of periods — pass it back as `cursor`. Omitted when this is the last page. |
| totalCount | No | Total forecast periods available upstream before the page window was applied — NOT the number in this page, which is shown. Compare it against shown to tell whether periods were withheld. |
| generatedAt | No | When the forecast was generated (ISO 8601) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers safety, and the description adds a useful behavioral detail: forecasts come as named 12-hour periods by default or hourly breakdowns. However, it does not disclose pagination, forecast regeneration, or error behavior beyond what the schema's cursor description already provides.
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 two short sentences with no filler, front-loading the core action and then stating the output options. Every word contributes useful 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?
Given the output schema, readOnlyHint annotation, and fully documented parameters, the description does not need to enumerate return fields or cursor mechanics. It is sufficient for a read-only forecast tool, though an explicit pointer to sibling tools for alternative forecast types would make it slightly more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter descriptions are already detailed, so the baseline is 3. The phrase 'US location' adds meaningful geographic context for latitude/longitude that the schema's world-wide bounds do not convey, giving the description extra semantic value.
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 ('Get the weather forecast') and resource ('a US location'), and briefly characterizes the output formats. It is clear at a glance, but it does not explicitly distinguish itself from sibling tools like nws_get_zone_forecast, so it falls 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?
There is no guidance about when to use this tool versus alternatives such as nws_get_zone_forecast or nws_get_observations. The description explains what the tool returns but not the conditions under which an agent should pick it over other forecast-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nws_get_observationsNws Get ObservationsARead-onlyInspect
Get current weather observations (actual measured conditions). Accepts coordinates (resolves nearest station automatically) or a station ID directly (e.g., "KSEA").
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | No | Latitude for automatic station resolution. Use with longitude. Ignored if station_id is provided. | |
| longitude | No | Longitude for automatic station resolution. Use with latitude. Ignored if station_id is provided. | |
| station_id | No | Station identifier directly (e.g., "KSEA", "KORD"). Use nws_find_stations to discover station IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when the latest observation is more than 2 hours old — data may not reflect current conditions. |
| station | No | Station ID that served the observation (e.g., "KSEA") |
| timeZone | No | Station time zone when known |
| dewpointC | No | Dewpoint in Celsius |
| stationId | No | Observation station ID |
| timestamp | No | Observation time (ISO 8601) |
| heatIndexC | No | Heat index in Celsius |
| observedAt | No | Observation timestamp (ISO 8601) |
| windChillC | No | Wind chill in Celsius |
| cloudLayers | No | Cloud layer information |
| stationName | No | Station name |
| visibilityM | No | Visibility in meters |
| windGustKmh | No | Wind gust in km/h |
| temperatureC | No | Temperature in Celsius |
| windSpeedKmh | No | Wind speed in km/h |
| textDescription | No | Conditions summary (e.g., "Mostly Cloudy") |
| windDirectionDeg | No | Wind direction in degrees (0-360) |
| relativeHumidityPct | No | Relative humidity in percent (0-100) |
| barometricPressurePa | No | Barometric pressure in Pascals |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnlyHint. The description adds meaningful behavior: coordinate resolution automatically picks the nearest station, and station_id bypasses that. It doesn't hide side effects, which are minimal for a read operation, and it does not contradict 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?
Two sentences, front-loads the core purpose and includes the necessary invocation options plus an example. No filler or 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?
This is a simple optional-parameter read tool; the description explains both valid input modes and the automatic station-resolution behavior. The output schema and readOnlyHint cover return values and safety, so 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?
The input schema already has 100% coverage, including 'automatic station resolution', 'Ignored if station_id is provided', and examples. The description adds no parameter meaning beyond what the schema provides, so 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 ('Get'), states the resource ('current weather observations'), and clarifies 'actual measured conditions' to distinguish from forecasts. It also enumerates accepted input forms (coordinates or station ID), making the tool's purpose unmistakable even among siblings like nws_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 gives clear context that this is for current observations and explains the two invocation modes, including that coordinates auto-resolve a station. It doesn't spell out exclusions versus forecast-related siblings, but the phrase 'actual measured conditions' implicitly routes the agent to observations rather than forecasts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nws_get_office_discussionNws Get Office DiscussionARead-onlyInspect
Get the latest narrative forecast product from a Weather Forecast Office (WFO). The default product is AFD (Area Forecast Discussion), which explains the meteorological reasoning behind the forecast — synoptic setup, model guidance, and forecaster confidence. Other types: HWO (Hazardous Weather Outlook, 1-7 day severe/flood/winter outlook), ZFP (Zone Forecast Product, zone-by-zone text), SPS (Special Weather Statement, short-fuse advisory). The office code is the 3-letter WFO identifier returned as the "office" field by nws_get_forecast.
| Name | Required | Description | Default |
|---|---|---|---|
| office | Yes | Three-letter Weather Forecast Office (WFO) code (e.g., "SEW" for Seattle, "LOX" for Los Angeles). Returned as the "office" field in nws_get_forecast output. | |
| product_type | No | Product type code. AFD (Area Forecast Discussion) — meteorological reasoning, model analysis, forecaster confidence. HWO (Hazardous Weather Outlook) — 1-7 day outlook for severe weather, flooding, winter weather. ZFP (Zone Forecast Product) — detailed zone-by-zone text forecast. SPS (Special Weather Statement) — short-fuse advisory for notable non-warning weather. | AFD |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| productCode | No | Product type code (e.g., "AFD"). |
| productName | No | Full product name (e.g., "Area Forecast Discussion"). |
| productText | No | Full narrative product text as issued by the forecaster. AFDs are typically 1,000-3,000 words covering synoptic setup, model guidance, and period-by-period reasoning. |
| issuanceTime | No | When the product was issued (ISO 8601), e.g., "2026-05-30T10:33:00+00:00". |
| issuingOffice | No | Issuing office call sign (e.g., "KSEW"). Includes the K/P prefix, unlike the input office code. |
| wmoCollectiveId | No | WMO collective identifier (e.g., "FXUS66"). Identifies the product family in international message routing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only declare readOnlyHint=true, so the description adds useful behavioral context by defining the default product, the nature of each product type, and that the office code comes from nws_get_forecast. It does not contradict the annotations and gives the agent a clearer sense of what the returned content will represent.
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 two sentences: the first states the core action and default, and the second compactly lists alternative product types with brief explanations. Every sentence earns its place, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with a rich input schema and an output schema, the description is complete. It covers the primary action, default behavior, product-type semantics, and the source of the office code, leaving no meaningful gap for an agent to call 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 fully documents both parameters and the enum values. The description largely repeats this information, though it adds a useful cross-reference tying the office code to nws_get_forecast. This adds marginal context but does not significantly elevate semantics 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 opens with a specific verb and resource: 'Get the latest narrative forecast product from a Weather Forecast Office (WFO).' It clearly enumerates the product types (AFD, HWO, ZFP, SPS) and explains what each one contains, making the tool's purpose unmistakable and distinct from 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 use the tool and how to select among product types, explaining the default AFD and the meaning of each alternative. It does not explicitly state when NOT to use this tool versus a sibling like nws_get_zone_forecast, but it provides enough context for an agent to make a reasonable selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nws_get_zone_forecastNws Get Zone ForecastARead-onlyInspect
Get the text forecast for a public NWS forecast zone. Returns named forecast periods (e.g., "Today", "Tonight", "Monday") with detailed narrative text — the human-readable, zone-level forecast written by local forecasters. Completes the alert-to-forecast chain: nws_search_alerts returns each affected zone in "affectedZones" as a code plus a type, and nws_find_stations returns codes in the "forecastZone" column. Only affectedZones entries with type "forecast" work here; entries typed "county" or "fire" have no text forecast upstream and will not resolve. Zone codes follow the pattern XXZ### (e.g., "WAZ315" for Western Washington lowlands).
| Name | Required | Description | Default |
|---|---|---|---|
| zone_id | Yes | NWS public forecast zone code (e.g., "WAZ315" for the Western Washington lowlands including Seattle). Returned as "forecastZone" by nws_get_forecast and nws_find_stations, or as the "code" of an "affectedZones" entry with type "forecast" in nws_search_alerts. Format: two-letter state + "Z" + three-digit number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| zoneId | No | Zone ID as provided (e.g., "WAZ315"). |
| periods | No | Forecast periods in chronological order, typically covering 7 days. |
| updated | No | When the zone forecast was last updated (ISO 8601 with timezone offset). |
| periodCount | No | Number of forecast periods returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds valuable behavioral context about zone type restrictions (only 'forecast' type resolves) and the zone code pattern (XXZ###), which goes beyond the annotation. It does not discuss permissions or rate limits, but those are not critical here.
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 moderately long but every sentence earns its place: it leads with the core action, then explains the workflow context, zone type restrictions, and code format. It is well-structured and front-loaded with the main purpose, with no redundant 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?
With an output schema present (indicated by 'Has output schema: true'), the description need not explain return structure. It covers the tool's role in the forecast chain, the acceptable zone types, and the code pattern, making it sufficiently complete for an agent to call it correctly. Minor omissions like error handling are not critical.
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 significant meaning beyond the schema by explaining where zone_id originates (from nws_search_alerts or nws_find_stations) and clarifying the format with examples, which helps the agent understand the parameter's provenance and validation.
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 retrieves text forecasts for NWS zones and returns named forecast periods with narrative text. It distinguishes from siblings by mentioning the alert-to-forecast chain and the zone code sources, though it does not explicitly compare with nws_get_forecast or nws_get_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?
It provides explicit usage context: 'Completes the alert-to-forecast chain' and explains that only affectedZones with type 'forecast' work, while county or fire types will not resolve. This gives both when-to-use and when-not-to-use guidance, though it does not name alternative tools directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nws_list_alert_typesNws List Alert TypesARead-onlyInspect
List all valid NWS alert event type names. Use to discover valid values for the event filter in nws_search_alerts, or to browse alert categories. No parameters required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of event types |
| error | No | Present when the call failed. Absent on success. |
| eventTypes | No | Alert event type names sorted alphabetically |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals that this is a safe read operation. The description adds the specific behavioral context that the tool returns a list of alert type names, which is beyond the annotation's binary read-only signal. While it does not mention rate limits or authentication, those are not critical for a simple listing tool, and the annotation covers safety.
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 three short, purposeful sentences. The first states the core action, the second gives usage context, and the third clarifies the lack of parameters. There is no fluff or redundancy, and the most important detail is front-loaded.
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 parameterless, read-only list tool, the description is complete. It explains what the tool returns (alert event type names), why it is used (to feed the event filter in nws_search_alerts or to browse), and that it requires no inputs. The output schema (present but not shown) would cover return format details, so nothing is missing from the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the rubric sets a baseline of 4. The description's note 'No parameters required' reinforces what the empty schema already implies but does not contradict it. There is nothing more to explain about params since none exist.
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: 'List all valid NWS alert event type names.' It clearly distinguishes this tool from siblings by stating its purpose is to provide valid values for the event filter in nws_search_alerts. This removes any ambiguity about what the tool does and its place 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 explicitly states when to use the tool: 'Use to discover valid values for the event filter in nws_search_alerts, or to browse alert categories.' It gives a clear primary use case tied to a sibling tool, and a secondary browsing use, leaving no doubt about when an agent should invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nws_search_alertsNws Search AlertsARead-onlyInspect
Search active weather alerts (watches, warnings, advisories) across the US. Filter by state, coordinates, zone, land/marine region, event type, severity, urgency, or certainty. area, point, zone, region_type, and region are mutually exclusive — provide at most one. Omit all filters for a national search.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | US state/territory code (e.g., "WA", "OK", "PR") or marine area code (e.g., "GM"). Mutually exclusive with point and zone. | |
| zone | No | NWS forecast zone (e.g., "WAZ558") or county zone (e.g., "WAC033"). Mutually exclusive with area and point. | |
| event | No | Filter to specific event types (e.g., ["Tornado Warning"]). Matches are case-insensitive and partial, so "tornado" matches both "Tornado Warning" and "Tornado Watch". Use nws_list_alert_types to discover valid names. | |
| limit | No | Maximum number of alerts to include in this page (1-25, default 25). totalCount still reports the full number of distinct matches, so a small limit returns a digest of broad or national searches without dropping the total; pass the returned nextCursor as cursor to reach the rest. | |
| point | No | Coordinates as "lat,lon" (e.g., "47.6,-122.3"). Returns alerts whose geometry contains this point. Mutually exclusive with area and zone. | |
| cursor | No | Opaque continuation token from a previous response's nextCursor. Omit for the first page. The token carries its own page size, so limit applies to the first page only. Every call re-fetches the active-alert feed, so alerts are contiguous within one response but not across calls — the active set changes continuously as alerts are issued and expire, so a continued page covers the collection as it stands at that moment. | |
| region | No | Restrict to NWS marine region groups: "AL" (Alaska waters), "AT" (Atlantic Ocean), "GL" (Great Lakes), "GM" (Gulf of Mexico), "PA" (Eastern Pacific and US West Coast), "PI" (Central and Western Pacific). Marine alerts only — a land alert never matches. Mutually exclusive with area, point, zone, and region_type. | |
| status | No | Alert status filter. Default "Actual". Use a different value only when you specifically need non-live alerts. | Actual |
| urgency | No | Filter by urgency level. | |
| severity | No | Filter by severity level. | |
| certainty | No | Filter by certainty level. | |
| region_type | No | Restrict to land-based or marine alerts. Mutually exclusive with area, point, zone, and region. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of alerts included in this response |
| alerts | No | Matching alerts for this page (at most the requested limit, max 25) |
| notice | No | Guidance when no alerts matched (echoes applied filters and suggests how to broaden), when matches remain beyond this page, or when the supplied cursor points past the end of the match set. |
| nextCursor | No | Opaque token for the next page of matches — pass it back as `cursor`. Omitted when this is the last page. |
| totalCount | No | Total distinct alerts matching the filters in this fetch, before the page window is applied. NWS repeats some alerts verbatim within one response; the copies are collapsed on id, so this counts each alert once. Compare against shown to tell whether matches were withheld from this page. |
| appliedFilters | No | Summary of applied search filters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safe-read nature is covered. The description adds that alerts are active (dynamic) and that an unfiltered search covers the whole US, but it does not go beyond that to describe pagination or feed behavior; those details live in the parameter schema rather than the description. 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?
Three sentences with no filler: action and scope first, then filter dimensions, then the critical exclusivity constraint and default behavior. Every sentence earns its place and is front-loaded.
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 12 fully described parameters, an output schema, and a readOnly annotation, the definition carries everything needed to select and invoke the tool correctly. The description's compact summary plus the rich schema leave no important invocation detail 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 schema already documents each parameter. The description adds value by summarizing the filter taxonomy and stating the at-most-one exclusivity rule plus the national-search default, which is a useful cross-cutting constraint not obvious from any single property 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 first sentence names a specific verb ('Search'), a precise resource ('active weather alerts'), and a scope ('across the US'). The filter list and the 'omit all filters for a national search' line make the tool's role unmistakable among the NWS siblings, none of which search active 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?
The description gives concrete invocation guidance: which filters exist, that area/point/zone/region_type/region are mutually exclusive, and that omitting all filters yields a national search. It does not explicitly state when to prefer this tool over a sibling or when not to use it, 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- Changed
nws_find_stations1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `out_of_scope`: Coordinates fall outside US National Weather Service coverage Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `out_of_scope`: Coordinates fall outside US National Weather Service coverage. Other values are possible when a failure originates below the handler."
- Changed
nws_get_forecast1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `out_of_scope`: Coordinates fall outside US National Weather Service coverage Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `out_of_scope`: Coordinates fall outside US National Weather Service coverage. Other values are possible when a failure originates below the handler."
- Changed
nws_get_observations1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `missing_input`: Neither station_id nor a (latitude, longitude) pair was provided `blank_station_id`: station_id was provided with a blank value `station_not_found`: Station ID does not exist in the NWS network `no_observations`: Station has no recent observations available `no_stations_nearby`: No observation stations exist near the requested coordinates `out_of_scope`: Coordinates fall outside US National Weather Service coverage Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `missing_input`: Neither station_id nor a (latitude, longitude) pair was provided. `blank_station_id`: station_id was provided with a blank value. `station_not_found`: Station ID does not exist in the NWS network. `no_observations`: Station has no recent observations available. `no_stations_nearby`: No observation stations exist near the requested coordinates. `out_of_scope`: Coordinates fall outside US National Weather Service coverage. Other values are possible when a failure originates below the handler."
- Changed
nws_get_office_discussion1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_products`: Office code is unknown, or a valid office has no current product of the requested type (episodic types like SPS and HWO are commonly empty) Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_products`: Office code is unknown, or a valid office has no current product of the requested type (episodic types like SPS and HWO are commonly empty). Other values are possible when a failure originates below the handler."
- Changed
nws_get_zone_forecast1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `zone_not_found`: Zone code is not a valid public forecast zone or has no forecast available Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `zone_not_found`: Zone code is not a valid public forecast zone or has no forecast available. Other values are possible when a failure originates below the handler."
- Changed
nws_search_alerts1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `mutually_exclusive_filters`: More than one of area, point, zone, region_type, or region provided `invalid_area_code`: Area code is not a recognized US state, territory, or marine area `invalid_point`: Point coordinates are malformed or outside valid bounds `invalid_zone`: Zone code does not match the NWS zone-code shape `blank_location_filter`: An area, point, or zone filter was provided with a blank value `empty_filter_array`: An event, severity, urgency, certainty, or region filter was provided with no usable entries Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `mutually_exclusive_filters`: More than one of area, point, zone, region_type, or region provided. `invalid_area_code`: Area code is not a recognized US state, territory, or marine area. `invalid_point`: Point coordinates are malformed or outside valid bounds. `invalid_zone`: Zone code does not match the NWS zone-code shape. `blank_location_filter`: An area, point, or zone filter was provided with a blank value. `empty_filter_array`: An event, severity, urgency, certainty, or region filter was provided with no usable entries. Other values are possible when a failure originates below the handler."
1 tool update
- Changed
nws_search_alerts1 field changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"Opaque continuation token from a previous response's nextCursor. Omit for the first page. The token carries its own page size, so limit applies to the first page only. Every call re-fetches /alerts/active, so alerts are contiguous within one response but not across calls — the active set changes continuously as alerts are issued and expire, so a continued page covers the collection as it stands at that moment."New value: +"Opaque continuation token from a previous response's nextCursor. Omit for the first page. The token carries its own page size, so limit applies to the first page only. Every call re-fetches the active-alert feed, so alerts are contiguous within one response but not across calls — the active set changes continuously as alerts are issued and expire, so a continued page covers the collection as it stands at that moment."
4 tool updates
- Changed
nws_find_stations2 fields changed- removed
Output schema / properties / stations / items / properties / elevationM / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / stations / items / properties / elevationM / typeAdded value: +[ + "number", + "null" +]
- Changed
nws_get_forecast6 fields changed- removed
Output schema / properties / periods / items / properties / dewpointC / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / periods / items / properties / dewpointC / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / periods / items / properties / precipChancePct / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / periods / items / properties / precipChancePct / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / periods / items / properties / relativeHumidityPct / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / periods / items / properties / relativeHumidityPct / typeAdded value: +[ + "number", + "null" +]
- Changed
nws_get_observations24 fields changed- removed
Output schema / properties / barometricPressurePa / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / barometricPressurePa / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / cloudLayers / items / properties / baseM / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / cloudLayers / items / properties / baseM / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / dewpointC / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / dewpointC / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / heatIndexC / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / heatIndexC / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / relativeHumidityPct / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / relativeHumidityPct / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / temperatureC / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / temperatureC / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / timeZone / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / timeZone / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / visibilityM / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / visibilityM / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / windChillC / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / windChillC / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / windDirectionDeg / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / windDirectionDeg / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / windGustKmh / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / windGustKmh / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / windSpeedKmh / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / windSpeedKmh / typeAdded value: +[ + "number", + "null" +]
- Changed
nws_search_alerts12 fields changed- removed
Output schema / properties / alerts / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / alerts / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / alerts / items / properties / ends / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / alerts / items / properties / ends / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / alerts / items / properties / expires / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / alerts / items / properties / expires / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / alerts / items / properties / headline / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / alerts / items / properties / headline / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / alerts / items / properties / instruction / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / alerts / items / properties / instruction / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / alerts / items / properties / onset / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / alerts / items / properties / onset / typeAdded value: +[ + "string", + "null" +]
7 tool updates
- Changed
nws_find_stations6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stations", + "totalCount", + "shown" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `out_of_scope`: Coordinates fall outside US National Weather Service coverage Other values are possible when a failure originates below the handler.", + "examples": [ + "out_of_scope" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "stations", - "totalCount", - "shown" -]
- Changed
nws_get_forecast6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "location", + "generatedAt", + "periods", + "totalCount", + "shown", + "mode" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `out_of_scope`: Coordinates fall outside US National Weather Service coverage Other values are possible when a failure originates below the handler.", + "examples": [ + "out_of_scope" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "location", - "generatedAt", - "periods", - "totalCount", - "shown", - "mode" -]
- Changed
nws_get_observations6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stationId", + "stationName", + "timestamp", + "timeZone", + "textDescription", + "temperatureC", + "dewpointC", + "windSpeedKmh", + "windDirectionDeg", + "windGustKmh", + "barometricPressurePa", + "visibilityM", + "relativeHumidityPct", + "heatIndexC", + "windChillC", + "cloudLayers", + "station", + "observedAt" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `missing_input`: Neither station_id nor a (latitude, longitude) pair was provided `blank_station_id`: station_id was provided with a blank value `station_not_found`: Station ID does not exist in the NWS network `no_observations`: Station has no recent observations available `no_stations_nearby`: No observation stations exist near the requested coordinates `out_of_scope`: Coordinates fall outside US National Weather Service coverage Other values are possible when a failure originates below the handler.", + "examples": [ + "missing_input", + "blank_station_id", + "station_not_found", + "no_observations", + "no_stations_nearby", + "out_of_scope" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "stationId", - "stationName", - "timestamp", - "timeZone", - "textDescription", - "temperatureC", - "dewpointC", - "windSpeedKmh", - "windDirectionDeg", - "windGustKmh", - "barometricPressurePa", - "visibilityM", - "relativeHumidityPct", - "heatIndexC", - "windChillC", - "cloudLayers", - "station", - "observedAt" -]
- Changed
nws_get_office_discussion6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "issuanceTime", + "issuingOffice", + "productCode", + "productName", + "productText", + "wmoCollectiveId" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_products`: Office code is unknown, or a valid office has no current product of the requested type (episodic types like SPS and HWO are commonly empty) Other values are possible when a failure originates below the handler.", + "examples": [ + "no_products" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "issuanceTime", - "issuingOffice", - "productCode", - "productName", - "productText", - "wmoCollectiveId" -]
- Changed
nws_get_zone_forecast6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "zoneId", + "updated", + "periods", + "periodCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `zone_not_found`: Zone code is not a valid public forecast zone or has no forecast available Other values are possible when a failure originates below the handler.", + "examples": [ + "zone_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "zoneId", - "updated", - "periods", - "periodCount" -]
- Changed
nws_list_alert_types6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "count", + "eventTypes" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "count", - "eventTypes" -]
- Changed
nws_search_alerts6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "alerts", + "totalCount", + "shown", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `mutually_exclusive_filters`: More than one of area, point, zone, region_type, or region provided `invalid_area_code`: Area code is not a recognized US state, territory, or marine area `invalid_point`: Point coordinates are malformed or outside valid bounds `invalid_zone`: Zone code does not match the NWS zone-code shape `blank_location_filter`: An area, point, or zone filter was provided with a blank value `empty_filter_array`: An event, severity, urgency, certainty, or region filter was provided with no usable entries Other values are possible when a failure originates below the handler.", + "examples": [ + "mutually_exclusive_filters", + "invalid_area_code", + "invalid_point", + "invalid_zone", + "blank_location_filter", + "empty_filter_array" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "alerts", - "totalCount", - "shown", - "appliedFilters" -]
3 tool updates
- Changed
nws_find_stations5 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max stations per page (1-50). totalFound still reports every station near the point, so pass the returned nextCursor as cursor to reach the rest."New value: +"Max stations per page (1-50). totalCount still reports every station near the point, so pass the returned nextCursor as cursor to reach the rest." - added
Output schema / properties / shownAdded value: +{ + "description": "Number of stations returned in this page", + "type": "number" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Number of stations returned in this page"New value: +"Total observation stations available near this location before the page limit was applied — NOT the number returned in this page, which is shown. Same value on every page of one query; compare it against shown to tell whether stations were withheld." - removed
Output schema / properties / totalFoundRemoved value: -{ - "description": "Total observation stations available near this location before the page limit was applied. Same value on every page of one query.", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "stations", - "totalFound", - "totalCount" -]New value: +[ + "stations", + "totalCount", + "shown" +]
- Changed
nws_get_forecast5 fields changed- removed
Output schema / properties / periodCountRemoved value: -{ - "description": "Number of forecast periods in this page (at most 48).", - "type": "number" -} - added
Output schema / properties / shownAdded value: +{ + "description": "Number of forecast periods in this page (at most 48).", + "type": "number" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Total forecast periods available upstream before the page window was applied — NOT the number in this page, which is shown. Compare it against shown to tell whether periods were withheld.", + "type": "number" +} - removed
Output schema / properties / totalPeriodCountRemoved value: -{ - "description": "Total forecast periods available upstream before the page window was applied.", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "location", - "generatedAt", - "periods", - "periodCount", - "totalPeriodCount", - "mode" -]New value: +[ + "location", + "generatedAt", + "periods", + "totalCount", + "shown", + "mode" +]
- Changed
nws_search_alerts5 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of alerts to include in this page (1-25, default 25). totalCount still reports the full number of matches, so a small limit returns a digest of broad or national searches without dropping the total; pass the returned nextCursor as cursor to reach the rest."New value: +"Maximum number of alerts to include in this page (1-25, default 25). totalCount still reports the full number of distinct matches, so a small limit returns a digest of broad or national searches without dropping the total; pass the returned nextCursor as cursor to reach the rest." - added
Output schema / properties / shownAdded value: +{ + "description": "Number of alerts included in this response", + "type": "number" +} - removed
Output schema / properties / shownCountRemoved value: -{ - "description": "Number of alerts included in this response", - "type": "number" -} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of matching alerts in this fetch, before the page window is applied"New value: +"Total distinct alerts matching the filters in this fetch, before the page window is applied. NWS repeats some alerts verbatim within one response; the copies are collapsed on id, so this counts each alert once. Compare against shown to tell whether matches were withheld from this page." - changed
Output schema / requiredPrevious value: -[ - "alerts", - "totalCount", - "shownCount", - "appliedFilters" -]New value: +[ + "alerts", + "totalCount", + "shown", + "appliedFilters" +]
2 tool updates
- Changed
nws_get_zone_forecast1 field changed- changed
Input schema / properties / zone_id / descriptionPrevious value: -"NWS public forecast zone code (e.g., \"WAZ315\" for the Western Washington lowlands including Seattle). Returned as \"forecastZone\" by nws_get_forecast and nws_find_stations, or in \"affectedZones\" by nws_search_alerts. Format: two-letter state + \"Z\" + three-digit number."New value: +"NWS public forecast zone code (e.g., \"WAZ315\" for the Western Washington lowlands including Seattle). Returned as \"forecastZone\" by nws_get_forecast and nws_find_stations, or as the \"code\" of an \"affectedZones\" entry with type \"forecast\" in nws_search_alerts. Format: two-letter state + \"Z\" + three-digit number."
- Changed
nws_search_alerts17 fields changed- added
Input schema / properties / regionAdded value: +{ + "description": "Restrict to NWS marine region groups: \"AL\" (Alaska waters), \"AT\" (Atlantic Ocean), \"GL\" (Great Lakes), \"GM\" (Gulf of Mexico), \"PA\" (Eastern Pacific and US West Coast), \"PI\" (Central and Western Pacific). Marine alerts only — a land alert never matches. Mutually exclusive with area, point, zone, and region_type.", + "items": { + "enum": [ + "AL", + "AT", + "GL", + "GM", + "PA", + "PI" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / region_typeAdded value: +{ + "description": "Restrict to land-based or marine alerts. Mutually exclusive with area, point, zone, and region.", + "enum": [ + "Land", + "Marine" + ], + "type": "string" +} - changed
Output schema / properties / alerts / items / properties / affectedZones / descriptionPrevious value: -"Affected zone codes"New value: +"Affected zones, each with the zone type that decides where it can chain" - added
Output schema / properties / alerts / items / properties / affectedZones / items / additionalPropertiesAdded value: +false - added
Output schema / properties / alerts / items / properties / affectedZones / items / descriptionAdded value: +"Affected zone with its NWS zone type" - added
Output schema / properties / alerts / items / properties / affectedZones / items / propertiesAdded value: +{ + "code": { + "description": "Zone code, e.g. \"WAZ558\" (forecast) or \"WAC033\" (county)", + "type": "string" + }, + "type": { + "description": "NWS zone type: \"forecast\", \"county\", or \"fire\" (\"unknown\" when upstream reports a shape this server cannot type). Only \"forecast\" codes have a zone text forecast — pass those to nws_get_zone_forecast. All types are valid values for this tool's own zone filter.", + "type": "string" + } +} - added
Output schema / properties / alerts / items / properties / affectedZones / items / requiredAdded value: +[ + "code", + "type" +] - changed
Output schema / properties / alerts / items / properties / affectedZones / items / typePrevious value: -"string"New value: +"object" - added
Output schema / properties / alerts / items / properties / description / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / alerts / items / properties / description / descriptionPrevious value: -"Full alert description"New value: +"Full alert description; null when NWS publishes the alert without one" - removed
Output schema / properties / alerts / items / properties / description / typeRemoved value: -"string" - added
Output schema / properties / alerts / items / properties / effectiveAdded value: +{ + "description": "Message effective time (ISO 8601) — when this version of the CAP message takes effect. A property of the message, not of the hazard: distinct from onset (when the hazard begins) and from expires (when a superseding message is due). Usually equals sent.", + "type": "string" +} - added
Output schema / properties / alerts / items / properties / messageTypeAdded value: +{ + "description": "CAP message type: \"Alert\" for an original issuance, \"Update\" for a revision of an earlier message, \"Cancel\" for a cancellation.", + "type": "string" +} - added
Output schema / properties / alerts / items / properties / referencesAdded value: +{ + "description": "Prior alert messages this one supersedes, newest first. Empty for an original issuance — never inferred when NWS reports none.", + "items": { + "additionalProperties": false, + "description": "One prior message this alert supersedes", + "properties": { + "identifier": { + "description": "CAP identifier of the superseded message", + "type": "string" + }, + "sent": { + "description": "When the superseded message was issued (ISO 8601)", + "type": "string" + } + }, + "required": [ + "identifier", + "sent" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / alerts / items / properties / sentAdded value: +{ + "description": "Message issuance time (ISO 8601) — when the office transmitted this CAP message. Describes the message, not the hazard: use it to judge how stale the report is.", + "type": "string" +} - added
Output schema / properties / alerts / items / properties / statusAdded value: +{ + "description": "This alert's own CAP status as reported by NWS (\"Actual\", \"Exercise\", \"System\", \"Test\", \"Draft\"). Distinct from the status input filter, which selects which alerts are searched — with the default filter every returned alert reads \"Actual\".", + "type": "string" +} - changed
Output schema / properties / alerts / items / requiredPrevious value: -[ - "id", - "event", - "headline", - "description", - "instruction", - "severity", - "urgency", - "certainty", - "areaDesc", - "onset", - "ends", - "expires", - "senderName", - "affectedZones" -]New value: +[ + "id", + "event", + "headline", + "description", + "instruction", + "severity", + "urgency", + "certainty", + "areaDesc", + "sent", + "effective", + "onset", + "ends", + "expires", + "status", + "messageType", + "references", + "senderName", + "affectedZones" +]
3 tool updates
- Changed
nws_find_stations6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque continuation token from a previous response's nextCursor. Omit for the first page. The token carries its own page size, so limit applies to the first page only. Every call re-fetches the station list, so pages are contiguous within one response; the registry changes rarely, but a later call can window an updated list.", + "type": "string" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Max stations to return (1-50)."New value: +"Max stations per page (1-50). totalFound still reports every station near the point, so pass the returned nextCursor as cursor to reach the rest." - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Opaque token for the next page of stations — pass it back as `cursor`. Omitted when this is the last page.", + "type": "string" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no stations were found near the requested coordinates."New value: +"Guidance when no stations were found near the requested coordinates, when stations remain beyond this page, or when the supplied cursor points past the end of the list." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Number of stations returned (respects the limit parameter)"New value: +"Number of stations returned in this page" - changed
Output schema / properties / totalFound / descriptionPrevious value: -"Total observation stations available near this location before the limit was applied"New value: +"Total observation stations available near this location before the page limit was applied. Same value on every page of one query."
- Changed
nws_get_forecast6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque continuation token from a previous response's nextCursor, to retrieve the next 48 periods. Omit for the first page. Every call re-fetches the forecast, so consecutive periods are contiguous within one response; NWS reissues forecasts through the day, so a later call can window a regenerated period array.", + "type": "string" +} - changed
Input schema / properties / hourly / descriptionPrevious value: -"If true, returns hourly forecast (next 48 one-hour periods) instead of 12-hour named periods (14 periods). Hourly includes dewpoint and relative humidity."New value: +"If true, returns hourly forecast (48 one-hour periods per page, ~156 available) instead of 12-hour named periods (14 periods). Hourly includes dewpoint and relative humidity." - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Opaque token for the next page of periods — pass it back as `cursor`. Omitted when this is the last page.", + "type": "string" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Set when upstream returned more periods than the cap — states how many periods were omitted."New value: +"Set when periods remain beyond this page, or when the supplied cursor points past the end of the period array." - changed
Output schema / properties / periodCount / descriptionPrevious value: -"Number of forecast periods returned (capped at 48)."New value: +"Number of forecast periods in this page (at most 48)." - changed
Output schema / properties / totalPeriodCount / descriptionPrevious value: -"Total forecast periods available upstream before the cap was applied."New value: +"Total forecast periods available upstream before the page window was applied."
- Changed
nws_search_alerts6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque continuation token from a previous response's nextCursor. Omit for the first page. The token carries its own page size, so limit applies to the first page only. Every call re-fetches /alerts/active, so alerts are contiguous within one response but not across calls — the active set changes continuously as alerts are issued and expire, so a continued page covers the collection as it stands at that moment.", + "type": "string" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of alerts to include in the response (1-25, default 25). totalCount still reports the full number of matches, so a small limit returns a digest of broad or national searches without dropping the total."New value: +"Maximum number of alerts to include in this page (1-25, default 25). totalCount still reports the full number of matches, so a small limit returns a digest of broad or national searches without dropping the total; pass the returned nextCursor as cursor to reach the rest." - changed
Output schema / properties / alerts / descriptionPrevious value: -"Matching alerts (capped at the requested limit, max 25)"New value: +"Matching alerts for this page (at most the requested limit, max 25)" - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Opaque token for the next page of matches — pass it back as `cursor`. Omitted when this is the last page.", + "type": "string" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no alerts matched — echoes applied filters and suggests how to broaden the search."New value: +"Guidance when no alerts matched (echoes applied filters and suggests how to broaden), when matches remain beyond this page, or when the supplied cursor points past the end of the match set." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of matching alerts before the limit/cap is applied"New value: +"Total number of matching alerts in this fetch, before the page window is applied"
1 tool update
- Changed
nws_get_forecast5 fields changed- changed
Input schema / properties / hourly / descriptionPrevious value: -"If true, returns hourly forecast (~156 periods) instead of 12-hour named periods (14 periods). Hourly includes dewpoint and relative humidity."New value: +"If true, returns hourly forecast (next 48 one-hour periods) instead of 12-hour named periods (14 periods). Hourly includes dewpoint and relative humidity." - added
Output schema / properties / noticeAdded value: +{ + "description": "Set when upstream returned more periods than the cap — states how many periods were omitted.", + "type": "string" +} - changed
Output schema / properties / periodCount / descriptionPrevious value: -"Number of forecast periods returned"New value: +"Number of forecast periods returned (capped at 48)." - added
Output schema / properties / totalPeriodCountAdded value: +{ + "description": "Total forecast periods available upstream before the cap was applied.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "location", - "generatedAt", - "periods", - "periodCount", - "mode" -]New value: +[ + "location", + "generatedAt", + "periods", + "periodCount", + "totalPeriodCount", + "mode" +]
2 tool updates
- Changed
nws_get_forecast2 fields changed- changed
Input schema / properties / latitude / descriptionPrevious value: -"Latitude in decimal degrees (e.g., 47.6062). Truncated to 4 decimal places."New value: +"Latitude in decimal degrees (e.g., 47.6062)." - changed
Input schema / properties / longitude / descriptionPrevious value: -"Longitude in decimal degrees (e.g., -122.3321). Truncated to 4 decimal places."New value: +"Longitude in decimal degrees (e.g., -122.3321)."
- Changed
nws_search_alerts3 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 25, + "description": "Maximum number of alerts to include in the response (1-25, default 25). totalCount still reports the full number of matches, so a small limit returns a digest of broad or national searches without dropping the total.", + "maximum": 25, + "minimum": 1, + "type": "integer" +} - changed
Output schema / properties / alerts / descriptionPrevious value: -"Matching alerts (capped at 25)"New value: +"Matching alerts (capped at the requested limit, max 25)" - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of matching alerts before the 25-alert cap"New value: +"Total number of matching alerts before the limit/cap is applied"
1 tool update
- Changed
nws_search_alerts2 fields changed- added
Output schema / properties / alerts / items / properties / endsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Hazard end (ISO 8601) — when the hazard is expected to end; null when open-ended (\"until further notice\"). Distinct from expires, which is the message-refresh time." +} - changed
Output schema / properties / alerts / items / requiredPrevious value: -[ - "id", - "event", - "headline", - "description", - "instruction", - "severity", - "urgency", - "certainty", - "areaDesc", - "onset", - "expires", - "senderName", - "affectedZones" -]New value: +[ + "id", + "event", + "headline", + "description", + "instruction", + "severity", + "urgency", + "certainty", + "areaDesc", + "onset", + "ends", + "expires", + "senderName", + "affectedZones" +]
4 tool updates
- Changed
nws_get_forecast3 fields changed- added
Output schema / properties / modeAdded value: +{ + "description": "Forecast mode: \"hourly\" or \"7-day\"", + "type": "string" +} - added
Output schema / properties / periodCountAdded value: +{ + "description": "Number of forecast periods returned", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "location", - "generatedAt", - "periods" -]New value: +[ + "location", + "generatedAt", + "periods", + "periodCount", + "mode" +]
- Changed
nws_get_observations4 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when the latest observation is more than 2 hours old — data may not reflect current conditions.", + "type": "string" +} - added
Output schema / properties / observedAtAdded value: +{ + "description": "Observation timestamp (ISO 8601)", + "type": "string" +} - added
Output schema / properties / stationAdded value: +{ + "description": "Station ID that served the observation (e.g., \"KSEA\")", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "stationId", - "stationName", - "timestamp", - "timeZone", - "textDescription", - "temperatureC", - "dewpointC", - "windSpeedKmh", - "windDirectionDeg", - "windGustKmh", - "barometricPressurePa", - "visibilityM", - "relativeHumidityPct", - "heatIndexC", - "windChillC", - "cloudLayers" -]New value: +[ + "stationId", + "stationName", + "timestamp", + "timeZone", + "textDescription", + "temperatureC", + "dewpointC", + "windSpeedKmh", + "windDirectionDeg", + "windGustKmh", + "barometricPressurePa", + "visibilityM", + "relativeHumidityPct", + "heatIndexC", + "windChillC", + "cloudLayers", + "station", + "observedAt" +]
- Added
nws_get_office_discussion - Added
nws_get_zone_forecast
2 tool updates
- Changed
nws_find_stations4 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no stations were found near the requested coordinates.", + "type": "string" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Number of stations returned (respects the limit parameter)", + "type": "number" +} - added
Output schema / properties / totalFoundAdded value: +{ + "description": "Total observation stations available near this location before the limit was applied", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "stations" -]New value: +[ + "stations", + "totalFound", + "totalCount" +]
- Changed
nws_search_alerts8 fields changed- added
Output schema / properties / appliedFiltersAdded value: +{ + "description": "Summary of applied search filters", + "type": "string" +} - removed
Output schema / properties / countRemoved value: -{ - "description": "Total number of matching alerts", - "type": "number" -} - removed
Output schema / properties / filtersRemoved value: -{ - "description": "Summary of applied search filters", - "type": "string" -} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no alerts matched — echoes applied filters and suggests how to broaden the search.", + "type": "string" +} - removed
Output schema / properties / shownRemoved value: -{ - "description": "Number of alerts included in this response", - "type": "number" -} - added
Output schema / properties / shownCountAdded value: +{ + "description": "Number of alerts included in this response", + "type": "number" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Total number of matching alerts before the 25-alert cap", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "count", - "shown", - "filters", - "alerts" -]New value: +[ + "alerts", + "totalCount", + "shownCount", + "appliedFilters" +]
Related MCP Connectors
US weather for AI agents: active NWS alerts by state, 5-period forecasts by lat/lon. Paid per call.
1US weather & geo for AI agents: forecasts, alerts, earthquakes, elevation, geocoding. No keys.
US weather & geo for AI agents: forecasts, alerts, earthquakes, elevation, geocoding. No keys.
US weather alerts (NWS): warnings, watches. $0.01/query. Register in-session — free testnet funds.
Related MCP Servers
- FlicenseBqualityDmaintenanceProvides weather forecasts and active alerts from the US National Weather Service API for US locations.2-
- FlicenseNot gradedqualityDmaintenanceProvides weather forecasts, current conditions, and alerts for US locations using the National Weather Service API.1-
- AlicenseNot gradedqualityDmaintenanceProvides US weather alerts and forecasts via the National Weather Service API.102 npmGPL 3.0
- AlicenseNot gradedqualityDmaintenanceProvides weather alerts and forecasts for US locations using the National Weather Service API.102 npmGPL 3.0
Glama MCP Gateway
Add one secure layer between your agents and this server.