Faa Aircraft Registry Mcp Server

io.github.cyanheadsPublished by GitHub account cyanheadsv0.1.12Updated Oct 24, 2026

Offline, keyless lookup of the US civil aircraft registry — decode N-numbers, search records.

VerifiedStreamable HTTPWeb executableLocation & LifestyleData & Analytics

Overview

AI-generated overview

Offline, keyless lookup of the US civil aircraft registry: decode N-numbers, check registration status, and search aircraft records by owner, type, state or ICA

What you can do
Decode a single N-number into aircraft, engine, airworthiness, status and Mode S details, with owner data only when redaction is off. Resolve whether a number is active, deregistered, reserved or unknown. Search active registrations by owner name, make/model, manufacturer/model code, state, aircraft type or Mode S code, with paging. Search the aircraft type reference table and decode manufacturer/model codes into specifications. Read a full registration record through a resource keyed by N-number.
When to use it
Useful when you need to identify a US civil aircraft from its tail number, verify whether a registration is current, or find aircraft by owner, model or state without an API key. Suited to research, aviation data work and cross-checking against flight-tracking Mode S codes.
Requirements
Either the public hosted Streamable HTTP endpoint, or a local install via npx, bunx or Docker (Node.js 24+ or Bun 1.4+). Local use needs a one-time index build from the FAA database download (about 70 MB compressed, a few hundred MB on disk) at the path set by FAA_MIRROR_PATH; network is needed only for that build and refresh. No API key.
Before you install
Owner name and address are personal data; they are redacted by default and owner-name search is disabled until FAA_REDACT_OWNER_PII is set to false, which the README recommends only on trusted local installs. Local queries fail until the index is built, and the index must be refreshed to stay current. The hosted endpoint is a third-party public instance, so queries go to that operator.

Installation

In SourceWeft

  1. Open Faa Aircraft Registry Mcp Server in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.cyanheads%2Ffaa-aircraft-registry-mcp-server/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "faa-aircraft-registry": {
      "type": "http",
      "url": "https://faa-aircraft-registry.caseyjhand.com/mcp"
    }
  }
}

README

@cyanheads/faa-aircraft-registry-mcp-server

Decode N-numbers to aircraft, engine, status, and owner; search the US civil aircraft registry by owner, type, or state; resolve active/deregistered/reserved status — offline via MCP. STDIO or Streamable HTTP.

5 Tools • 1 Resource


Overview

The US civil aircraft registry, searchable offline from the FAA's Releasable Aircraft Database. Decode an N-number to its aircraft, engine, and registered owner; check whether it's active, deregistered, or reserved; and search by owner, make and model, state, or Mode S code.

Tools

ToolDescription
faa_lookup_registrationDecode one N-number to its full pre-joined active record — aircraft make/model, engine, year, airworthiness, registration status, Mode S code, and registered owner (when redaction is off).
faa_get_registration_statusResolve an N-number across all three status files (active, deregistered, reserved) in priority order, returning a definitive recordType.
faa_search_registrationsSearch active registrations by owner name, make/model, exact manufacturer/model code, state, aircraft type, or Mode S code.
faa_search_aircraft_typesSearch the aircraft reference table by manufacturer/model name, type, or category to discover manufacturer-model codes.
faa_get_aircraft_typeDecode a 6–7-character manufacturer/model/series code to aircraft specs — category, type, engine, seats, weight class, cruise speed, type-certificate data.

Resources

ResourceDescription
faa://registration/{nNumber}Full registration record for one N-number — the same decoded, pre-joined payload as faa_lookup_registration.

Also reachable via faa_lookup_registration; search collections aren't exposed as resources.

Capability reference

faa_lookup_registration tool

  • Accepts N12345 or 12345; the leading N is optional
  • Returns decoded aircraft, engine, and status fields as raw code plus label, and the Mode S code in octal and hex (hex is the ICAO 24-bit address)
  • Owner name and address appear only when FAA_REDACT_OWNER_PII=false; otherwise ownerRedacted: true
  • Errors: not_found (no active registration; try faa_get_registration_status), invalid_n_number

faa_get_registration_status tool

  • Checks the active, deregistered, and reserved files in that order
  • recordType is active, deregistered, reserved, or unknown; a never-issued number returns unknown, not an error
  • Status facts only, no owner data
  • Error: invalid_n_number

faa_search_registrations tool

  • Filters: ownerName, makeModel, manufacturerModelCode, state, aircraftType, modeSCode; at least one required, combined with AND
  • limit 1–200 (default 25) with offset paging; responses report totalCount and nextOffset when truncated
  • Each result carries an N-number to pass to faa_lookup_registration
  • Errors: no_filters, invalid_code, invalid_state, invalid_mode_s_code, invalid_aircraft_type, and owner_search_disabled (owner-name search is off while FAA_REDACT_OWNER_PII is on)

faa_search_aircraft_types tool

  • Filters: query (manufacturer/model name), aircraftType (1–9/H/O), category (1–3); at least one required
  • Returns summaries with the code to pass to faa_get_aircraft_type or faa_search_registrations.manufacturerModelCode
  • limit 1–200 (default 25) with offset paging; responses report totalCount and nextOffset when truncated
  • Errors: no_filters, invalid_aircraft_type, invalid_category

faa_get_aircraft_type tool

  • Accepts a 6–7-character uppercase alphanumeric manufacturer/model/series code; find codes with faa_search_aircraft_types
  • Returns manufacturer, model, type, engine, category, seats, engines, weight class, cruise speed, and type-certificate data
  • weightClass keeps the raw FAA string; weightClassLabel decodes it when known
  • Errors: not_found, invalid_code

faa://registration/{nNumber} resource

  • Same payload as faa_lookup_registration; application/json, cached 1 hour
  • nNumber accepts N12345 or 12345
  • Errors: not_found, invalid_n_number

Features

Built 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 registry-specific:

  • Offline and keyless at runtime: queries hit a local SQLite + FTS5 index with no API key or rate limit
  • Daily index refresh under HTTP transport, aligned to the FAA's nightly re-release
  • Pre-joined records: one call returns decoded aircraft, engine, and status
  • Owner name and address are redacted by default, and owner-name search is disabled until FAA_REDACT_OWNER_PII=false
  • Mode S hex codes match the ICAO 24-bit addresses used by flight-tracking feeds

Agent-friendly output:

  • Coded fields carry both the raw FAA code and the decoded label
  • Capped search results flag truncated with shown and cap
  • Fields the FAA leaves blank stay absent rather than filled in
  • recordType and ownerRedacted let callers branch on data

Getting started

Public Hosted Instance

A public instance is available at https://faa-aircraft-registry.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:

json
{  "mcpServers": {    "faa-aircraft-registry-mcp-server": {      "type": "streamable-http",      "url": "https://faa-aircraft-registry.caseyjhand.com/mcp"    }  }}

Self-Hosted / Local

First run requires building the local index — see First-run setup below. The package does not ship the FAA data; until mirror:init has run once, queries fail with a clear "run mirror:init" error.

The Desktop MCPB includes Node's SQLite driver and its cross-platform prebuilts. Build the local index with the bundle's mirror CLI before querying.

Add the following to your MCP client configuration file:

json
{  "mcpServers": {    "faa-aircraft-registry-mcp-server": {      "type": "stdio",      "command": "bunx",      "args": ["@cyanheads/faa-aircraft-registry-mcp-server@latest"],      "env": {        "MCP_TRANSPORT_TYPE": "stdio",        "MCP_LOG_LEVEL": "info",        "FAA_MIRROR_PATH": "/path/to/faa-registry.db"      }    }  }}

Or with npx (no Bun required):

json
{  "mcpServers": {    "faa-aircraft-registry-mcp-server": {      "type": "stdio",      "command": "npx",      "args": ["-y", "@cyanheads/faa-aircraft-registry-mcp-server@latest"],      "env": {        "MCP_TRANSPORT_TYPE": "stdio",        "MCP_LOG_LEVEL": "info",        "FAA_MIRROR_PATH": "/path/to/faa-registry.db"      }    }  }}

Or with Docker (mount a volume at /usr/src/app/.mirror so the built index persists across containers — build it once with docker exec … bun run mirror:init):

json
{  "mcpServers": {    "faa-aircraft-registry-mcp-server": {      "type": "stdio",      "command": "docker",      "args": [        "run", "-i", "--rm",        "-e", "MCP_TRANSPORT_TYPE=stdio",        "-v", "faa-registry:/usr/src/app/.mirror",        "ghcr.io/cyanheads/faa-aircraft-registry-mcp-server:latest"      ]    }  }}

For Streamable HTTP, set the transport and start the server:

sh
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http# Server listens at http://localhost:3010/mcp

FAA_MIRROR_PATH points the server at the index that mirror:init builds — set it to a persistent path so the index survives across runs. Owner PII is redacted by default; set FAA_REDACT_OWNER_PII=false only on a trusted local install to expose owner detail.

First-run setup

The FAA Releasable Aircraft Database is not bundled with the package — it is a public dataset (~70 MB compressed, refreshed daily by the FAA) that the operator downloads and indexes once before first use. Building the index produces a local SQLite file of a few hundred MB.

Build the index out-of-band (never on server startup — a full parse of ~1M rows must not block start). From a source checkout, run bun install && bun run build first. Then, from the checkout, installed package directory, or extracted MCPB directory, run the compiled commands below. Node and Bun both work; replace node with bun to use Bun's built-in SQLite. The Docker image supports bun run mirror:init, mirror:verify, and mirror:refresh.

sh
# Build the local index from the live FAA download (idempotent, resumable)FAA_MIRROR_PATH=/path/to/faa-registry.db node dist/cli/faa-mirror-init.js
# Verify it built (readiness + integrity check)FAA_MIRROR_PATH=/path/to/faa-registry.db node dist/cli/faa-mirror-verify.js
# Rebuild from the latest FAA release (run on a schedule, or out-of-band for stdio)FAA_MIRROR_PATH=/path/to/faa-registry.db node dist/cli/faa-mirror-refresh.js
  • Keep the path stable. Point FAA_MIRROR_PATH (and the same env var in your MCP client config) at a persistent location so the built index is reused across runs. Default: .mirror/faa-registry.db.
  • Daily refresh. Under HTTP transport the server schedules a daily mirror:refresh aligned to the FAA's nightly re-release (~11:30 PM Central). If an interrupted rebuild leaves the index empty, queries fail loudly with ServiceUnavailable until the rebuild succeeds. Under stdio, run mirror:refresh out-of-band (e.g. a cron job).
  • Docker. The image ships the mirror CLI and a writable .mirror data directory owned by the runtime user. Mount a volume there and run mirror:init once (e.g. docker exec <container> bun run mirror:init, or a one-shot init job against the shared volume) so the index persists across container restarts.
  • Until the index exists, every query fails with a ServiceUnavailable error whose recovery hint points to mirror:init — there is no live API to fall back to, so the cold state surfaces loudly rather than returning empty results.

The source URL is overridable via FAA_DATABASE_URL (for a private or cached mirror); it is read only at ingest time, never per request.

Prerequisites

  • Bun v1.4 or higher (or Node.js v24+). Bun uses built-in bun:sqlite; Node uses the included better-sqlite3 dependency, with bundled N-API prebuilts for macOS, Windows, and Linux (glibc/musl), on x64 and arm64.
  • Disk space for the built index (a few hundred MB) at FAA_MIRROR_PATH.
  • Network access at mirror:init / mirror:refresh time to download the FAA ZIP. Not needed at query time.

Installation

For local development or self-hosting from source:

  1. Clone the repository:
sh
git clone https://github.com/cyanheads/faa-aircraft-registry-mcp-server.git
  1. Navigate into the directory:
sh
cd faa-aircraft-registry-mcp-server
  1. Install dependencies:
sh
bun install
  1. Compile the server and build the index (see First-run setup):
sh
bun run buildbun run mirror:init

Configuration

VariableDescriptionDefault
FAA_REDACT_OWNER_PIIRedact owner name and address and disable owner-name search. Unset, empty, or malformed counts as true.true
FAA_MIRROR_PATHPath to the SQLite index file; use a persistent location..mirror/faa-registry.db
FAA_DATABASE_URLSource URL for the FAA database ZIP, read only by mirror:init / mirror:refresh.FAA registry ZIP
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_SESSION_MODESession mode: auto, stateful, or stateless.stateless
MCP_HTTP_PORTPort for the HTTP server.3010
MCP_HTTP_ENDPOINT_PATHHTTP endpoint path where the MCP server is mounted./mcp
MCP_AUTH_MODEAuth mode: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (RFC 5424).info
LOGS_DIRDirectory for log files (Node.js only).<project-root>/logs
LOG_TOOL_FAILURE_PAYLOADSLog each failed tool call's arguments and result (cap: LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES, default 16384).false
OTEL_ENABLEDEnable OpenTelemetry instrumentation.false

See .env.example for the full list of optional overrides.

Running the server

Local development

  • Build and run:

    sh
    # One-time buildbun run rebuild
    # Build the local index (see First-run setup)bun run mirror:init
    # Run the built serverbun run start:stdio# orbun run start:http
  • Run checks and tests:

    sh
    bun run devcheck   # Lint, format, typecheck, securitybun run test       # Vitest unit and integration testsbun run test:package # npm tarball + cleaned MCPB runtime checksbun run lint:mcp   # Validate MCP definitions against spec

Docker

sh
docker build -t faa-aircraft-registry-mcp-server .docker run --rm -e MCP_TRANSPORT_TYPE=http -p 3010:3010 \  -v faa-registry:/usr/src/app/.mirror faa-aircraft-registry-mcp-server# Build the index once against the mounted volume:docker run --rm -v faa-registry:/usr/src/app/.mirror faa-aircraft-registry-mcp-server bun run mirror:init

The Dockerfile defaults to HTTP transport with stateless sessions, ships the mirror:init/mirror:refresh/mirror:verify CLI, pre-creates a writable .mirror data directory owned by the runtime user (mount a volume there and run mirror:init once to build and persist the index), and logs to /var/log/faa-aircraft-registry-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/index.tscreateApp() entry point — registers tools and the resource, inits the registry service, and schedules the daily refresh under HTTP transport.
src/configServer-specific environment variable parsing and validation with Zod.
src/mcp-server/toolsTool definitions (*.tool.ts).
src/mcp-server/resourcesResource definitions (*.resource.ts).
src/services/registryRegistry service — the SQLite + FTS5 mirror, ingester, decode maps, N-number normalizer, and the owner-PII redaction gate.
src/cli/Mirror lifecycle CLI — compiled to dist/cli/ for mirror:init, mirror:refresh, mirror:verify.
tests/Unit and integration tests mirroring src/.

Development guide

See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for request-scoped logging, ctx.state for tenant-scoped storage
  • Register new tools and resources via the barrels in src/mcp-server/*/definitions/index.ts

Contributing

Issues are welcome. Run checks and tests before submitting:

sh
bun run devcheckbun run test

License

Apache-2.0 — see LICENSE for details.

The FAA Releasable Aircraft Database is a public-domain US Government work, published by the FAA Civil Aviation Registry. This project redistributes none of that data; operators download it directly from the FAA at install time.

Source: README.md at commit 6e10735

Tools

5

faa_lookup_registration

faa-aircraft-registry-mcp-server: lookup registration

Decode one US civil aircraft N-number to its full registration record — aircraft make/model, engine, year manufactured, airworthiness, registration status, Mode S (ICAO 24-bit) code, and registered owner (when owner-PII redaction is off). Accepts "N12345" or "12345" (the leading N is optional). Returns ownerRedacted: true when owner details were withheld. A number that is known but inactive (deregistered or reserved) is not found here — use faa_get_registration_status for its current state.

ParametersnNumberrequired

faa_get_aircraft_type

faa-aircraft-registry-mcp-server: get aircraft type

Decode a 6–7-character FAA manufacturer/model/series code to aircraft specifications — manufacturer, model, aircraft category, aircraft type, engine type, number of engines, number of seats, weight class, cruise speed, and type-certificate data sheet/holder. Use faa_search_aircraft_types first to discover a code by manufacturer or model name.

Parameterscoderequired

faa_search_registrations

faa-aircraft-registry-mcp-server: search registrations

Search active US civil aircraft registrations by owner name, make/model, exact manufacturerModelCode, state, aircraft type, or Mode S (hex) code. Discover codes with faa_search_aircraft_types, search registrations by manufacturerModelCode, then drill into N-numbers via faa_lookup_registration. Filters are AND-combined; at least one is required. Owner-name search is unavailable when this deployment redacts owner PII — use the other filters instead. Every response reports totalCount (all matches, not just this page); when more remain, it returns nextOffset — pass it back as offset to page forward.

ParameterslimitstateoffsetmakeModelmodeSCodeownerNameaircraftTypemanufacturerModelCode

faa_search_aircraft_types

faa-aircraft-registry-mcp-server: search aircraft types

Search FAA aircraft types by manufacturer/model name, aircraft type code, or category code to discover 6–7-character manufacturer/model/series codes and browse specifications. Pass a code to faa_get_aircraft_type for specs or faa_search_registrations as manufacturerModelCode for exact registration matches, then faa_lookup_registration for details. At least one filter is required. Every response reports totalCount (all matches, not just this page); when more remain, it returns nextOffset — pass it back as offset to page forward.

ParameterslimitqueryoffsetcategoryaircraftType

faa_get_registration_status

faa-aircraft-registry-mcp-server: get registration status

Resolve whether a US civil aircraft N-number is active, deregistered, reserved, or unknown, including the available registration and airworthiness status. Use this rather than faa_lookup_registration when a number may be inactive. A number that was never issued returns recordType "unknown" — a valid, informative answer, not an error. Accepts "N12345" or "12345".

ParametersnNumberrequired

Version history

5
  1. v0.1.12LatestOct 18, 2026
  2. v0.1.11Oct 16, 2026
  3. v0.1.10Oct 9, 2026
  4. v0.1.9Sep 21, 2026
  5. v0.1.8Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts