FlightByte MCP Server
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@FlightByte MCP ServerIs TK1848 on time today? Which gate?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Quick start
Get a free API key at app.flightbyte.dev/signup.
Connect the server. Use the hosted one, or run it locally:
Address
Key
Hosted
https://mcp.flightbyte.dev/mcpAuthorization: Bearer <key>headerLocal
npx -y @flightbyte/mcpFLIGHTBYTE_KEYenvironment variableIn Claude Code, for example:
claude mcp add --transport http flightbyte https://mcp.flightbyte.dev/mcp \ --header "Authorization: Bearer $FLIGHTBYTE_KEY"Every other client is under Install.
Ask: "Is TK1848 on time today?"
In Claude (claude.ai, Desktop or mobile) there is nothing to copy: FlightByte is in Claude's connector directory. Add it there, and the first time Claude needs your account it asks you to sign in to FlightByte and allow it. See Sign in with OAuth.
The docs tools work without a key or a sign-in, so an assistant can read the documentation before you have signed up.
Related MCP server: FlightTicketMCP
What you can ask
You ask | What happens |
"Is TK1848 on time today? Which gate?" |
|
"TK1 from Istanbul tomorrow: when does it leave?" | TK1 flies two legs that day. The assistant passes |
"Watch PC1001 on Friday and post every change to https://api.example.com/hooks/flights." |
|
"Our webhook stopped firing. Why?" |
|
"Add a FlightByte webhook receiver with signature verification to this Express app." |
|
Tools
Docs: no key needed.
Tool | What it does |
| Keyword search over the whole documentation: docs, API reference, guides and glossary. Returns titles, links and snippets. |
| Any docs page as Markdown, from a link or a path like |
Flights: read-only.
Tool | What it does |
| Live status of one flight leg: phase, gates, terminals, baggage belt, scheduled, estimated and actual times, delay, aircraft, codeshares, and every leg the number flies that day. |
| The same lookup with query parameters. |
| The airline's own change history for a leg, newest first. |
Subscriptions
Tool | What it does | Access |
| Watch a flight and get a signed webhook for every change. Counts as a watched flight on your plan. | writes |
| Your subscriptions, filtered by status, carrier, number or date. | read-only |
| One subscription with its status and delivery counters. | read-only |
| Change the webhook URL, event filter, delay threshold, headers or metadata. | writes |
| Stop polling and deliveries without losing anything. | writes |
| Resume a paused or auto-suspended subscription. | writes |
| Delete a subscription for good. | destructive |
| Send a signed test webhook to the subscription's URL. | writes |
| Recent delivery attempts with HTTP status and errors. | read-only |
| Recent events with the exact payloads that were sent. | read-only |
Parameters carry the API's own names (carrier, flightNumber, date, origin, webhookUrl, Idempotency-Key, …), and the test suite checks every one against the OpenAPI document. Results are the API's JSON, as text and as structured content.
Built for assistants
Your key stays yours. The local server reads
FLIGHTBYTE_KEY. The hosted server reads the key from each request's header, uses it for that request only, and never stores or logs it. Signed in with OAuth, the app never sees a key at all, and you can revoke it under Connected apps.Secrets stay out of the chat. There are no tools to reveal or rotate a webhook signing secret, because either would put it into the model's context and from there into transcripts.
create_subscriptionreturns the secret once, as the API does, and tells the assistant to hand it to you. Reveal or rotate a secret yourself with the API: reveal, rotate.Clients know what is safe. Read-only tools are marked read-only and
delete_subscriptionis marked destructive, so clients can ask before running it.create_subscriptiontells the model it creates a billable watched flight and should only run when you ask for one.Errors say what to do next. A flight number that flies twice comes back with its legs and "pass
origin". A429comes back with how long to wait. A402 watched_flight_limitsays to stop, when the allowance resets, and where to upgrade; a402 overage_cap_reachedsays the cap you set on extra flights is reached and where to raise or remove it.Docs fetches stay on flightbyte.dev.
get_doc_pagerefuses every other host.
Install
Replace YOUR_FLIGHTBYTE_KEY with your key. Every client below can use the hosted server; the local one needs Node.js 20 or later.
Hosted:
claude mcp add --transport http flightbyte https://mcp.flightbyte.dev/mcp \
--header "Authorization: Bearer YOUR_FLIGHTBYTE_KEY"Local:
claude mcp add flightbyte --env FLIGHTBYTE_KEY=YOUR_FLIGHTBYTE_KEY \
-- npx -y @flightbyte/mcpAdd --scope user to have it in every project. To share it with a team through a committed .mcp.json, keep the key in each person's environment:
{
"mcpServers": {
"flightbyte": {
"type": "http",
"url": "https://mcp.flightbyte.dev/mcp",
"headers": { "Authorization": "Bearer ${FLIGHTBYTE_KEY}" }
}
}
}Click Add to Cursor at the top for the hosted server, or this link for the local one, then replace YOUR_FLIGHTBYTE_KEY in the installed entry. Or add it to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
{
"mcpServers": {
"flightbyte": {
"url": "https://mcp.flightbyte.dev/mcp",
"headers": { "Authorization": "Bearer YOUR_FLIGHTBYTE_KEY" }
}
}
}Local:
{
"mcpServers": {
"flightbyte": {
"command": "npx",
"args": ["-y", "@flightbyte/mcp"],
"env": { "FLIGHTBYTE_KEY": "YOUR_FLIGHTBYTE_KEY" }
}
}
}"Bearer ${env:FLIGHTBYTE_KEY}" also works, if Cursor was started from a shell that has the variable.
Click Install in VS Code at the top: VS Code asks for the key and stores it securely. Or add it to .vscode/mcp.json:
{
"inputs": [
{ "type": "promptString", "id": "flightbyte_key", "description": "FlightByte API key", "password": true }
],
"servers": {
"flightbyte": {
"type": "http",
"url": "https://mcp.flightbyte.dev/mcp",
"headers": { "Authorization": "Bearer ${input:flightbyte_key}" }
}
}
}Local, from a terminal:
code --add-mcp '{"name":"flightbyte","type":"stdio","command":"npx","args":["-y","@flightbyte/mcp"],"env":{"FLIGHTBYTE_KEY":"YOUR_FLIGHTBYTE_KEY"}}'Add the local server to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then quit and reopen Claude:
{
"mcpServers": {
"flightbyte": {
"command": "npx",
"args": ["-y", "@flightbyte/mcp"],
"env": { "FLIGHTBYTE_KEY": "YOUR_FLIGHTBYTE_KEY" }
}
}
}Or skip the key: add FlightByte from Claude's connector directory, or add the hosted server under Customize → Connectors → Add custom connector with the URL https://mcp.flightbyte.dev/mcp (on Team and Enterprise plans an Owner adds it under Organization settings → Connectors). If the dialog asks, pick Sign in when needed and Use Claude's published identity. The docs tools work right away; the first time Claude calls a tool that needs your account, it shows a Connect button, you sign in to FlightByte and allow it, and the call goes through. See Sign in with OAuth.
Streamable HTTP:
https://mcp.flightbyte.dev/mcpwith the headerAuthorization: Bearer YOUR_FLIGHTBYTE_KEY(orx-api-key: YOUR_FLIGHTBYTE_KEY).stdio: command
npx, arguments-y @flightbyte/mcp, environmentFLIGHTBYTE_KEY=YOUR_FLIGHTBYTE_KEY.
Both speak MCP 2026-07-28 and the 2025 revisions (2024-11-05 to 2025-11-25); the client's first message picks one. A Streamable HTTP client that supports MCP authorization can sign in with OAuth instead of sending a key.
Sign in with OAuth
The hosted server is an OAuth 2.1 protected resource, as the MCP authorization spec describes, so clients that take OAuth and no API key (Claude's connectors) can use it with your account.
Signed out,
initialize,tools/list,search_docsandget_doc_pagework. Calling an API tool answers401withWWW-Authenticate: Bearer resource_metadata="https://mcp.flightbyte.dev/.well-known/oauth-protected-resource/mcp", which is what makes the client offer to sign in.The authorization server is the FlightByte API (
https://api.flightbyte.dev, metadata at/.well-known/oauth-authorization-server). You sign in to the dashboard and allow the app there; it acts as one of your API keys, so that key's plan, quota, logs and watched flights apply. Clients identify themselves with a Client ID Metadata Document (as Claude and Claude Code do) or register dynamically; PKCE is required, and refresh tokens rotate.Scopes:
flights:read(the flight tools),subscriptions:read(listing watches, deliveries and events) andsubscriptions:write(creating, changing and deleting watches, and test events). A tool outside the granted scopes answers403 insufficient_scope.Tokens are never passed through. The MCP spec forbids sending a client's token on to another API, so this server trades it at the authorization server (RFC 8693) for a short-lived token for the API, with a client secret of its own, and keeps the trade in memory until it expires. Revoking the app under Connected apps, or revoking the key it acts as, stops it on its next request.
API keys work exactly as before, in either header. OAuth is off unless
FLIGHTBYTE_OAUTH_CLIENT_SECRETis set.
Configuration
Variable | Used by | Default | Meaning |
| local | none | Your API key. Without it the API tools explain how to set one and the docs tools still work. The hosted server ignores it and reads the key from each request. |
| both |
| API base URL, e.g. |
| both |
| Docs site that serves |
| HTTP |
| Listening port. |
| HTTP |
| Listening address. |
| HTTP |
| Requests to |
| HTTP |
| How many reverse proxies' |
| HTTP | loopback names on a loopback | Comma-separated |
| HTTP | none | Turns OAuth on: this server's secret at the authorization server, used only to trade tokens. Must match the API's |
| HTTP |
| This server's public origin; the OAuth resource is |
| HTTP |
| The authorization server named in the protected resource metadata. |
| HTTP |
| Where tokens are traded, e.g. the API's internal address. |
| HTTP |
| This server's client id at the authorization server. |
Self-hosting
The hosted server is this repository's Dockerfile: a stateless Streamable HTTP server with no database. Its one secret is the OAuth client secret, and only when OAuth is on.
docker build -t flightbyte-mcp .
docker run -p 8080:8080 flightbyte-mcpIt serves POST /mcp and GET /healthz. Each request gets a fresh server bound to the key in its headers; responses are plain JSON with no sessions, so it scales to any number of replicas. Requests in the 2026-07-28 format are served by the SDK's per-request handler, and 2025-era requests by a JSON-mode Streamable HTTP transport. Deployment notes for Dokploy are in DEPLOY.md.
Development
Running the server needs Node.js 20 or later; developing it needs 22.12 or later.
npm install
npm run build # TypeScript → dist/
npm test # builds, then runs everything against a local mock of the API and docs
npm run typecheck
npm run lintThe tests never touch the real API and need no key. They cover every tool's request mapping, the error mapping, docs parsing and ranking, and both transports end to end: the built dist/stdio.js and dist/http.js are spawned and driven by MCP clients on protocol 2025-11-25 and 2026-07-28, including one built on the v1 SDK. A drift check fails when a tool's parameter names, locations, required fields or enums stop matching spec/openapi.json, a copy of the public OpenAPI document. When the API changes:
npm run sync:openapi
npm testTry it by hand with the MCP Inspector, or against a local API:
npx @modelcontextprotocol/inspector node dist/stdio.jsFLIGHTBYTE_API_URL=http://localhost:3000/v1 FLIGHTBYTE_KEY=your-local-key node dist/stdio.jssrc/
stdio.ts bin entry: stdio transport, key from FLIGHTBYTE_KEY
http.ts HTTP entry: POST /mcp, GET /healthz, env config
http-app.ts request handling, protocol routing, key extraction, the OAuth gate, per-IP rate limit
oauth.ts protected resource metadata, WWW-Authenticate challenges, the token trade
server.ts createServer(): registers every tool on an McpServer
tools/api-tools.ts the 13 API tools, one definition per OpenAPI operation
tools/docs-tools.ts search_docs and get_doc_page
docs.ts llms-full.txt parsing, ranking, caching, page fetches
api.ts fetch wrapper for the REST API
errors.ts error envelope → tool error with next steps
spec/openapi.json copy of the public OpenAPI document (npm run sync:openapi)
server.json MCP Registry entry: the npm package and the hosted remoteBump
versioninpackage.jsonand in both places inserver.json; a test fails if they differ.npm publish. It runs typecheck, lint and tests first, and publishes publicly under the@flightbytescope.Publish
server.jsonto the MCP Registry:mcp-publisher login dns --domain flightbyte.dev …, thenmcp-publisher publish.Redeploy the Docker image behind
mcp.flightbyte.dev.
License
Available Tools
15 toolscreate_subscriptionCreate a subscriptionA
Watch a flight: FlightByte polls it on an adaptive schedule and POSTs a signed webhook to webhookUrl for every change (status, gates, terminals, times, delays, departure, arrival, baggage carousel, cancellation, diversion, aircraft, route, codeshares) until the flight is over. Each new subscription counts as a watched flight on the user's plan (Free: 3 per month) and starts outbound requests to the URL, so only call this when the user asked to watch or be notified about a specific flight and gave the webhook URL. If the flight number operates more than one leg that day the call is refused with the list of legs: pass origin. Flights up to seven days ahead are accepted and wait as pending until published. The response includes the signing secret in full; this is the only time it is shown, so relay it to the user to store for webhook signature verification. Pass Idempotency-Key to make a retry return the same subscription.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Local departure date at the origin airport, YYYY-MM-DD. A flight that leaves at 23:50 and lands the next morning belongs to the day it left. Live records cover a few days back to about two days ahead. | |
| events | No | Change types to deliver; omit to deliver all 23. Common picks: "flight.departed", "flight.arrived", "flight.cancelled", "flight.diverted", "departure.gate.changed", "arrival.baggage.changed", "delay.increased". | |
| origin | No | Departure airport, IATA code (e.g. "IST"; the upstream code such as "ISL" also works). Picks the leg when the flight number operates more than one leg that day. | |
| secret | No | Bring your own signing secret, only when the user explicitly provides one their receiver already uses. Normally omit it: FlightByte generates one and returns it once. | |
| carrier | Yes | Airline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK". | |
| headers | No | Extra HTTP headers sent with every delivery, e.g. {"Authorization": "Bearer <receiver token>"}. | |
| flightId | No | Exact leg pick: a providerFlightId from a previous response's `alternates`, or a flightId from an error's list of legs. | |
| metadata | No | String map echoed back in every webhook, e.g. {"bookingId": "BK-1042"}. Use it to tie deliveries to your own records. | |
| webhookUrl | Yes | The user's public http(s) endpoint that receives a signed POST for every change. Addresses that resolve to private, loopback or link-local ranges are refused. Never invent one. | |
| destination | No | Arrival airport, IATA code (e.g. "JFK"). Narrows further when several legs leave the same airport. | |
| flightNumber | Yes | Flight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored. | |
| Idempotency-Key | No | Any unique string (e.g. a UUID). Replaying the same key within 24 hours returns the original subscription instead of creating a second one. | |
| delayThresholdMinutes | No | Delay changes smaller than this many minutes are not delivered. 1 to 240; the default is 1. |
delete_subscriptionDelete a subscriptionADestructiveIdempotent
Permanently delete a subscription: its polling and webhook deliveries stop and it cannot be restored. Confirm with the user first, and prefer pause_subscription if they may want it back. Events and deliveries already recorded stay on FlightByte's side for 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions. |
get_doc_pageRead a FlightByte docs pageARead-onlyIdempotent
Fetch one FlightByte documentation page as Markdown. Accepts a URL from search_docs (anchors are ignored) or a path such as "/docs/webhooks", "/docs/reference/subscriptions/create-subscription", "/guides/verifying-webhook-signatures" or "/glossary/flight-phase". "/docs" is the introduction, with links to every page. Works without an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Docs path or URL, e.g. "/docs/errors" or "https://flightbyte.dev/docs/webhooks#verifying-signatures". |
get_flightGet a flightARead-only
Look up the live status of one flight leg by airline code, flight number and local departure date, e.g. TK1848 on 2026-10-18 → carrier "TK", flightNumber "1848", date "2026-10-18". Returns FlightByte's flight snapshot: status.phase to branch on (scheduled, boarding, departed, en_route, landed, arrived, cancelled, diverted, redirected, unknown) with delayed/cancelled/diverted flags; departure and arrival airports with terminal, gate and baggage carousel; scheduled, estimated and actual gate and runway times in UTC and local time (bestTimeUtc is the best single time, delayMinutes the gate delay); aircraft, codeshares, the airline timeline, cached, and alternates: every leg this flight number operates that day. Some numbers fly more than one leg a day (TK1 is SAW→AMS in the morning and IST→JFK later): without a selector the default leg is returned, so pass origin when the user named a departure airport. For updates over time, create a subscription instead of calling this repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Local departure date at the origin airport, YYYY-MM-DD. A flight that leaves at 23:50 and lands the next morning belongs to the day it left. Live records cover a few days back to about two days ahead. | |
| origin | No | Departure airport, IATA code (e.g. "IST"; the upstream code such as "ISL" also works). Picks the leg when the flight number operates more than one leg that day. | |
| carrier | Yes | Airline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK". | |
| refresh | No | true skips FlightByte's cache and asks upstream now (counts as a normal request). Leave unset unless the user needs a guaranteed fresh answer. | |
| flightId | No | Exact leg pick: a providerFlightId from a previous response's `alternates`, or a flightId from an error's list of legs. | |
| destination | No | Arrival airport, IATA code (e.g. "JFK"). Narrows further when several legs leave the same airport. | |
| flightNumber | Yes | Flight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored. |
get_flight_timelineFlight timelineARead-only
The airline's own change history for one flight leg, newest first, as {flightKey, count, data}; each entry has occurredAt, title, source and events in the airline's words (e.g. "Actual Gate Arrival changed to 13:35"). Use it for "what changed" or "why is it late" questions. get_flight already contains the same timeline, so call this only when the history alone is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Local departure date at the origin airport, YYYY-MM-DD. A flight that leaves at 23:50 and lands the next morning belongs to the day it left. Live records cover a few days back to about two days ahead. | |
| origin | No | Departure airport, IATA code (e.g. "IST"; the upstream code such as "ISL" also works). Picks the leg when the flight number operates more than one leg that day. | |
| carrier | Yes | Airline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK". | |
| destination | No | Arrival airport, IATA code (e.g. "JFK"). Narrows further when several legs leave the same airport. | |
| flightNumber | Yes | Flight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored. |
get_subscriptionGet a subscriptionARead-only
Fetch one subscription: status (active, pending, paused, completed, suspended) and statusReason, flightKey, flightResolved, webhook URL, event filter, delay threshold, deliveredCount/failedCount, and the last poll, change and delivery times. The secret is masked.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions. |
list_deliveriesList deliveriesARead-only
Recent webhook delivery attempts for a subscription, newest first: eventId, attempt, status, httpStatus, error, durationMs, at and changeTypes. Use it to debug a receiver that is not getting webhooks or is answering with errors. Records are kept for 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions. | |
| limit | No | How many attempts, 1 to 100. Default 25. |
list_eventsList sent eventsARead-only
Recent events generated for a subscription, newest first, with the exact webhook payloads that were sent (the list of changes and the flight snapshot at the time). Use it to see what changed and when, or to replay a payload into a local receiver.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions. | |
| limit | No | How many events, 1 to 100. Default 25. |
list_subscriptionsList subscriptionsARead-only
List the subscriptions owned by this API key, newest first, as {total, data}. All filters are optional; page with limit and offset. Secrets are masked (secretHint). Use it to find a subscription id before get, update, pause, resume, delete or log calls.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Local departure date at the origin airport, YYYY-MM-DD. A flight that leaves at 23:50 and lands the next morning belongs to the day it left. Live records cover a few days back to about two days ahead. | |
| limit | No | Page size, 1 to 200. Default 25. | |
| offset | No | How many to skip, for paging. Default 0. | |
| status | No | Only subscriptions in this state: active (being polled), pending (flight not published yet), paused, completed (flight over) or suspended (20 failed deliveries in a row). | |
| carrier | No | Airline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK". | |
| flightNumber | No | Flight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored. |
pause_subscriptionPause a subscriptionAIdempotent
Stop polling and webhook deliveries for a subscription without deleting it. Nothing is lost; resume_subscription continues it. Returns the updated subscription.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions. |
resume_subscriptionResume a subscriptionAIdempotent
Resume a paused subscription, or one that was suspended after 20 consecutive failed deliveries (fix the receiver first; send_test_event checks it). A completed subscription cannot be resumed: create a new one. Returns the updated subscription.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions. |
search_docsSearch the FlightByte docsARead-onlyIdempotent
Keyword search over the whole FlightByte documentation: the docs, the API reference, the engineering guides and the glossary. Returns the best-matching sections with title, URL and a snippet. Use it before answering questions about the API (authentication, quotas, errors, flight lookups, leg selection, subscriptions, webhook payloads and change types, signature verification, retries) or before writing integration code, then read the full page with get_doc_page. Works without an API key.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many sections to return, 1 to 10. Default 5. | |
| query | Yes | Keywords, e.g. "verify webhook signature", "429 retry", "flight number two legs origin", "baggage carousel event". |
search_flightsSearch flightsARead-only
The same lookup as get_flight (same parameters, same snapshot), sent as query parameters to /v1/flights/search. Use either one, not both. Returns FlightByte's flight snapshot: status.phase to branch on (scheduled, boarding, departed, en_route, landed, arrived, cancelled, diverted, redirected, unknown) with delayed/cancelled/diverted flags; departure and arrival airports with terminal, gate and baggage carousel; scheduled, estimated and actual gate and runway times in UTC and local time (bestTimeUtc is the best single time, delayMinutes the gate delay); aircraft, codeshares, the airline timeline, cached, and alternates: every leg this flight number operates that day. When the flight number operates several legs that day, pass origin (and optionally destination) to pick one; without a selector the default leg is returned and every leg is listed under alternates.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Local departure date at the origin airport, YYYY-MM-DD. A flight that leaves at 23:50 and lands the next morning belongs to the day it left. Live records cover a few days back to about two days ahead. | |
| origin | No | Departure airport, IATA code (e.g. "IST"; the upstream code such as "ISL" also works). Picks the leg when the flight number operates more than one leg that day. | |
| carrier | Yes | Airline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK". | |
| refresh | No | true skips FlightByte's cache and asks upstream now (counts as a normal request). Leave unset unless the user needs a guaranteed fresh answer. | |
| flightId | No | Exact leg pick: a providerFlightId from a previous response's `alternates`, or a flightId from an error's list of legs. | |
| destination | No | Arrival airport, IATA code (e.g. "JFK"). Narrows further when several legs leave the same airport. | |
| flightNumber | Yes | Flight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored. |
send_test_eventSend a test eventA
Send a signed subscription.test webhook through the real delivery pipeline to the subscription's webhookUrl, signed with its real secret, and return the eventId. Use it to prove a receiver and its signature check work before the first real change, then call list_deliveries to see how the delivery went.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions. |
update_subscriptionUpdate a subscriptionAIdempotent
Change a subscription's webhookUrl, events filter, delayThresholdMinutes, headers or metadata. Send only the fields to change; headers and metadata replace the stored maps. The flight cannot be changed: create a new subscription for a different flight.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions. | |
| events | No | Change types to deliver; omit to deliver all 23. Common picks: "flight.departed", "flight.arrived", "flight.cancelled", "flight.diverted", "departure.gate.changed", "arrival.baggage.changed", "delay.increased". | |
| headers | No | Extra HTTP headers sent with every delivery, e.g. {"Authorization": "Bearer <receiver token>"}. | |
| metadata | No | String map echoed back in every webhook, e.g. {"bookingId": "BK-1042"}. Use it to tie deliveries to your own records. | |
| webhookUrl | No | The user's public http(s) endpoint that receives a signed POST for every change. Addresses that resolve to private, loopback or link-local ranges are refused. Never invent one. | |
| delayThresholdMinutes | No | Delay changes smaller than this many minutes are not delivered. 1 to 240; the default is 1. |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v1.0.0- First observed
create_subscription - First observed
delete_subscription - First observed
get_doc_page - First observed
get_flight - First observed
get_flight_timeline - First observed
get_subscription - First observed
list_deliveries - First observed
list_events - First observed
list_subscriptions - First observed
pause_subscription - First observed
resume_subscription - First observed
search_docs - First observed
search_flights - First observed
send_test_event - First observed
update_subscription
TDQS
Scored across 15 tools
The subscription tools (get/list/update/pause/resume/delete) are cleanly separated, but get_flight and search_flights are explicitly the same lookup with the same payload, differing only in HTTP method, and get_flight_timeline duplicates the `timeline` already embedded in get_flight. The descriptions do call out these overlaps ('use either one, not both', 'call this only when the history alone is needed'), which mitigates but does not remove the misselection risk.
Every tool is snake_case with a verb-first pattern: search_docs, get_doc_page, get_flight, search_flights, get_flight_timeline, create/list/get/update/pause/resume/delete_subscription, send_test_event, list_deliveries, list_events. Resource nouns are consistent (_subscription, _deliveries) and no conventions are mixed.
15 tools is at the top of the well-scoped range and the surface maps cleanly onto four areas: docs, flight lookup, subscription lifecycle, and webhook observability. One tool is arguably redundant (search_flights vs get_flight), which keeps it just short of ideal.
Subscription lifecycle is fully covered (create/list/get/update/pause/resume/delete plus test event, deliveries and events for debugging), and docs plus flight lookup are covered. Minor gaps: no way to look up an airport/airline/route or search flights by route, so agents must rely on flight-number lookups or docs for that context.
Maintenance
Related MCP Connectors
Aircraft intelligence for AI agents: valuations with uncertainty bands, FAA registry lookups, cost of ownership, comparable aircraft, fleet search, airworthiness directives and STCs, market metrics and forecasts, verified value reports, pre-buy diligence checklists, logbook search and a watchlist. 38 tools; free tier with OAuth or a Windsock API key.
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Flight search MCP server providing search, pagination, and itinerary details for AI assistants.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides comprehensive flight tracking capabilities using the OpenSky Network API, enabling real-time flight data, geographic searches, historical data, and airport operations through MCP tools.MIT
- AlicenseBqualityDmaintenanceEnables AI assistants to query flight routes, real-time flight tracking, weather, and transfer flights via standardized MCP tools.10MIT

AirLabs MCP Serverofficial
AlicenseAqualityDmaintenanceProvides AI assistants with access to real-time flight data, airport schedules, delays, and aviation reference databases through natural language queries.12182 npmMIT- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to ask what aircraft are flying near a location, track a specific flight's live position, route, aircraft details and photo, and surface emergency-squawking or military aircraft. It exposes four tools (flights_near, track_flight, emergencies, military_aircraft) backed by merged volunteer ADS-B networks and a global snapshot.2MIT