Skip to main content
Glama

Find Aviation Weather Stations

aviation_find_stations
Read-onlyIdempotent

Resolve an airport or weather reporting station by its identifier, or discover stations within a bounding box or US state. Returns all identifier variants (ICAO/IATA/FAA), coordinates, elevation, and available data types (METAR, TAF, SYNOP, etc.). A lookup matches the registry's own identifier, which for an airport is its 4-letter ICAO ID (e.g., KSEA, KJFK); buoys and mesonet sites carry identifiers of other shapes and resolve by those. At least one of station_ids, bbox, or state is required. limit bounds how many stations an area search returns without changing the area searched, and belongs to the bbox and state modes only.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bboxNoGeographic bounding box for spatial queries.
limitNoMaximum stations to return, applied after ordering by ICAO identifier ascending with identifier-less stations last — so the same query with the same limit returns the same stations, and airports rather than unidentified sites lead the first page. It bounds the response without changing the area searched, which a smaller bbox or a different state would. Distinct from the 400-row upstream cap: a limited result examined every station it counted and withheld some, while a capped one never drew the rest. Belongs to the bbox and state modes; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every match. Optional.
stateNoTwo-letter USPS code for one of the 50 US states or DC (e.g., "WA") to list all stations in that jurisdiction. US territories are not supported — use bbox for those.
station_idsNoOne or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-letter ICAO ID for an airport, and other shapes for the buoys and mesonet sites the registry also carries, which resolve by those. A 3-letter IATA code (e.g., SEA) never resolves, even for a station whose entry carries one. Whitespace around an entry is trimmed, so a padded identifier resolves the same as the bare one; an empty or whitespace-only entry is rejected. Use bbox or state to discover identifiers by location.

Output Schema

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 any client-side state filter and after any limit.
noticeNoGuidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, or the cause and fix for identifiers that resolved to nothing. The cap and the limit can both fire on one result, and the text keeps them apart; the reconciliation cannot join them, since only bbox and state reach the row cap or accept a limit, and only station_ids reconciles a request.
limitedNoTrue when the requested limit withheld stations that matched — the caller asked to see fewer of them. False affirms the limit did not bite, so every matching station is here. Present only when the call supplied a limit. It never states anything about the upstream cap: a limited result examined every station it counted, while a truncated one never drew the rest.
matchedNoStations that matched this query before the limit selected from them. Present only on a limited result. Where the result is also truncated this counts the capped draw and not the search area — the stations the cap dropped were never examined, so no count can include them.
missingNoRequested identifiers absent from the result. Deduplicated the way returned is: a repeated or differently-cased identifier appears once, under its first spelling. Absent when none are missing.
partialNoTrue when a requested identifier resolved to nothing. False affirms every requested identifier resolved, which a count cannot establish — upstream case-folds and deduplicates, so a shorter list is not itself a gap. Present only on a station_ids lookup.
returnedNoRequested identifiers that resolved, spelled as the caller wrote them rather than as upstream returned them. Deduplicated the way upstream deduplicates: a repeated or differently-cased identifier appears once, under its first spelling. Present only on a station_ids lookup.
stationsNoMatching stations.
requestedNoStation identifiers this call asked for, spelled as the caller wrote them and in the order given. Present only on a station_ids lookup — the bbox and state modes ask for an area, not a list.
truncatedNoTrue when the upstream draw hit the AWC row cap, so stations inside the search area are missing from this result. False affirms the area was drawn in full, which a count alone cannot establish.
upstreamRowsNoRows AWC returned before the client-side state filter ran. Present only on a truncated state query the filter then narrowed, where the post-filter count sits below the cap and so cannot reveal the truncation on its own.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed10 schema fields changed
    • addedInput schema / properties / limit
      Added value: +{
      +  "description": "Maximum stations to return, applied after ordering by ICAO identifier ascending with identifier-less stations last — so the same query with the same limit returns the same stations, and airports rather than unidentified sites lead the first page. It bounds the response without changing the area searched, which a smaller bbox or a different state would. Distinct from the 400-row upstream cap: a limited result examined every station it counted and withheld some, while a capped one never drew the rest. Belongs to the bbox and state modes; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every match. Optional.",
      +  "maximum": 400,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / station_ids / description
      Previous value: -"One or more 4-letter ICAO station IDs (e.g., KSEA, KJFK). The upstream API only accepts ICAO format — 3-letter IATA codes (e.g., SEA) will return no results. Use bbox or state to discover ICAO IDs by location."New value: +"One or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-letter ICAO ID for an airport, and other shapes for the buoys and mesonet sites the registry also carries, which resolve by those. A 3-letter IATA code (e.g., SEA) never resolves, even for a station whose entry carries one. Whitespace around an entry is trimmed, so a padded identifier resolves the same as the bare one; an empty or whitespace-only entry is rejected. Use bbox or state to discover identifiers by location."
    • changedInput schema / properties / station_ids / items / description
      Previous value: -"A 4-letter ICAO station identifier (e.g., KSEA)."New value: +"One station identifier (e.g., KSEA)."
    • addedInput schema / properties / station_ids / items / pattern
      Added value: +"\\S"
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: None of the requested IDs match any known station. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: None of the requested IDs match any known station. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. `upstream_rejected`: The AWC station registry rejected the request as malformed rather than answering it. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "station_not_found",
      -  "missing_search_criteria",
      -  "conflicting_location",
      -  "invalid_bbox",
      -  "invalid_state"
      -]New value: +[
      +  "station_not_found",
      +  "missing_search_criteria",
      +  "conflicting_location",
      +  "invalid_bbox",
      +  "invalid_state",
      +  "conflicting_limit",
      +  "upstream_rejected"
      +]
    • addedOutput schema / properties / limited
      Added value: +{
      +  "description": "True when the requested limit withheld stations that matched — the caller asked to see fewer of them. False affirms the limit did not bite, so every matching station is here. Present only when the call supplied a limit. It never states anything about the upstream cap: a limited result examined every station it counted, while a truncated one never drew the rest.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / matched
      Added value: +{
      +  "description": "Stations that matched this query before the limit selected from them. Present only on a limited result. Where the result is also truncated this counts the capped draw and not the search area — the stations the cap dropped were never examined, so no count can include them.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance for whichever disclosure fired: the lever that narrows a truncated draw, or the cause and fix for identifiers that resolved to nothing. The two cannot co-occur — only bbox and state can reach the row cap, and only station_ids reconciles a request."New value: +"Guidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, or the cause and fix for identifiers that resolved to nothing. The cap and the limit can both fire on one result, and the text keeps them apart; the reconciliation cannot join them, since only bbox and state reach the row cap or accept a limit, and only station_ids reconciles a request."
    • changedOutput schema / properties / shown / description
      Previous value: -"Stations in this result, counted after any client-side state filter."New value: +"Stations in this result, counted after any client-side state filter and after any limit."
  2. Changed5 schema fields changed
    • addedOutput schema / properties / missing
      Added value: +{
      +  "description": "Requested identifiers absent from the result. Deduplicated the way returned is: a repeated or differently-cased identifier appears once, under its first spelling. Absent when none are missing.",
      +  "items": {
      +    "description": "A requested identifier that resolved to no station.",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance naming the lever that narrows the draw. Present only on a truncated result."New value: +"Guidance for whichever disclosure fired: the lever that narrows a truncated draw, or the cause and fix for identifiers that resolved to nothing. The two cannot co-occur — only bbox and state can reach the row cap, and only station_ids reconciles a request."
    • addedOutput schema / properties / partial
      Added value: +{
      +  "description": "True when a requested identifier resolved to nothing. False affirms every requested identifier resolved, which a count cannot establish — upstream case-folds and deduplicates, so a shorter list is not itself a gap. Present only on a station_ids lookup.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / requested
      Added value: +{
      +  "description": "Station identifiers this call asked for, spelled as the caller wrote them and in the order given. Present only on a station_ids lookup — the bbox and state modes ask for an area, not a list.",
      +  "items": {
      +    "description": "A station identifier as requested.",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / returned
      Added value: +{
      +  "description": "Requested identifiers that resolved, spelled as the caller wrote them rather than as upstream returned them. Deduplicated the way upstream deduplicates: a repeated or differently-cased identifier appears once, under its first spelling. Present only on a station_ids lookup.",
      +  "items": {
      +    "description": "A requested identifier that resolved to a station.",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  3. Changed8 schema fields changed
    • removedOutput schema / properties / stations / items / properties / elevation_ft / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / stations / items / properties / elevation_ft / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / stations / items / properties / faa_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / stations / items / properties / faa_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / stations / items / properties / iata_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / stations / items / properties / iata_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / stations / items / properties / icao_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / stations / items / properties / icao_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  4. 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": [
      +      "stations",
      +      "truncated",
      +      "shown"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `station_not_found`: None of the requested IDs match any known station. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "station_not_found",
      +            "missing_search_criteria",
      +            "conflicting_location",
      +            "invalid_bbox",
      +            "invalid_state"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "stations",
      -  "truncated",
      -  "shown"
      -]
  5. Changed6 schema fields changed
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "The upstream row maximum that was applied to the draw. Present only on a truncated result.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Guidance naming the lever that narrows the draw. Present only on a truncated result.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / shown
      Added value: +{
      +  "description": "Stations in this result, counted after any client-side state filter.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "description": "True when the upstream draw hit the AWC row cap, so stations inside the search area are missing from this result. False affirms the area was drawn in full, which a count alone cannot establish.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / upstreamRows
      Added value: +{
      +  "description": "Rows AWC returned before the client-side state filter ran. Present only on a truncated state query the filter then narrowed, where the post-filter count sits below the cap and so cannot reveal the truncation on its own.",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "stations"
      -]New value: +[
      +  "stations",
      +  "truncated",
      +  "shown"
      +]
  6. Changed3 schema fields changed
    • addedOutput schema / properties / stations / items / properties / elevation_ft / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / stations / items / properties / elevation_ft / description
      Previous value: -"Station elevation in feet MSL."New value: +"Station elevation in feet MSL. 0 is a sea-level site; null means no elevation is on file upstream, so it is unknown."
    • removedOutput schema / properties / stations / items / properties / elevation_ft / type
      Removed value: -"number"
  7. Changed1 schema field changed
    • changedInput schema / properties / state / description
      Previous value: -"Two-letter US state abbreviation (e.g., \"WA\") to list all stations in that state."New value: +"Two-letter USPS code for one of the 50 US states or DC (e.g., \"WA\") to list all stations in that jurisdiction. US territories are not supported — use bbox for those."
  8. First observed

TDQS

A4.3/5.0
Behavior4/5

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

The description goes beyond the annotations by explaining the matching behavior (ICAO vs IATA, buoys/mesonet identifiers), the trimming of whitespace, and the behavior of limit (ordering with identifier-less stations last, deterministic results). It also notes the 400-row upstream cap and how limit differs from that cap. While annotations declare readOnlyHint and idempotentHint, the description adds important context about result ordering and edge cases. A small gap is that it doesn't explain what happens when no stations match, but that is minor.

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

Conciseness4/5

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

The description is three sentences, with the key purpose and modes front-loaded. However, the third sentence is long and dense, combining the limit behavior, the 400-row cap, and mode restrictions in a way that could be split for clarity. Still, there is no wasted text, and it is efficient overall.

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

Completeness4/5

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

Given the tool's complexity (multiple modes, nested bbox object, output schema exists) and the schema's high coverage, the description provides sufficient guidance for an agent to make a correct call. It covers required parameters, mode selection, and edge cases like IATA codes. The output schema exists, so return values are not needed in the description. Minor gaps include not explaining how to specify multiple station_ids or the exact response structure, but the schema and output schema cover that.

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

Parameters3/5

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

Schema description coverage is 100% and each parameter is richly described in the schema (e.g., the limit parameter's detailed explanation). The description adds a brief summary of parameters and their roles, but largely reinforces the schema. For example, the station_ids parameter already explains IATA never resolves and whitespace trimming; the description repeats that. Thus, the description adds minimal new value beyond the schema, so a baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Resolve' or 'discover') and resource ('aviation weather stations'), and clearly distinguishes the two main modes: identifier lookup and area-based discovery. It names the sibling tools (e.g., aviation_get_metar) implicitly by focusing on station metadata, not weather data, making it easy for an agent to tell it apart from other aviation tools.

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

Usage Guidelines5/5

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

The description explicitly states that at least one of station_ids, bbox, or state is required, and explains when to use each: 'Use bbox or state to discover identifiers by location.' It also warns against using limit with station_ids ('Belongs to the bbox and state modes; supplying it alongside station_ids is rejected'), and clarifies the difference between limit and a smaller bbox. This is explicit and actionable.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.