Skip to main content
Glama

Get Pilot Reports (PIREPs)

aviation_get_pireps
Read-onlyIdempotent

Get recent Pilot Reports (PIREPs) near an airport or within a bounding box. Returns decoded turbulence, icing, and cloud reports with altitude, aircraft type, intensity, and the raw PIREP string. Requires either station_id (ICAO center point for radial search, e.g., KSEA) or bbox (area search) — not both. distance_nm belongs to the station_id search only, and altitude_min_ft must not exceed altitude_max_ft. min_intensity restricts the result to reports carrying a turbulence or icing layer at that intensity or above. limit bounds how many reports come back without changing what is searched, keeping the most recent. Coverage is US-centric; PIREPs are sparse and absence of reports does not imply smooth conditions.

Input Schema

TableJSON 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 (e.g., KSEA). 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). 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). 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

TableJSON Schema
NameRequiredDescriptionDefault
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, and what a requested limit withheld. Both 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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema 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."
  2. Changed26 schema 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"
      +]
  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": [
      +      "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"
      -]
  4. Changed6 schema 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"
      +]
  5. Changed9 schema 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."
  6. Changed2 schema 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."
  7. First observed

TDQS

A4.7/5.0
Behavior4/5

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

No annotations were supplied, so the description carries the transparency burden. It discloses non-obvious behaviors—limit returns the most recent without changing the query, min_intensity filters whole reports rather than individual layers, and PIREPs absence does not indicate smooth conditions. However, it does not state the typical freshness window or how 'recent' is bounded.

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

Conciseness5/5

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

Every sentence adds information; the description moves from purpose, to returned fields, to parameter gating, to caveats. It stays under ~150 words while covering inputs, outputs, constraints, and data caveats without repetition or tangential detail.

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

Completeness4/5

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

The description covers what the tool does, what it returns, required parameter constraints, and a geographic/data caveat. It does not specify expected response format or default values for omitted parameters, but the core invocation semantics are sufficiently complete for agent use.

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

Parameters5/5

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

Each parameter's role beyond its name is clarified: station_id is an ICAO center for radial search, distance_nm only pairs with station_id, min_intensity filters turbulence/icing layers at or above a level, and altitude bounds are cross-constrained. It also explains limit operates post-search, which is not obvious from the parameter name.

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

Purpose5/5

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

The description opens with a precise, verb-led statement: 'Get recent Pilot Reports (PIREPs) near an airport or within a bounding box.' It further specifies what is returned (turbulence, icing, cloud reports with altitude, aircraft type, intensity, raw text), so an agent can immediately identify the tool's purpose and output.

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

Usage Guidelines5/5

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

The description provides concrete operational constraints: 'station_id or bbox—not both,' distance_nm applies 'to the station_id search only,' altitude_min_ft must not exceed altitude_max_ft, and limit only bounds results without changing the search. It also warns about US-centric sparse data, giving an agent the context needed to choose and calibrate the call.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.