Skip to main content
Glama

faa-traffic-delays-mcp-server

Get FAA Airport Status

faa_delays_get_airport_status
Read-onlyIdempotent

Get the current FAA traffic management status for one or more US airports: a headline status, every active event (ground stop, Ground Delay Program with its delay profile, arrival or departure delay, closure, deicing) with reason and times, and the runway configuration and airport arrival rate. Each row also carries plannedPrograms, the current operations plan's terminal ground-stop and delay-program items that name the airport, with the plan's times as written. Every row carries the airport's ARTCC, and its coordinates come from the feed when the airport is listed (absent when the feed omits them) and from the NASR directory otherwise; both place a departure airport against a program's includedFacilities and departureScopeNm. Airports are FAA 3-character identifiers (SEA, ORD, JFK) or their ICAO codes (KSEA, PHNL); a code that names no US airport is rejected. The FAA feed lists only airports with an active event, so a known airport absent from it returns status no_active_events, and runway configuration is available only for listed airports.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "airports": "<airports>"
    },
    "name": "faa_delays_get_airport_status"
  }
}

Input Schema

NameRequiredDescriptionDefault
airportsYes1–100 submitted US airport codes, each a 3-character FAA location identifier (SEA, ORD, 0S9) or its ICAO code (KSEA, PHNL, TJSJ), case-insensitive; a comma-separated string is also accepted. Validates every code, deduplicates FAA/ICAO equivalents, and processes the first 25 distinct airports with the canonical remainder returned as omittedAirports. City and airport names are not accepted.

Output Schema

NameRequiredDescriptionDefault
capNoMaximum distinct airports processed: 25.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance on quiet results, stale delay entries, or partial data.
airportsNoOne row per processed airport, in first-seen request order, up to 25 distinct FAA identifiers.
fetchedAtNoWhen this server fetched the snapshot from the FAA (UTC ISO); with the 60 s cache it can trail the call by up to a minute.
processedCountNoDistinct airports processed in this response.
omittedAirportsNoCanonical FAA identifiers left after the first 25 distinct airports, in first-seen order; empty when all were processed.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • changedOutput schema / properties / airports / items / properties / closure / description
      Previous value: -"Airport closed to all operations; text lists exceptions."New value: +"Airport closed to all operations, with its NOTAM; text lists the exceptions. A closure scheduled daily is closed only inside dailyWindowUtc, and inEffect says whether it is at fetchedAt."
    • addedOutput schema / properties / airports / items / properties / closure / properties / dailyWindowUtc
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The daily window the NOTAM schedules (a DLY HHMM-HHMM closing its text, with startTime on the first window start and endTime on the last window end): the closure applies only inside it, every day from startTime to endTime. Absent when the text states no such schedule.",
      +  "properties": {
      +    "end": {
      +      "description": "Window end, HHMM UTC; earlier than start when the window crosses 0000Z.",
      +      "type": "string"
      +    },
      +    "start": {
      +      "description": "Window start, HHMM UTC.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "start",
      +    "end"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / airports / items / properties / closure / properties / inEffect
      Added value: +{
      +  "description": "Whether the closure applies at fetchedAt: between startTime and endTime and inside dailyWindowUtc. Present only with dailyWindowUtc; when false, the notice names the next window.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / airports / items / properties / closure / properties / issuedAt
      Added value: +{
      +  "description": "NOTAM issue time (UTC ISO).",
      +  "type": "string"
      +}
    • addedOutput schema / properties / airports / items / properties / closure / properties / notamNumber
      Added value: +{
      +  "description": "NOTAM number.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / airports / items / properties / closure / properties / notamText
      Added value: +{
      +  "description": "Full NOTAM text (FAA-authored).",
      +  "type": "string"
      +}
    • changedOutput schema / properties / airports / items / properties / closure / properties / text / description
      Previous value: -"Closure detail and exceptions (FAA-authored text)."New value: +"The NOTAM wording without its header and effective period: the restriction or the closure exceptions (FAA-authored)."
    • addedOutput schema / properties / airports / items / properties / closureNotam / properties / dailyWindowUtc
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The daily window the NOTAM schedules (a DLY HHMM-HHMM closing its text, with startTime on the first window start and endTime on the last window end): the closure applies only inside it, every day from startTime to endTime. Absent when the text states no such schedule.",
      +  "properties": {
      +    "end": {
      +      "description": "Window end, HHMM UTC; earlier than start when the window crosses 0000Z.",
      +      "type": "string"
      +    },
      +    "start": {
      +      "description": "Window start, HHMM UTC.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "start",
      +    "end"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / airports / items / properties / closureNotam / properties / inEffect
      Added value: +{
      +  "description": "Whether the closure applies at fetchedAt: between startTime and endTime and inside dailyWindowUtc. Present only with dailyWindowUtc; when false, the notice names the next window.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / airports / items / properties / closureNotam / properties / text / description
      Previous value: -"The restriction wording (FAA-authored)."New value: +"The NOTAM wording without its header and effective period: the restriction or the closure exceptions (FAA-authored)."
    • addedOutput schema / properties / airports / items / properties / plannedPrograms
      Added value: +{
      +  "description": "The current operations plan's terminal ground-stop and delay-program items that name this airport, each identical item once, with times as the plan states them (see timeUtc; an item past its time is not filtered out). [] when the plan names the airport nowhere, which does not mean no trouble is expected: en-route items, constraints, and runway closures stay in faa_delays_get_operations_plan and the plan advisory. Absent when the operations plan could not be read. Never changes status.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One terminal item of the current operations plan that names this airport, with the advisory reference of the plan.",
      +    "properties": {
      +      "advisory": {
      +        "additionalProperties": false,
      +        "description": "Reference to the ATCSCC advisory behind this item, absent when the FAA feed links none. For the full text, call faa_delays_get_advisory with number as advisory_number and date as date.",
      +        "properties": {
      +          "date": {
      +            "description": "Advisory UTC date, YYYY-MM-DD.",
      +            "type": "string"
      +          },
      +          "number": {
      +            "description": "ATCSCC advisory number; numbers restart at 1 each UTC day.",
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "url": {
      +            "description": "Server-built advisory URL, the page faa_delays_get_advisory reads for this number and date.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "number",
      +          "date",
      +          "url"
      +        ],
      +        "type": "object"
      +      },
      +      "likelihood": {
      +        "description": "The FAA's stated likelihood: possible (<30 %), probable (30–60 %), or expected (most likely). Absent when the text states none.",
      +        "enum": [
      +          "possible",
      +          "probable",
      +          "expected"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "The planned item as the FAA wrote it, tabs flattened and the leading dash removed (FAA-authored).",
      +        "type": "string"
      +      },
      +      "timeQualifier": {
      +        "description": "How the planned time bounds the item, parsed from the start of the text; for between, timeUtc is the start of the window and its end stays in text.",
      +        "enum": [
      +          "after",
      +          "until",
      +          "by",
      +          "between"
      +        ],
      +        "type": "string"
      +      },
      +      "timeUtc": {
      +        "description": "Planned time as HHMM UTC, with no date. Its day comes from the plan's event window (the EVENT TIME line of the plan advisory, read with faa_delays_get_advisory), which can start on the UTC day after the advisory date.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / airports / items / properties / status / description
      Previous value: -"Headline status, first match wins: closed (airport closure) → ground_stop → ground_delay_program → delays (arrival or departure delay) → restrictions_only (listed with only a closure NOTAM, deicing, or runway configuration) → no_active_events (absent from the feed: no FAA program, which does not guarantee on-time flights)."New value: +"Headline status, first match wins: closed (an airport closure in effect; one outside its daily window, closure.inEffect false, is skipped) → ground_stop → ground_delay_program → delays (arrival or departure delay) → restrictions_only (listed with only a closure NOTAM, deicing, runway configuration, or an airport closure outside its daily window) → no_active_events (absent from the feed: no FAA program, which does not guarantee on-time flights)."
  2. Changed9 schema fields changed
    • changedInput schema / properties / airports / description
      Previous value: -"1–25 US airports, each a 3-character FAA location identifier (SEA, ORD, 0S9) or its ICAO code (KSEA, PHNL, TJSJ), case-insensitive; a comma-separated string is also accepted. City and airport names are not accepted."New value: +"1–100 submitted US airport codes, each a 3-character FAA location identifier (SEA, ORD, 0S9) or its ICAO code (KSEA, PHNL, TJSJ), case-insensitive; a comma-separated string is also accepted. Validates every code, deduplicates FAA/ICAO equivalents, and processes the first 25 distinct airports with the canonical remainder returned as omittedAirports. City and airport names are not accepted."
    • changedInput schema / properties / airports / maxItems
      Previous value: -25New value: +100
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "fetchedAt",
      -      "airports"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "fetchedAt",
      +      "airports",
      +      "cap",
      +      "processedCount",
      +      "omittedAirports"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / airports / description
      Previous value: -"One row per requested airport, in request order, duplicates dropped."New value: +"One row per processed airport, in first-seen request order, up to 25 distinct FAA identifiers."
    • addedOutput schema / properties / airports / items / properties / reportedTimezone
      Added value: +{
      +  "description": "Original FAA time zone when a verified correction was applied.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / airports / items / properties / timezone / description
      Previous value: -"IANA-style time zone the FAA assigns to a pacing airport (US/Pacific)."New value: +"Effective IANA time zone; PHX reported as US/Mountain is corrected to America/Phoenix."
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "Maximum distinct airports processed: 25.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / omittedAirports
      Added value: +{
      +  "description": "Canonical FAA identifiers left after the first 25 distinct airports, in first-seen order; empty when all were processed.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / processedCount
      Added value: +{
      +  "description": "Distinct airports processed in this response.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
  3. First observed

TDQS

A4.2/5.0
Behavior5/5

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

Annotations only declare readOnly/idempotent/openWorld, while the description discloses real behavioral traits: the feed contains only airports with active events, absent airports yield no_active_events, runway configuration is only available for listed airports, invalid codes are rejected, and coordinates fall back to the NASR directory when the feed omits them. This goes well beyond the annotation set.

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

Conciseness3/5

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

The purpose is front-loaded in the first clause, which is good, but the body is dense and crammed with coordinate-resolution and operations-plan detail that an output schema (which exists) would carry better. It is one sprawling construction plus a long caveat sentence rather than tightly organized guidance.

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 an output schema exists, the extensive field-by-field enumeration of return values is partly redundant, but the description compensates with the edge-case coverage an agent actually needs (absent airports, invalid codes, missing runway configuration). Nothing essential for a correct call appears to be missing.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents the FAA/ICAO formats, deduplication, and the 25-distinct-airport processing cap. The description still adds meaning the schema does not: that codes naming no US airport are rejected, and that city/airport names are unacceptable.

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 ('Get the current FAA traffic management status') and a precise scope (one or more US airports), then enumerates the content of each row (headline status, active events, runway configuration, ARTCC, coordinates). This distinguishes it from siblings like faa_delays_list_active_events, which lists events without per-airport consolidation.

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

Usage Guidelines3/5

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

The per-airport framing implies when to use it, and the note that known airports absent from the FAA feed return status no_active_events is genuinely useful selection guidance. However, no sibling is named as an alternative, and there is no explicit when-not-to-use statement.

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.