Skip to main content
Glama

Get METAR Weather Observations

aviation_get_metar
Read-onlyIdempotent

Get current weather observations (METARs) for one or more airports. Returns decoded fields — wind direction/speed/gusts, visibility, ceiling with its kind (measured, or indefinite for vertical visibility into an obscuration), present weather, temperature, dewpoint, altimeter, cloud layers — plus the computed flight category (VFR/MVFR/IFR/LIFR) and the raw METAR string. Accepts 1–10 ICAO station IDs (e.g., KSEA, KJFK). Use aviation_find_stations to resolve or verify an ICAO ID, or to discover nearby stations.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
hoursNoLookback window in hours (1–12), not a row limit: every observation inside the window is returned, so a station reporting more often than hourly yields more than one row per hour. At the default of 1, half-hourly stations return two observations and SPECI-issuing stations can return more. Budget rows by the station reporting interval, never one per station.
station_idsYesICAO station IDs to query. 1–10 stations per call.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
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 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.
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.
requestedNoStation IDs this call asked for, in the order given.
observationsNoWeather observations, one per station/time pair. Multiple entries per station when hours > 1.

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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"
      +]
  2. 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"
      +]
  3. 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"
      -]
  4. 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"
      +]
  5. 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"
      +]
  6. First observed

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context: the hours parameter is a lookback window not a row limit, and stations reporting more often can yield multiple rows. It doesn't describe pagination or rate limits, but the annotations plus this context are strong.

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

Conciseness5/5

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

The description is two sentences, front-loads the core purpose and return fields, and packs the critical usage caveat about hours into the schema description rather than bloating the main description. Every sentence earns its place.

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

Completeness5/5

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

Given the tool has an output schema, annotations covering safety, and 100% schema description coverage, the description is complete. It explains what is returned, how many stations are accepted, and how to resolve station IDs. An agent has everything needed to invoke it correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents both parameters well. The description adds meaning by explaining the hours lookback behavior (not a row limit) and the station_ids count range (1–10). This goes beyond the schema's field-level descriptions, so it earns above the baseline 3.

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

Purpose5/5

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

The description states a specific verb ('Get'), a clear resource ('current weather observations (METARs)'), and enumerates the decoded fields plus computed flight category and raw string. It also distinguishes itself from siblings by naming aviation_find_stations for resolving/verifying ICAO IDs, which helps an agent select this tool over alternatives.

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

Usage Guidelines5/5

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

The description explicitly says when to use this tool (get current METARs for 1–10 ICAO IDs) and when to use aviation_find_stations instead (resolve/verify an ICAO ID or discover nearby stations). It also clarifies the hours parameter is a lookback window, not a row limit, which is critical usage guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.