The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Faa Traffic Delays MCP Server listing page.
Track FAA ground stops, delay programs, airport delays, the operations plan, and ATCSCC advisories via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://faa-traffic-delays.caseyjhand.com/mcp
Real-time air traffic management status from the FAA Air Traffic Control System Command Center (ATCSCC), read from the NAS Status feed behind nasstatus.faa.gov and the ATCSCC advisories database. Check US airports for ground stops, Ground Delay Programs, delays, and closures; list every active event nationwide, en-route Airspace Flow Programs included; read the operations plan for later in the day; list the advisories issued on a UTC date, canceled and past programs included; and read the full advisory behind each one. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
| Tool | Description |
|---|---|
faa_delays_get_airport_status | Current status of up to 25 distinct US airports per call, with the remainder named: ground stops, delay programs, delays, closures, deicing, and runway configuration |
faa_delays_list_active_events | Every active event across the National Airspace System, Airspace Flow Programs included, sorted by severity with per-type counts |
faa_delays_get_operations_plan | The Command Center's operations plan: programs and initiatives expected later today, with planned time and likelihood |
faa_delays_get_advisory | Full text of one ATCSCC advisory by number and UTC date: program rate, scope, comments, and the plan's constraints |
faa_delays_list_advisories | The ATCSCC advisories issued on one UTC date, newest first, with their numbers: programs as issued, proposed, revised, and canceled, reroutes, and the operations plan |
faa_delays_list_reference | Decode event types, traffic-management terms, ARTCC codes, the FAA pacing airports, and identifier formats |
faa_delays_get_airport_status toolairports: 1–100 submitted codes, each a 3-character FAA identifier (SEA) or ICAO code (KSEA, PHNL), case-insensitive, as an array or comma-separated string. Every code is validated before fetching; an unknown code fails the whole call as unknown_airport. FAA/ICAO equivalents use one slot; the first 25 distinct airports are processed in order. cap: 25, processedCount, and omittedAirports identify the exact canonical remainder to pass in the next callstatus (closed, ground_stop, ground_delay_program, delays, restrictions_only, no_active_events), listedInFeed, airportName, artcc, latitude / longitude, requestedAs for an ICAO input, and each active event: groundStop, groundDelayProgram with programStartTime and a per-15-minute delayProfile, arrivalDelay / departureDelay, closure, closureNotam, deicingartcc comes from the NASR directory and matches the ARTCC codes in a program's includedFacilities; an airport the feed doesn't list takes its coordinates from the directory too. runwayConfiguration (runways and arrivalRatePerHour) appears only for listed airports; isPacingAirport and timezone are omitted, with a notice, when the pacing-airport list can't be readUS/Mountain uses effective timezone: "America/Phoenix" and retains reportedTimezone: "US/Mountain"; every other airport/value pair stays as reportedfaa_delays_list_active_events toolevent_types filter over ground_stop, ground_delay_program, airspace_flow_program, arrival_delay, departure_delay, airport_closure, closure_notam, deicing (aliases gs, gdp, afp); rows are sorted by severity, with reason, delay figures, times, and an advisory reference where the FAA links onetotalActive and countsByType cover the whole feed before the filter; shown / appliedEventTypes echo what was returned. ground_delay_program rows add programStartTime beside the current revision's startTime, and airspace_flow_program rows carry afp detail (constrained area, departure and arrival filters, altitudes, delay profile)enRouteFeed (ok, unavailable, format_changed) reports whether Airspace Flow Programs were read. An en-route failure omits them with a notice rather than failing the call, unless they are the only type requestedfaa_delays_get_operations_plan toolterminalPlanned and enRoutePlanned items carry text, timeQualifier (after, until, by, between), timeUtc (HHMM with no date), and likelihood (possible, probable, expected)announcements lists current ATCSCC announcements ([] when none; absent, with a notice, when the list can't be read); advisory references the full plan text for faa_delays_get_advisoryfaa_delays_get_advisory tooladvisory_number (1–999) and date (UTC, YYYY-MM-DD; MM/DD/YYYY accepted), taken from a faa_delays_list_advisories row or an advisory reference's number and date; numbers restart at 1 each UTC day, and past advisories stay readabletitle, controlElement, subject, effectiveTime and sentAt as the advisory prints them (DDHHMM-DDHHMM, YY/MM/DD HH:MM, on operations plans and reroutes too), and the full text; a number the database doesn't hold returns found: false with guidance that points to faa_delays_list_advisoriestruncated and totalChars; page failures surface as advisory_service_unavailable or advisory_contract_changedfaa_delays_list_advisories toolquery matches a literal, case-insensitive substring in subject or any details line before paging, combined with the other filters. For a named FCA in the plan, use query: "FCA005"; appliedQuery echoes the trimmed filterdate (UTC, YYYY-MM-DD; MM/DD/YYYY accepted; no later than tomorrow; omitted → today), optional categories (ground_stop, ground_delay_program, airspace_flow_program, ctop, route, other; aliases gs, gdp, afp) and control_element (an airport by FAA or ICAO code, an ARTCC, or DCC for national advisories), limit 1–200 (default 50) and offsetnumber and date for faa_delays_get_advisory, controlElement, subject, details (a reroute's or flow constrained area's name, constrained area, and valid period), and sentAt (ISO 8601 UTC); totalCount counts every match and nextOffset is present while more remaincategories the list also carries the CDM compression advisories the FAA files under no category; a date with no advisories, or a filter that matches none, returns an empty list with a noticefaa_delays_list_reference tooltopic: event_types, terms, artccs, pacing_airports, or identifierspacing_airports calls the FAA (live, cached 6 hours); identifiers also reports the bundled NASR airport directory's cycle date and airport countBuilt on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
FAA-specific:
nasstatus.faa.gov/api) and the ATCSCC advisories database (www.fly.faa.gov/adv), keyless; FAA status and NASR airport data are US federal works in the public domain (17 U.S.C. §105)KSEA → SEA, PHNL → HNL), so a mistyped code fails instead of reading as a quiet airport; the same directory supplies each airport's ARTCC, and its coordinates when the feed doesn't list itnotice; unreadable event objects, planned lists, and invalid delay profiles are named as unknown sections. Wrong-typed scalar fields are dropped and logged. Delay-profile sequences must be exactly 1 through N after sorting, so missing intervals never shift later delaysAgent-friendly output:
feed_unavailable), a slow or throttled FAA (retry_deadline_exceeded, upstream_rate_limited, pacer_shed), and a format change (feed_contract_changed, not retryable) distinct; recovery hints name the tool to call next, and rate-limit errors carry retryAfter when knownnotice instead of failing the callfetchedAt dates the snapshot, and a notice flags an arrival or departure delay last updated more than 6 hours earlier, since the FAA feed can keep a delay entry after it lapsescontent[] so it reads as data, and stays verbatim in structuredContentLimitations:
nasstatus.faa.gov/api/* is the dashboard's private backend, with no schema, terms, versioning, or published limits, and it can change without notice. The server fails with feed_contract_changed rather than guess.no_active_events means no FAA program, not on-time flights. Per-flight EDCTs are not in the feed.enRouteFeed: "format_changed" rather than failing it.A public instance is available at https://faa-traffic-delays.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
Add the following to your MCP client configuration file.
Or with npx (no Bun required):
Or with Docker:
For Streamable HTTP, set the transport and start the server:
The server reads no environment variables of its own: the FAA hosts, cache lifetimes, and request pacing are fixed in the services. These framework variables cover transport, logging, and telemetry.
| Variable | Description | Default |
|---|---|---|
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_HTTP_HOST | HTTP server host. | 127.0.0.1 |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto. | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
LOGS_DIR | Directory for log files (Node.js only). | <app-root>/logs |
OTEL_ENABLED | Enable OpenTelemetry. | false |
See .env.example for the common framework overrides.
Build and run the production version:
Run checks and tests:
Refresh the airport directory from the current FAA NASR cycle (needs network access and the system unzip):
| Directory | Purpose |
|---|---|
src/mcp-server/tools | Tool definitions (*.tool.ts), plus shared output schemas, the advisory date input, notice fragments, and Markdown helpers for FAA-authored text. |
src/services/nas-status | NAS Status feed client and tolerant feed parsers. |
src/services/advisory | ATCSCC advisories database client, advisory page and index parsers, and the advisory and index URL builders. |
src/services/airport-directory | Bundled FAA NASR airport directory (name, place, ARTCC, coordinates) and ICAO → FAA crosswalk (generated module). |
src/services/upstream | Shared FAA fetch boundary (pacing, retry, status classification) and the in-process cache. |
scripts/refresh-airport-directory.ts | Regenerates the airport directory module (bun run refresh:airports). |
tests/ | Unit and integration tests, mirroring the src/ structure, with synthetic FAA fixtures. |
docs/design.md | Tool surface design, upstream API notes, design decisions, and known limitations. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for logging; FAA feeds are cached in process, not in ctx.stateallToolDefinitions in src/mcp-server/tools/definitions/index.tsIssues are welcome. Run checks and tests before submitting:
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.