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-character ICAO ID (e.g., KSEA, KJFK, K0S9); buoys and mesonet sites carry identifiers of other shapes and resolve by those. At least one of station_ids, bbox, or state is required. limit bounds how many stations an area search returns without changing the area searched, and belongs to the bbox and state modes only.

Input 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), with 1–20 identifiers after splitting commas and trimming each token. Empty tokens are rejected. A lookup matches the registry's own identifier: a 4-character ICAO ID for an airport (e.g., KSEA, K0S9), and other shapes for buoys and mesonet sites. A 3-letter IATA code (e.g., SEA) never resolves. Use bbox or state to discover identifiers by location.

Output 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 bbox row caps, requested limits, area results above 110 stations with no limit, unresolved identifiers, or unavailable supplementary magnetic variation. State snapshots are complete and never reach the stationinfo row cap. A failed airport lookup does not invalidate station identity.
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. Changed6 schema fields changed
    • changedInput schema / properties / station_ids / description
      Previous value: -"One or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-character ICAO ID for an airport (e.g., KSEA, K0S9), and other shapes for the buoys and mesonet sites the registry also carries, which resolve by those. A 3-letter IATA code (e.g., SEA) never resolves, even for a station whose entry carries one. Whitespace around an entry is trimmed, so a padded identifier resolves the same as the bare one; an empty or whitespace-only entry is rejected. Use bbox or state to discover identifiers by location."New value: +"One or more station identifiers (e.g., KSEA, KJFK), with 1–20 identifiers after splitting commas and trimming each token. Empty tokens are rejected. A lookup matches the registry's own identifier: a 4-character ICAO ID for an airport (e.g., KSEA, K0S9), and other shapes for buoys and mesonet sites. A 3-letter IATA code (e.g., SEA) never resolves. Use bbox or state to discover identifiers by location."
    • changedInput schema / properties / station_ids / items / description
      Previous value: -"One station identifier (e.g., KSEA)."New value: +"One station identifier or comma-separated identifiers (e.g., KSEA,KJFK)."
    • 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, or the bbox or state search found none. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. `upstream_rejected`: The AWC station registry rejected the request as malformed rather than answering it. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_station_ids`: Comma-separated station_ids contain an empty token or expand beyond twenty identifiers. `station_not_found`: None of the requested IDs match any known station, or the bbox or state search found none. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. `upstream_rejected`: The AWC station registry rejected the request as malformed rather than answering it. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "station_not_found",
      -  "missing_search_criteria",
      -  "conflicting_location",
      -  "invalid_bbox",
      -  "invalid_state",
      -  "conflicting_limit",
      -  "upstream_rejected"
      -]New value: +[
      +  "invalid_station_ids",
      +  "station_not_found",
      +  "missing_search_criteria",
      +  "conflicting_location",
      +  "invalid_bbox",
      +  "invalid_state",
      +  "conflicting_limit",
      +  "upstream_rejected"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, that limit bounds the response without changing the area searched (on a bbox or state result of more than 130 stations from a call that set no limit), or the cause and fix for identifiers that resolved to nothing. The cap and either limit statement can fire on one result, and the text keeps them apart; the reconciliation cannot join them, since only bbox and state reach the row cap or take a limit, and only station_ids reconciles a request."New value: +"Guidance for bbox row caps, requested limits, area results above 110 stations with no limit, unresolved identifiers, or unavailable supplementary magnetic variation. State snapshots are complete and never reach the stationinfo row cap. A failed airport lookup does not invalidate station identity."
    • addedOutput schema / properties / stations / items / properties / magnetic_declination
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "degrees": {
      +          "description": "Source-published magnetic variation in degrees, east positive and west negative; null for unrecognized source syntax.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "source": {
      +          "description": "Exact magdec string from the AWC airport record; no epoch is supplied.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "degrees",
      +        "source"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Published airport magnetic variation for named lookups; null when absent, unavailable, or an area search. Not a current geomagnetic model."
      +}
  2. Changed2 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `station_not_found`: None of the requested IDs match any known station. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. `upstream_rejected`: The AWC station registry rejected the request as malformed rather than answering it. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `station_not_found`: None of the requested IDs match any known station, or the bbox or state search found none. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. `upstream_rejected`: The AWC station registry rejected the request as malformed rather than answering it. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, or the cause and fix for identifiers that resolved to nothing. The cap and the limit can both fire on one result, and the text keeps them apart; the reconciliation cannot join them, since only bbox and state reach the row cap or accept a limit, and only station_ids reconciles a request."New value: +"Guidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, that limit bounds the response without changing the area searched (on a bbox or state result of more than 130 stations from a call that set no limit), or the cause and fix for identifiers that resolved to nothing. The cap and either limit statement can fire on one result, and the text keeps them apart; the reconciliation cannot join them, since only bbox and state reach the row cap or take a limit, and only station_ids reconciles a request."
  3. Changed2 schema fields changed
    • changedInput schema / properties / station_ids / description
      Previous value: -"One or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-letter ICAO ID for an airport, and other shapes for the buoys and mesonet sites the registry also carries, which resolve by those. A 3-letter IATA code (e.g., SEA) never resolves, even for a station whose entry carries one. Whitespace around an entry is trimmed, so a padded identifier resolves the same as the bare one; an empty or whitespace-only entry is rejected. Use bbox or state to discover identifiers by location."New value: +"One or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-character ICAO ID for an airport (e.g., KSEA, K0S9), and other shapes for the buoys and mesonet sites the registry also carries, which resolve by those. A 3-letter IATA code (e.g., SEA) never resolves, even for a station whose entry carries one. Whitespace around an entry is trimmed, so a padded identifier resolves the same as the bare one; an empty or whitespace-only entry is rejected. Use bbox or state to discover identifiers by location."
    • changedOutput schema / properties / stations / items / properties / icao_id / description
      Previous value: -"ICAO 4-letter station ID, or null if not assigned."New value: +"ICAO station ID, 4 uppercase letters or digits (e.g., KSEA, K0S9), or null if not assigned."
  4. 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."
  5. 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"
      +}
  6. 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"
      +]
  7. 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"
      -]
  8. 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"
      +]
  9. 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"
  10. 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."
  11. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/closed-world, so the safety profile is covered; the description goes further by disclosing a deterministic ordering (ICAO ascending, identifier-less last), a 400-row upstream cap distinct from limit, and the fact that limit bounds the response without shrinking the searched area. That cap-vs-limit distinction is exactly the kind of hidden behavior an agent could otherwise misread.

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?

Front-loaded with the two modes, then return shape, then the required-argument rule, then limit semantics — a sensible ordering with no filler. It is somewhat long and echoes schema text (the limit and identifier-shape explanations repeat what the properties already say), costing a point.

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?

For a 4-parameter, nested-bbox, multi-mode discovery tool with an output schema, the description covers modes, the required-argument invariant, identifier shapes across station types, limit semantics, and the upstream cap. An agent can pick the right mode and arguments without consulting the 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%, so 3 is the floor, and the description adds cross-parameter meaning the per-property schema cannot easily convey: limit is mode-scoped and rejected alongside station_ids. It also reinforces the identifier-resolution rule (4-char ICAO resolves, 3-letter IATA never does) — though that is largely duplicated from the station_ids schema text, keeping it from a 5.

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 and resource: 'Resolve an airport or weather reporting station by its identifier, or discover stations within a bounding box or US state.' The two modes (ID lookup vs. area discovery) are spelled out, which cleanly separates it from the weather-data siblings (metar/taf/pireps/advisories) that consume rather than produce station identifiers.

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

Usage Guidelines4/5

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

Explicit preconditions: 'At least one of station_ids, bbox, or state is required,' plus the mode coupling rule that limit belongs only to bbox/state and is rejected with station_ids. It even routes within the tool ('Use bbox or state to discover identifiers by location'), though it never names a sibling tool or states when to prefer a sibling over this one, which keeps it from a 5.

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.