by punitarani
Google Flights MCP, CLI and Python Library
# Add to your Claude Code skills
git clone https://github.com/punitarani/fliGuides for using mcp servers skills like fli.
Last scanned: 4/24/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-04-24T06:11:57.544Z",
"semgrepRan": false,
"npmAuditRan": true,
"pipAuditRan": true
}See how fli compares with popular alternatives.
fli is an open-source mcp servers skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by punitarani. Google Flights MCP, CLI and Python Library. It has 3,185 GitHub stars.
Yes. fli passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/punitarani/fli" and add it to your Claude Code skills directory (see the Installation section above).
fli is primarily written in Python. It is open-source under punitarani on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other MCP Servers skills you can browse and compare side by side. Open the MCP Servers category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh fli against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
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
flispecial? 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
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/

{
"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 runningwhich fli-mcpin your terminal.
The MCP server provides two main tools:
| Tool | Description |
|---|---|
search_flights |
Search for flights on a specific date with detailed filters |
search_dates |
Find the cheapest travel dates across a flexible date range |
search_flights Parameters| Parameter | Type | Description |
|---|---|---|
origin |
string | Departure airport IATA code(s) — comma-separated for multi |
destination |
string | Arrival airport IATA code(s) — comma-separated for multi |
departure_date |
string | Travel date in YYYY-MM-DD format |
return_date |
string | Return date for round trips (optional) |
cabin_class |
string | ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST |
max_stops |
string | ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS |
departure_window |
string | Time window in 'HH-HH' format (e.g., '6-20') |
airlines |
list | Filter by airline codes (e.g., ['BA', 'AA']) |
exclude_airlines |
list | Airline IATA codes to exclude (e.g., ['DL', 'B6']) |
alliance |
list | Restrict to alliances: ONEWORLD, SKYTEAM, STAR_ALLIANCE |
exclude_alliance |
list | Alliance names to exclude from results |
min_layover |
int | Minimum layover duration in minutes (multi-stop only) |
max_layover |
int | Maximum layover duration in minutes (multi-stop only) |
top_n |
int | Round-trip only: outbound options expanded into return flights (default 5, 1-10) |
currency |
string | ISO 4217 code (e.g. 'EUR', 'JPY') — flows to curr= param |
language |
string | BCP-47 language code (e.g. 'en-GB') — flows to hl= param |
country |
string | ISO 3166-1 alpha-2 country code (e.g. 'GB') for gl= param |
sort_by |
string | CHEAPEST, DURATION, DEPARTURE_TIME, or ARRIVAL_TIME |
passengers |
int | Number of adult passengers |
children |
int | Number of children (ages 2-11) |
infants_in_seat |
int | Number of infants (under 2) occupying their own seat |
infants_on_lap |
int | Number of lap infants (under 2, no seat) |
Total travelers (
passengers + children + infants_in_seat + infants_on_lap) must be between 1 and 9, andinfants_on_lapcannot exceedpassengers.A round trip costs
1 + top_npage fetches (one outbound search, plus one per outbound candidate expanded into return flights), sotop_nis capped at 10. Round-trip results all from one airline? Raisetop_n, or sort differently — the default sort only ever expands the cheapesttop_noutbounds, which are often the same carrier.
search_dates Parameters| Parameter | Type | Description |
|---|---|---|
origin |
string | Departure airport IATA code(s) — comma-separated for multi |
destination |
string | Arrival airport IATA code(s) — comma-separated for multi |
start_date |
string | Start of date range in YYYY-MM-DD format |
end_date |
string | End of date range in YYYY-MM-DD format |
trip_duration |
int | Trip duration in days (for round-trips) |
is_round_trip |
bool | Whether to search for round-trip flights |
cabin_class |
string | ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST |
max_stops |
string | ANY, NON_STOP, ONE_STOP, or TWO_PLUS_STOPS |
departure_window |
string | Time window in 'HH-HH' format (e.g., '6-20') |
airlines |
list | Filter by airline codes (e.g., ['BA', 'AA']) |
exclude_airlines |
list | Airline IATA codes to exclude |
alliance |
list | Restrict to alliances: ONEWORLD, SKYTEAM, STAR_ALLIANCE |
exclude_alliance |
list | Alliance names to exclude |
min_layover |
int | Minimum layover duration in minutes |
max_layover |
int | Maximum layover duration in minutes |
currency |
string | ISO 4217 currency code (e.g. 'EUR', 'JPY') |
language |
string | BCP-47 language code (e.g. 'en-GB') |
country |
string | ISO 3166-1 alpha-2 country code (e.g. 'GB') |
sort_by_price |
bool | Sort results by price (lowest first) |
passengers |
int | Number of adult passengers |
children |
int | Number of children (ages 2-11) |
infants_in_seat |
int | Number of infants (under 2) occupying their own seat |
infants_on_lap |
int | Number of lap infants (under 2, no seat) |
Same passenger limits as
search_flights: total 1-9,infants_on_lap≤passengers.
pip install flights
# Install using pipx (recommended for CLI)
pipx install flights
# Get started with CLI
fli --help

🔍 Powerful Search
💺 Cabin Classes
🎯 Smart Sorting
🛡️ Built-in Protection
Searches are served by Google's public search page rather than the
FlightsFrontendService RPC. Since 2026-08 GetShoppingResults and
GetCalendarGraph require an x-goog-batchexecute-bgr header that only the
page's own JavaScript can produce, so a plain HTTP client gets HTTP 200 with no
payload. Fli issues GET https://www.google.com/travel/flights?tfs=<protobuf>
instead and reads the results out of the page's inline AF_initDataCallback
blob keyed ds:1.
What that means in practice:
emissions, bags and
exclude_basic_economy have no tfs field and cannot be reconstructed from
the decoded rows, so they are dropped with a warning. Stops, cabin,
passengers, alliances and layover bounds ride in the request; airline
include/exclude, price cap, max duration and departure windows are applied to
the results after fetching.SearchUnsupportedError. Google loads those results
client-side through the gated RPC, so the page carries no rows to read.
Search each leg separately.get_booking_options is unavailable. It calls GetBookingResults, which
is gated the same way, and currently raises SearchRejectedError. The
per-flight tfs booking deep links are built offline and still work.search() only warns when the fetched page
itself came back with