Skip to main content
Glama
shayben

All Flights MCP

by shayben

All Flights MCP

A federated Model Context Protocol server that searches multiple flight inventory sources concurrently and returns one normalized, deduplicated result set.

Providers

Provider

Status

Inventory role

ITA Matrix

Supported through an existing Streamable HTTP ITA MCP

Fare research and routing

Google Flights

Supported through the pinned Fli MCP

Live metasearch fares and Google booking links

Duffel

Supported directly

Live NDC, GDS, and selected low-cost-carrier offers

Skyscanner

Supported directly

Metasearch suppliers and booking deep links

Standard MCP

Extensible adapter

Additional providers that implement this server's normalized search_flights schema

No provider guarantees complete global inventory. Configure more than one source for better coverage. Provider errors are isolated: one failed or slow source does not discard results from the others.

Related MCP server: Find Flights MCP Server

MCP tools

  • list_providers: reports configured and unavailable providers.

  • search_flights: searches providers concurrently, normalizes offers, and groups equivalent itineraries with provider-specific alternatives.

  • search_date_range: scans up to 60 outbound-date/stay-length combinations.

  • get_offer: retrieves a recent offer and its alternatives from the in-memory cache.

Quick start

Requires Node.js 22 or newer.

npm install
cp .env.example .env
npm run build
npm start

The server automatically loads .env. The default transport is stdio. Set MCP_TRANSPORT=http to expose stateless Streamable HTTP at http://127.0.0.1:3000/mcp. The HTTP server also exposes GET /health.

Local MCP client

{
  "mcpServers": {
    "all-flights": {
      "command": "node",
      "args": ["C:\\Repos\\all-flights-mcp\\dist\\index.js"],
      "env": {
        "ITA_MCP_URL": "https://your-ita-mcp.example/mcp",
        "ITA_MCP_BEARER_TOKEN": "${input:ita-token}",
        "DUFFEL_ACCESS_TOKEN": "${input:duffel-token}"
      }
    }
  }
}

Configuration

Copy .env.example and enable any providers for which you have access:

  • ITA_MCP_URL and optional ITA_MCP_BEARER_TOKEN

  • or ITA_MCP_COMMAND and optional ITA_MCP_ARGS_JSON for a local stdio server

  • GOOGLE_FLIGHTS_MCP_URL or GOOGLE_FLIGHTS_MCP_COMMAND=fli-mcp

  • DUFFEL_ACCESS_TOKEN

  • SKYSCANNER_API_KEY plus market and locale

Skyscanner, Sabre, and Travelport generally require commercial approval. Credentials are never returned in tool output or written to disk by this server.

Additional MCP providers

UPSTREAM_MCP_PROVIDERS_JSON adds providers that expose a normalized search_flights tool compatible with this repository:

[
  {
    "id": "partner",
    "name": "Partner inventory",
    "url": "https://partner.example/mcp",
    "tokenEnv": "PARTNER_MCP_TOKEN",
    "toolName": "search_flights"
  }
]

tokenEnv names an environment variable; do not place secrets directly in the JSON configuration.

HTTP deployment

cp .env.example .env
# Edit .env and set MCP_TRANSPORT=http and MCP_BEARER_TOKEN.
docker compose up -d --build

When MCP_BEARER_TOKEN is set, /mcp requires Authorization: Bearer <token>. Use TLS in front of the container.

HomeAssistant OCI deployment

The repository includes the deployment used by HomeAssistant. It runs beside the existing ITA MCP container and a pinned Fli Google Flights container, publishes https://flights.159-54-184-44.sslip.io/mcp through Caddy, stores the bearer token in Azure Key Vault, and registers the server in the agent's MCP registry. The OCI Fli container uses the existing residential SOCKS tunnel because Google returns empty inventory from the datacenter address.

.\deploy-oci.ps1

Provider credentials can be added to /opt/n8n/all-flights-mcp.env before restarting the service. ITA is reached over the private Compose network.

Normalization and deduplication

Each offer retains its source, provider offer ID, total price, currency, segments, carriers, booking URL or booking-item links, and expiry. Equivalent itineraries are grouped by segment airports, times, carriers, and flight numbers. The cheapest alternative in the requested currency becomes the primary result; every provider alternative remains attached.

Prices are not currency-converted. ITA Matrix results are marked non-bookable because ITA does not return durable booking links. Always revalidate a selected offer before purchase. Google Flights support uses an unofficial reverse-engineered interface provided by Fli; it may change without notice.

Development

npm run check

The test suite uses Node's built-in test runner and does not call live provider APIs.

Available Tools

3 tools
list_providersA
Read-only

List flight inventory providers and whether each one is configured.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

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

The description and annotations are consistent: readOnlyHint true aligns with a listing operation. The description adds the detail that the tool returns configuration status, which is transparent. No contradictory or missed behaviors.

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 a single concise sentence of 9 words, front-loading the purpose and requiring no additional sentences. Every word provides value.

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 the tool's low complexity, zero parameters, and no output schema, the description adequately captures the purpose. It states the output includes provider names and configuration status, which is sufficient for a simple list. A minor gap is the lack of return format details, but the tool is straightforward.

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?

With no parameters and 100% schema description coverage, the description does not need to add parameter info. The baseline score of 4 is appropriate as the tool's parameterless nature is fully captured.

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 clearly states the tool lists flight inventory providers and their configuration status, using a specific verb and resource. However, it does not explicitly differentiate from sibling tools like search_flights and search_date_range, which are focused on searching rather than listing.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. This leaves the agent without context for selecting it appropriately.

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

search_date_rangeB
Read-only

Search multiple outbound dates and stay lengths, returning the cheapest normalized offer for each date pair.

ParametersJSON Schema
NameRequiredDescriptionDefault
cabinNoeconomy
adultsNo
originYesOrigin IATA airport or city code
endDateYes
currencyNoISO 4217 currency
maxStopsNo
maxNightsNo
minNightsNo
providersNoProvider IDs to query
startDateYes
timeoutMsNo
maxResultsNo
destinationYesDestination IATA airport or city code

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already indicate readOnlyHint and openWorldHint. Description adds no further behavioral context such as rate limits, pagination, or what 'normalized offer' means.

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?

Single sentence front-loaded with verb 'Search', very concise. However, it could include more structure for clarity.

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

Completeness2/5

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

Tool has 13 parameters and no output schema, yet description lacks details on return value format, how results are normalized, or any usage caveats. Incomplete for a tool of this complexity.

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

Parameters2/5

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

Schema description coverage is low (31%), and description does not elaborate on parameter semantics beyond mentioning 'outbound dates and stay lengths'. No mapping to specific parameters or added meaning for the 13 parameters.

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?

Description clearly states it searches multiple outbound dates and stay lengths, returning cheapest normalized offer per date pair. This distinguishes it from sibling tools like search_flights which likely searches specific dates.

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?

Description implies usage for flexible date searches but does not explicitly specify when to use this tool over siblings or when not to use it.

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

search_flightsB
Read-only

Search all configured flight providers concurrently, normalize their offers, and deduplicate equivalent itineraries.

ParametersJSON Schema
NameRequiredDescriptionDefault
cabinNoeconomy
adultsNo
originYesOrigin IATA airport or city code
currencyNoISO 4217 currency
maxStopsNo
providersNoProvider IDs to query
timeoutMsNo
maxResultsNo
returnDateNoOptional return date, YYYY-MM-DD
destinationYesDestination IATA airport or city code
departureDateYesDeparture date, YYYY-MM-DD

TDQS

B3.4/5.0
Behavior4/5

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

The description adds value beyond annotations by disclosing concurrent querying of providers, normalization, and deduplication. Annotations already indicate read-only and open-world behavior, and the description complements this without contradiction. However, it still omits details like error handling or rate limits.

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 a single sentence that effectively summarizes the core function. It is concise and front-loaded with the key action. However, it could be broken into multiple sentences for improved readability, but overall it is appropriately sized.

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

Completeness2/5

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

Given the tool's complexity (11 parameters, no output schema), the description is insufficient. It does not explain the output format, how to interpret results, or what edge cases exist. The annotations and schema alone do not provide complete guidance for a production tool.

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

Parameters2/5

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

With schema coverage at 55%, many parameters lack description. The tool description does not elaborate on parameter meanings beyond what is already in the schema. It does not compensate for the missing schema descriptions, leaving ambiguity for parameters like 'providers' or 'timeoutMs'.

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 clearly specifies the verb 'Search', the resource 'flights', and the unique behavior: searching all configured providers concurrently, normalizing offers, and deduplicating. It distinguishes itself from sibling tools like 'list_providers' and 'search_date_range' which have different scopes.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool vs. alternatives is provided. The description only states what the tool does, but does not mention when to prefer it over 'search_date_range' or other tools. The context of usage is implied but not articulated.

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

TDQS

A3.7/5.0
Disambiguation5/5

Each tool has a distinct purpose: listing providers, searching flights across providers, and searching across date ranges. No overlaps or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case: list_providers, search_flights, search_date_range. No deviations.

Tool Count5/5

Three tools is well-scoped for a flight search server, covering configuration listing, general search, and date-range search without excess or deficiency.

Completeness4/5

The set covers core flight search functionality, but lacks filters (e.g., by airline, price) or provider-specific queries. Minor gap but sufficient for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/shayben/all-flights-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server