Sandbox
@punitarani/fli

Google Flights MCP server, CLI, and Python library

Fli gives you programmatic access to Google Flights data from Python, the command line, or an MCP server. It supports one-way, round-trip, date-range, and multi-city searches, with filters for cabins, stops, airlines, alliances, layovers, locale, and sorting.

3,144 starsβ€’393 forksβ€’Pythonβ€’Updated 1mo ago
Who it's for

People who want their agent or terminal to search flights, compare fares, and find cheap dates.

What it delivers

You can search Google Flights from your agent or terminal instead of re-entering trip details by hand.

What it does

Flight search tools

Provides `search_flights` and `search_dates` tools through MCP for flight lookups and cheap-date searches.

CLI commands

Includes `fli flights`, `fli dates`, and `fli multi` for direct terminal searches with filters.

Python API

Offers `SearchFlights` and model classes like `FlightSearchFilters`, `FlightSegment`, and `Airport` for scripted use.

TypeScript port

Ships a 1:1 `fli-js` package with the same models and filter encoding.

Search filters

Supports cabin class, stop count, airlines, alliances, layover limits, date ranges, time windows, currency, language, and country.

Developer examples

Includes runnable Python and TypeScript examples for one-way, round-trip, multi-city, and advanced searches.

How to get it

  1. 1Run
    pip install flights
  2. 2Run
    # Install using pipx (recommended for CLI)
    pipx install flights
    
    # Get started with CLI
    fli --help
  3. 3Experimental --format json is experimental. The JSON schema may change while the…
    # Return machine-readable flight results
    fli flights JFK LHR 2026-10-25 --format json
  4. 4Run
    # Basic date search
    fli dates JFK LHR
    
    # Advanced search with date range
    fli dates JFK LHR \
        --from 2026-01-01 \
        --to 2026-02-01 \
        --monday --friday      # Only Mondays and Fridays
  5. 5Experimental --format json is experimental for date searches as well.
    # Return machine-readable date search results
    fli dates JFK LHR --from 2026-01-01 --to 2026-02-01 --format json
  6. 6Runnable examples live in examples/python/
    # Run examples with uv (recommended)
    uv run python examples/python/basic_one_way_search.py
    uv run python examples/python/round_trip_search.py
    uv run python examples/python/date_range_search.py
    
    # Or install dependencies first, then run directly
    pip install pydantic curl_cffi httpx
    python examples/python/basic_one_way_search.py

README

πŸ›« Fli - Flight Search MCP Server and Library

Ask DeepWiki

A powerful Python library that provides programmatic access to Google Flights data with an elegant CLI interface. Search flights, find the best deals, and filter results with ease.

πŸš€ What makes fli special? Unlike other flight search libraries that rely on web scraping, Fli directly interacts with Google Flights' API through reverse engineering. This means:

  • Fast: Direct API access means faster, more reliable results
  • Zero Scraping: No HTML parsing, no browser automation, just pure API interaction
  • Reliable: Less prone to breaking from UI changes
  • Modular: Extensible architecture for easy customization and integration

MCP Server

pipx install flights

# Run the MCP server on STDIO
fli-mcp

# Run the MCP server over HTTP (streamable)
fli-mcp-http  # serves at http://127.0.0.1:8000/mcp/

MCP Demo

Connecting to Claude Desktop

{
  "mcpServers": {
    "fli": {
      "command": "/Users/<user>/.local/bin/fli-mcp"
    }
  }
}

Note: Replace <user> with your actual username. You can also find the path to the MCP server by running which fli-mcp in your terminal.

MCP Tools Available

The MCP server provides two main tools:

ToolDescription
search_flightsSearch for flights on a specific date with detailed filters
search_datesFind the cheapest travel dates across a flexible date range

search_flights Parameters

ParameterTypeDescription
originstringDeparture airport IATA code(s) β€” comma-separated for multi
destinationstringArrival airport IATA code(s) β€” comma-separated for multi
departure_datestringTravel date in YYYY-MM-DD format
return_datestringReturn date for round trips (optional)
cabin_classstringECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST
max_stopsstringANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS
departure_windowstringTime window in 'HH-HH' format (e.g., '6-20')
airlineslistFilter by airline codes (e.g., ['BA', 'AA'])
exclude_airlineslistAirline IATA codes to exclude (e.g., ['DL', 'B6'])
alliancelistRestrict to alliances: ONEWORLD, SKYTEAM, STAR_ALLIANCE
exclude_alliancelistAlliance names to exclude from results
min_layoverintMinimum layover duration in minutes (multi-stop only)
max_layoverintMaximum layover duration in minutes (multi-stop only)
currencystringISO 4217 code (e.g. 'EUR', 'JPY') β€” flows to curr= param
languagestringBCP-47 language code (e.g. 'en-GB') β€” flows to hl= param
countrystringISO 3166-1 alpha-2 country code (e.g. 'GB') for gl= param
sort_bystringCHEAPEST, DURATION, DEPARTURE_TIME, or ARRIVAL_TIME
passengersintNumber of adult passengers

search_dates Parameters

ParameterTypeDescription
originstringDeparture airport IATA code(s) β€” comma-separated for multi
destinationstringArrival airport IATA code(s) β€” comma-separated for multi
start_datestringStart of date range in YYYY-MM-DD format
end_datestringEnd of date range in YYYY-MM-DD format
trip_durationintTrip duration in days (for round-trips)
is_round_tripboolWhether to search for round-trip flights
cabin_classstringECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST
max_stopsstringANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS
departure_windowstringTime window in 'HH-HH' format (e.g., '6-20')
airlineslistFilter by airline codes (e.g., ['BA', 'AA'])
exclude_airlineslistAirline IATA codes to exclude
alliancelistRestrict to alliances: ONEWORLD, SKYTEAM, STAR_ALLIANCE
exclude_alliancelistAlliance names to exclude
min_layoverintMinimum layover duration in minutes
max_layoverintMaximum layover duration in minutes
currencystringISO 4217 currency code (e.g. 'EUR', 'JPY')
languagestringBCP-47 language code (e.g. 'en-GB')
countrystringISO 3166-1 alpha-2 country code (e.g. 'GB')
sort_by_priceboolSort results by price (lowest first)
passengersintNumber of adult passengers

Quick Start

pip install flights
# Install using pipx (recommended for CLI)
pipx install flights

# Get started with CLI
fli --help

CLI Demo

Features

  • πŸ” Powerful Search

    • One-way flight searches
    • Multi-city flight searches
    • Flexible departure times
    • Multi-airline support
    • Cabin class selection
    • Stop preferences
    • Custom result sorting
  • πŸ’Ί Cabin Classes

    • Economy
    • Premium Economy
    • Business
    • First
  • 🎯 Smart Sorting

    • Price
    • Duration
    • Departure Time
    • Arrival Time
  • πŸ›‘οΈ Built-in Protection

    • Rate limiting
    • Automatic retries
    • Comprehensive error handling
    • Input validation

CLI Usage

Search for Flights

# Basic flight search
fli flights JFK LHR 2026-10-25

# Advanced search with filters
fli flights JFK LHR 2026-10-25 \
    --time 6-20 \             # Departure time window (6 AM - 8 PM)
    --airlines BA,KL \        # Airlines (British Airways, KLM)
    --class BUSINESS \        # Cabin class
    --stops NON_STOP \        # Non-stop flights only
    --sort DURATION           # Sort by duration

# Alliance + exclude + locale (May-2026 filter additions)
fli flights JFK LHR 2026-10-25 \
    --alliance ONEWORLD \
    --exclude-airlines AA \
    --min-layover 90 \
    --max-layover 360 \
    --currency EUR --language en-GB --country GB

⚠️ Experimental --format json is experimental. The JSON schema may change while the machine-readable CLI contract settles.

# Return machine-readable flight results
fli flights JFK LHR 2026-10-25 --format json

Find Cheapest Dates

# Basic date search
fli dates JFK LHR

# Advanced search with date range
fli dates JFK LHR \
    --from 2026-01-01 \
    --to 2026-02-01 \
    --monday --friday      # Only Mondays and Fridays

⚠️ Experimental --format json is experimental for date searches as well.

# Return machine-readable date search results
fli dates JFK LHR --from 2026-01-01 --to 2026-02-01 --format json

Multi-city Search

# Two-leg multi-city trip
fli multi --leg SEA,HKG,2026-12-26 --leg PEK,SEA,2027-01-02

# Three-leg multi-city trip with filters
fli multi \
    -l SEA,NRT,2026-12-26 \
    -l NRT,HKG,2026-12-30 \
    -l HKG,SEA,2027-01-05 \
    --class BUSINESS \
    --stops 0

CLI Options

Flights Command (fli flights)

OptionDescriptionExample
--return, -rReturn date2026-10-30
--time, -tDeparture time window6-20
--airlines, -aAirline IATA codesBA,KL
--exclude-airlines, -AAirline IATA codes to excludeDL,B6
--allianceRestrict to alliance(s)ONEWORLD, SKYTEAM
--exclude-allianceAlliance(s) to excludeSTAR_ALLIANCE
--min-layoverMinimum layover (minutes)90
--max-layoverMaximum layover (minutes)360
--currencyISO 4217 currency codeEUR, JPY
--languageBCP-47 language code (Google hl=)en-GB
--countryISO 3166-1 alpha-2 country (gl=)GB
--class, -cCabin classECONOMY, BUSINESS
--stops, -sMaximum stopsNON_STOP, ONE_STOP
--sort, -oSort results byCHEAPEST, DURATION
--formatOutput formattext, json

Dates Command (fli dates)

OptionDescriptionExample
--fromStart date2026-01-01
--toEnd date2026-02-01
--duration, -dTrip duration in days3
--round, -RRound-trip search(flag)
--airlines, -aAirline IATA codesBA,KL
--exclude-airlines, -AAirline IATA codes to excludeDL,B6
--allianceRestrict to alliance(s)ONEWORLD
--exclude-allianceAlliance(s) to excludeSTAR_ALLIANCE
--min-layoverMinimum layover (minutes)90
--max-layoverMaximum layover (minutes)360
--currencyISO 4217 currency codeEUR, JPY
--languageBCP-47 language codeen-GB
--countryISO 3166-1 alpha-2 countryGB
--class, -cCabin classECONOMY, BUSINESS
--stops, -sMaximum stopsNON_STOP, ONE_STOP
--timeDeparture time window6-20
--sortSort by price(flag)
--[day]Day filters--monday, --friday
--formatOutput formattext, json

Multi Command (fli multi)

OptionDescriptionExample
--leg, -lFlight leg (ORIGIN,DEST,DATE format)SEA,HKG,2026-12-26
--time, -tDeparture time window6-20
--airlines, -aAirline IATA codesDL CX
--class, -cCabin classECONOMY, BUSINESS
--stops, -sMaximum stopsNON_STOP, ONE_STOP
--sort, -oSort results byCHEAPEST, DURATION

MCP Server Integration

Fli includes a Model Context Protocol (MCP) server that allows AI assistants like Claude to search for flights directly. This enables natural language flight search through conversation.

Running the MCP Server

# Run the MCP server on STDIO
fli-mcp

# Or with uv (for development)
uv run fli-mcp

# Or with make (for development)
make mcp

# Run the MCP server over HTTP (streamable)
fli-mcp-http  # serves at http://127.0.0.1:8000/mcp/

Claude Desktop Configuration

To use the flight search capabilities in Claude Desktop, add this configuration to your claude_desktop_config.json:

Location: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)

{
  "mcpServers": {
    "flight-search": {
      "command": "fli-mcp",
      "args": []
    }
  }
}

After adding this configuration:

  1. Restart Claude Desktop
  2. You can now ask Claude to search for flights naturally:
    • "Find flights from JFK to LAX on December 25th"
    • "What are the cheapest dates to fly from NYC to London in January?"
    • "Search for business class flights from SFO to NRT with no stops"

Python API Usage

Basic Search Example

from datetime import datetime, timedelta
from fli.models import (
    Airport,
    PassengerInfo,
    SeatType,
    MaxStops,
    SortBy,
    FlightSearchFilters,
    FlightSegment
)
from fli.search import SearchFlights

# Create search filters
filters = FlightSearchFilters(
    passenger_info=PassengerInfo(adults=1),
    flight_segments=[
        FlightSegment(
            departure_airport=[[Airport.JFK, 0]],
            arrival_airport=[[Airport.LAX, 0]],
            travel_date=(datetime.now() + timedelta(days=30)).strftime("%Y-%m-%d"),
        )
    ],
    seat_type=SeatType.ECONOMY,
    stops=MaxStops.NON_STOP,
    sort_by=SortBy.CHEAPEST,
)

# Search flights
search = SearchFlights()
flights = search.search(filters)

# Process results
for flight in flights:
    print(f"πŸ’° Price: ${flight.price}")
    print(f"⏱️ Duration: {flight.duration} minutes")
    print(f"✈️ Stops: {flight.stops}")

    for leg in flight.legs:
        print(f"\nπŸ›« Flight: {leg.airline.value} {leg.flight_number}")
        print(f"πŸ“ From: {leg.departure_airport.value} at {leg.departure_datetime}")
        print(f"πŸ“ To: {leg.arrival_airport.value} at {leg.arrival_datetime}")

Running Examples

Runnable examples live in examples/python/:

# Run examples with uv (recommended)
uv run python examples/python/basic_one_way_search.py
uv run python examples/python/round_trip_search.py
uv run python examples/python/date_range_search.py

# Or install dependencies first, then run directly
pip install pydantic curl_cffi httpx
python examples/python/basic_one_way_search.py

Available Examples:

  • basic_one_way_search.py - Simple one-way flight search
  • round_trip_search.py - Round-trip flight booking
  • date_range_search.py - Find cheapest dates
  • multi_city_search.py - Multi-city itinerary across several legs
  • advanced_filters_search.py - Alliances, airline exclusions, layovers, locale
  • complex_flight_search.py - Advanced filtering and multi-passenger
  • time_restrictions_search.py - Time-based filtering
  • date_search_with_preferences.py - Weekend filtering
  • price_tracking.py - Price monitoring over time
  • error_handling_with_retries.py - Robust error handling
  • result_processing.py - Data analysis with pandas
  • complex_round_trip_validation.py - Advanced round-trip with validation
  • advanced_date_search_validation.py - Complex date search with filtering

Examples

Examples are organized by language, with parallel scripts so you can compare the two APIs:

# Python
uv run python examples/python/complex_flight_search.py

# TypeScript (from examples/typescript, after `bun install`)
bun run multi_city_search.ts

Example Categories:

  • Basic Usage: One-way, round-trip, date searches
  • Advanced Filtering: Time restrictions, airlines, alliances, seat classes, locale
  • Data Analysis: Price tracking, result processing with pandas
  • Error Handling: Retry logic, robust error management
  • Complex Scenarios: Multi-city, multi-passenger, validation, business rules

Each example is self-contained β€” change the airports, dates, and filters at the top of the script to fit your search.

TypeScript / JavaScript

Fli is also available as a 1:1 TypeScript port, published to npm as fli-js. Same models, same filter encoding, same direct-API approach.

bun add fli-js   # or: npm install fli-js
import { Airport, FlightSearchFilters, FlightSegment, SearchFlights, SeatType } from "fli-js";

const inDays = (n: number) => new Date(Date.now() + n * 86_400_000).toISOString().slice(0, 10);

const filters = new FlightSearchFilters({
  passenger_info: { adults: 1, children: 0, infants_in_seat: 0, infants_on_lap: 0 },
  flight_segments: [
    new FlightSegment({
      departure_airport: [[[Airport.JFK, 0]]],
      arrival_airport: [[[Airport.LAX, 0]]],
      travel_date: inDays(30),
    }),
  ],
  seat_type: SeatType.ECONOMY,
});

const results = await new SearchFlights().search(filters, { currency: "USD" });

The TypeScript source lives in fli-js/; see the TypeScript Quick Start for the full guide.

Development

# Clone the repository
git clone https://github.com/punitarani/fli.git
cd fli

# Install dependencies with uv
uv sync --all-extras

# Run tests
uv run pytest

# Run linting
uv run ruff check .
uv run ruff format .

# Build documentation
uv run mkdocs serve

# Or use the Makefile for common tasks
make install-all  # Install all dependencies
make test         # Run tests
make lint         # Check code style
make format       # Format code

Docker Development

# Build the devcontainer
docker build -t fli-dev -f .devcontainer/Dockerfile .

# Run CI inside the container
docker run --rm fli-dev make lint test-all

# Or run lint and tests separately
docker run --rm fli-dev make lint
docker run --rm fli-dev make test-all

Running CI Locally with act

To run GitHub Actions locally, install act:

brew install act

# Run CI locally (lint + tests on Python 3.10-3.13)
make ci

# Or run CI inside Docker (no local act installation needed)
make ci-docker

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License β€” see the LICENSE file for details.

Files in the repo

Repository payloadβ€’27 top-level entries
  • .devcontainer
  • .github
  • data
  • docs
  • examples
  • fli
  • fli-js
  • scripts
  • skills
  • tests
  • .actrc
  • .dockerignore
  • .gitignore
  • AGENTS.md
  • CLAUDE.md
  • docker-compose.yml
  • Dockerfile
  • LICENSE.txt
  • Makefile
  • mkdocs.yml
  • nixpacks.toml
  • pyproject.toml
  • pytest.ini
  • railway.toml
  • README.md
  • tox.ini
  • uv.lock

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More connectors

Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface

86k

High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph β€” average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

43k

Universal provider proxy for OpenAI Codex & Claude Code β€” use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code

14k
okf-memory/
okf-agent-memory

Git-native persistent memory for AI coding agents. Implements Google OKF v0.2 with sub-300Β΅s in-memory BM25 search, embedded MCP server, and progressive disclosure. Slashes token bloat by 80% with zero external databases or dependencies. Built in pure Go.

547
2akouwu/
reverify

Stop your AI from making things up β€” it proposes, deterministic tools decide, every claim checked against ground truth with evidence. Grounded facts and context survive resets. Reverse engineering is the proving ground. MCP server + CLI.

1.1k

x64dbg-MCP Server is a native MCP (Model Context Protocol) plugin for x64dbg that exposes the debugger's full functionality over HTTP. Connect any MCP-compatible AI assistant and control x64dbg programmatically: set breakpoints, step through code, read memory, dump registers, and more. Built with Zig β€” zero dependencies, single-binary output, cros

1.9k