Skip to main content
Glama

Get METAR Weather Observations

aviation_get_metar
Read-onlyIdempotent

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.

Input Schema

TableJSON 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

TableJSON Schema
NameRequiredDescriptionDefault
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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema 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"
      +}
  2. Changed24 schema 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"
      +}
  3. Changed6 schema 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"
      +]
  4. Changed14 schema 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"
      +]
  5. Changed6 schema 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"
      -]
  6. Changed8 schema 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"
      +]
  7. Changed18 schema 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"
      +]
  8. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.