aviation-weather-mcp-server
Server Details
Fetch METARs, TAFs, PIREPs, and domestic SIGMETs from the NWS Aviation Weather Center.
- Status
- Healthy
- Uptime
- 100.0% over 36 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/aviation-weather-mcp-server
- GitHub Stars
- 2
- Server Listing
- @cyanheads/aviation-weather-mcp-server
TDQS
Scored across 5 tools
Each tool targets a distinct aviation weather data product: station lookup, advisories, METARs, PIREPs, and TAFs. There is no meaningful overlap between the tools, and the descriptions make it clear which one should be used for which data type.
All tools share the aviation_ prefix and follow a consistent verb_noun pattern—find for station discovery and get for weather products. The naming convention is uniform, readable, and predictable.
Five tools is well-scoped for an aviation weather server covering station lookup, observations, forecasts, pilot reports, and advisories. Each tool represents a meaningful and necessary capability without unnecessary bloat.
The core aviation weather surface is covered: stations, METARs, TAFs, PIREPs, and SIGMETs. The main gap is the lack of AIRMET support, which the advisories tool explicitly rejects, and the US-centric coverage limits broader usefulness.
Available Tools
5 toolsaviation_find_stationsFind Aviation Weather StationsARead-onlyIdempotentInspect
Resolve an airport or weather reporting station by its identifier, or discover stations within a bounding box or US state. Returns all identifier variants (ICAO/IATA/FAA), coordinates, elevation, and available data types (METAR, TAF, SYNOP, etc.). A lookup matches the registry's own identifier, which for an airport is its 4-letter ICAO ID (e.g., KSEA, KJFK); buoys and mesonet sites carry identifiers of other shapes and resolve by those. At least one of station_ids, bbox, or state is required. limit bounds how many stations an area search returns without changing the area searched, and belongs to the bbox and state modes only.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | Geographic bounding box for spatial queries. | |
| limit | No | Maximum stations to return, applied after ordering by ICAO identifier ascending with identifier-less stations last — so the same query with the same limit returns the same stations, and airports rather than unidentified sites lead the first page. It bounds the response without changing the area searched, which a smaller bbox or a different state would. Distinct from the 400-row upstream cap: a limited result examined every station it counted and withheld some, while a capped one never drew the rest. Belongs to the bbox and state modes; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every match. Optional. | |
| state | No | Two-letter USPS code for one of the 50 US states or DC (e.g., "WA") to list all stations in that jurisdiction. US territories are not supported — use bbox for those. | |
| station_ids | No | One or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-letter ICAO ID for an airport, and other shapes for the buoys and mesonet sites the registry also carries, which resolve by those. A 3-letter IATA code (e.g., SEA) never resolves, even for a station whose entry carries one. Whitespace around an entry is trimmed, so a padded identifier resolves the same as the bare one; an empty or whitespace-only entry is rejected. Use bbox or state to discover identifiers by location. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The upstream row maximum that was applied to the draw. Present only on a truncated result. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Stations in this result, counted after any client-side state filter and after any limit. |
| notice | No | Guidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, or the cause and fix for identifiers that resolved to nothing. The cap and the limit can both fire on one result, and the text keeps them apart; the reconciliation cannot join them, since only bbox and state reach the row cap or accept a limit, and only station_ids reconciles a request. |
| limited | No | True when the requested limit withheld stations that matched — the caller asked to see fewer of them. False affirms the limit did not bite, so every matching station is here. Present only when the call supplied a limit. It never states anything about the upstream cap: a limited result examined every station it counted, while a truncated one never drew the rest. |
| matched | No | Stations that matched this query before the limit selected from them. Present only on a limited result. Where the result is also truncated this counts the capped draw and not the search area — the stations the cap dropped were never examined, so no count can include them. |
| missing | No | Requested identifiers absent from the result. Deduplicated the way returned is: a repeated or differently-cased identifier appears once, under its first spelling. Absent when none are missing. |
| partial | No | True when a requested identifier resolved to nothing. False affirms every requested identifier resolved, which a count cannot establish — upstream case-folds and deduplicates, so a shorter list is not itself a gap. Present only on a station_ids lookup. |
| returned | No | Requested identifiers that resolved, spelled as the caller wrote them rather than as upstream returned them. Deduplicated the way upstream deduplicates: a repeated or differently-cased identifier appears once, under its first spelling. Present only on a station_ids lookup. |
| stations | No | Matching stations. |
| requested | No | Station identifiers this call asked for, spelled as the caller wrote them and in the order given. Present only on a station_ids lookup — the bbox and state modes ask for an area, not a list. |
| truncated | No | True when the upstream draw hit the AWC row cap, so stations inside the search area are missing from this result. False affirms the area was drawn in full, which a count alone cannot establish. |
| upstreamRows | No | Rows AWC returned before the client-side state filter ran. Present only on a truncated state query the filter then narrowed, where the post-filter count sits below the cap and so cannot reveal the truncation on its own. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by explaining the matching behavior (ICAO vs IATA, buoys/mesonet identifiers), the trimming of whitespace, and the behavior of limit (ordering with identifier-less stations last, deterministic results). It also notes the 400-row upstream cap and how limit differs from that cap. While annotations declare readOnlyHint and idempotentHint, the description adds important context about result ordering and edge cases. A small gap is that it doesn't explain what happens when no stations match, but that is minor.
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 sentences, with the key purpose and modes front-loaded. However, the third sentence is long and dense, combining the limit behavior, the 400-row cap, and mode restrictions in a way that could be split for clarity. Still, there is no wasted text, and it is efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple modes, nested bbox object, output schema exists) and the schema's high coverage, the description provides sufficient guidance for an agent to make a correct call. It covers required parameters, mode selection, and edge cases like IATA codes. The output schema exists, so return values are not needed in the description. Minor gaps include not explaining how to specify multiple station_ids or the exact response structure, but the schema and output schema cover that.
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 each parameter is richly described in the schema (e.g., the limit parameter's detailed explanation). The description adds a brief summary of parameters and their roles, but largely reinforces the schema. For example, the station_ids parameter already explains IATA never resolves and whitespace trimming; the description repeats that. Thus, the description adds minimal new value beyond the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Resolve' or 'discover') and resource ('aviation weather stations'), and clearly distinguishes the two main modes: identifier lookup and area-based discovery. It names the sibling tools (e.g., aviation_get_metar) implicitly by focusing on station metadata, not weather data, making it easy for an agent to tell it apart from other aviation 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 that at least one of station_ids, bbox, or state is required, and explains when to use each: 'Use bbox or state to discover identifiers by location.' It also warns against using limit with station_ids ('Belongs to the bbox and state modes; supplying it alongside station_ids is rejected'), and clarifies the difference between limit and a smaller bbox. This is explicit and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aviation_get_advisoriesGet Active Aviation Advisories (SIGMETs)ARead-onlyIdempotentInspect
Get active domestic SIGMETs for a region. Returns each advisory with hazard type (CONVECTIVE, TURBULENCE, ICING, IFR), severity, altitude range, valid period, polygon coordinates, and raw text. Coverage is US-centric (NWS Aviation Weather Center). This tool reads the domestic SIGMET feed only and cannot return an AIRMET; requests for one are rejected rather than answered with SIGMETs. During fair-weather periods no advisories may be active — an empty result is normal, not an error. Filter by advisory_type, hazard, or bbox.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | Geographic bounding box to filter advisories by polygon overlap. | |
| hazard | No | Optional hazard filter, applied upstream by AWC. CONVECTIVE, TURBULENCE, ICING, and IFR are the four hazard classes the domestic SIGMET feed carries, and an empty result under one of them means no advisory of that class is active — it says nothing about the others. MTN OBSCN, SURFACE WIND, and LLWS are AIRMET-family phenomena with no upstream counterpart here and are rejected rather than returning an empty result. | |
| advisory_type | No | Filter by advisory type. "sigmet" and "all" both return the active domestic SIGMET set, which is everything this tool serves. "airmet" is rejected with guidance: the upstream feed cannot return an AIRMET, so answering it would mean presenting SIGMETs as AIRMET matches. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Present only when the result is empty, naming the stage that emptied it: no domestic SIGMETs are active at all, none carry the requested hazard, or none intersect the requested bbox — and which filter to broaden. A hazard-scoped empty draw states only that no advisory carries that hazard; AWC applies the hazard filter, so the response cannot say whether other classes are active. |
| advisories | No | Active advisories matching the filter criteria. May be empty during fair weather periods. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, openWorldHint, and idempotentHint annotations, the description adds substantial behavioral context: the feed is US-centric, only the domestic SIGMET feed is read, AIRMET requests are rejected, and an empty result is a normal weather state rather than an error. It also enumerates returned fields, so the agent knows what to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and keeps every sentence functional. The feed-scope warning, AIRMET rejection, and empty-result guidance are all non-redundant; no filler or repetition weakens the text.
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 zero required parameters, full schema coverage, an output schema, and sibling context, the description covers everything needed for safe invocation: source, geographic scope, accepted filters, rejection behavior, normal empty results, and return contents. No material gap remains 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?
Input schema coverage is 100% with rich per-parameter descriptions and enums, so the baseline applies. The description only restates that filtering can be done by advisory_type, hazard, or bbox, adding no meaning 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 opens with a specific verb and resource: 'Get active domestic SIGMETs for a region.' It distinguishes the tool from siblings by naming the exact feed (domestic SIGMET, NWS Aviation Weather Center) and by explicitly saying it cannot return an AIRMET. There is no ambiguity about what this tool does.
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 scope: use it for active domestic SIGMETs, and it explicitly warns that requests for AIRMETs are rejected rather than answered with SIGMETs. It also tells the agent that an empty result during fair weather is normal. It does not explicitly name alternative sibling tools, so it stops just short of full cross-tool routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aviation_get_metarGet METAR Weather ObservationsARead-onlyIdempotentInspect
Get current weather observations (METARs) for one or more airports. Returns decoded fields — wind direction/speed/gusts, visibility, ceiling with its kind (measured, or indefinite for vertical visibility into an obscuration), present weather, temperature, dewpoint, altimeter, cloud layers — plus the computed flight category (VFR/MVFR/IFR/LIFR) and the raw METAR string. Accepts 1–10 ICAO station IDs (e.g., KSEA, KJFK). Use aviation_find_stations to resolve or verify an ICAO ID, or to discover nearby stations.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | Lookback window in hours (1–12), not a row limit: every observation inside the window is returned, so a station reporting more often than hourly yields more than one row per hour. At the default of 1, half-hourly stations return two observations and SPECI-issuing stations can return more. Budget rows by the station reporting interval, never one per station. | |
| station_ids | Yes | ICAO station IDs to query. 1–10 stations per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Recovery guidance naming the missing station IDs. Present only on a partial result. It lists the candidate causes without asserting one — upstream omits the row either way. |
| missing | No | Requested station IDs absent from the result. Absent when none are missing. |
| partial | No | True when a requested station produced no observation. False affirms the result covers every requested station, so full coverage is distinguishable from a short batch rather than being inferred from the count. |
| returned | No | Distinct station IDs that produced at least one observation. Counted per station, not per row — with hours > 1 a station reporting six times still appears once. |
| requested | No | Station IDs this call asked for, in the order given. |
| observations | No | Weather observations, one per station/time pair. Multiple entries per station when hours > 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context: the hours parameter is a lookback window not a row limit, and stations reporting more often can yield multiple rows. It doesn't describe pagination or rate limits, but the annotations plus this context are strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the core purpose and return fields, and packs the critical usage caveat about hours into the schema description rather than bloating the main description. 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?
Given the tool has an output schema, annotations covering safety, and 100% schema description coverage, the description is complete. It explains what is returned, how many stations are accepted, and how to resolve station IDs. An agent has everything needed 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 description coverage is 100%, so the schema already documents both parameters well. The description adds meaning by explaining the hours lookback behavior (not a row limit) and the station_ids count range (1–10). This goes beyond the schema's field-level descriptions, so it earns 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 ('Get'), a clear resource ('current weather observations (METARs)'), and enumerates the decoded fields plus computed flight category and raw string. It also distinguishes itself from siblings by naming aviation_find_stations for resolving/verifying ICAO IDs, which helps an agent select this tool over alternatives.
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 (get current METARs for 1–10 ICAO IDs) and when to use aviation_find_stations instead (resolve/verify an ICAO ID or discover nearby stations). It also clarifies the hours parameter is a lookback window, not a row limit, which is critical usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aviation_get_pirepsGet Pilot Reports (PIREPs)ARead-onlyIdempotentInspect
Get recent Pilot Reports (PIREPs) near an airport or within a bounding box. Returns decoded turbulence, icing, and cloud reports with altitude, aircraft type, intensity, and the raw PIREP string. Requires either station_id (ICAO center point for radial search, e.g., KSEA) or bbox (area search) — not both. distance_nm belongs to the station_id search only, and altitude_min_ft must not exceed altitude_max_ft. min_intensity restricts the result to reports carrying a turbulence or icing layer at that intensity or above. limit bounds how many reports come back without changing what is searched, keeping the most recent. Coverage is US-centric; PIREPs are sparse and absence of reports does not imply smooth conditions.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | Geographic bounding box for area PIREP search. | |
| hours | No | How many hours of history to return. Default 3. | |
| limit | No | Maximum reports to return, applied last — after every filter and after ordering by observation time descending, so a limited result is the most recent reports rather than an arbitrary slice. It bounds the response without changing what is searched, which every other parameter does. Distinct from the 400-row upstream cap: a limited result examined every report it counted and withheld some, while a capped one never drew the rest. Selection is by recency alone, so pair it with min_intensity to bound a result by severity. Omit to return every match. Optional. | |
| station_id | No | ICAO station ID as center point for radial search (e.g., KSEA). Use with distance_nm. | |
| distance_nm | No | Search radius in nautical miles around station_id, defaulting to 100 when omitted. Belongs to the station_id search only — supplying it alongside bbox is rejected. | |
| min_intensity | No | Return only reports carrying at least one turbulence or icing layer at this intensity or above. The filter selects reports, not layers — a matching report still carries its lighter layers, so a result may include NEG, TRC, or LGT entries alongside the layer that matched. Optional. | |
| altitude_max_ft | No | Filter by maximum altitude in feet MSL (e.g., 35000 for FL350). Reports with an unknown altitude (altitude_ft null) cannot be shown to satisfy a bound and are dropped whenever either bound is set. Optional. | |
| altitude_min_ft | No | Filter by minimum altitude in feet MSL (e.g., 18000 for FL180). Reports with an unknown altitude (altitude_ft null) cannot be shown to satisfy a bound and are dropped whenever either bound is set. Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The upstream row maximum that was applied to the page. Present only on a truncated result. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Reports in this result, counted after any altitude filter and after any limit. |
| notice | No | Guidance for whichever disclosures fired: the levers that narrow the query before the cap applies, and what a requested limit withheld. Both can fire on one result, and the text keeps them apart. |
| pireps | No | Pilot reports matching the search criteria, ordered by observation time descending. |
| limited | No | True when the requested limit withheld reports that matched — the caller asked to see fewer of them. False affirms the limit did not bite, so every matching report is here. Present only when the call supplied a limit. It never states anything about the upstream cap: a limited result examined every report it counted, while a truncated one never drew the rest. |
| matched | No | Reports that matched this query before the limit selected from them. Present only on a limited result. Where the result is also truncated this counts the capped page and not the search area — the reports the cap dropped were never examined, so no count can include them. |
| truncated | No | True when the upstream page hit the AWC row cap, so reports inside the search area and time window are missing from this result. False affirms the whole window was searched, which a count alone cannot establish. |
| upstreamRows | No | Reports AWC returned before the altitude filter ran. Present only on a truncated result the filter then narrowed, where the remaining count sits below the cap and so cannot reveal the truncation on its own. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations were supplied, so the description carries the transparency burden. It discloses non-obvious behaviors—limit returns the most recent without changing the query, min_intensity filters whole reports rather than individual layers, and PIREPs absence does not indicate smooth conditions. However, it does not state the typical freshness window or how 'recent' is bounded.
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 adds information; the description moves from purpose, to returned fields, to parameter gating, to caveats. It stays under ~150 words while covering inputs, outputs, constraints, and data caveats without repetition or tangential detail.
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 does, what it returns, required parameter constraints, and a geographic/data caveat. It does not specify expected response format or default values for omitted parameters, but the core invocation semantics are sufficiently complete for agent use.
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?
Each parameter's role beyond its name is clarified: station_id is an ICAO center for radial search, distance_nm only pairs with station_id, min_intensity filters turbulence/icing layers at or above a level, and altitude bounds are cross-constrained. It also explains limit operates post-search, which is not obvious from the parameter name.
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, verb-led statement: 'Get recent Pilot Reports (PIREPs) near an airport or within a bounding box.' It further specifies what is returned (turbulence, icing, cloud reports with altitude, aircraft type, intensity, raw text), so an agent can immediately identify the tool's purpose and output.
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 concrete operational constraints: 'station_id or bbox—not both,' distance_nm applies 'to the station_id search only,' altitude_min_ft must not exceed altitude_max_ft, and limit only bounds results without changing the search. It also warns about US-centric sparse data, giving an agent the context needed to choose and calibrate the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aviation_get_tafGet Terminal Aerodrome Forecast (TAF)ARead-onlyIdempotentInspect
Get the Terminal Aerodrome Forecast (TAF) for one or more airports. Returns each forecast period with valid times, surface wind, low-level wind shear, visibility, decoded weather conditions, cloud layers, and the vertical visibility into a forecast obscuration, plus the raw TAF string. TAFs cover the next 24–30 hours and are issued only for airports with scheduled commercial service; check data_types from aviation_find_stations to confirm TAF availability. Accepts 1–4 ICAO station IDs (e.g., KSEA, KJFK).
| Name | Required | Description | Default |
|---|---|---|---|
| station_ids | Yes | ICAO station IDs to query. 1–4 stations per call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Recovery guidance naming the missing station IDs. Present only on a partial result. It lists the candidate causes without asserting one — upstream omits the row either way. |
| missing | No | Requested station IDs absent from the result. Absent when none are missing. |
| partial | No | True when a requested station produced no forecast. False affirms the result covers every requested station, so full coverage is distinguishable from a short batch rather than being inferred from the count. |
| returned | No | Distinct station IDs that produced a forecast. |
| forecasts | No | TAF forecasts, one per requested station. |
| requested | No | Station IDs this call asked for, in the order given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the description need not repeat those. It adds value by disclosing the forecast coverage window (24–30 hours) and the availability constraint (scheduled commercial service only), and by listing the output fields. These go beyond the annotations and give the agent a realistic expectation of the data. Minor omissions like rate limits are not critical given the read-only, idempotent nature.
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: it states the purpose first, lists the output components, adds availability constraints, and closes with parameter specifics. No sentence is wasted, and the most important scoping information (coverage, availability) appears early.
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 that an output schema is present (so return structure is already machine-readable), the description covers all necessary decision factors: what the tool returns, the time range, the issuance criteria, and how to verify station support. Combined with the annotations, an agent has everything needed to call it correctly and to anticipate the response format.
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 station_ids with a regex pattern and min/max items (100% coverage). The description adds concrete examples (KSEA, KJFK), clarifies that it accepts 1–4 ICAO IDs, and ties the parameter to the availability check. This is helpful context beyond the schema, nudging the agent to use valid ICAO codes and to pre-verify station support.
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 clear verb-resource pair ('Get the Terminal Aerodrome Forecast (TAF) for one or more airports') and enumerates the specific forecast elements returned (valid times, wind, visibility, weather, clouds, vertical visibility, raw TAF). It also distinguishes itself from sibling tools (aviation_get_metar, aviation_get_advisories, etc.) by being the TAF-specific tool, so an agent can select it unambiguously.
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?
Provides explicit guidance: TAFs cover the next 24–30 hours, are issued only for airports with scheduled commercial service, and instructs the agent to check data_types from aviation_find_stations to confirm availability. This tells the agent when to use this tool and when to verify prerequisites via an alternative, which is exactly the kind of routing information that helps correct selection.
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.
2 tool updates
- Changed
aviation_find_stations10 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum stations to return, applied after ordering by ICAO identifier ascending with identifier-less stations last — so the same query with the same limit returns the same stations, and airports rather than unidentified sites lead the first page. It bounds the response without changing the area searched, which a smaller bbox or a different state would. Distinct from the 400-row upstream cap: a limited result examined every station it counted and withheld some, while a capped one never drew the rest. Belongs to the bbox and state modes; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every match. Optional.", + "maximum": 400, + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / station_ids / descriptionPrevious value: -"One or more 4-letter ICAO station IDs (e.g., KSEA, KJFK). The upstream API only accepts ICAO format — 3-letter IATA codes (e.g., SEA) will return no results. Use bbox or state to discover ICAO IDs by location."New value: +"One or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-letter ICAO ID for an airport, and other shapes for the buoys and mesonet sites the registry also carries, which resolve by those. A 3-letter IATA code (e.g., SEA) never resolves, even for a station whose entry carries one. Whitespace around an entry is trimmed, so a padded identifier resolves the same as the bare one; an empty or whitespace-only entry is rejected. Use bbox or state to discover identifiers by location." - changed
Input schema / properties / station_ids / items / descriptionPrevious value: -"A 4-letter ICAO station identifier (e.g., KSEA)."New value: +"One station identifier (e.g., KSEA)." - added
Input schema / properties / station_ids / items / patternAdded value: +"\\S" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: None of the requested IDs match any known station. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: None of the requested IDs match any known station. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. `upstream_rejected`: The AWC station registry rejected the request as malformed rather than answering it. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "station_not_found", - "missing_search_criteria", - "conflicting_location", - "invalid_bbox", - "invalid_state" -]New value: +[ + "station_not_found", + "missing_search_criteria", + "conflicting_location", + "invalid_bbox", + "invalid_state", + "conflicting_limit", + "upstream_rejected" +] - added
Output schema / properties / limitedAdded value: +{ + "description": "True when the requested limit withheld stations that matched — the caller asked to see fewer of them. False affirms the limit did not bite, so every matching station is here. Present only when the call supplied a limit. It never states anything about the upstream cap: a limited result examined every station it counted, while a truncated one never drew the rest.", + "type": "boolean" +} - added
Output schema / properties / matchedAdded value: +{ + "description": "Stations that matched this query before the limit selected from them. Present only on a limited result. Where the result is also truncated this counts the capped draw and not the search area — the stations the cap dropped were never examined, so no count can include them.", + "type": "number" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance for whichever disclosure fired: the lever that narrows a truncated draw, or the cause and fix for identifiers that resolved to nothing. The two cannot co-occur — only bbox and state can reach the row cap, and only station_ids reconciles a request."New value: +"Guidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, or the cause and fix for identifiers that resolved to nothing. The cap and the limit can both fire on one result, and the text keeps them apart; the reconciliation cannot join them, since only bbox and state reach the row cap or accept a limit, and only station_ids reconciles a request." - changed
Output schema / properties / shown / descriptionPrevious value: -"Stations in this result, counted after any client-side state filter."New value: +"Stations in this result, counted after any client-side state filter and after any limit."
- Changed
aviation_get_pireps5 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum reports to return, applied last — after every filter and after ordering by observation time descending, so a limited result is the most recent reports rather than an arbitrary slice. It bounds the response without changing what is searched, which every other parameter does. Distinct from the 400-row upstream cap: a limited result examined every report it counted and withheld some, while a capped one never drew the rest. Selection is by recency alone, so pair it with min_intensity to bound a result by severity. Omit to return every match. Optional.", + "maximum": 400, + "minimum": 1, + "type": "integer" +} - added
Output schema / properties / limitedAdded value: +{ + "description": "True when the requested limit withheld reports that matched — the caller asked to see fewer of them. False affirms the limit did not bite, so every matching report is here. Present only when the call supplied a limit. It never states anything about the upstream cap: a limited result examined every report it counted, while a truncated one never drew the rest.", + "type": "boolean" +} - added
Output schema / properties / matchedAdded value: +{ + "description": "Reports that matched this query before the limit selected from them. Present only on a limited result. Where the result is also truncated this counts the capped page and not the search area — the reports the cap dropped were never examined, so no count can include them.", + "type": "number" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance naming the levers that narrow the query before the cap applies. Present only on a truncated result."New value: +"Guidance for whichever disclosures fired: the levers that narrow the query before the cap applies, and what a requested limit withheld. Both can fire on one result, and the text keeps them apart." - changed
Output schema / properties / shown / descriptionPrevious value: -"Reports in this result, counted after any altitude filter."New value: +"Reports in this result, counted after any altitude filter and after any limit."
1 tool update
- Changed
aviation_get_advisories2 fields changed- changed
Input schema / properties / hazard / descriptionPrevious value: -"Optional hazard filter. CONVECTIVE, TURBULENCE, ICING, and IFR match the four hazard classes the domestic SIGMET feed carries. MTN OBSCN, SURFACE WIND, and LLWS are AIRMET-family phenomena with no upstream counterpart here and are rejected rather than returning an empty result."New value: +"Optional hazard filter, applied upstream by AWC. CONVECTIVE, TURBULENCE, ICING, and IFR are the four hazard classes the domestic SIGMET feed carries, and an empty result under one of them means no advisory of that class is active — it says nothing about the others. MTN OBSCN, SURFACE WIND, and LLWS are AIRMET-family phenomena with no upstream counterpart here and are rejected rather than returning an empty result." - added
Output schema / properties / noticeAdded value: +{ + "description": "Present only when the result is empty, naming the stage that emptied it: no domestic SIGMETs are active at all, none carry the requested hazard, or none intersect the requested bbox — and which filter to broaden. A hazard-scoped empty draw states only that no advisory carries that hazard; AWC applies the hazard filter, so the response cannot say whether other classes are active.", + "type": "string" +}
3 tool updates
- Changed
aviation_find_stations5 fields changed- added
Output schema / properties / missingAdded value: +{ + "description": "Requested identifiers absent from the result. Deduplicated the way returned is: a repeated or differently-cased identifier appears once, under its first spelling. Absent when none are missing.", + "items": { + "description": "A requested identifier that resolved to no station.", + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance naming the lever that narrows the draw. Present only on a truncated result."New value: +"Guidance for whichever disclosure fired: the lever that narrows a truncated draw, or the cause and fix for identifiers that resolved to nothing. The two cannot co-occur — only bbox and state can reach the row cap, and only station_ids reconciles a request." - added
Output schema / properties / partialAdded value: +{ + "description": "True when a requested identifier resolved to nothing. False affirms every requested identifier resolved, which a count cannot establish — upstream case-folds and deduplicates, so a shorter list is not itself a gap. Present only on a station_ids lookup.", + "type": "boolean" +} - added
Output schema / properties / requestedAdded value: +{ + "description": "Station identifiers this call asked for, spelled as the caller wrote them and in the order given. Present only on a station_ids lookup — the bbox and state modes ask for an area, not a list.", + "items": { + "description": "A station identifier as requested.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / returnedAdded value: +{ + "description": "Requested identifiers that resolved, spelled as the caller wrote them rather than as upstream returned them. Deduplicated the way upstream deduplicates: a repeated or differently-cased identifier appears once, under its first spelling. Present only on a station_ids lookup.", + "items": { + "description": "A requested identifier that resolved to a station.", + "type": "string" + }, + "type": "array" +}
- Changed
aviation_get_metar6 fields changed- changed
Input schema / properties / hours / descriptionPrevious value: -"Hours of observation history to return (1–12). Default 1 returns only the most recent observation per station."New value: +"Lookback window in hours (1–12), not a row limit: every observation inside the window is returned, so a station reporting more often than hourly yields more than one row per hour. At the default of 1, half-hourly stations return two observations and SPECI-issuing stations can return more. Budget rows by the station reporting interval, never one per station." - changed
Output schema / properties / observations / items / properties / ceiling_ft / descriptionPrevious value: -"Ceiling in feet AGL — the lowest broken, overcast, or obscuration layer. Per FAA AIM 7-1-29 the ceiling is the lowest broken or overcast layer, or the vertical visibility into an obscuration; few and scattered layers are never ceilings. Null when the observation reported no such layer."New value: +"Ceiling in feet AGL — the lowest broken, overcast, or obscuration layer. Per FAA AIM 7-1-29 the ceiling is the lowest broken or overcast layer, or the vertical visibility into an obscuration; few and scattered layers are never ceilings. Null in two cases that are not the same: the observation reported no such layer, or it reported an obscuration whose vertical visibility the station could not determine (a VV/// group), where the ceiling exists and only its height is missing. A sky_condition of OVX marks the second." - changed
Output schema / properties / observations / items / properties / clouds / descriptionPrevious value: -"All reported cloud layers from lowest to highest."New value: +"All reported cloud layers from lowest to highest. Empty whenever the observation published no layer heights, which covers a clear sky, an obscuration with no determinable height, and an observation that reported no sky condition at all; sky_condition distinguishes them. An empty array is not a clear sky on its own." - added
Output schema / properties / observations / items / properties / sky_conditionAdded value: +{ + "description": "The sky condition the observation stated when it published no layer heights: CLR, SKC, or CAVOK for a clear or insignificant-cloud report, OVX for an obscuration whose layer carried no height (a VV/// group, and the opposite of clear). Null when clouds carries layers — those are the statement — and also when the observation carried no sky-condition group at all. An empty clouds array beside a null here is an unreported sky, never a clear one.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / observations / items / properties / visibility_sm / descriptionPrevious value: -"Prevailing visibility in statute miles (e.g., \"10+\", \"3\", \"1/2\")."New value: +"Prevailing visibility in statute miles (e.g., \"10+\", \"3\", \"1/2\"), or the string \"unknown\" when the observation carried no visibility group. \"unknown\" is not a measurement and carries no unit." - changed
Output schema / properties / observations / items / requiredPrevious value: -[ - "station_id", - "name", - "lat", - "lon", - "elevation_ft", - "flight_category", - "metar_type", - "observed_at", - "wind", - "visibility_sm", - "ceiling_ft", - "ceiling_type", - "clouds", - "present_weather", - "temp_c", - "dewpoint_c", - "altimeter_inhg", - "raw_metar" -]New value: +[ + "station_id", + "name", + "lat", + "lon", + "elevation_ft", + "flight_category", + "metar_type", + "observed_at", + "wind", + "visibility_sm", + "ceiling_ft", + "ceiling_type", + "clouds", + "sky_condition", + "present_weather", + "temp_c", + "dewpoint_c", + "altimeter_inhg", + "raw_metar" +]
- Changed
aviation_get_taf4 fields changed- changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / change_type / descriptionPrevious value: -"Change indicator: FM (from), TEMPO (temporary), BECMG (becoming), or null for the base period."New value: +"Change indicator: FM (from), TEMPO (temporary), BECMG (becoming), PROB (a standalone probability group), or null for the base period. A PROB30 or PROB40 qualifying a temporary group arrives as TEMPO; standing alone, with no temporary group after it, it arrives as PROB. Either way the percentage is in probability." - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / descriptionPrevious value: -"Forecast cloud layers for this period."New value: +"Forecast cloud layers for this period. Empty whenever the period published no layer heights, which covers a forecast clear sky and a period carrying no cloud element at all; sky_condition distinguishes them. An empty array is not a forecast of a clear sky on its own." - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / sky_conditionAdded value: +{ + "description": "The sky condition this period forecast when it published no layer heights: SKC or NSC for a clear or insignificant-cloud forecast (a CAVOK group arrives as NSC), OVX for a forecast obscuration carrying no vertical visibility. Null when clouds carries layers — those are the statement — and also when the period carried no cloud element at all. An empty clouds array beside a null here forecasts nothing about cloud; on a TEMPO, PROB, or BECMG group that means the prevailing forecast stands unchanged, never that the sky will be clear.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / requiredPrevious value: -[ - "from", - "to", - "change_type", - "probability", - "wind", - "wind_shear", - "visibility_sm", - "vertical_visibility_ft", - "weather", - "clouds" -]New value: +[ + "from", + "to", + "change_type", + "probability", + "wind", + "wind_shear", + "visibility_sm", + "vertical_visibility_ft", + "weather", + "clouds", + "sky_condition" +]
5 tool updates
- Changed
aviation_find_stations8 fields changed- removed
Output schema / properties / stations / items / properties / elevation_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / stations / items / properties / elevation_ft / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / stations / items / properties / faa_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / stations / items / properties / faa_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / stations / items / properties / iata_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / stations / items / properties / iata_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / stations / items / properties / icao_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / stations / items / properties / icao_id / typeAdded value: +[ + "string", + "null" +]
- Changed
aviation_get_advisories7 fields changed- removed
Output schema / properties / advisories / items / properties / altitude_high_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / advisories / items / properties / altitude_high_ft / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / advisories / items / properties / altitude_low_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / advisories / items / properties / altitude_low_ft / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / advisories / items / properties / movement / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "direction_deg": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Movement direction in degrees true, or null if stationary." - }, - "speed_kt": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Movement speed in knots, or null if stationary." - } - }, - "required": [ - "direction_deg", - "speed_kt" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "direction_deg": { + "description": "Movement direction in degrees true, or null if stationary.", + "type": [ + "number", + "null" + ] + }, + "speed_kt": { + "description": "Movement speed in knots, or null if stationary.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "direction_deg", + "speed_kt" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / advisories / items / properties / severity / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / advisories / items / properties / severity / typeAdded value: +[ + "number", + "null" +]
- Changed
aviation_get_metar14 fields changed- removed
Output schema / properties / observations / items / properties / altimeter_inhg / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / observations / items / properties / altimeter_inhg / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / observations / items / properties / ceiling_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / observations / items / properties / ceiling_ft / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / observations / items / properties / dewpoint_c / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / observations / items / properties / dewpoint_c / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / observations / items / properties / temp_c / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / observations / items / properties / temp_c / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / observations / items / properties / wind / properties / direction_deg / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / observations / items / properties / wind / properties / direction_deg / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / observations / items / properties / wind / properties / gust_kt / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / observations / items / properties / wind / properties / gust_kt / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / observations / items / properties / wind / properties / speed_kt / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / observations / items / properties / wind / properties / speed_kt / typeAdded value: +[ + "number", + "null" +]
- Changed
aviation_get_pireps26 fields changed- added
Input schema / properties / min_intensityAdded value: +{ + "description": "Return only reports carrying at least one turbulence or icing layer at this intensity or above. The filter selects reports, not layers — a matching report still carries its lighter layers, so a result may include NEG, TRC, or LGT entries alongside the layer that matched. Optional.", + "enum": [ + "lgt", + "mod", + "sev" + ], + "type": "string" +} - removed
Output schema / properties / pireps / items / properties / aircraft_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / aircraft_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / pireps / items / properties / altitude_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - changed
Output schema / properties / pireps / items / properties / altitude_ft / descriptionPrevious value: -"Reported altitude in feet MSL, or null when the pilot gave no flight level (raw /FLUNKN/, /FLDURC/, or /FLDURD/). A raw /FL000/ is a reported flight level of zero and returns 0."New value: +"Reported altitude in feet MSL, or null when the raw flight-level group carries no usable altitude. That covers /FLUNKN/ and the during-climb and during-descent markers, and equally any other group AWC could not read — including one made only of digits, such as /FL2130/. A raw /FL000/ is a reported flight level of zero and returns 0." - added
Output schema / properties / pireps / items / properties / altitude_ft / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / pireps / items / properties / clouds / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": false, - "description": "A cloud layer, whose base and top are each present only if reported.", - "properties": { - "base_ft": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Cloud base altitude in feet MSL, or null if the pilot reported no base." - }, - "cover": { - "description": "Cloud cover code: FEW, SCT, BKN, OVC, SKC, or CLR. The field also carries the flight-condition markers VMC and IMC, which describe the flight environment rather than a cloud layer and arrive with no base or top.", - "type": "string" - }, - "top_ft": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Cloud top altitude in feet MSL, or null if the pilot reported no top." - } - }, - "required": [ - "cover", - "base_ft", - "top_ft" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": false, + "description": "A cloud layer, whose base and top are each present only if reported.", + "properties": { + "base_ft": { + "description": "Cloud base altitude in feet MSL, or null if the pilot reported no base.", + "type": [ + "number", + "null" + ] + }, + "cover": { + "description": "Cloud cover code: FEW, SCT, BKN, OVC, SKC, or CLR. The field also carries the flight-condition markers VMC and IMC, which describe the flight environment rather than a cloud layer and arrive with no base or top.", + "type": "string" + }, + "top_ft": { + "description": "Cloud top altitude in feet MSL, or null if the pilot reported no top.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "cover", + "base_ft", + "top_ft" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / properties / pireps / items / properties / icing / descriptionPrevious value: -"Icing layers reported. An explicit negative report is a layer with intensity NEG; an empty array means the PIREP carried no icing group, so the pilot said nothing either way."New value: +"Icing layers the raw report carried. An explicit negative report is a layer with intensity NEG; an empty array means the PIREP carried no icing group, so the pilot said nothing either way. Layers AWC synthesized for a report that never mentioned ice are omitted rather than published." - removed
Output schema / properties / pireps / items / properties / icing / items / properties / base_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / icing / items / properties / base_ft / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / pireps / items / properties / icing / items / properties / top_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / icing / items / properties / top_ft / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / pireps / items / properties / icing / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / icing / items / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / pireps / items / properties / remarks / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / remarks / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / pireps / items / properties / turbulence / items / properties / base_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / turbulence / items / properties / base_ft / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / pireps / items / properties / turbulence / items / properties / frequency / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / turbulence / items / properties / frequency / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / pireps / items / properties / turbulence / items / properties / top_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / turbulence / items / properties / top_ft / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / pireps / items / properties / turbulence / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / turbulence / items / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / pireps / items / properties / visibility_sm / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / pireps / items / properties / visibility_sm / typeAdded value: +[ + "number", + "null" +]
- Changed
aviation_get_taf16 fields changed- removed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / change_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / change_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / probability / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / probability / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / vertical_visibility_ft / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / vertical_visibility_ft / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / visibility_sm / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / visibility_sm / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / direction_deg / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / direction_deg / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / gust_kt / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / gust_kt / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / typeAdded value: +[ + "number", + "null" +]
5 tool updates
- Changed
aviation_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", + "truncated", + "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: `station_not_found`: None of the requested IDs match any known station. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. Other values are possible when a failure originates below the handler.", + "examples": [ + "station_not_found", + "missing_search_criteria", + "conflicting_location", + "invalid_bbox", + "invalid_state" + ], + "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", - "truncated", - "shown" -]
- Changed
aviation_get_advisories6 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": [ + "advisories" + ] + }, + { + "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: `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `airmet_not_served`: advisory_type \"airmet\" was requested, or a hazard filter naming an AIRMET-family phenomenon (MTN OBSCN, SURFACE WIND, LLWS) with no counterpart on the SIGMET feed. Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_bbox", + "airmet_not_served" + ], + "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: -[ - "advisories" -]
- Changed
aviation_get_metar6 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": [ + "observations", + "requested", + "returned", + "partial" + ] + }, + { + "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_stations_found`: None of the requested station IDs returned METAR data. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_stations_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: -[ - "observations", - "requested", - "returned", - "partial" -]
- Changed
aviation_get_pireps6 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": [ + "pireps", + "truncated", + "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: `no_pireps_found`: No pilot reports found in the search area and time window. `missing_location`: Neither station_id nor bbox was provided. `conflicting_location`: Both station_id and bbox were provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `conflicting_distance`: distance_nm was provided together with bbox, where a search radius has no meaning. `invalid_altitude_range`: altitude_min_ft is greater than altitude_max_ft, so no report can match both bounds. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_pireps_found", + "missing_location", + "conflicting_location", + "invalid_bbox", + "conflicting_distance", + "invalid_altitude_range" + ], + "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: -[ - "pireps", - "truncated", - "shown" -]
- Changed
aviation_get_taf6 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": [ + "forecasts", + "requested", + "returned", + "partial" + ] + }, + { + "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_taf_available`: Station does not issue TAFs or no TAF is currently available. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_taf_available" + ], + "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: -[ - "forecasts", - "requested", - "returned", - "partial" -]
3 tool updates
- Changed
aviation_find_stations6 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The upstream row maximum that was applied to the draw. Present only on a truncated result.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance naming the lever that narrows the draw. Present only on a truncated result.", + "type": "string" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Stations in this result, counted after any client-side state filter.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the upstream draw hit the AWC row cap, so stations inside the search area are missing from this result. False affirms the area was drawn in full, which a count alone cannot establish.", + "type": "boolean" +} - added
Output schema / properties / upstreamRowsAdded value: +{ + "description": "Rows AWC returned before the client-side state filter ran. Present only on a truncated state query the filter then narrowed, where the post-filter count sits below the cap and so cannot reveal the truncation on its own.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "stations" -]New value: +[ + "stations", + "truncated", + "shown" +]
- Changed
aviation_get_advisories7 fields changed- changed
Input schema / properties / advisory_type / descriptionPrevious value: -"Filter by advisory type. \"sigmet\" includes convective SIGMETs. \"airmet\" includes AIRMET Sierra (IFR/mountain obscuration), Tango (turbulence), and Zulu (icing). \"all\" returns both."New value: +"Filter by advisory type. \"sigmet\" and \"all\" both return the active domestic SIGMET set, which is everything this tool serves. \"airmet\" is rejected with guidance: the upstream feed cannot return an AIRMET, so answering it would mean presenting SIGMETs as AIRMET matches." - changed
Input schema / properties / hazard / descriptionPrevious value: -"Optional hazard filter. CONVECTIVE = convective SIGMETs; TURBULENCE = AIRMET Tango; ICING = AIRMET Zulu; IFR = AIRMET Sierra (IFR conditions); MTN OBSCN = AIRMET Sierra (mountain obscuration); SURFACE WIND = sustained strong surface winds (typically >30 kt); LLWS = low-level wind shear below 2,000 ft AGL."New value: +"Optional hazard filter. CONVECTIVE, TURBULENCE, ICING, and IFR match the four hazard classes the domestic SIGMET feed carries. MTN OBSCN, SURFACE WIND, and LLWS are AIRMET-family phenomena with no upstream counterpart here and are rejected rather than returning an empty result." - changed
Output schema / properties / advisories / items / descriptionPrevious value: -"An active SIGMET or AIRMET advisory."New value: +"An active SIGMET advisory." - changed
Output schema / properties / advisories / items / properties / advisory_type / descriptionPrevious value: -"Advisory type: SIGMET or AIRMET."New value: +"Advisory type as issued. The domestic SIGMET feed this tool reads emits SIGMET." - changed
Output schema / properties / advisories / items / properties / hazard / descriptionPrevious value: -"Hazard type (e.g., CONVECTIVE, TURBULENCE, ICING, IFR, MTN OBSCN)."New value: +"Hazard type — one of CONVECTIVE, TURBULENCE, ICING, or IFR." - changed
Output schema / properties / advisories / items / properties / raw_text / descriptionPrevious value: -"Original encoded SIGMET or AIRMET text as issued by the meteorological watch office."New value: +"Original encoded SIGMET text as issued by the meteorological watch office." - changed
Output schema / properties / advisories / items / properties / severity / descriptionPrevious value: -"Severity integer for convective SIGMETs (higher = more intense). Null for AIRMETs."New value: +"Severity integer for convective SIGMETs (higher = more intense). Null when the advisory stated none."
- Changed
aviation_get_pireps6 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The upstream row maximum that was applied to the page. Present only on a truncated result.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance naming the levers that narrow the query before the cap applies. Present only on a truncated result.", + "type": "string" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Reports in this result, counted after any altitude filter.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the upstream page hit the AWC row cap, so reports inside the search area and time window are missing from this result. False affirms the whole window was searched, which a count alone cannot establish.", + "type": "boolean" +} - added
Output schema / properties / upstreamRowsAdded value: +{ + "description": "Reports AWC returned before the altitude filter ran. Present only on a truncated result the filter then narrowed, where the remaining count sits below the cap and so cannot reveal the truncation on its own.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "pireps" -]New value: +[ + "pireps", + "truncated", + "shown" +]
2 tool updates
- Changed
aviation_get_metar8 fields changed- added
Output schema / properties / missingAdded value: +{ + "description": "Requested station IDs absent from the result. Absent when none are missing.", + "items": { + "description": "A requested ICAO station ID that produced no observation.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery guidance naming the missing station IDs. Present only on a partial result. It lists the candidate causes without asserting one — upstream omits the row either way.", + "type": "string" +} - changed
Output schema / properties / observations / items / properties / ceiling_ft / descriptionPrevious value: -"Ceiling in feet AGL — the lowest broken, overcast, or obscuration layer. Per FAA AIM 7-1-13 the ceiling is the lowest broken or overcast layer, or the vertical visibility into an obscuration; few and scattered layers are never ceilings. Null when the observation reported no such layer."New value: +"Ceiling in feet AGL — the lowest broken, overcast, or obscuration layer. Per FAA AIM 7-1-29 the ceiling is the lowest broken or overcast layer, or the vertical visibility into an obscuration; few and scattered layers are never ceilings. Null when the observation reported no such layer." - changed
Output schema / properties / observations / items / properties / present_weather / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "decoded": { - "description": "Plain-English reading of the group (e.g., \"fog\", \"light rain showers\").", - "type": "string" - }, - "raw": { - "description": "Weather group exactly as encoded (e.g., \"FG\", \"-SHRA\", \"+RA BR\").", - "type": "string" - } - }, - "required": [ - "raw", - "decoded" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "decoded": { + "description": "Plain-English reading of each group, joined with \"; \" (e.g., \"fog\", \"light rain showers; mist\"). A group the decoder does not recognize is carried through as its own raw token rather than half-translated, so compare against raw when a reading still looks coded.", + "type": "string" + }, + "raw": { + "description": "Weather groups exactly as encoded, space-delimited (e.g., \"FG\", \"-SHRA\", \"VCTS -RA\").", + "type": "string" + } + }, + "required": [ + "raw", + "decoded" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / partialAdded value: +{ + "description": "True when a requested station produced no observation. False affirms the result covers every requested station, so full coverage is distinguishable from a short batch rather than being inferred from the count.", + "type": "boolean" +} - added
Output schema / properties / requestedAdded value: +{ + "description": "Station IDs this call asked for, in the order given.", + "items": { + "description": "An ICAO station ID as requested.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / returnedAdded value: +{ + "description": "Distinct station IDs that produced at least one observation. Counted per station, not per row — with hours > 1 a station reporting six times still appears once.", + "items": { + "description": "An ICAO station ID present in the result.", + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "observations" -]New value: +[ + "observations", + "requested", + "returned", + "partial" +]
- Changed
aviation_get_taf15 fields changed- changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / base_ft / descriptionPrevious value: -"Cloud base altitude in feet AGL."New value: +"Cloud base altitude in feet AGL. On an OVX layer this is the vertical visibility into the obscuration rather than a layer bottom, and 0 is a surface-level indefinite ceiling." - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / cover / descriptionPrevious value: -"Sky cover code: FEW, SCT, BKN, OVC, SKC, CLR."New value: +"Sky cover code: FEW, SCT, BKN, OVC, SKC, or OVX. OVX is the decoded form of a VVhhh group — the sky is obscured and the base is the vertical visibility into it, not a cloud bottom." - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / type / descriptionPrevious value: -"Cloud type qualifier: CB (cumulonimbus), TCU (towering cumulus), or null."New value: +"Cloud type qualifier: CB (cumulonimbus), TCU (towering cumulus), or null. An obscuration can carry one — a VV008CB group is an OVX layer with type CB." - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / vertical_visibility_ftAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Vertical visibility into a forecast obscuration, in feet AGL — an indefinite ceiling, and the same height as this period OVX cloud layer. 0 is a surface-level indefinite ceiling; null means the period forecasts no obscuration." +} - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / weather / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "decoded": { + "description": "Plain-English reading of each group, joined with \"; \" (e.g., \"light rain showers; mist\"). A group the decoder does not recognize is carried through as its own raw token rather than half-translated, so compare against raw when a reading still looks coded.", + "type": "string" + }, + "raw": { + "description": "Weather groups exactly as forecast, space-delimited (e.g., \"-SHRA\", \"-SHRA BR\", \"VCTS -RA\").", + "type": "string" + } + }, + "required": [ + "raw", + "decoded" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / weather / descriptionPrevious value: -"Decoded weather condition (e.g., \"light rain showers\", \"thunderstorm with rain\"). Null if none."New value: +"Forecast weather for this period, or null when the period carried no weather group." - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / descriptionPrevious value: -"Forecast wind conditions for this period."New value: +"Forecast wind conditions at the surface for this period." - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind_shearAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "direction_deg": { + "description": "Forecast wind direction at the top of the shear layer, in degrees true — not a direction of shear.", + "type": "number" + }, + "height_ft": { + "description": "Top of the shear layer in feet AGL — not the layer base and not its thickness. A WS020 group is 2000 ft.", + "type": "number" + }, + "speed_kt": { + "description": "Forecast wind speed at the top of the shear layer, in knots — the wind at that height, not the magnitude of the shear.", + "type": "number" + } + }, + "required": [ + "height_ft", + "direction_deg", + "speed_kt" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Forecast non-convective low-level wind shear (a WS group), confined to the surface–2,000 ft AGL band. A null means no non-convective LLWS group was issued for this period, rather than no shear expected: the group is excluded from TEMPO and PROB groups, and shear is always assumed present in convective activity." +} - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / requiredPrevious value: -[ - "from", - "to", - "change_type", - "probability", - "wind", - "visibility_sm", - "weather", - "clouds" -]New value: +[ + "from", + "to", + "change_type", + "probability", + "wind", + "wind_shear", + "visibility_sm", + "vertical_visibility_ft", + "weather", + "clouds" +] - added
Output schema / properties / missingAdded value: +{ + "description": "Requested station IDs absent from the result. Absent when none are missing.", + "items": { + "description": "A requested ICAO station ID that produced no forecast.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery guidance naming the missing station IDs. Present only on a partial result. It lists the candidate causes without asserting one — upstream omits the row either way.", + "type": "string" +} - added
Output schema / properties / partialAdded value: +{ + "description": "True when a requested station produced no forecast. False affirms the result covers every requested station, so full coverage is distinguishable from a short batch rather than being inferred from the count.", + "type": "boolean" +} - added
Output schema / properties / requestedAdded value: +{ + "description": "Station IDs this call asked for, in the order given.", + "items": { + "description": "An ICAO station ID as requested.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / returnedAdded value: +{ + "description": "Distinct station IDs that produced a forecast.", + "items": { + "description": "An ICAO station ID present in the result.", + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "forecasts" -]New value: +[ + "forecasts", + "requested", + "returned", + "partial" +]
4 tool updates
- Changed
aviation_find_stations3 fields changed- added
Output schema / properties / stations / items / properties / elevation_ft / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / stations / items / properties / elevation_ft / descriptionPrevious value: -"Station elevation in feet MSL."New value: +"Station elevation in feet MSL. 0 is a sea-level site; null means no elevation is on file upstream, so it is unknown." - removed
Output schema / properties / stations / items / properties / elevation_ft / typeRemoved value: -"number"
- Changed
aviation_get_metar18 fields changed- added
Output schema / properties / observations / items / properties / altimeter_inhg / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / observations / items / properties / altimeter_inhg / descriptionPrevious value: -"Altimeter setting in inches of mercury."New value: +"Altimeter setting in inches of mercury, or null when the observation carried no altimeter group (common at stations reporting sea-level pressure only)." - removed
Output schema / properties / observations / items / properties / altimeter_inhg / typeRemoved value: -"number" - changed
Output schema / properties / observations / items / properties / ceiling_ft / descriptionPrevious value: -"Ceiling in feet MSL — lowest BKN or OVC layer base. Null when sky is clear."New value: +"Ceiling in feet AGL — the lowest broken, overcast, or obscuration layer. Per FAA AIM 7-1-13 the ceiling is the lowest broken or overcast layer, or the vertical visibility into an obscuration; few and scattered layers are never ceilings. Null when the observation reported no such layer." - added
Output schema / properties / observations / items / properties / ceiling_typeAdded value: +{ + "anyOf": [ + { + "enum": [ + "measured", + "indefinite" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "How the ceiling height was determined: \"measured\" for a broken or overcast layer base, \"indefinite\" for vertical visibility into an obscuration (an OVX layer). Null exactly when ceiling_ft is null." +} - changed
Output schema / properties / observations / items / properties / clouds / items / properties / base_ft / descriptionPrevious value: -"Cloud base altitude in feet MSL."New value: +"Cloud base altitude in feet AGL." - changed
Output schema / properties / observations / items / properties / clouds / items / properties / cover / descriptionPrevious value: -"Sky cover code: FEW, SCT, BKN, OVC, SKC, CLR."New value: +"Sky cover code: FEW, SCT, BKN, OVC, SKC, CLR, CAVOK, or OVX. OVX is the decoded form of a VVhhh group — the sky is obscured and the base is the vertical visibility into it, not a cloud bottom." - added
Output schema / properties / observations / items / properties / dewpoint_c / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / observations / items / properties / dewpoint_c / descriptionPrevious value: -"Dewpoint in degrees Celsius."New value: +"Dewpoint in degrees Celsius. 0 is a real reading; null means the observation carried no dewpoint, so it is unknown." - removed
Output schema / properties / observations / items / properties / dewpoint_c / typeRemoved value: -"number" - added
Output schema / properties / observations / items / properties / present_weatherAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "decoded": { + "description": "Plain-English reading of the group (e.g., \"fog\", \"light rain showers\").", + "type": "string" + }, + "raw": { + "description": "Weather group exactly as encoded (e.g., \"FG\", \"-SHRA\", \"+RA BR\").", + "type": "string" + } + }, + "required": [ + "raw", + "decoded" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Present weather at the station, or null when the observation carried no weather group (a dry, unobscured day)." +} - added
Output schema / properties / observations / items / properties / temp_c / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / observations / items / properties / temp_c / descriptionPrevious value: -"Temperature in degrees Celsius."New value: +"Temperature in degrees Celsius. 0 is a real reading; null means the observation carried no temperature, so it is unknown." - removed
Output schema / properties / observations / items / properties / temp_c / typeRemoved value: -"number" - added
Output schema / properties / observations / items / properties / wind / properties / speed_kt / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / observations / items / properties / wind / properties / speed_kt / descriptionPrevious value: -"Wind speed in knots."New value: +"Wind speed in knots. 0 is calm (a reported 00000KT); null means the observation carried no wind group, so the speed is unknown." - removed
Output schema / properties / observations / items / properties / wind / properties / speed_kt / typeRemoved value: -"number" - changed
Output schema / properties / observations / items / requiredPrevious value: -[ - "station_id", - "name", - "lat", - "lon", - "elevation_ft", - "flight_category", - "metar_type", - "observed_at", - "wind", - "visibility_sm", - "ceiling_ft", - "clouds", - "temp_c", - "dewpoint_c", - "altimeter_inhg", - "raw_metar" -]New value: +[ + "station_id", + "name", + "lat", + "lon", + "elevation_ft", + "flight_category", + "metar_type", + "observed_at", + "wind", + "visibility_sm", + "ceiling_ft", + "ceiling_type", + "clouds", + "present_weather", + "temp_c", + "dewpoint_c", + "altimeter_inhg", + "raw_metar" +]
- Changed
aviation_get_pireps9 fields changed- changed
Input schema / properties / altitude_max_ft / descriptionPrevious value: -"Filter by maximum altitude in feet MSL (e.g., 35000 for FL350). Optional."New value: +"Filter by maximum altitude in feet MSL (e.g., 35000 for FL350). Reports with an unknown altitude (altitude_ft null) cannot be shown to satisfy a bound and are dropped whenever either bound is set. Optional." - changed
Input schema / properties / altitude_min_ft / descriptionPrevious value: -"Filter by minimum altitude in feet MSL (e.g., 18000 for FL180). Optional."New value: +"Filter by minimum altitude in feet MSL (e.g., 18000 for FL180). Reports with an unknown altitude (altitude_ft null) cannot be shown to satisfy a bound and are dropped whenever either bound is set. Optional." - added
Output schema / properties / pireps / items / properties / altitude_ft / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / pireps / items / properties / altitude_ft / descriptionPrevious value: -"Reported altitude in feet MSL."New value: +"Reported altitude in feet MSL, or null when the pilot gave no flight level (raw /FLUNKN/, /FLDURC/, or /FLDURD/). A raw /FL000/ is a reported flight level of zero and returns 0." - removed
Output schema / properties / pireps / items / properties / altitude_ft / typeRemoved value: -"number" - changed
Output schema / properties / pireps / items / properties / clouds / anyOfPrevious value: -[ - { - "items": { - "additionalProperties": false, - "description": "A cloud layer with base and top altitudes.", - "properties": { - "base_ft": { - "description": "Cloud base altitude in feet MSL.", - "type": "number" - }, - "cover": { - "description": "Cloud cover code (e.g., FEW, SCT, BKN, OVC).", - "type": "string" - }, - "top_ft": { - "description": "Cloud top altitude in feet MSL.", - "type": "number" - } - }, - "required": [ - "cover", - "base_ft", - "top_ft" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": false, + "description": "A cloud layer, whose base and top are each present only if reported.", + "properties": { + "base_ft": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Cloud base altitude in feet MSL, or null if the pilot reported no base." + }, + "cover": { + "description": "Cloud cover code: FEW, SCT, BKN, OVC, SKC, or CLR. The field also carries the flight-condition markers VMC and IMC, which describe the flight environment rather than a cloud layer and arrive with no base or top.", + "type": "string" + }, + "top_ft": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Cloud top altitude in feet MSL, or null if the pilot reported no top." + } + }, + "required": [ + "cover", + "base_ft", + "top_ft" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / properties / pireps / items / properties / clouds / descriptionPrevious value: -"Cloud layers with base and top altitudes, or null if not reported."New value: +"Cloud layers, or null if the PIREP carried no sky-condition group." - changed
Output schema / properties / pireps / items / properties / icing / descriptionPrevious value: -"Icing layers reported. Empty array if no icing encountered (NEG)."New value: +"Icing layers reported. An explicit negative report is a layer with intensity NEG; an empty array means the PIREP carried no icing group, so the pilot said nothing either way." - changed
Output schema / properties / pireps / items / properties / turbulence / descriptionPrevious value: -"Turbulence layers reported. Empty array if no turbulence encountered (NEG)."New value: +"Turbulence layers reported. An explicit negative report is a layer with intensity NEG; an empty array means the PIREP carried no turbulence group, so the pilot said nothing either way."
- Changed
aviation_get_taf5 fields changed- changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / base_ft / descriptionPrevious value: -"Cloud base altitude in feet MSL."New value: +"Cloud base altitude in feet AGL." - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / direction_deg / descriptionPrevious value: -"Forecast wind direction in degrees true. Null when variable."New value: +"Forecast wind direction in degrees true. Null when the forecast said VRB (variable), and also when the period carries no wind element at all — speed_kt is null in that second case and a number in the first." - added
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / descriptionPrevious value: -"Forecast wind speed in knots."New value: +"Forecast wind speed in knots. 0 is a forecast calm (a 00000KT group); null means the period amends only visibility, weather, or cloud and carries no wind element, so the wind is unknown rather than calm." - removed
Output schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / typeRemoved value: -"number"
2 tool updates
- Changed
aviation_find_stations1 field changed- changed
Input schema / properties / state / descriptionPrevious value: -"Two-letter US state abbreviation (e.g., \"WA\") to list all stations in that state."New value: +"Two-letter USPS code for one of the 50 US states or DC (e.g., \"WA\") to list all stations in that jurisdiction. US territories are not supported — use bbox for those."
- Changed
aviation_get_pireps2 fields changed- removed
Input schema / properties / distance_nm / defaultRemoved value: -100 - changed
Input schema / properties / distance_nm / descriptionPrevious value: -"Search radius in nautical miles around station_id. Only used when station_id is provided. Default 100."New value: +"Search radius in nautical miles around station_id, defaulting to 100 when omitted. Belongs to the station_id search only — supplying it alongside bbox is rejected."
5 tool updates
- First observed
aviation_find_stations - First observed
aviation_get_advisories - First observed
aviation_get_metar - First observed
aviation_get_pireps - First observed
aviation_get_taf
Related MCP Connectors
Get US weather forecasts, active alerts, and current observations.
Aviation Weather MCP — METAR, TAF, PIREPs, AIRMET/SIGMET, station info
Search NOAA CDO stations and datasets, fetch historical weather observations.
Search NOAA climate stations and datasets, fetch historical weather observations.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides aviation weather data including METAR, TAF, PIREPs, AIRMET/SIGMET, station info, and winds aloft forecasts.16 npmMIT
- FlicenseNot gradedqualityDmaintenanceFetches and parses METAR/TAF aviation weather data from NOAA with caching and human-readable formatting.1-
- AlicenseNot gradedqualityDmaintenanceProvides access to aviation weather data from aviationweather.gov, enabling LLMs to fetch and analyze METAR, TAF, PIREPs, AIRMETs, and other aviation weather information.7 npm7MIT
- AlicenseNot gradedqualityDmaintenanceProvides aviation weather information through a Model Context Protocol server, enabling access to METARs, TAFs, PIREPs, and route weather data for informational purposes only.2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.