cheapdates-mcp
This MCP server provides flight search and fare research via Google Flights and ITA Matrix, including cheapest-date calendars, detailed itineraries, fare comparisons, airline/alliance filters, and loyalty benefit assessments.
Cheapest dates: Use
cheapest_dates_toolto get the cheapest fare for each departure date between a start and end date, for one-way or round trips (trip_length).Search controls: Specify origin/destination as IATA codes, currency, nonstop preference, seat type, backend (
sweep,graph, orauto), and optionally include airline names.Detailed itineraries and fares: Additional tools (
search_flights_tool,select_flight_tool,compare_fares_tool) support detailed flight searches, return-leg selection, and ITA Matrix fare research with booking-class comparisons.Airline and loyalty features:
airline_partners_toolandassess_benefits_toolprovide airline/alliance partner info and benefit assessments using optional traveler profiles, distinguishing sourced policies, exclusions, and missing evidence.Result handling: Provides per-date statuses (
priced,no_results,error) and top-level statuses (ok,no_results,partial,error); invalid inputs or total failures return tool errors.
Provides tools to find the cheapest dates to fly a given route using Google Flights data, supporting one-way and round-trip searches, with options for nonstop flights, currency, seat class, and backend selection.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cheapdates-mcpShow me the cheapest dates to fly JFK to LHR in October 2026."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
cheapdates
Flight calendars, detailed itineraries, airline/alliance filters, and free ITA Matrix fare research. CLI + MCP server.
The default workflow uses HTTP only: no Chromium, clicking, account, personal API key or subscription.
The MCP includes cheapest_dates_tool, search_flights_tool, select_flight_tool,
compare_fares_tool, airline_partners_tool, and assess_benefits_tool.
Optional traveler profiles record any loyalty program, status tier and requested benefits.
Benefit assessments distinguish sourced tier policies, explicit exclusions and missing evidence
for each operator. Initial reviewed coverage includes SkyMiles on LATAM/Virgin Atlantic and
LATAM Pass on Delta; other combinations remain unknown. No personal defaults or account numbers
are needed. Required benefits default to an empty list and Basic fares are not excluded
by default. exclude_basic_economy=true is an explicit user choice sent to Google as an
unverified preference, not a guarantee of non-Basic fares. These tools do not list every
airline fare family. Search limit=null returns all matching candidates in the provider
response; coverage metadata reports output truncation.
See detailed search and fare comparison for examples, booking-class comparisons,
and the distinction between requested filters and verified itinerary details.
cheapdates has two calendar backends:
sweep (default) — one Google flight search per date, with airline names and no browser.
graph (explicit opt-in) — headless Chromium opens Google's price graph. One response covers roughly 60 dates, but provides no airline details.
auto always selects sweep. Sweep reads both Google result groups so a cheaper offer in
one group is not overlooked. Detailed search and return selection also use HTTP.
Fare research uses ITA Matrix, with its quote kept separate from Google's price.
Use IATA airport codes, not city names. For Santiago, Chile use SCL. For New York, choose
the intended airport (JFK, EWR, or LGA); the tool does not silently pick one for you.
Whitespace and lowercase codes are accepted. Validation checks code format, not airport existence
or route availability.
Need the airline? Set include_airlines=true in MCP/Python or --include-airlines in the CLI.
This selects sweep, including when backend="graph" was requested. The price and airline come from
the same returned offer. Graph alone has always provided calendar prices only, so its airlines
field is null; an airline from a separate search must not be attributed to that calendar price.
Install
git clone https://github.com/afgoes/cheapdates.git && cd cheapdates && uv sync # see INSTALL.md
# Optional, only if you explicitly use --backend graph:
uv run python -m playwright install chromiumRelated MCP server: fli
CLI
cheapdates JFK LHR 2026-10-01 2026-11-30 # one-way
cheapdates JFK LHR 2026-10-01 2026-11-30 -r 7 # round trip, 7 nights
cheapdates JFK LHR 2026-10-01 2026-11-30 --nonstop --json
cheapdates JFK LHR 2026-10-01 2026-11-30 -b sweep # force fast-flights
cheapdates JFK SCL 2026-09-23 2026-09-29 -r 7 --include-airlines --jsonMCP (Claude Code)
claude mcp add cheapdates -- uv run --directory /path/to/cheapdates cheapdates-mcpTool: cheapest_dates_tool(origin, destination, start, end, trip_length?, currency?, nonstop?, seat?, backend?, include_airlines?).
Example arguments for a seven-night trip with airline names:
{
"origin": "JFK",
"destination": "SCL",
"start": "2026-09-23",
"end": "2026-09-29",
"trip_length": 7,
"include_airlines": true
}For long ranges, narrow the date window to reduce HTTP requests. Graph is an optional browser alternative.
Airline names are returned when Google supplies them; they do not establish flight numbers,
nonstop service, or all return-leg details. Use nonstop=true to request nonstop results.
Results and failures
Result
status:ok,no_results,partial, orerror.Day
status:priced,no_results, orerror;errorcontains a diagnostic when applicable.A missing fare after a completed search differs from a failed fetch or parser error.
Partial results retain successful dates and report failed dates individually.
MCP returns a tool error for invalid inputs or when every requested date fails.
CLI emits exit code 2 for invalid arguments and 1 for partial/total search failure, including with
--json.Sweep requests have a 20-second timeout, retry only transport errors/HTTP 429/5xx up to three attempts, and never retry deterministic parser errors.
The existing result fields are retained. status and per-day error are additive.
Update and test
git pull --ff-only
uv sync --locked
uv run pytest -qRestart the MCP client after updating so it reloads the tool schema. The tests use fixtures and mocked responses; live flight searches are separate and prices can change.
Python
import datetime as dt
from cheapdates import cheapest_dates
r = cheapest_dates("JFK", "LHR", dt.date(2026,10,1), dt.date(2026,11,30), trip_length=7)
print(r.cheapest)Caveats
Reverse-engineered; Google can change the page or response at any time. The parser is fixture-tested
(pytest), and the graph backend falls back to sweep on failure.
Available Tools
1 toolcheapest_dates_toolA
Cheapest fare for each departure date between start and end (YYYY-MM-DD) on origin→destination.
trip_length: None for one-way, or N for a round trip returning N days after departure. Returns {cheapest, days:[{depart, ret, price, airlines}], backend, warnings}. The 'graph' backend reads Google Flights' own price calendar (fast, ~60 days per call); 'sweep' searches each date individually. 'auto' picks graph when a browser is available.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| seat | No | economy | |
| start | Yes | ||
| origin | Yes | ||
| backend | No | auto | |
| nonstop | No | ||
| currency | No | USD | |
| destination | Yes | ||
| trip_length | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the behavior of different backends (graph vs sweep vs auto) and mentions speed implications, which is useful. However, it does not disclose any data limitations, rate limits, or potential variability in results, which would be helpful for a tool using different search backends.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the main purpose, and provides structured information about trip_length and backend behavior. It uses bullet-like structure within paragraphs effectively, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 9 parameters and no output schema, the description provides a solid overview but lacks detailed parameter explanations and behavioral notes. It covers the essential usage and return format but could be more complete by describing the meaning of the warning field, typical use cases, and edge cases like date boundaries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 9 parameters but the description does not explicitly map each parameter beyond trip_length and backend. Schema description coverage is 0%, so the description must compensate, but it only explains a couple of parameters. The return structure is described, but parameter semantics for origin, destination, start, end, seat, nonstop, currency are left to the schema, which has no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds the cheapest fare for each departure date over a date range for a given route, distinguishing it from typical one-off price lookup tools. It specifies input format and return structure, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the trip_length parameter (one-way vs round trip) and backend options, but does not explicitly state when to prefer this tool over alternatives. Since no sibling tools are provided, we cannot evaluate differentiation, but the description does give context on how to use different backends.
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 tool update
v0.1.0- First observed
cheapest_dates_tool
TDQS
Scored across 1 tool
With only one tool, there is zero ambiguity—an agent cannot confuse it with any other. The tool's purpose is clearly described.
The single tool name 'cheapest_dates_tool' is descriptive but uses a bare noun with a redundant 'tool' suffix rather than a verb_noun pattern. Since there is no set of names to compare, it is not inconsistent, but the naming style is slightly unconventional.
The server exposes only one tool, which is at the borderline of being too thin. While the tool encapsulates a coherent function, a larger set (e.g., specific date lookup, fare alerts) could better justify a dedicated MCP server.
The tool fully covers the stated purpose—finding cheapest fares across a date range. It supports one-way and round-trip queries, provides pricing and airline details, and handles backend selection automatically. Minor gaps like booking integration or fare alerts are outside its shown scope.
Maintenance
Related MCP Connectors
whentofly: flexible-date economy/business flight search + price-level context for AI agents
Real-time Google Flights fares for agents. Three things people do with this server. Scan for deals: one call takes a date range and a list of destination airports, expands every combination server side, and returns each fare with Google's own low, typical or high verdict. Put live search in your app: flat JSON with a bookable link on every result, and round trips priced as paired legs. Run a 24/7 AI travel agent: add the server, sign in with Google, and schedule it. No ads, no sponsored content. You bring your own RapidAPI key, so every search is billed to your plan and never to anyone else's. Add https://flights.flightpowers.com/mcp , click Sign in, sign in with Google, and paste your RapidAPI key once on the page that opens. Scripts and clients without a sign-in button send the key as x-rapidapi-key on the same URL.
Flight Intelligence MCP — search, cheapest dates, multi-city, airline compare via Google Flights
Flight search, airfare analytics, flexible destinations
Related MCP Servers
- AlicenseAqualityDmaintenanceIntegrates Google Flights data into AI workflows for natural language flight searches, price comparisons, flexible date searches, and multi-city itinerary planning with support for various cabin classes and passenger types.95MIT
- AlicenseNot gradedqualityAmaintenanceEnables flight search and fare calendar exploration by interacting with Google Flights' API, supporting detailed filters for origin, destination, dates, cabin class, airlines, and more.3,876 PyPI3,193MIT
- AlicenseAqualityFmaintenanceConnects AI agents to Google Flights data, enabling retrieval of flight information, cheapest options, time-filtered flights, and best recommendations.429MIT
- AlicenseAqualityFmaintenanceEnables searching and analyzing Google Flights data including prices, emissions, cabin classes, layovers, and price tracking, all without an API key.12213 npm5ISC