Faa Airmen Registry Mcp Server

io.github.cyanheads由 GitHub 帳號 cyanheads 發布v0.3.1更新於 Oct 30, 2026

Search FAA airmen certificates, ratings, and informational medical records.

已驗證Streamable HTTP可網頁執行資料庫位置與生活

概覽

AI 產生的概覽

在本機 FAA 飛行員快照中查詢證書、等級、教官與遠端飛行員紀錄,以及僅供參考的體檢欄位。

可以做什麼
  • 依姓名或 FAA 唯一 ID 解析出各自獨立的身份候選,並讀取其證書紀錄
  • 讀取飛行員、飛行教官、遠端飛行員與飛行工程師證書及其有序等級與機型等級
  • 依姓名、州與等級代碼尋找飛行及地面教官,並尋找遠端飛行員證書持有人
  • 依唯一 ID 讀取僅供參考的體檢等級、體檢日期與 BasicMed 日期
  • 讀取證書、級別、等級與機型等級代碼、識別與體檢說明,以及鏡像狀態
適用情境
適合需要離線核對 FAA 飛行員認證紀錄的情境:確認某個姓名或 ID 是否持有特定證書或等級、尋找某州的飛行或地面教官,或讀取僅供參考的體檢欄位。託管端點無需任何設定即可使用,自行架設則可取得完整功能。
執行需求
可使用公開託管的 HTTP 端點(無需安裝或快照),或透過 npx 在本機執行,需要 Node.js 24+ 或 Bun 1.4.0+。本機安裝需先以鏡像 CLI 建立快照:下載約 57 MB,資料約 1.75 GB,預留約 3 GB 磁碟空間,僅初始化與更新時需要網路。不需要 API 金鑰。主要設定項:FAA_AIRMEN_MIRROR_DIR、FAA_AIRMEN_REDACT_PII、FAA_AIRMEN_INCLUDE_LOCATION,以及選用的 MCP_TRANSPORT_TYPE、MCP_HTTP_HOST、MCP_HTTP_PORT 與 MCP_AUTH_MODE。
安裝前請注意
個人資料遮蔽預設開啟;將 FAA_AIRMEN_REDACT_PII 設為 false 會揭露姓名、城市與郵遞區號並啟用體檢查詢,因此只應在個人安裝時這樣做。匯入與篩選城市及郵遞區號需要 FAA_AIRMEN_INCLUDE_LOCATION=true。結果僅供參考:查無資料不代表某人沒有證書,查到也不代表目前執照權限、體檢合格或教官資格有效。託管執行個體一律開啟遮蔽。此伺服器為唯讀,本身不會下載資料。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Faa Airmen Registry Mcp Server,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.cyanheads%2Ffaa-airmen-registry-mcp-server/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

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

README

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

Search FAA airmen certificates, ratings, and informational medical records via MCP. STDIO or Streamable HTTP.

6 Tools


Overview

FAA airmen certification records from the Releasable Airmen Database, served from a local snapshot. Resolve names to separate identity candidates, read pilot and non-pilot certificates with their ordered ratings, find flight and ground instructors and remote pilots, and read informational medical fields.

Runs as a stdio process, a loopback Streamable HTTP server (directly or in Docker), or the public hosted endpoint above. A self-hosted operator builds the snapshot with a separate CLI; the server never downloads data, and no API key is needed.

Tools

ToolDescription
faa_airmen_verify_certificateFind identity candidates by name or FAA Unique ID, optionally narrowed by certificate type, level, and ratings, and read their complete certificate records
faa_airmen_get_type_ratingsRead a person's pilot, flight instructor, remote pilot, and flight engineer certificates with their aircraft type, category/class, and instrument ratings
faa_airmen_check_medical_statusRead informational medical and BasicMed fields without assessing fitness or eligibility
faa_airmen_search_instructorsFind flight and ground instructor records by name, state, and ratings
faa_airmen_verify_remote_pilotFind releasable remote pilot certificate records by name or Unique ID
faa_airmen_list_referenceRead codes, interpretation guidance, observed type designators, and mirror status

Capability reference

faa_airmen_verify_certificate tool

  • mode: "name" requires lastName; firstName, state, city, and zipCode narrow it. nameMatch applies to each supplied name field: words (default) matches whole leading words, so JOHN finds the FIRST NAME JOHN ROBERT (FAA first names usually include middle names) and SMITH finds the LAST NAME SMITH JR; only a space separates words, so SMITH does not find SMITH-JONES. exact compares the whole field, and prefix matches from its beginning, mid-word included
  • mode: "id" takes one uniqueId, an opaque A or C plus seven digits that is not a certificate number, and rejects name and location fields
  • certificateType (a type letter, its reference topic certificate_types description such as remote pilot or flight_instructor in any case, or CFI) selects people but returns all their certificates; people sharing a name stay separate candidates
  • certificateLevel (one letter from reference topic certificate_levels; requires certificateType), ratingCodes (1–11 codes from topic ratings), and typeRatings (1–11 designators from topic type_ratings, such as B-737) narrow candidates further. Every requested credential must sit on one certificate, and matches still return all their certificates. Repeats collapse. A bare code or designator matches any level, and level/code only that slot's level: A/B-737 is a type rating held at ATP level, while certificateLevel: "A" with B-737 asks for an ATP certificate carrying it at any level, C/B-737 included
  • ratingCodes carries the same CFII and MEI mapping as faa_airmen_search_instructors; CFII or MEI sent as a code matches nothing. When a zero result routes to topic ratings and the codes sent include CFII, MEI, or one of their codes, the notice names the alternatives and, unless the call sent certificateType: "F", says to send each with it, since a bare INSTA also matches a pilot certificate's instrument rating
  • A zero result with credential filters says how many people the name search matches without them, so a name miss reads apart from a credential miss
  • With FAA_AIRMEN_REDACT_PII on (the default), name mode needs both lastName and firstName and refuses nameMatch: "prefix", city, and zipCode with pii_redacted; city and ZIP are omitted from results

faa_airmen_get_type_ratings tool

  • One uniqueId from a faa_airmen_verify_certificate, faa_airmen_search_instructors, or faa_airmen_verify_remote_pilot result; returns every certificate from the FAA pilot files (pilot, flight instructor, authorized aircraft instructor, remote pilot, flight engineer) with ordered ratings and typeRatings slots, each keeping its raw value, ordinal, and code
  • Ground instructor, mechanic, and other non-pilot certificates are not included; faa_airmen_verify_certificate in mode: "id" returns every certificate
  • found: false for an unknown ID; a known person with only non-pilot certificates gets an empty certificates array

faa_airmen_check_medical_status tool

  • One uniqueId from a faa_airmen_verify_certificate, faa_airmen_search_instructors, or faa_airmen_verify_remote_pilot result; returns each distinct reported medical record: medicalClass, medicalDateRaw and medicalExpireDateRaw (normally MMYYYY), and the BasicMed course and checklist dates (normally YYYYMMDD)
  • found separates an unknown ID from a known person, and hasReportedMedicalFields: false means nothing was reported, never an adverse finding. Every result carries a disclaimer: the fields are informational, not evidence of fitness or eligibility
  • With FAA_AIRMEN_REDACT_PII on (the default), every call is refused with pii_redacted

faa_airmen_search_instructors tool

  • Needs at least one of lastName, firstName, state, city, zipCode, or ratingCodes; instructorType is flight (F), ground (G), or both (default)
  • ratingCodes takes 1–11 codes from reference topic ratings, all required on the same certificate; repeats collapse. A bare code matches any source level, and level/code (the raw form results return, such as F/INSTA; the level is one letter) only that level. CFII is INSTA, INSTH, INSTI, or INSTP on F and MEI is AME or ASME; INST, ADV, and BASIC occur only on G
  • A zero result that sent ratingCodes with a name or location filter counts the instructors of the requested type those filters match without the codes: a positive count points to the rating codes, zero to the name and location filters. A rating-codes route after CFII, MEI, or one of their codes also names the alternatives; after an instructorType: "ground" search it says to send them with flight or both, since all of them sit on F
  • With FAA_AIRMEN_REDACT_PII on (the default), a name search needs both lastName and firstName, and nameMatch: "prefix", city, and zipCode are refused with pii_redacted; city and ZIP are omitted from results
  • Matches carry their complete qualifying instructorCertificates. Legacy expiry fields don't establish currency, and CFI certificates no longer expire under the December 2024 rule

faa_airmen_verify_remote_pilot tool

  • Same mode, uniqueId, and name selectors as faa_airmen_verify_certificate; returns only people holding U certificates, with all of them in remotePilotCertificates
  • With FAA_AIRMEN_REDACT_PII on (the default), the same name restrictions apply: both names required, and nameMatch: "prefix", city, and zipCode refused with pii_redacted
  • Certificate presence doesn't establish Part 107 recurrent-training currency or operating authority

faa_airmen_list_reference tool

  • topic is certificate_types, certificate_levels, ratings, type_ratings, identifiers, medical_guidance, or mirror_status; the four vocabulary topics take a case-insensitive filter of up to 80 characters
  • Static topics and mirror_status answer before a snapshot exists; type_ratings lists the designators observed in the imported snapshot
  • mirror_status returns mirrorStatus.state (missing, ready, unavailable), refreshState (idle, running, failed, or unreadable when REFRESH.json can't be read or isn't a valid refresh record; removing it is safe, and the next refresh rewrites it), lastRefreshFailure (the stage of a refresh that didn't complete, such as acquisition, validation, disk, cancelled, timeout, or interrupted for one whose process ended without recording a result), and the latest generation's provenance, without filesystem paths

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

  • Offline SQLite lookups over the four monthly source files (PILOT_BASIC, NONPILOT_BASIC, PILOT_CERT, NONPILOT_CERT), joined by FAA Unique ID, keeping every distinct certificate and differing identity variant
  • Street addresses are discarded before anything is stored. City and ZIP import, output, and filtering need FAA_AIRMEN_INCLUDE_LOCATION=true; state is always available
  • Serving-time redaction is on by default (FAA_AIRMEN_REDACT_PII, only false turns it off): name searches need first and last name, prefix matching and city/ZIP filters are refused, city and ZIP are omitted from output, and faa_airmen_check_medical_status refuses every call. Refusals carry the reason pii_redacted, every successful response carries piiRedacted, and the mirror import is unaffected
  • The faa-airmen-registry-mirror CLI downloads and validates each snapshot into an immutable generation; a failed refresh leaves the last complete one serving
  • The FAA omits airmen who withhold address release and publishes no certificate numbers or recurrent-training dates. A miss is not evidence that someone is uncertificated, and a match is not a current-privilege determination; use the FAA's official services for authoritative answers

Agent-friendly output:

  • Provenance on every snapshot-backed response: source name, snapshot month, source age with a stale flag, generation ID, and the generation's location import policy, plus the normalized appliedFilters; faa_airmen_list_reference topic mirror_status returns the full record, including hashes, row counts, and source-quality warning counts
  • Whole-record paging: list tools return complete people within a ~24 KiB response budget, so limit (default 10, at most 50; a larger limit returns 50 with a notice) is an upper bound. totalCount, returnedCount, and nextOffset describe the actual page, and a page the budget cut short of limit says so in its notice with the offset to continue from; offsets stop at 10,000, where atPagingCap asks for narrower filters
  • A published Agent Skill, faa-airmen-registry-guide, served over MCP as skill://faa-airmen-registry-guide/SKILL.md and shipped in the plugin, npm package, .mcpb, and image: mapping CFII, MEI, ATP, and type-rating shorthand to codes, one call per alternative code, name matches that miss silently, reading each rating at its own level, and the stop rule before reporting a credential absent
  • Typed failures that name the next call: mirror_missing, location_access_disabled, pii_redacted, invalid_filter, and the other declared reasons each carry a recovery step. A validation failure names the field and its expected form (state must be a two-letter USPS state, territory, or military code.), never the value, and empty pages still return totals and guidance

Getting started

Connect to the hosted instance, no install or snapshot:

sh
claude mcp add --transport http faa-airmen-registry-mcp-server https://faa-airmen-registry.caseyjhand.com/mcp

The hosted instance runs with redaction on: name searches need both first and last names, nameMatch: "prefix" and city/ZIP searches are refused, and medical lookups are unavailable. Whole leading words remain supported by the default words matching. For the full surface, self-host with FAA_AIRMEN_REDACT_PII=false.

Or run it locally. A local install serves its own snapshot, so build it before connecting a client:

sh
export FAA_AIRMEN_MIRROR_DIR="$HOME/.local/share/faa-airmen-registry-mcp-server"npx -y --package @cyanheads/faa-airmen-registry-mcp-server faa-airmen-registry-mirror init

init downloads the FAA archive (about 57 MB) and builds a ~1.75 GB snapshot in about 12 minutes; allow about 3 GB of disk. Point the MCP client at the same FAA_AIRMEN_MIRROR_DIR, and set FAA_AIRMEN_REDACT_PII=false on a personal install that wants the full surface. Refreshing, pruning old generations, and keeping city and ZIP are covered in docs/snapshot.md.

Then add it to Claude Code with the same snapshot directory:

sh
claude mcp add faa-airmen-registry-mcp-server -e FAA_AIRMEN_MIRROR_DIR="$FAA_AIRMEN_MIRROR_DIR" -- npx -y @cyanheads/faa-airmen-registry-mcp-server

For other clients, add this to the MCP config file:

json
{  "mcpServers": {    "faa-airmen-registry-mcp-server": {      "command": "npx",      "args": ["-y", "@cyanheads/faa-airmen-registry-mcp-server"],      "env": { "FAA_AIRMEN_MIRROR_DIR": "/absolute/path/to/airmen-mirror" }    }  }}

For Docker, Streamable HTTP, or a source build, see Running the server.

Configuration

VariableDescriptionDefault
FAA_AIRMEN_MIRROR_DIRPersistent snapshot directory, shared by the CLI and the server.Platform user-data directory plus faa-airmen-registry-mcp-server
FAA_AIRMEN_INCLUDE_LOCATIONtrue opts in to city and ZIP import, and to output and filtering when FAA_AIRMEN_REDACT_PII=false; false disables them.false
FAA_AIRMEN_REDACT_PIIServing-time redaction, on by default; only false (any case) turns it off, and any other value leaves it on. Never changes what the mirror imports.true
FAA_AIRMEN_STALE_AFTER_DAYSSource-age warning threshold, integer 1–366; never a credential verdict.45
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_HOSTHTTP bind address.127.0.0.1
MCP_HTTP_PORTHTTP server port.3010
MCP_SESSION_MODEHTTP session mode: stateless, stateful, or auto; a meaningful value overrides the server's stateless declaration.stateless
MCP_AUTH_MODEAuthentication: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (debug, info, warning, error, etc.).info
OTEL_ENABLEDEnable OpenTelemetry.false

See .env.example for the common framework overrides. Framework storage settings don't relocate the FAA snapshot.

Running the server

Local development

Requires Bun v1.4.0 or higher (or Node.js v24+) and about 3 GB of persistent local storage for the snapshot; network access is needed only for init and refresh. Under Node, better-sqlite3 loads prebuilt bindings for macOS, Linux, and Windows on x64 and arm64 with no compiler step. Execution is tested on macOS under Node and Bun.

  • Clone and install:

    sh
    git clone https://github.com/cyanheads/faa-airmen-registry-mcp-server.gitcd faa-airmen-registry-mcp-server && bun installcp .env.example .env# set FAA_AIRMEN_MIRROR_DIR, and FAA_AIRMEN_INCLUDE_LOCATION if you want city and ZIP# FAA_AIRMEN_REDACT_PII=false lifts serving-time redaction on a personal local install
  • Build, initialize the snapshot, and run:

    sh
    # One-time build and snapshotbun run rebuildnode --env-file=.env dist/cli/mirror.js init
    # Run the built serverbun run start:stdio# or, on loopback at http://127.0.0.1:3010/mcpbun run start:http

    The CLI doesn't load .env itself; pass --env-file=.env or export the variables.

  • Run checks and tests:

    sh
    bun run devcheck   # Lint, format, typecheck, securitybun run test       # Vitest test suitebun run lint:mcp   # Validate MCP definitions against spec

Docker

The image keeps its snapshot in /data/airmen, so initialize a named volume first; run the same command with refresh, verify, or status for maintenance, and with prune once every server container using the volume is stopped:

sh
docker volume create faa-airmen-datadocker run --rm -v faa-airmen-data:/data/airmen ghcr.io/cyanheads/faa-airmen-registry-mcp-server:latest bun dist/cli/mirror.js initdocker run --rm -p 127.0.0.1:3010:3010 -v faa-airmen-data:/data/airmen ghcr.io/cyanheads/faa-airmen-registry-mcp-server:latest

The image defaults to HTTP transport, stateless session mode, and logs to /var/log/faa-airmen-registry-mcp-server; the last command publishes it on loopback only, at http://127.0.0.1:3010/mcp. To run it over stdio from an MCP client, use "command": "docker" with "args": ["run", "-i", "--rm", "-v", "faa-airmen-data:/data/airmen", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/faa-airmen-registry-mcp-server:latest"]. To build locally, docker build -t faa-airmen-registry-mcp-server .; OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/mcp-server/toolsTool definitions (*.tool.ts), shared schemas, and lossless rendering. Six read-only tools.
src/services/airmenFAA acquisition, streaming import, immutable snapshot lifecycle, queries, and reference tables.
src/cliThe faa-airmen-registry-mirror operator CLI.
src/configServer-specific environment variable parsing and validation with Zod.
skills/The published faa-airmen-registry-guide Agent Skill for agents calling the tools.
tests/Synthetic-source lifecycle, query, and MCP contract tests.

Development guide

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

  • Handlers throw, framework catches — no try/catch in tool logic
  • The snapshot is operator-owned and read-only; keep it in the service layer and use ctx.state only for tenant state
  • Register new tools in the createApp() arrays in src/index.ts
  • Validate source rows → normalize to domain types → return the output schema; never fabricate missing fields, never persist street addresses, and use synthetic identities in tests and examples

Contributing

Issues are welcome. Run checks and tests before submitting:

sh
bun run devcheckbun run test

License

This project is licensed under the Apache 2.0 License. See the LICENSE file for details.

來源:README.md,提交 8440005

工具

6

faa_airmen_verify_certificate

Faa Airmen Verify Certificate

Find releasable FAA airman records by exact Unique ID or name and read their certificate records. Use name mode to discover IDs, then use an ID for ratings or informational medical fields. Certificate type, level, rating, and type-rating filters must all match one certificate, and each match still returns all its certificates. While the operator's personal-data redaction is on (the default), name mode needs lastName and firstName, nameMatch prefix and city or ZIP filters are rejected, and city and ZIP are withheld. A missing or matching record is not a current licensing or operating-privilege determination.

輸入參數citymode必填limitstateoffsetzipCodelastNameuniqueIdfirstNamenameMatchratingCodestypeRatings另有 2 個

faa_airmen_get_type_ratings

Faa Airmen Get Type Ratings

Read one FAA airman's certificates from the FAA pilot file, by Unique ID: pilot, flight instructor, authorized aircraft instructor, remote pilot, and flight engineer, each with every aircraft type, category/class, and instrument rating. Ground instructor, mechanic, and other non-pilot certificates are excluded; faa_airmen_verify_certificate mode id returns every certificate. Get the ID from a faa_airmen_verify_certificate, faa_airmen_search_instructors, or faa_airmen_verify_remote_pilot result. Ratings retain their source certificate type and level and do not establish current operating privileges.

輸入參數uniqueId必填

faa_airmen_check_medical_status

Faa Airmen Check Medical Status

Read the FAA snapshot's informational medical class, medical dates, and BasicMed dates for one airman Unique ID. These fields are not authoritative medical certification or fitness determinations. Get the ID from a faa_airmen_verify_certificate, faa_airmen_search_instructors, or faa_airmen_verify_remote_pilot result. Every call is rejected while the operator's personal-data redaction is on (the default).

輸入參數uniqueId必填

faa_airmen_search_instructors

Faa Airmen Search Instructors

Find releasable flight and ground instructor certificate records by name, state, and rating codes. Supply at least one name, state, city, ZIP, or rating filter. City and ZIP filters require operator-enabled location access. While the operator's personal-data redaction is on (the default), lastName and firstName are both required, nameMatch prefix and city or ZIP filters are rejected, and city and ZIP are withheld. Legacy expiry fields do not establish instructor currency; CFI certificates no longer expire under the December 2024 rule.

輸入參數citylimitstateoffsetzipCodelastNamefirstNamenameMatchratingCodesinstructorType

faa_airmen_verify_remote_pilot

Faa Airmen Verify Remote Pilot

Find releasable FAA remote pilot certificate records by Unique ID or name. While the operator's personal-data redaction is on (the default), name mode needs lastName and firstName, nameMatch prefix and city or ZIP filters are rejected, and city and ZIP are withheld. Results establish certificate presence in the local snapshot; they do not establish recurrent-training currency, commercial operating authority, or current Part 107 eligibility.

輸入參數citymode必填limitstateoffsetzipCodelastNameuniqueIdfirstNamenameMatch

faa_airmen_list_reference

Faa Airmen List Reference

Read FAA certificate and rating codes, observed aircraft type designators, identity guidance, medical guidance, or local mirror status. Use these references to construct lookup filters and interpret snapshot limits. Static topics work before mirror initialization.

輸入參數limittopic必填filteroffset

版本歷史

4
  1. v0.3.1最新Oct 29, 2026
  2. v0.2.1Oct 25, 2026
  3. v0.2.0Oct 21, 2026
  4. v0.1.1Oct 21, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分