Skip to main content
Glama

Server Details

Fetch METARs, TAFs, PIREPs, and domestic SIGMETs from the NWS Aviation Weather Center.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 56 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

A4.5/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct data product: station lookup, SIGMET advisories, current METARs, pilot reports, and forecasts. No two tools overlap; get_metar and get_taf are clearly separated as current vs forecast, and get_advisories is explicit about not covering AIRMETs.

Naming Consistency4/5

All tools share the aviation_ prefix and use snake_case verb_noun structure (find_stations, get_advisories, get_metar, get_pireps, get_taf). The minor mix of 'find' vs 'get' is a small deviation from a uniform verb pattern.

Tool Count5/5

Five tools cover the core aviation weather data products without bloating the surface. Each tool provides a meaningful, non-redundant function, and the count feels appropriately scoped for a focused aviation weather server.

Completeness4/5

The set covers the major aviation weather products—METAR, TAF, PIREPs, and SIGMET advisories—plus a station registry. The notable gap is the absence of AIRMETs (explicitly excluded by get_advisories) and winds aloft, but the core operational workflow is intact.

Available Tools

5 tools
aviation_find_stationsFind Aviation Weather StationsA
Read-onlyIdempotent
Inspect

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-character ICAO ID (e.g., KSEA, KJFK, K0S9); 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bboxNoGeographic bounding box for spatial queries.
limitNoMaximum 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.
stateNoTwo-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_idsNoOne or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-character ICAO ID for an airport (e.g., KSEA, K0S9), 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

ParametersJSON Schema
NameRequiredDescription
capNoThe upstream row maximum that was applied to the draw. Present only on a truncated result.
errorNoPresent when the call failed. Absent on success.
shownNoStations in this result, counted after any client-side state filter and after any limit.
noticeNoGuidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, that limit bounds the response without changing the area searched (on a bbox or state result of more than 130 stations from a call that set no limit), or the cause and fix for identifiers that resolved to nothing. The cap and either limit statement can 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 take a limit, and only station_ids reconciles a request.
limitedNoTrue 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.
matchedNoStations 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.
missingNoRequested 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.
partialNoTrue 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.
returnedNoRequested 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.
stationsNoMatching stations.
requestedNoStation 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.
truncatedNoTrue 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.
upstreamRowsNoRows 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

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and idempotent hints, and the description adds extensive behavioral detail: how limit bounds results without changing the searched area, the ordering (ICAO ascending with identifier-less last), the distinction between limit and upstream cap, and that supplying limit with station_ids is rejected. It also clarifies whitespace trimming and empty-entry rejection. This far exceeds the annotation baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a clear purpose statement followed by mode-specific details. It is dense but every sentence earns its place—no fluff or redundancy. It front-loads the core functionality and then adds necessary nuances.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple modes, parameter interdependencies, edge cases), the description covers all necessary aspects: required modes, parameter restrictions, identifier formats, geographic limits, and response characteristics. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter. The description adds critical meaning: how station_ids matches registry identifiers (ICAO for airports, other shapes for buoys/mesonet), that IATA codes are never accepted, and the interaction of limit with area modes. This elevates the understanding beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool resolves or discovers stations by identifier or area, and lists what it returns (identifier variants, coordinates, elevation, data types). It distinguishes from sibling tools that focus on weather data (METAR/TAF/PIREPS/advisories) rather than station discovery, making it unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states at least one of station_ids, bbox, or state is required, and that limit applies only to bbox/state modes. It explains when to use bbox/state for discovery, warns that IATA codes never resolve, and notes US territories are unsupported. This is precise routing guidance.

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)A
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bboxNoGeographic bounding box to filter advisories by polygon overlap.
hazardNoOptional 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_typeNoFilter 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

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPresent 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.
advisoriesNoActive advisories matching the filter criteria. May be empty during fair weather periods.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

Get current weather observations (METARs) for named airports, or survey every reporting station inside a geographic area. 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. Requires either station_ids (1–10 ICAO IDs, e.g., KSEA, KJFK, K0S9) or bbox (area survey) — not both. station_ids returns every observation inside the hours window; bbox returns the latest observation per station in the box, with flight_category keeping only the stations in the categories named (e.g., IFR and LIFR) and limit bounding how many stations come back. Use aviation_find_stations to resolve or verify an ICAO ID, or to discover nearby stations.

ParametersJSON Schema
NameRequiredDescriptionDefault
bboxNoGeographic bounding box for an area observation survey.
hoursNoLookback window in hours (1–12), not a row limit. With station_ids 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, so budget rows by the station reporting interval, never one per station. With bbox the result is reduced to the latest observation per station, but the window still shapes the draw the upstream row cap applies to — a wide window spends that cap on repeat readings from busy stations instead of on more stations, so lower it before narrowing the box.
limitNoMaximum stations to return, applied after the draw is reduced to the latest observation per station, after any flight_category filter, and ordered by station ID ascending — so the same query with the same limit returns the same stations. It bounds the response without changing the area searched, which a smaller bbox would, and it keeps an alphabetical slice rather than a region or a condition. 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 mode; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every station in the box. Optional.
station_idsNoICAO station IDs to query. 1–10 stations per call, and every observation inside the hours window is returned for each. Supplying it alongside bbox is rejected — use bbox to ask about an area rather than a named set.
flight_categoryNoReturn only the stations whose flight category is one of these (e.g., ["IFR", "LIFR"] to find where conditions are poor). Applied in the tool after the draw is reduced to the latest observation per station and before limit, so it changes which stations come back, not what AWC draws or the upstream row cap. A station AWC could not rate (flight_category "unknown") never matches. Belongs to the bbox mode; supplying it alongside station_ids is rejected, since each named station already reports its own category. Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe upstream row maximum that was applied to the draw. Present only on a truncated result.
errorNoPresent when the call failed. Absent on success.
shownNoStations in this result, counted after the reduction to one observation per station, after any flight_category filter, and after any limit. Present only on a bbox survey.
noticeNoGuidance for whichever disclosures fired, in this order: the levers that narrow a truncated draw; what the flight_category filter kept of the stations surveyed, or that it emptied the result; what a requested limit withheld; and — on a survey of more than 40 stations from a call that set no limit — that limit bounds the response but keeps an alphabetical slice, not a region. Or, on a station_ids lookup, the station IDs that returned nothing. The survey statements share one notice and the text keeps them apart; the reconciliation cannot join them, since only bbox reaches the row cap or takes a filter or a limit, and only station_ids reconciles a request.
limitedNoTrue 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 station drawn is here. Present only when a bbox survey 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.
matchedNoStations the draw held before the limit selected from them — after the flight_category filter, where one was supplied. Present only on a limited result. Where the result is also truncated this counts the capped draw and not the box — the observations the cap dropped were never examined, so no count can include them.
missingNoRequested station IDs absent from the result. Absent when none are missing.
partialNoTrue 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. Present only on a station_ids lookup.
returnedNoDistinct 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. Present only on a station_ids lookup.
surveyedNoStations the survey reached — one per station, the latest observation of each — before the flight_category filter selected from them. Present only when a bbox survey supplied flight_category; the count after the filter is shown, or matched where a limit then withheld stations. Where the result is also truncated this counts the capped draw and not the box.
requestedNoStation IDs this call asked for, in the order given. Present only on a station_ids lookup — a bbox survey asks for an area, not a list.
truncatedNoTrue when the upstream draw hit the AWC row cap, so stations inside the box are missing from this result. False says the draw did not reach that cap, which a count alone cannot establish — the draw is reduced to one row per station, so the returned count sits far below the cap either way. It is not a completeness claim: AWC also thins a dense box by station priority, independently of the cap and with nothing in the response to mark it, so re-run over smaller quadrants and union the results when the box must be complete. Present only on a bbox survey.
observationsNoWeather observations. With station_ids, one per station/time pair — multiple entries per station when the hours window holds more than one observation. With bbox, one per station: the latest observation inside that window.
upstreamRowsNoObservations AWC returned before the reduction to one row per station. Present only on a truncated draw the reduction then narrowed, where the station count sits below the cap and so cannot reveal the truncation on its own.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover readOnly, idempotent, and openWorld hints, and the description adds substantial context on top: station_ids returns every observation in the window while bbox returns the latest per station, flight_category filtering order, limit's alphabetical-slice semantics, and the hours window interplay with station reporting intervals (half-hourly stations yield two rows, SPECI adds more). This far exceeds what annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long and dense, but every sentence earns its place given the tool's complexity (two modes, subtle ordering semantics, caps). It is well-structured: purpose and returns up front, then mode behavior, then sibling routing. Slightly heavy, but justified for this parameter count and interaction depth.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not detail return shape, though it still summarizes the decoded fields and flight category. For a 5-param tool with two modes and intricate interaction rules, the description covers mutual exclusivity, filter ordering, limits, hours, and sibling routing comprehensively. Minor omissions are acceptable given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema descriptions are themselves unusually rich (they explain limit ordering, filter application order, mutual exclusivity, and the hours window). The description adds synthesizing value — the mode-level distinction and the row-budgeting warning — but much of the per-parameter meaning is already in the schema, so the incremental contribution is moderate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get), resource (METAR weather observations), and two distinct operational modes (named airports vs. area survey). The description also enumerates the exact decoded fields returned and names the sibling tool (aviation_find_stations) it is not, making it unmistakably distinct from the other aviation_* siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Use aviation_find_stations to resolve or verify an ICAO ID, or to discover nearby stations.' It also spells out when to pick bbox vs. station_ids, the mutual exclusivity, and which mode's semantics apply (per-station latest vs. every observation), leaving no ambiguity about selection.

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)A
Read-onlyIdempotent
Inspect

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, outside air temperature, wind aloft, flight weather, 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bboxNoGeographic bounding box for area PIREP search.
hoursNoHow many hours of history to return. Default 3.
limitNoMaximum 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_idNoICAO station ID as center point for radial search — 4 uppercase letters or digits (e.g., KSEA, K0S9). Use with distance_nm.
distance_nmNoSearch 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_intensityNoReturn 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_ftNoFilter by maximum altitude in feet MSL (e.g., 35000 for FL350), from 0 to 60000 ft — AWC searches no band below sea level, and none centred above FL600, which is already above the altitude any pilot report carries. 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_ftNoFilter by minimum altitude in feet MSL (e.g., 18000 for FL180), from 0 to 60000 ft — AWC searches no band below sea level, and none centred above FL600, which is already above the altitude any pilot report carries. 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

ParametersJSON Schema
NameRequiredDescription
capNoThe upstream row maximum that was applied to the page. Present only on a truncated result.
errorNoPresent when the call failed. Absent on success.
shownNoReports in this result, counted after any altitude filter and after any limit.
noticeNoGuidance for whichever disclosures fired: the levers that narrow the query before the cap applies, what a requested limit withheld, and — on a result of more than 50 reports from a call that set no limit — that limit bounds the response without changing what is searched, keeping the most recent. The cap and either limit statement can fire on one result, and the text keeps them apart.
pirepsNoPilot reports matching the search criteria, ordered by observation time descending.
limitedNoTrue 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.
matchedNoReports 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.
truncatedNoTrue 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.
upstreamRowsNoReports 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

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnly/openWorld/idempotent, and the description does not contradict them. It adds non-obvious behavioral details: limit is applied last after recency ordering, min_intensity filters reports rather than layers, and absence of reports does not imply smooth conditions. These go well beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Compact but information-dense; front-loads purpose, then covers return contents, parameter constraints, limit behavior, and data caveats in logical order. No filler, repetition, or restatement of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all non-obvious selection constraints, output contents, and real-world caveats. Since an output schema exists, return format need not be duplicated. The only unmentioned parameter, hours, is fully documented in the schema with a default, so nothing necessary is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds essential inter-parameter semantics: altitude_min_ft must not exceed altitude_max_ft, distance_nm with bbox is rejected, min_intensity selects reports not layers, and limit preserves recency without changing the search. This substantially enriches the raw schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('recent Pilot Reports (PIREPs)') with geographic scope ('near an airport or within a bounding box'). The resource type is unique among sibling tools like aviation_get_metar and aviation_get_taf, so an agent can immediately distinguish it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit conditional usage rules: 'Requires either station_id or bbox — not both' and 'distance_nm belongs to the station_id search only.' Adds a coverage caveat about US-centric sparse PIREPs that informs interpretation, though it does not explicitly name alternative tools or when-not-to-use conditions.

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)A
Read-onlyIdempotent
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
station_idsYesICAO station IDs to query. 1–4 stations per call.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery 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.
missingNoRequested station IDs absent from the result. Absent when none are missing.
partialNoTrue 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.
returnedNoDistinct station IDs that produced a forecast.
forecastsNoTAF forecasts, one per requested station.
requestedNoStation IDs this call asked for, in the order given.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds valuable behavioral context: TAFs are only issued for airports with scheduled commercial service, coverage is 24–30 hours, and availability should be verified via aviation_find_stations. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then lists outputs, then operational constraints and input format. Every sentence carries useful information without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the single parameter is fully described in the schema, the description supplies the remaining operational context: TAF availability, coverage window, and how to confirm station support. Nothing essential is missing for an agent to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with station_ids already documented as 4-character ICAO codes, 1–4 items, and examples. The description restates the 1–4 limit and examples but does not add meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') with a clear resource ('Terminal Aerodrome Forecast') and spells out the returned content: valid times, wind, visibility, weather conditions, cloud layers, and raw TAF string. It also references aviation_find_stations, helping distinguish this tool from sibling tools like aviation_get_metar or aviation_get_advisories.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states when to use the tool (for TAF forecasts covering the next 24–30 hours) and explicitly directs users to aviation_find_stations to confirm TAF availability. It does not explicitly contrast with alternatives like METAR for current conditions, so it stops short of full when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updates
    • Changedaviation_find_stations2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: None of the requested IDs match any known station, or the bbox or state search found none. `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."
      • changedOutput schema / properties / notice / description
        Previous 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."New value: +"Guidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, that limit bounds the response without changing the area searched (on a bbox or state result of more than 130 stations from a call that set no limit), or the cause and fix for identifiers that resolved to nothing. The cap and either limit statement can 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 take a limit, and only station_ids reconciles a request."
    • Changedaviation_get_metar8 fields changed
      • addedInput schema / properties / flight_category
        Added value: +{
        +  "description": "Return only the stations whose flight category is one of these (e.g., [\"IFR\", \"LIFR\"] to find where conditions are poor). Applied in the tool after the draw is reduced to the latest observation per station and before limit, so it changes which stations come back, not what AWC draws or the upstream row cap. A station AWC could not rate (flight_category \"unknown\") never matches. Belongs to the bbox mode; supplying it alongside station_ids is rejected, since each named station already reports its own category. Optional.",
        +  "items": {
        +    "description": "A flight category: VFR, MVFR, IFR, or LIFR.",
        +    "enum": [
        +      "VFR",
        +      "MVFR",
        +      "IFR",
        +      "LIFR"
        +    ],
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum stations to return, applied after the draw is reduced to the latest observation per station and ordered by station ID ascending — so the same query with the same limit returns the same stations. It bounds the response without changing the area searched, which a smaller bbox 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 mode; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every station in the box. Optional."New value: +"Maximum stations to return, applied after the draw is reduced to the latest observation per station, after any flight_category filter, and ordered by station ID ascending — so the same query with the same limit returns the same stations. It bounds the response without changing the area searched, which a smaller bbox would, and it keeps an alphabetical slice rather than a region or a condition. 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 mode; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every station in the box. Optional."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_stations_found`: No station returned METAR data — none of the requested IDs, or no station inside the bounding box. `missing_location`: Neither station_ids nor bbox was provided. `conflicting_location`: Both station_ids and bbox were provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_stations_found`: No station returned METAR data — none of the requested IDs, or no station inside the bounding box. `missing_location`: Neither station_ids nor bbox was provided. `conflicting_location`: Both station_ids and bbox were provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. `conflicting_flight_category`: flight_category was provided together with station_ids, where the caller has already named the set. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_stations_found",
        -  "missing_location",
        -  "conflicting_location",
        -  "invalid_bbox",
        -  "conflicting_limit"
        -]New value: +[
        +  "no_stations_found",
        +  "missing_location",
        +  "conflicting_location",
        +  "invalid_bbox",
        +  "conflicting_limit",
        +  "conflicting_flight_category"
        +]
      • changedOutput schema / properties / matched / description
        Previous value: -"Stations the draw held 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 box — the observations the cap dropped were never examined, so no count can include them."New value: +"Stations the draw held before the limit selected from them — after the flight_category filter, where one was supplied. Present only on a limited result. Where the result is also truncated this counts the capped draw and not the box — the observations the cap dropped were never examined, so no count can include them."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance for whichever disclosures fired: the levers that narrow a truncated draw, what a requested limit withheld, or the station IDs that returned 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 reaches the row cap or accepts a limit, and only station_ids reconciles a request."New value: +"Guidance for whichever disclosures fired, in this order: the levers that narrow a truncated draw; what the flight_category filter kept of the stations surveyed, or that it emptied the result; what a requested limit withheld; and — on a survey of more than 40 stations from a call that set no limit — that limit bounds the response but keeps an alphabetical slice, not a region. Or, on a station_ids lookup, the station IDs that returned nothing. The survey statements share one notice and the text keeps them apart; the reconciliation cannot join them, since only bbox reaches the row cap or takes a filter or a limit, and only station_ids reconciles a request."
      • changedOutput schema / properties / shown / description
        Previous value: -"Stations in this result, counted after the reduction to one observation per station and after any limit. Present only on a bbox survey."New value: +"Stations in this result, counted after the reduction to one observation per station, after any flight_category filter, and after any limit. Present only on a bbox survey."
      • addedOutput schema / properties / surveyed
        Added value: +{
        +  "description": "Stations the survey reached — one per station, the latest observation of each — before the flight_category filter selected from them. Present only when a bbox survey supplied flight_category; the count after the filter is shown, or matched where a limit then withheld stations. Where the result is also truncated this counts the capped draw and not the box.",
        +  "type": "number"
        +}
    • Changedaviation_get_pireps7 fields changed
      • changedOutput schema / properties / notice / description
        Previous 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."New value: +"Guidance for whichever disclosures fired: the levers that narrow the query before the cap applies, what a requested limit withheld, and — on a result of more than 50 reports from a call that set no limit — that limit bounds the response without changing what is searched, keeping the most recent. The cap and either limit statement can fire on one result, and the text keeps them apart."
      • changedOutput schema / properties / pireps / items / properties / clouds / anyOf
        Previous 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"
        -  }
        -]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. SKC and CLR state a clear sky and never carry a base or top. 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"
        +  }
        +]
      • removedOutput schema / properties / pireps / items / properties / remarks
        Removed value: -{
        -  "description": "Weather remarks or additional conditions, or null if none.",
        -  "type": [
        -    "string",
        -    "null"
        -  ]
        -}
      • addedOutput schema / properties / pireps / items / properties / temp_c
        Added value: +{
        +  "description": "Outside air temperature in degrees Celsius at the report altitude, as AWC decoded it — the /TA group on a PIREP, the MS or PS temperature group on an AIREP. 0 is a real reading; null means the report carried none or gave it as unknown (/TA UNKN).",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / pireps / items / properties / weather
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "decoded": {
        +          "description": "Plain-English reading of each group, joined with \"; \" (e.g., \"heavy rain\", \"fog; light rain\"). A group the decoder does not recognize is carried through as its own raw token, so compare against raw when a reading still looks coded.",
        +          "type": "string"
        +        },
        +        "raw": {
        +          "description": "Weather groups exactly as encoded, space-delimited (e.g., \"+RA\", \"FG -RA\").",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "raw",
        +        "decoded"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Flight weather AWC decoded from the /WX group, or null when it decoded no weather phenomena from it. A flight visibility AWC can read (FV07SM, 10SM) lands in visibility_sm instead. /WX text AWC cannot decode is dropped or trimmed — CEILING 017 returns null and RA FL300 AOB returns RA alone — so raw_pirep is the only source for it. This is not the /RM remarks text, which AWC does not decode either — raw_pirep carries it."
        +}
      • addedOutput schema / properties / pireps / items / properties / wind
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "direction_deg": {
        +          "description": "Wind direction aloft in degrees, as reported and not converted. A PIREP /WV group is referenced to magnetic north (AIM TBL 7-1-18), unlike the true-north METAR and TAF winds, so apply the local magnetic variation before combining a PIREP's direction with a true track; an AIREP's reference is not stated here.",
        +          "type": "number"
        +        },
        +        "speed_kt": {
        +          "description": "Wind speed aloft in knots. 0 is a reported calm.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "direction_deg",
        +        "speed_kt"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Wind aloft at the report altitude, as AWC decoded it — the /WV group on a PIREP, the direction/speed group (e.g., 291/035KT) on an AIREP. Null unless AWC decoded both direction and speed. AWC leaves some forms undecoded — a gust suffix (/WV 03020G30), a single-digit AIREP speed (252/9 KT), a variation (/WV +/- 5KT) — and those return null here, with raw_pirep as the only source."
        +}
      • changedOutput schema / properties / pireps / items / required
        Previous value: -[
        -  "observed_at",
        -  "lat",
        -  "lon",
        -  "altitude_ft",
        -  "aircraft_type",
        -  "pirep_type",
        -  "turbulence",
        -  "icing",
        -  "clouds",
        -  "visibility_sm",
        -  "remarks",
        -  "raw_pirep"
        -]New value: +[
        +  "observed_at",
        +  "lat",
        +  "lon",
        +  "altitude_ft",
        +  "aircraft_type",
        +  "pirep_type",
        +  "turbulence",
        +  "icing",
        +  "clouds",
        +  "visibility_sm",
        +  "temp_c",
        +  "wind",
        +  "weather",
        +  "raw_pirep"
        +]
  2. 4 tool updates
    • Changedaviation_find_stations2 fields changed
      • changedInput schema / properties / station_ids / description
        Previous 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."New value: +"One or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-character ICAO ID for an airport (e.g., KSEA, K0S9), 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."
      • changedOutput schema / properties / stations / items / properties / icao_id / description
        Previous value: -"ICAO 4-letter station ID, or null if not assigned."New value: +"ICAO station ID, 4 uppercase letters or digits (e.g., KSEA, K0S9), or null if not assigned."
    • Changedaviation_get_metar24 fields changed
      • addedInput schema / properties / bbox
        Added value: +{
        +  "description": "Geographic bounding box for an area observation survey.",
        +  "properties": {
        +    "maxLat": {
        +      "description": "Northern boundary latitude in decimal degrees.",
        +      "maximum": 90,
        +      "minimum": -90,
        +      "type": "number"
        +    },
        +    "maxLon": {
        +      "description": "Eastern boundary longitude in decimal degrees.",
        +      "maximum": 180,
        +      "minimum": -180,
        +      "type": "number"
        +    },
        +    "minLat": {
        +      "description": "Southern boundary latitude in decimal degrees.",
        +      "maximum": 90,
        +      "minimum": -90,
        +      "type": "number"
        +    },
        +    "minLon": {
        +      "description": "Western boundary longitude in decimal degrees.",
        +      "maximum": 180,
        +      "minimum": -180,
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "minLat",
        +    "minLon",
        +    "maxLat",
        +    "maxLon"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / properties / hours / description
        Previous 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."New value: +"Lookback window in hours (1–12), not a row limit. With station_ids 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, so budget rows by the station reporting interval, never one per station. With bbox the result is reduced to the latest observation per station, but the window still shapes the draw the upstream row cap applies to — a wide window spends that cap on repeat readings from busy stations instead of on more stations, so lower it before narrowing the box."
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Maximum stations to return, applied after the draw is reduced to the latest observation per station and ordered by station ID ascending — so the same query with the same limit returns the same stations. It bounds the response without changing the area searched, which a smaller bbox 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 mode; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every station in the box. Optional.",
        +  "maximum": 400,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / station_ids / description
        Previous value: -"ICAO station IDs to query. 1–10 stations per call."New value: +"ICAO station IDs to query. 1–10 stations per call, and every observation inside the hours window is returned for each. Supplying it alongside bbox is rejected — use bbox to ask about an area rather than a named set."
      • changedInput schema / properties / station_ids / items / description
        Previous value: -"4-letter ICAO station ID (e.g., KSEA, KJFK)."New value: +"ICAO station ID: 4 uppercase letters or digits (e.g., KSEA, KJFK, K0S9)."
      • changedInput schema / properties / station_ids / items / pattern
        Previous value: -"^[A-Z]{4}$"New value: +"^[A-Z0-9]{4}$"
      • removedInput schema / required
        Removed value: -[
        -  "station_ids"
        -]
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "observations",
        -      "requested",
        -      "returned",
        -      "partial"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "observations"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The upstream row maximum that was applied to the draw. Present only on a truncated result.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"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."New value: +"Machine-readable failure mode. Declared by this tool: `no_stations_found`: No station returned METAR data — none of the requested IDs, or no station inside the bounding box. `missing_location`: Neither station_ids nor bbox was provided. `conflicting_location`: Both station_ids and bbox were provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_stations_found"
        -]New value: +[
        +  "no_stations_found",
        +  "missing_location",
        +  "conflicting_location",
        +  "invalid_bbox",
        +  "conflicting_limit"
        +]
      • addedOutput schema / properties / limited
        Added 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 station drawn is here. Present only when a bbox survey 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"
        +}
      • addedOutput schema / properties / matched
        Added value: +{
        +  "description": "Stations the draw held 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 box — the observations the cap dropped were never examined, so no count can include them.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"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."New value: +"Guidance for whichever disclosures fired: the levers that narrow a truncated draw, what a requested limit withheld, or the station IDs that returned 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 reaches the row cap or accepts a limit, and only station_ids reconciles a request."
      • changedOutput schema / properties / observations / description
        Previous value: -"Weather observations, one per station/time pair. Multiple entries per station when hours > 1."New value: +"Weather observations. With station_ids, one per station/time pair — multiple entries per station when the hours window holds more than one observation. With bbox, one per station: the latest observation inside that window."
      • changedOutput schema / properties / observations / items / properties / clouds / description
        Previous 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."New value: +"Cloud layers from lowest to highest, as AWC decoded them — at most four, so a fifth or higher reported layer is left out with no marker and raw_metar is the complete source. 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."
      • changedOutput schema / properties / observations / items / properties / station_id / description
        Previous value: -"ICAO 4-letter station identifier (e.g., KSEA)."New value: +"ICAO station identifier, 4 uppercase letters or digits (e.g., KSEA, K0S9)."
      • changedOutput schema / properties / observations / items / properties / wind / properties / direction_deg / description
        Previous value: -"Wind direction in degrees true. Null when variable."New value: +"Wind direction in degrees true. Null when the observation reported a variable wind (VRB), and also when it carried no wind group at all — speed_kt is a number in the first case and null in the second."
      • changedOutput schema / properties / partial / description
        Previous value: -"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."New value: +"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. Present only on a station_ids lookup."
      • changedOutput schema / properties / requested / description
        Previous value: -"Station IDs this call asked for, in the order given."New value: +"Station IDs this call asked for, in the order given. Present only on a station_ids lookup — a bbox survey asks for an area, not a list."
      • changedOutput schema / properties / returned / description
        Previous value: -"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."New value: +"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. Present only on a station_ids lookup."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Stations in this result, counted after the reduction to one observation per station and after any limit. Present only on a bbox survey.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the upstream draw hit the AWC row cap, so stations inside the box are missing from this result. False says the draw did not reach that cap, which a count alone cannot establish — the draw is reduced to one row per station, so the returned count sits far below the cap either way. It is not a completeness claim: AWC also thins a dense box by station priority, independently of the cap and with nothing in the response to mark it, so re-run over smaller quadrants and union the results when the box must be complete. Present only on a bbox survey.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / upstreamRows
        Added value: +{
        +  "description": "Observations AWC returned before the reduction to one row per station. Present only on a truncated draw the reduction then narrowed, where the station count sits below the cap and so cannot reveal the truncation on its own.",
        +  "type": "number"
        +}
    • Changedaviation_get_pireps10 fields changed
      • changedInput schema / properties / altitude_max_ft / description
        Previous 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."New value: +"Filter by maximum altitude in feet MSL (e.g., 35000 for FL350), from 0 to 60000 ft — AWC searches no band below sea level, and none centred above FL600, which is already above the altitude any pilot report carries. Reports with an unknown altitude (altitude_ft null) cannot be shown to satisfy a bound and are dropped whenever either bound is set. Optional."
      • changedInput schema / properties / altitude_max_ft / maximum
        Previous value: -9007199254740991New value: +60000
      • changedInput schema / properties / altitude_max_ft / minimum
        Previous value: --9007199254740991New value: +0
      • changedInput schema / properties / altitude_min_ft / description
        Previous 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."New value: +"Filter by minimum altitude in feet MSL (e.g., 18000 for FL180), from 0 to 60000 ft — AWC searches no band below sea level, and none centred above FL600, which is already above the altitude any pilot report carries. Reports with an unknown altitude (altitude_ft null) cannot be shown to satisfy a bound and are dropped whenever either bound is set. Optional."
      • changedInput schema / properties / altitude_min_ft / maximum
        Previous value: -9007199254740991New value: +60000
      • changedInput schema / properties / altitude_min_ft / minimum
        Previous value: --9007199254740991New value: +0
      • changedInput schema / properties / station_id / description
        Previous value: -"ICAO station ID as center point for radial search (e.g., KSEA). Use with distance_nm."New value: +"ICAO station ID as center point for radial search — 4 uppercase letters or digits (e.g., KSEA, K0S9). Use with distance_nm."
      • changedInput schema / properties / station_id / pattern
        Previous value: -"^[A-Z]{4}$"New value: +"^[A-Z0-9]{4}$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"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."New value: +"Machine-readable failure mode. Declared by this tool: `no_pireps_found`: No pilot reports found in the search area and time window. `station_not_recognized`: AWC does not recognize station_id as a PIREP search center — a closed or retired airport, for example — and rejects the request. `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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_pireps_found",
        -  "missing_location",
        -  "conflicting_location",
        -  "invalid_bbox",
        -  "conflicting_distance",
        -  "invalid_altitude_range"
        -]New value: +[
        +  "no_pireps_found",
        +  "station_not_recognized",
        +  "missing_location",
        +  "conflicting_location",
        +  "invalid_bbox",
        +  "conflicting_distance",
        +  "invalid_altitude_range"
        +]
    • Changedaviation_get_taf6 fields changed
      • changedInput schema / properties / station_ids / items / description
        Previous value: -"4-letter ICAO station ID (e.g., KSEA, KJFK)."New value: +"ICAO station ID: 4 uppercase letters or digits (e.g., KSEA, KJFK, K36U)."
      • changedInput schema / properties / station_ids / items / pattern
        Previous value: -"^[A-Z]{4}$"New value: +"^[A-Z0-9]{4}$"
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / description
        Previous 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."New value: +"Forecast cloud layers for this period, as AWC decoded them — at most three, so a further layer is left out of this array and its text surfaces in not_decoded, with raw_taf the complete source. 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."
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / not_decoded
        Added value: +{
        +  "description": "Text AWC attached to this period without decoding it, trimmed — usually a cloud layer past the three-layer decode limit, sometimes another group such as VV///. Null when nothing was left undecoded. Non-null marks a partial decode. Upstream can attach the leftover of one group, such as a TEMPO, to the period after it, so the text is published on the period it arrived on and never reassigned or parsed into clouds; raw_taf is the complete forecast.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / required
        Previous value: -[
        -  "from",
        -  "to",
        -  "change_type",
        -  "probability",
        -  "wind",
        -  "wind_shear",
        -  "visibility_sm",
        -  "vertical_visibility_ft",
        -  "weather",
        -  "clouds",
        -  "sky_condition"
        -]New value: +[
        +  "from",
        +  "to",
        +  "change_type",
        +  "probability",
        +  "wind",
        +  "wind_shear",
        +  "visibility_sm",
        +  "vertical_visibility_ft",
        +  "weather",
        +  "clouds",
        +  "sky_condition",
        +  "not_decoded"
        +]
      • changedOutput schema / properties / forecasts / items / properties / station_id / description
        Previous value: -"ICAO 4-letter station identifier (e.g., KSEA)."New value: +"ICAO station identifier, 4 uppercase letters or digits (e.g., KSEA, K36U)."
  3. 2 tool updates
    • Changedaviation_find_stations10 fields changed
      • addedInput schema / properties / limit
        Added 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"
        +}
      • changedInput schema / properties / station_ids / description
        Previous 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."
      • changedInput schema / properties / station_ids / items / description
        Previous value: -"A 4-letter ICAO station identifier (e.g., KSEA)."New value: +"One station identifier (e.g., KSEA)."
      • addedInput schema / properties / station_ids / items / pattern
        Added value: +"\\S"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • addedOutput schema / properties / limited
        Added 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"
        +}
      • addedOutput schema / properties / matched
        Added 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"
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / shown / description
        Previous 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."
    • Changedaviation_get_pireps5 fields changed
      • addedInput schema / properties / limit
        Added 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"
        +}
      • addedOutput schema / properties / limited
        Added 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"
        +}
      • addedOutput schema / properties / matched
        Added 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"
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / shown / description
        Previous 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."
  4. 1 tool update
    • Changedaviation_get_advisories2 fields changed
      • changedInput schema / properties / hazard / description
        Previous 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."
      • addedOutput schema / properties / notice
        Added 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"
        +}
  5. 3 tool updates
    • Changedaviation_find_stations5 fields changed
      • addedOutput schema / properties / missing
        Added 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"
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • addedOutput schema / properties / partial
        Added 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"
        +}
      • addedOutput schema / properties / requested
        Added 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"
        +}
      • addedOutput schema / properties / returned
        Added 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"
        +}
    • Changedaviation_get_metar6 fields changed
      • changedInput schema / properties / hours / description
        Previous 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."
      • changedOutput schema / properties / observations / items / properties / ceiling_ft / description
        Previous 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."
      • changedOutput schema / properties / observations / items / properties / clouds / description
        Previous 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."
      • addedOutput schema / properties / observations / items / properties / sky_condition
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / observations / items / properties / visibility_sm / description
        Previous 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."
      • changedOutput schema / properties / observations / items / required
        Previous 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"
        +]
    • Changedaviation_get_taf4 fields changed
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / change_type / description
        Previous 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."
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / description
        Previous 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."
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / sky_condition
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / required
        Previous 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"
        +]
  6. 5 tool updates
    • Changedaviation_find_stations8 fields changed
      • removedOutput schema / properties / stations / items / properties / elevation_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / stations / items / properties / elevation_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / stations / items / properties / faa_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / stations / items / properties / faa_id / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / stations / items / properties / iata_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / stations / items / properties / iata_id / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / stations / items / properties / icao_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / stations / items / properties / icao_id / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedaviation_get_advisories7 fields changed
      • removedOutput schema / properties / advisories / items / properties / altitude_high_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / advisories / items / properties / altitude_high_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / advisories / items / properties / altitude_low_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / advisories / items / properties / altitude_low_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • changedOutput schema / properties / advisories / items / properties / movement / anyOf
        Previous 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"
        +  }
        +]
      • removedOutput schema / properties / advisories / items / properties / severity / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / advisories / items / properties / severity / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedaviation_get_metar14 fields changed
      • removedOutput schema / properties / observations / items / properties / altimeter_inhg / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / observations / items / properties / altimeter_inhg / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / observations / items / properties / ceiling_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / observations / items / properties / ceiling_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / observations / items / properties / dewpoint_c / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / observations / items / properties / dewpoint_c / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / observations / items / properties / temp_c / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / observations / items / properties / temp_c / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / observations / items / properties / wind / properties / direction_deg / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / observations / items / properties / wind / properties / direction_deg / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / observations / items / properties / wind / properties / gust_kt / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / observations / items / properties / wind / properties / gust_kt / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / observations / items / properties / wind / properties / speed_kt / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / observations / items / properties / wind / properties / speed_kt / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedaviation_get_pireps26 fields changed
      • addedInput schema / properties / min_intensity
        Added 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"
        +}
      • removedOutput schema / properties / pireps / items / properties / aircraft_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / aircraft_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / pireps / items / properties / altitude_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedOutput schema / properties / pireps / items / properties / altitude_ft / description
        Previous 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."
      • addedOutput schema / properties / pireps / items / properties / altitude_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • changedOutput schema / properties / pireps / items / properties / clouds / anyOf
        Previous 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"
        +  }
        +]
      • changedOutput schema / properties / pireps / items / properties / icing / description
        Previous 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."
      • removedOutput schema / properties / pireps / items / properties / icing / items / properties / base_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / icing / items / properties / base_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / pireps / items / properties / icing / items / properties / top_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / icing / items / properties / top_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / pireps / items / properties / icing / items / properties / type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / icing / items / properties / type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / pireps / items / properties / remarks / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / remarks / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / pireps / items / properties / turbulence / items / properties / base_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / turbulence / items / properties / base_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / pireps / items / properties / turbulence / items / properties / frequency / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / turbulence / items / properties / frequency / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / pireps / items / properties / turbulence / items / properties / top_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / turbulence / items / properties / top_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / pireps / items / properties / turbulence / items / properties / type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / turbulence / items / properties / type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / pireps / items / properties / visibility_sm / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pireps / items / properties / visibility_sm / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedaviation_get_taf16 fields changed
      • removedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / change_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / change_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / probability / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / probability / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / vertical_visibility_ft / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / vertical_visibility_ft / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / visibility_sm / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / visibility_sm / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / direction_deg / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / direction_deg / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / gust_kt / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / gust_kt / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / type
        Added value: +[
        +  "number",
        +  "null"
        +]
  7. 5 tool updates
    • Changedaviation_find_stations6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "stations",
        +      "truncated",
        +      "shown"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "stations",
        -  "truncated",
        -  "shown"
        -]
    • Changedaviation_get_advisories6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "advisories"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "advisories"
        -]
    • Changedaviation_get_metar6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "observations",
        +      "requested",
        +      "returned",
        +      "partial"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "observations",
        -  "requested",
        -  "returned",
        -  "partial"
        -]
    • Changedaviation_get_pireps6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "pireps",
        +      "truncated",
        +      "shown"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "pireps",
        -  "truncated",
        -  "shown"
        -]
    • Changedaviation_get_taf6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "forecasts",
        +      "requested",
        +      "returned",
        +      "partial"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "forecasts",
        -  "requested",
        -  "returned",
        -  "partial"
        -]
  8. 3 tool updates
    • Changedaviation_find_stations6 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The upstream row maximum that was applied to the draw. Present only on a truncated result.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance naming the lever that narrows the draw. Present only on a truncated result.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Stations in this result, counted after any client-side state filter.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added 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"
        +}
      • addedOutput schema / properties / upstreamRows
        Added 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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "stations"
        -]New value: +[
        +  "stations",
        +  "truncated",
        +  "shown"
        +]
    • Changedaviation_get_advisories7 fields changed
      • changedInput schema / properties / advisory_type / description
        Previous 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."
      • changedInput schema / properties / hazard / description
        Previous 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."
      • changedOutput schema / properties / advisories / items / description
        Previous value: -"An active SIGMET or AIRMET advisory."New value: +"An active SIGMET advisory."
      • changedOutput schema / properties / advisories / items / properties / advisory_type / description
        Previous value: -"Advisory type: SIGMET or AIRMET."New value: +"Advisory type as issued. The domestic SIGMET feed this tool reads emits SIGMET."
      • changedOutput schema / properties / advisories / items / properties / hazard / description
        Previous value: -"Hazard type (e.g., CONVECTIVE, TURBULENCE, ICING, IFR, MTN OBSCN)."New value: +"Hazard type — one of CONVECTIVE, TURBULENCE, ICING, or IFR."
      • changedOutput schema / properties / advisories / items / properties / raw_text / description
        Previous 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."
      • changedOutput schema / properties / advisories / items / properties / severity / description
        Previous 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."
    • Changedaviation_get_pireps6 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The upstream row maximum that was applied to the page. Present only on a truncated result.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance naming the levers that narrow the query before the cap applies. Present only on a truncated result.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Reports in this result, counted after any altitude filter.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added 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"
        +}
      • addedOutput schema / properties / upstreamRows
        Added 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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "pireps"
        -]New value: +[
        +  "pireps",
        +  "truncated",
        +  "shown"
        +]
  9. 2 tool updates
    • Changedaviation_get_metar8 fields changed
      • addedOutput schema / properties / missing
        Added 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"
        +}
      • addedOutput schema / properties / notice
        Added 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"
        +}
      • changedOutput schema / properties / observations / items / properties / ceiling_ft / description
        Previous 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."
      • changedOutput schema / properties / observations / items / properties / present_weather / anyOf
        Previous 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"
        +  }
        +]
      • addedOutput schema / properties / partial
        Added 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"
        +}
      • addedOutput schema / properties / requested
        Added value: +{
        +  "description": "Station IDs this call asked for, in the order given.",
        +  "items": {
        +    "description": "An ICAO station ID as requested.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / returned
        Added 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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "observations"
        -]New value: +[
        +  "observations",
        +  "requested",
        +  "returned",
        +  "partial"
        +]
    • Changedaviation_get_taf15 fields changed
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / base_ft / description
        Previous 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."
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / cover / description
        Previous 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."
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / type / description
        Previous 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."
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / vertical_visibility_ft
        Added 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."
        +}
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / weather / anyOf
        Previous 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"
        +  }
        +]
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / weather / description
        Previous 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."
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / description
        Previous value: -"Forecast wind conditions for this period."New value: +"Forecast wind conditions at the surface for this period."
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind_shear
        Added 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."
        +}
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / required
        Previous 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"
        +]
      • addedOutput schema / properties / missing
        Added 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"
        +}
      • addedOutput schema / properties / notice
        Added 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"
        +}
      • addedOutput schema / properties / partial
        Added 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"
        +}
      • addedOutput schema / properties / requested
        Added value: +{
        +  "description": "Station IDs this call asked for, in the order given.",
        +  "items": {
        +    "description": "An ICAO station ID as requested.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / returned
        Added value: +{
        +  "description": "Distinct station IDs that produced a forecast.",
        +  "items": {
        +    "description": "An ICAO station ID present in the result.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "forecasts"
        -]New value: +[
        +  "forecasts",
        +  "requested",
        +  "returned",
        +  "partial"
        +]
  10. 4 tool updates
    • Changedaviation_find_stations3 fields changed
      • addedOutput schema / properties / stations / items / properties / elevation_ft / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / stations / items / properties / elevation_ft / description
        Previous 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."
      • removedOutput schema / properties / stations / items / properties / elevation_ft / type
        Removed value: -"number"
    • Changedaviation_get_metar18 fields changed
      • addedOutput schema / properties / observations / items / properties / altimeter_inhg / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / observations / items / properties / altimeter_inhg / description
        Previous 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)."
      • removedOutput schema / properties / observations / items / properties / altimeter_inhg / type
        Removed value: -"number"
      • changedOutput schema / properties / observations / items / properties / ceiling_ft / description
        Previous 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."
      • addedOutput schema / properties / observations / items / properties / ceiling_type
        Added 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."
        +}
      • changedOutput schema / properties / observations / items / properties / clouds / items / properties / base_ft / description
        Previous value: -"Cloud base altitude in feet MSL."New value: +"Cloud base altitude in feet AGL."
      • changedOutput schema / properties / observations / items / properties / clouds / items / properties / cover / description
        Previous 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."
      • addedOutput schema / properties / observations / items / properties / dewpoint_c / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / observations / items / properties / dewpoint_c / description
        Previous 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."
      • removedOutput schema / properties / observations / items / properties / dewpoint_c / type
        Removed value: -"number"
      • addedOutput schema / properties / observations / items / properties / present_weather
        Added 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)."
        +}
      • addedOutput schema / properties / observations / items / properties / temp_c / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / observations / items / properties / temp_c / description
        Previous 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."
      • removedOutput schema / properties / observations / items / properties / temp_c / type
        Removed value: -"number"
      • addedOutput schema / properties / observations / items / properties / wind / properties / speed_kt / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / observations / items / properties / wind / properties / speed_kt / description
        Previous 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."
      • removedOutput schema / properties / observations / items / properties / wind / properties / speed_kt / type
        Removed value: -"number"
      • changedOutput schema / properties / observations / items / required
        Previous 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"
        +]
    • Changedaviation_get_pireps9 fields changed
      • changedInput schema / properties / altitude_max_ft / description
        Previous 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."
      • changedInput schema / properties / altitude_min_ft / description
        Previous 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."
      • addedOutput schema / properties / pireps / items / properties / altitude_ft / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / pireps / items / properties / altitude_ft / description
        Previous 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."
      • removedOutput schema / properties / pireps / items / properties / altitude_ft / type
        Removed value: -"number"
      • changedOutput schema / properties / pireps / items / properties / clouds / anyOf
        Previous 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"
        +  }
        +]
      • changedOutput schema / properties / pireps / items / properties / clouds / description
        Previous 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."
      • changedOutput schema / properties / pireps / items / properties / icing / description
        Previous 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."
      • changedOutput schema / properties / pireps / items / properties / turbulence / description
        Previous 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."
    • Changedaviation_get_taf5 fields changed
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / clouds / items / properties / base_ft / description
        Previous value: -"Cloud base altitude in feet MSL."New value: +"Cloud base altitude in feet AGL."
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / direction_deg / description
        Previous 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."
      • addedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / description
        Previous 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."
      • removedOutput schema / properties / forecasts / items / properties / forecast_periods / items / properties / wind / properties / speed_kt / type
        Removed value: -"number"
  11. 2 tool updates
    • Changedaviation_find_stations1 field changed
      • changedInput schema / properties / state / description
        Previous 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."
    • Changedaviation_get_pireps2 fields changed
      • removedInput schema / properties / distance_nm / default
        Removed value: -100
      • changedInput schema / properties / distance_nm / description
        Previous 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."
  12. 5 tool updates
    • First observedaviation_find_stations
    • First observedaviation_get_advisories
    • First observedaviation_get_metar
    • First observedaviation_get_pireps
    • First observedaviation_get_taf

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.