Skip to main content
Glama

Quick start

  1. Get a free API key at app.flightbyte.dev/signup.

  2. Connect the server. Use the hosted one, or run it locally:

    Address

    Key

    Hosted

    https://mcp.flightbyte.dev/mcp

    Authorization: Bearer <key> header

    Local

    npx -y @flightbyte/mcp

    FLIGHTBYTE_KEY environment variable

    In 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.

  3. 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?"

get_flight returns the live snapshot: phase, gate, terminal, delay, and the best known departure and arrival times.

"TK1 from Istanbul tomorrow: when does it leave?"

TK1 flies two legs that day. The assistant passes origin: "IST" and gets the right one instead of a guess.

"Watch PC1001 on Friday and post every change to https://api.example.com/hooks/flights."

create_subscription starts the watch and hands you the signing secret, shown once.

"Our webhook stopped firing. Why?"

get_subscription and list_deliveries show the status and the HTTP code and error of every recent attempt.

"Add a FlightByte webhook receiver with signature verification to this Express app."

search_docs and get_doc_page pull the exact steps from the docs, so the code matches the API rather than a guess.

Tools

Docs: no key needed.

Tool

What it does

search_docs

Keyword search over the whole documentation: docs, API reference, guides and glossary. Returns titles, links and snippets.

get_doc_page

Any docs page as Markdown, from a link or a path like /docs/webhooks.

Flights: read-only.

Tool

What it does

get_flight

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.GET /v1/flights/{carrier}/{flightNumber}/{date}

search_flights

The same lookup with query parameters.GET /v1/flights/search

get_flight_timeline

The airline's own change history for a leg, newest first.GET /v1/flights/{carrier}/{flightNumber}/{date}/timeline

Subscriptions

Tool

What it does

Access

create_subscription

Watch a flight and get a signed webhook for every change. Counts as a watched flight on your plan.POST /v1/subscriptions

writes

list_subscriptions

Your subscriptions, filtered by status, carrier, number or date.GET /v1/subscriptions

read-only

get_subscription

One subscription with its status and delivery counters.GET /v1/subscriptions/{id}

read-only

update_subscription

Change the webhook URL, event filter, delay threshold, headers or metadata.PATCH /v1/subscriptions/{id}

writes

pause_subscription

Stop polling and deliveries without losing anything.POST /v1/subscriptions/{id}/pause

writes

resume_subscription

Resume a paused or auto-suspended subscription.POST /v1/subscriptions/{id}/resume

writes

delete_subscription

Delete a subscription for good.DELETE /v1/subscriptions/{id}

destructive

send_test_event

Send a signed test webhook to the subscription's URL.POST /v1/subscriptions/{id}/test

writes

list_deliveries

Recent delivery attempts with HTTP status and errors.GET /v1/subscriptions/{id}/deliveries

read-only

list_events

Recent events with the exact payloads that were sent.GET /v1/subscriptions/{id}/events

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_subscription returns 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_subscription is marked destructive, so clients can ask before running it. create_subscription tells 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". A 429 comes back with how long to wait. A 402 watched_flight_limit says to stop, when the allowance resets, and where to upgrade; a 402 overage_cap_reached says the cap you set on extra flights is reached and where to raise or remove it.

  • Docs fetches stay on flightbyte.dev. get_doc_page refuses 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/mcp

Add --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/mcp with the header Authorization: Bearer YOUR_FLIGHTBYTE_KEY (or x-api-key: YOUR_FLIGHTBYTE_KEY).

  • stdio: command npx, arguments -y @flightbyte/mcp, environment FLIGHTBYTE_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_docs and get_doc_page work. Calling an API tool answers 401 with WWW-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) and subscriptions:write (creating, changing and deleting watches, and test events). A tool outside the granted scopes answers 403 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_SECRET is set.

Configuration

Variable

Used by

Default

Meaning

FLIGHTBYTE_KEY

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.

FLIGHTBYTE_API_URL

both

https://api.flightbyte.dev/v1

API base URL, e.g. http://localhost:3000/v1 for a local API.

FLIGHTBYTE_DOCS_URL

both

https://flightbyte.dev

Docs site that serves /llms-full.txt and <page>.md.

PORT

HTTP

8080

Listening port.

HOST

HTTP

127.0.0.1 (0.0.0.0 in Docker)

Listening address.

RATE_LIMIT_PER_MINUTE

HTTP

120

Requests to /mcp per client IP per minute; 0 turns it off.

TRUST_PROXY

HTTP

0 (1 in Docker)

How many reverse proxies' X-Forwarded-For entries to trust when finding the client IP.

ALLOWED_HOSTS

HTTP

loopback names on a loopback HOST, otherwise any

Comma-separated Host values accepted on /mcp, against DNS rebinding.

FLIGHTBYTE_OAUTH_CLIENT_SECRET

HTTP

none

Turns OAuth on: this server's secret at the authorization server, used only to trade tokens. Must match the API's OAUTH_MCP_CLIENT_SECRET.

MCP_PUBLIC_URL

HTTP

https://mcp.flightbyte.dev

This server's public origin; the OAuth resource is <MCP_PUBLIC_URL>/mcp and must equal the API's OAUTH_MCP_RESOURCE.

FLIGHTBYTE_OAUTH_ISSUER

HTTP

https://api.flightbyte.dev

The authorization server named in the protected resource metadata.

FLIGHTBYTE_OAUTH_TOKEN_URL

HTTP

<issuer>/oauth/token

Where tokens are traded, e.g. the API's internal address.

FLIGHTBYTE_OAUTH_CLIENT_ID

HTTP

flightbyte-mcp

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-mcp

It 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 lint

The 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 test

Try it by hand with the MCP Inspector, or against a local API:

npx @modelcontextprotocol/inspector node dist/stdio.js
FLIGHTBYTE_API_URL=http://localhost:3000/v1 FLIGHTBYTE_KEY=your-local-key node dist/stdio.js
src/
  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 remote
  1. Bump version in package.json and in both places in server.json; a test fails if they differ.

  2. npm publish. It runs typecheck, lint and tests first, and publishes publicly under the @flightbyte scope.

  3. Publish server.json to the MCP Registry: mcp-publisher login dns --domain flightbyte.dev …, then mcp-publisher publish.

  4. Redeploy the Docker image behind mcp.flightbyte.dev.

License

MIT

Available Tools

15 tools
create_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.

NameRequiredDescriptionDefault
dateYesLocal 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.
eventsNoChange 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".
originNoDeparture 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.
secretNoBring 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.
carrierYesAirline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK".
headersNoExtra HTTP headers sent with every delivery, e.g. {"Authorization": "Bearer <receiver token>"}.
flightIdNoExact leg pick: a providerFlightId from a previous response's `alternates`, or a flightId from an error's list of legs.
metadataNoString map echoed back in every webhook, e.g. {"bookingId": "BK-1042"}. Use it to tie deliveries to your own records.
webhookUrlYesThe 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.
destinationNoArrival airport, IATA code (e.g. "JFK"). Narrows further when several legs leave the same airport.
flightNumberYesFlight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored.
Idempotency-KeyNoAny unique string (e.g. a UUID). Replaying the same key within 24 hours returns the original subscription instead of creating a second one.
delayThresholdMinutesNoDelay changes smaller than this many minutes are not delivered. 1 to 240; the default is 1.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so the safety profile is already structured. The description still adds substantial behavior beyond that: per-plan quota counting, outbound POSTs to the user URL, refusal on ambiguous legs, pending state for flights up to seven days ahead, and the one-time signing secret. The one caveat is the idempotentHint=false annotation alongside the Idempotency-Key paragraph, which could read as tension even though it is really 'not idempotent by default'.

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 and every sentence carries real information, but the block is dense and sentence-heavy for a 13-parameter tool. A short bulleted split between 'when to use', 'side effects', and 'response' would make it easier to scan without losing content.

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 13 parameters, nested objects, no output schema, and only sparse annotations, the description covers the high-risk behaviors an agent must know: quota, outbound requests, leg ambiguity, pending publication, and one-time secret handling. What remains thin is response shape and webhook payload contents, which are partly implied but not documented.

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%, so the baseline is 3. The description still adds cross-parameter semantics the schema cannot: `origin` is the disambiguator when a flight number operates multiple legs, `Idempotency-Key` changes retry behavior, and the generated `secret` is returned once and should normally be omitted unless the user supplies one. It does not explain the event-filter or delay-threshold parameters, but those are already well described in the schema.

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?

Opens with a concrete verb+resource ('Watch a flight') and immediately explains the mechanism: FlightByte polls on an adaptive schedule and POSTs a signed webhook for every change. It is clearly distinguishable from the sibling read/management tools (list_subscriptions, update_subscription, delete_subscription) because it describes creating a new watched flight with an endpoint.

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

Usage Guidelines5/5

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

States an explicit trigger ('only call this when the user asked to watch or be notified about a specific flight and gave the webhook URL') and warns about quota consumption (Free: 3 per month) and outbound requests. It also gives the concrete fallback for multi-leg flights: the call is refused with a leg list so pass `origin`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_subscriptionDelete a subscriptionA
DestructiveIdempotent

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.

NameRequiredDescriptionDefault
idYesSubscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds critical context beyond that: polling and webhook deliveries stop, deletion cannot be reversed, and recorded events/deliveries persist for 30 days. This gives the agent concrete consequences needed before calling a destructive tool.

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

Conciseness5/5

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

Three tightly written sentences, front-loaded with the core destructive action, followed by usage guidance and a data-retention note. No sentence is wasted or redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description covers purpose, consequences, alternatives, and data-retention behavior. Combined with the rich annotations, an agent has everything needed to decide and invoke correctly.

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

Parameters3/5

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

Schema description coverage is 100% and the single `id` parameter is fully documented in the schema, including an example and source. The description adds no additional parameter meaning, so the baseline of 3 is appropriate.

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 ('Permanently delete') and resource ('a subscription'), and distinguishes itself from sibling tools like pause_subscription by emphasizing permanence. The agent can immediately tell this is a destructive deletion operation.

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

Usage Guidelines5/5

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

Explicitly instructs to 'Confirm with the user first' and 'prefer pause_subscription if they may want it back', naming the alternative and the condition for using it. This directly routes the agent away from deletion when appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_doc_pageRead a FlightByte docs pageA
Read-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.

NameRequiredDescriptionDefault
pathYesDocs path or URL, e.g. "/docs/errors" or "https://flightbyte.dev/docs/webhooks#verifying-signatures".

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent and open-world, so the safety profile is covered. The description adds genuinely new behavioral facts: no API key required, anchors are stripped, and "/docs" returns the full page index. It does not say what happens on an invalid path, but the added auth and normalization details are real value.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the core action and output format, followed by input forms and the useful "/docs" entry-point hint. The example paths are long but each illustrates a different accepted prefix.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with no output schema, the description covers what it returns (Markdown), where valid inputs come from, and the auth situation. Nothing an agent needs in order to call it correctly is 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% with one required string, so the baseline is 3. The description goes beyond the schema by explaining that anchors in URLs are ignored and by listing multiple accepted path shapes (docs, guides, glossary), which clarifies that the parameter is not restricted to /docs paths.

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 ("Fetch one FlightByte documentation page") plus the return format (Markdown), which is information the name alone does not convey. It also implicitly separates itself from search_docs by framing itself as the page reader rather than the finder.

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

Usage Guidelines4/5

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

Tells the agent exactly what inputs are valid — a URL from search_docs with anchors ignored, or a path — and enumerates representative path families including the docs root. It does not explicitly say when to prefer search_docs over this tool, so routing is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_flightGet a flightA
Read-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.

NameRequiredDescriptionDefault
dateYesLocal 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.
originNoDeparture 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.
carrierYesAirline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK".
refreshNotrue skips FlightByte's cache and asks upstream now (counts as a normal request). Leave unset unless the user needs a guaranteed fresh answer.
flightIdNoExact leg pick: a providerFlightId from a previous response's `alternates`, or a flightId from an error's list of legs.
destinationNoArrival airport, IATA code (e.g. "JFK"). Narrows further when several legs leave the same airport.
flightNumberYesFlight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say readOnly/openWorld, but the description adds real operational context: `refresh` bypasses cache and 'counts as a normal request' (a cost/rate signal), the `cached` flag, live-data coverage of a few days back to ~2 days ahead, and the full snapshot shape including `status.phase` enum values to branch on. Nothing contradicts the annotations.

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

Conciseness4/5

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

Front-loaded with purpose and example, then escalates to return shape and edge cases; every clause is dense with information. It runs long as a single paragraph and the return-field enumeration is heavy, but with no output schema that content earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter, open-world lookup with no output schema, the description covers input disambiguation, the returned snapshot structure (status phase, flags, times, alternates), caching behavior, and the subscription alternative. An agent has everything needed to call it correctly and interpret the result.

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%, so the baseline is 3, but the description adds cross-parameter selection logic the schema cannot express: which selector wins when a flight number operates multiple legs, why `origin` matters, and that `alternates`/`flightId` come from prior responses or error leg lists. It stops short of detailing `destination`/`refresh` interplay, but adds genuine value.

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 ('look up the live status of one flight leg') and immediately grounds it with a concrete example (TK1848 → carrier/flightNumber/date). It is clearly distinguishable from siblings like search_flights (discovery) and get_flight_timeline (history) by emphasizing a single leg's live snapshot.

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

Usage Guidelines5/5

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

Explicitly tells the agent when to pass `origin` (user named a departure airport, flight number has multiple legs) and names the alternative for polling: 'create a subscription instead of calling this repeatedly.' The multi-leg default behavior is spelled out so the agent knows the consequence of omitting selectors.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_flight_timelineFlight timelineA
Read-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.

NameRequiredDescriptionDefault
dateYesLocal 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.
originNoDeparture 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.
carrierYesAirline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK".
destinationNoArrival airport, IATA code (e.g. "JFK"). Narrows further when several legs leave the same airport.
flightNumberYesFlight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds real behavioral detail beyond that — newest-first ordering, the wrapper shape, and that events are verbatim airline text. It does not state volume limits or whether history is truncated, which keeps it short of a 5.

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

Conciseness4/5

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

The identifying scope and return shape are front-loaded, and the routing sentence closes it cleanly. The first sentence is dense with opaque field names, but every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by naming the envelope keys and the per-entry fields (`occurredAt`, `title`, `source`, `events`). Combined with full schema coverage and annotations, an agent has everything needed to call and interpret it.

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

Parameters3/5

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

Schema coverage is 100% and each parameter has a detailed description, so the schema does the heavy lifting. The description only adds the notion of 'one flight leg', which indirectly motivates the origin/destination narrowing already explained in the schema. Baseline 3 applies.

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 (the airline's own change history for one flight leg) plus ordering (newest first) and the exact response envelope `{flightKey, count, data}`. It is clearly distinguishable from `get_flight`, which it explicitly names as carrying the same data.

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

Usage Guidelines5/5

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

Gives concrete triggering questions ('what changed', 'why is it late') and an explicit exclusion: call this only when the history alone is needed, since `get_flight` already contains it. That is a when-to-use and a when-not-to-use against a named sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_subscriptionGet a subscriptionA
Read-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.

NameRequiredDescriptionDefault
idYesSubscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely new context: the secret field is masked on return, and it enumerates which state fields (status, counts, timestamps) come back — information not available from annotations and valuable since there is no output schema.

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

Conciseness4/5

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

One front-loaded sentence: the action comes first, then the returned fields. The long field list is dense but each item earns its place as return-value documentation, with no filler.

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?

With no output schema, the field enumeration and masking note are exactly what's needed for an agent to use the result. Only the absence of explicit sibling routing keeps it from a 5.

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

Parameters3/5

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

Schema coverage is 100% and the `id` parameter already has a clear description with an example and provenance (create_subscription/list_subscriptions). The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Fetch one subscription") and then enumerates the fields returned, so the agent knows exactly what it gets. It implicitly contrasts with list_subscriptions but never names it, keeping it just short of full sibling differentiation.

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 single-item phrasing implies this is for retrieving one known subscription (the schema's `id` example confirms it), but the description never states when to use this versus search or list_subscriptions. Usage is inferable rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_deliveriesList deliveriesA
Read-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.

NameRequiredDescriptionDefault
idYesSubscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions.
limitNoHow many attempts, 1 to 100. Default 25.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds non-obvious behavior on top: results are ordered newest first and records are pruned after 30 days. It does not say whether attempts are paginated beyond the limit cap or how failures are surfaced, but the retention and ordering facts are real added value.

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

Conciseness5/5

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

Three tight sentences: what it returns and in what order, when to use it, and a retention caveat. The identifying information and the field list are front-loaded with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the return fields (eventId, attempt, status, httpStatus, error, durationMs, at, changeTypes), and it adds ordering and retention. For a two-parameter read tool with readOnlyHint set, nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, with both the subscription id format and the 1–100 limit bound (default 25) fully documented in the schema. The description only reinforces the subscription scoping and adds nothing about the limit parameter, so this is the baseline case where the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Recent webhook delivery attempts for a subscription') plus ordering and the exact fields returned, which is far more than a restatement of the name. It never names a sibling like list_events, so the reader must infer the deliveries-vs-events distinction rather than being told it explicitly.

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

Usage Guidelines4/5

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

Gives a concrete triggering scenario: 'Use it to debug a receiver that is not getting webhooks or is answering with errors.' That is clear when-to-use guidance, but no alternative tool is named for adjacent tasks (e.g. checking whether an event was even emitted).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_eventsList sent eventsA
Read-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.

NameRequiredDescriptionDefault
idYesSubscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions.
limitNoHow many events, 1 to 100. Default 25.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and closed-world scope, so the safety profile is covered. The description usefully adds ordering (newest first) and the contents of the returned payloads (change list plus flight snapshot at the time), but 'recent' is undefined and there is no mention of retention, pagination, or what happens past the limit.

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

Conciseness5/5

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

Two sentences, front-loaded with what is listed and how it is ordered, followed by the practical use cases. Nothing is wasted and nothing important is buried.

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?

For a two-parameter, read-only listing tool with an annotation-declared safety profile and full schema coverage, the description covers returned content and ordering well. The main missing pieces are the relationship to list_deliveries and any indication of the retention window, which matter for choosing between the two tools.

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

Parameters3/5

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

Schema coverage is 100%, and the schema documents both the subscription id format and the 1-100 limit with its default. The description adds no parameter meaning beyond that, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Recent events generated for a subscription') and adds concrete scope: newest first, with the exact webhook payloads that were sent. It does not name or contrast with the closely related sibling list_deliveries, so the distinction between 'events' and 'deliveries' is left implicit.

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

Usage Guidelines4/5

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

It gives two explicit use cases ('see what changed and when' and 'replay a payload into a local receiver'), which is clear usage context. It offers no exclusions or alternative routing, notably against list_deliveries, which an agent could plausibly pick instead for the same investigation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_subscriptionsList subscriptionsA
Read-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.

NameRequiredDescriptionDefault
dateNoLocal 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.
limitNoPage size, 1 to 200. Default 25.
offsetNoHow many to skip, for paging. Default 0.
statusNoOnly subscriptions in this state: active (being polled), pending (flight not published yet), paused, completed (flight over) or suspended (20 failed deliveries in a row).
carrierNoAirline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK".
flightNumberNoFlight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description still adds real value: newest-first ordering, the {total, data} response envelope, and that secrets are returned masked via secretHint — none of which the annotations convey.

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

Conciseness5/5

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

Three tight sentences: scope and ordering first, paging/masking second, routing guidance last. No filler, and the most decision-relevant facts are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description supplies the return shape and ordering an agent needs to parse results, plus the secretHint masking caveat. Combined with the fully documented schema, nothing material is missing for a read-only list call.

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

Parameters3/5

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

Schema description coverage is 100%, so every filter (date, status, carrier, flightNumber) and the paging params are already documented in detail. The description only restates that filters are optional and paging uses limit/offset, adding no format or behavior detail beyond the schema. Baseline 3 is appropriate.

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 ('List the subscriptions owned by this API key'), plus ordering (newest first) and return envelope {total, data}. The closing sentence names the downstream siblings (get, update, pause, resume, delete, log calls), so an agent can separate this from get_subscription or list_deliveries without opening a schema.

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

Usage Guidelines4/5

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

Explicitly frames the tool as the id-discovery step before get/update/pause/resume/delete/log calls, and notes that all filters are optional with limit/offset paging. It doesn't state when-not to use it or contrast with search_flights, but the primary use case and alternative path are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pause_subscriptionPause a subscriptionA
Idempotent

Stop polling and webhook deliveries for a subscription without deleting it. Nothing is lost; resume_subscription continues it. Returns the updated subscription.

NameRequiredDescriptionDefault
idYesSubscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions.

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the annotations (non-destructive, idempotent, not read-only), the description adds the two facts that matter: nothing is lost and the pause is reversible via resume_subscription. It also notes the return value. Minor gaps remain, such as whether in-flight deliveries are aborted, but the essential behavioral picture is covered.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and its key constraint, then reversibility, then the return value. No filler and nothing an agent must read twice.

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?

For a single-parameter mutation with no output schema, the description covers action, side effects, reversibility, and return value. The only unstated detail is edge-case behavior on in-flight deliveries, which is minor.

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

Parameters3/5

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

Only one parameter, and the schema already documents it at 100% coverage with an example format and its origin (create_subscription / list_subscriptions). The description adds nothing parameter-specific, so the baseline 3 applies.

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 ('Stop polling and webhook deliveries for a subscription') and immediately scopes the effect ('without deleting it'), which cleanly separates it from delete_subscription and resume_subscription. An agent can pick this tool without opening the schema.

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

Usage Guidelines4/5

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

It gives a clear condition for choosing this tool over the destructive alternative and names resume_subscription as the inverse path. It stops short of an explicit 'use when X, do not use when Y' statement, but the routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resume_subscriptionResume a subscriptionA
Idempotent

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.

NameRequiredDescriptionDefault
idYesSubscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare that this is a non-read-only, idempotent, non-destructive mutation, so the description does not need to repeat that safety profile. The description adds useful behavioral context beyond annotations: the suspension cause, the receiver-fix prerequisite, the completed-state exclusion, and the fact that it returns the updated subscription.

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

Conciseness5/5

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

The description is front-loaded with the core action, then covers the suspension edge case and excludes completed subscriptions in a few compact sentences. Every clause adds a distinct operational detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with annotations covering safety, the description is complete enough: it states the eligible states, the blocking condition, the prerequisite check, and the return value. No output schema exists, so mentioning that it returns the updated subscription fills the gap.

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

Parameters3/5

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

Schema description coverage is 100%, and the single id parameter is already richly documented with format examples and where it comes from. The description does not add parameter-specific meaning beyond the schema, so the baseline of 3 is appropriate.

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?

The description states a specific verb and resource (resume a subscription) and distinguishes the eligible states from the ineligible completed state. It also names the sibling tools relevant to the exception path (send_test_event and create_subscription).

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

Usage Guidelines5/5

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

It explicitly says when to use it (paused or suspended after 20 failed deliveries) and when not to use it (completed subscriptions require creating a new one). It also supplies the prerequisite to fix the receiver first and points to send_test_event for checking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_docsSearch the FlightByte docsA
Read-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.

NameRequiredDescriptionDefault
limitNoHow many sections to return, 1 to 10. Default 5.
queryYesKeywords, e.g. "verify webhook signature", "429 retry", "flight number two legs origin", "baggage carousel event".

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already carry readOnly/idempotent/openWorld, so the bar is lower; the description still adds useful context by disclosing the return shape (title, URL, snippet) and the auth constraint ("Works without an API key"). It leaves out ranking behavior or whether results are always returned when nothing matches, which keeps it from a 5.

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

Conciseness4/5

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

Three sentences, front-loaded with purpose and ending with the follow-up step; nothing is padding. The long parenthetical topic list (authentication through signature verification) is bulky but does real work as keyword priming for an agent forming a query.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with no output schema, the definition covers what is searched, what is returned, that no API key is needed, and what to do next. There is no output schema to defer to, and the description compensates by describing the result fields directly.

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

Parameters3/5

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

Schema description coverage is 100% and the schema itself documents both parameters, including the 1-10 limit range, the default of 5, and example query strings. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

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 ("keyword search over the whole FlightByte documentation") and enumerates the corpora covered: docs, API reference, engineering guides, glossary. It also says what comes back ("best-matching sections with title, URL and a snippet"), so an agent knows exactly what this tool is versus the flight/subscription siblings.

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

Usage Guidelines4/5

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

Gives an explicit trigger ("before answering questions about the API... or before writing integration code") and a concrete next step ("then read the full page with get_doc_page"), which is real workflow routing. It does not say when this tool is the wrong choice or name a competing search path, so it stops short of full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_flightsSearch flightsA
Read-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.

NameRequiredDescriptionDefault
dateYesLocal 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.
originNoDeparture 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.
carrierYesAirline code: the 2-character IATA code (e.g. "TK") or 3-character ICAO code (e.g. "THY"). For flight "TK1848" this is "TK".
refreshNotrue skips FlightByte's cache and asks upstream now (counts as a normal request). Leave unset unless the user needs a guaranteed fresh answer.
flightIdNoExact leg pick: a providerFlightId from a previous response's `alternates`, or a flightId from an error's list of legs.
destinationNoArrival airport, IATA code (e.g. "JFK"). Narrows further when several legs leave the same airport.
flightNumberYesFlight number without the airline code: 1 to 4 digits and an optional letter suffix. For "TK1848" this is "1848". Leading zeros are ignored.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds substantial behavioral context: the returned snapshot structure, branchable status fields, delay/cancellation flags, time representations, cache behavior, and alternate-leg handling.

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

Conciseness4/5

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

The description is long but front-loads the most important information: equivalence to get_flight and usage guidance. The detailed return-field enumeration is justified because there is no output schema, though it is dense and could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and seven parameters, the description provides the necessary return-value context and leg-selection semantics. Combined with the 100% schema coverage and annotations, an agent has enough information to invoke the tool correctly.

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%, so the schema already documents parameter formats and meanings. The description adds value beyond the schema by explaining the origin/destination leg-selection behavior and what the default leg and alternates mean when a flight number operates multiple legs.

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?

The description states a specific lookup operation and explicitly distinguishes it from get_flight: same data, same parameters, but sent as query parameters to /v1/flights/search. An agent can identify the tool and its relationship to the sibling without opening either schema.

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

Usage Guidelines5/5

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

It gives explicit routing guidance: 'Use either one, not both' relative to get_flight. It also explains how to disambiguate multi-leg flight numbers using origin and destination, and what happens when no selector is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
idYesSubscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and openWorldHint=true, but the description adds the crucial fact that this is not a dry run — it goes through the real pipeline and is signed with the real secret, so an external receiver is actually hit. It does not mention rate limits, retries, or whether the test event appears in the subscription's delivery history except indirectly via list_deliveries.

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

Conciseness5/5

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

Two sentences, no filler, with the delivery mechanism and the safety rationale front-loaded before the follow-up action. Every clause carries information an agent would otherwise have to infer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one fully documented parameter and no output schema, the description supplies what is missing: a live side effect on an external receiver, the returned eventId, and the natural next call. Nothing an agent needs to invoke it safely is absent.

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

Parameters3/5

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

Schema coverage is 100% and the single `id` parameter already carries an example and points to create_subscription/list_subscriptions. The description mentions webhookUrl and eventId but adds nothing about the `id` argument itself, so the baseline 3 applies.

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 (send a signed subscription.test webhook), and pins down the mechanism: the real delivery pipeline, the subscription's real webhookUrl, its real secret, returning an eventId. That is far more distinct than the sibling subscription tools, none of which deliver anything.

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

Usage Guidelines5/5

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

Gives an explicit when: prove the receiver and its signature check work before the first real change. It also names the follow-up step (call list_deliveries to see how the delivery went), so the agent knows both the trigger and the next call in the sequence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_subscriptionUpdate a subscriptionA
Idempotent

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.

NameRequiredDescriptionDefault
idYesSubscription id, e.g. "sub_7Kd91mQx0Zb2", as returned by create_subscription or list_subscriptions.
eventsNoChange 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".
headersNoExtra HTTP headers sent with every delivery, e.g. {"Authorization": "Bearer <receiver token>"}.
metadataNoString map echoed back in every webhook, e.g. {"bookingId": "BK-1042"}. Use it to tie deliveries to your own records.
webhookUrlNoThe 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.
delayThresholdMinutesNoDelay changes smaller than this many minutes are not delivered. 1 to 240; the default is 1.

TDQS

A4.4/5.0
Behavior4/5

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

Goes beyond the annotations (which only declare idempotent/non-destructive/non-readOnly) by disclosing the replace-vs-merge semantics of `headers` and `metadata` and the immutability of the flight binding — behavior an agent cannot infer from the schema or annotations. Minor gaps remain: no mention of delivery-history effects or whether a new webhookUrl is re-verified.

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

Conciseness5/5

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

Three sentences, zero waste: mutable fields first, patch semantics second, the hard constraint and its workaround last. Every sentence carries information not present elsewhere.

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?

For a 6-parameter mutation tool with no output schema, the description covers what can be changed, how to send changes, and the one immutable property. It would be complete at 5 with a note on validation/re-verification of a changed webhookUrl or on whether existing deliveries are affected.

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 already 100%, so baseline is 3; the description adds real value by clarifying that `headers` and `metadata` replace the stored maps rather than merge, and by framing the operation as a partial patch so unchanged fields are left intact. That nuance is not in the schema descriptions.

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 (change) and resource (subscription) and enumerates exactly which fields are mutable (webhookUrl, events, delayThresholdMinutes, headers, metadata), which alone distinguishes it from create_subscription and get_subscription. The explicit statement that the flight is immutable further pins down the tool's scope.

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

Usage Guidelines4/5

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

"Send only the fields to change" is a precise call pattern, and "create a new subscription for a different flight" names the alternative for the case this tool cannot handle. It stops short of routing the agent to pause_subscription/resume_subscription for temporary silencing, which would have earned a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 15 tool updatesv1.0.0
    • First observedcreate_subscription
    • First observeddelete_subscription
    • First observedget_doc_page
    • First observedget_flight
    • First observedget_flight_timeline
    • First observedget_subscription
    • First observedlist_deliveries
    • First observedlist_events
    • First observedlist_subscriptions
    • First observedpause_subscription
    • First observedresume_subscription
    • First observedsearch_docs
    • First observedsearch_flights
    • First observedsend_test_event
    • First observedupdate_subscription

TDQS

A4.1/5.0

Scored across 15 tools

Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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
  • A
    license
    A
    quality
    D
    maintenance
    Provides AI assistants with access to real-time flight data, airport schedules, delays, and aviation reference databases through natural language queries.
    12
    182 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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.
    2
    MIT