About dealdata
dealdata is a local bridge to HasData’s hosted Google Flights deals MCP server for travelers searching from a plain-language trip idea. It returns flight dates, prices, itinerary details, and Google Flights links, without booking or payment capabilities.
Key features
- 01Search deals from a natural-language trip idea
- 02Set an origin airport and optional destination
- 03Filter dates, cabin, stops, and price
- 04Return flight, trip, and airline details
- 05Provide direct Google Flights links
Use cases
- 01Find beach-trip flight deals from an origin airport
- 02Filter flights by date range and trip length
- 03Compare prices, flight duration, and stops
MCP support
It exposes one read-only flight-deals search tool to MCP clients and forwards calls to HasData’s hosted Google Flights deals MCP server. It does not support booking, ticketing, or payment.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
1Saved tool list · updated 2d ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| q | string | Yes | Free-text trip description, from a bare place name to a full sentence: - **Destination**: `Tokyo` - **Type of trip**: `beach escape`, `weekend getaway in Europe` - **Season or event**: `I would like to see cherry blossom in Japan` When the query implies a time of year, Google dates it itself and reports the range in `searchInformation.dateRange`. |
| gl | string | No | The two-letter country code for the country you want to limit the search to. Provide one exact documented value (245 allowed), e.g. `ac`, `af`. |
| hl | string | No | The two-letter language code for the language you want to use for the search. Provide one exact documented value (159 allowed), e.g. `af`, `ak`. |
| type | enum | No | Flight type. Requires `arrivalId`. - `1` / `roundTrip` — round trip (default) - `2` / `oneWay` — one way A one-way deal carries no `returnDate` and no `tripLengthDays`.1 | roundTrip | 2 | oneWay |
| stops | enum | No | Maximum number of stops. Requires `arrivalId`. Omitted, any number is allowed. - `1` / `nonStop` — direct flights only - `2` / `oneStopOrFewer` — at most one connection - `3` / `twoStopsOrFewer` — at most two connections A route with nothing at that depth returns an empty `flightDeals` array, not an error — `nonStop` on a route without a direct flight is a valid, empty answer.1 | nonStop | 2 | oneStopOrFewer | 3 | twoStopsOrFewer |
| adults | number | No | Number of adults. Prices cover the whole party, so raising this raises every deal price. Passenger counts reprice rather than narrow the search, so they need no `arrivalId`. The whole party must not exceed 9. |
| children | number | No | Number of children, priced at their own fare. Counts towards the limit of 9 passengers. |
| currency | string | No | Parameter defines the currency of the returned prices Provide one exact documented value (71 allowed), e.g. `ALL`, `DZD`. |
| maxPrice | number | No | Maximum ticket price, inclusive. Requires `arrivalId`. Omitted, it is unbounded. Read in the currency of the request: `650` means 650 EUR when `currency` is `EUR`, and 650 USD by default. |
| arrivalId | string | No | Pins the search to one destination instead of letting Google pick from the query. - **IATA code**: 3 uppercase letters, e.g. `NRT` for Tokyo Narita. - **Location kgmid**: starts with `/m/`, found in Wikidata under "Freebase ID", e.g. `/m/07dfk` for Tokyo. Required by every filter: `type`, `travelClass`, `stops`, `outboundDate`, `returnDate`, `travelDuration`, `tripLength`, `maxPrice`, `maxDuration`, `includeAirlines` and `excludeAirlines`. Without it Google drops them silently. |
| returnDate | string | No | When to return, in the same exact-or-window spelling as `outboundDate`, which is required alongside it. Cannot be combined with `travelDuration` or `tripLength` — all three set the trip length. Ignored when `type` is `oneWay`. |
| tripLength | string | No | Trip length in days. Requires `arrivalId`. Cannot be combined with `returnDate` or `travelDuration`. - **Exact**: `7` - **Range**: `5,10` — min first Pairs with `outboundDate` to limit the departure period. Ignored when `type` is `oneWay`. |
| departureId | string | Yes | Departure airport as a 3-letter uppercase IATA code, e.g. `LAX` or `LHR`. Search on [IATA](https://www.iata.org/en/publications/directories/code-search). One airport per search; city names are not accepted. |
| maxDuration | number | No | Maximum flight duration in minutes — `1500` for 25 hours. Requires `arrivalId`. Omitted, it is unbounded. Applies to each leg, not to the round trip. Google measures against a longer figure than the `durationMinutes` it returns, so set the ceiling above the flight you want: on a route whose shortest deal is 635 minutes, `635` comes back empty and `680` returns it. On an empty result, raise `maxDuration` by up to 200 before concluding the route has nothing. |
| travelClass | enum | No | Travel class. Requires `arrivalId`. - `1` / `economy` — economy (default) - `2` / `premiumEconomy` — premium economy - `3` / `business` — business - `4` / `first` — first Fares climb steeply: on LAX-NRT the same search ran $730 in economy against $2882 in business.1 | economy | 2 | premiumEconomy | 3 | business | 4 | first |
| infantsOnLap | number | No | Number of infants on an adult's lap. Counts towards the limit of 9 passengers. Google prices a lap infant above one in its own seat — the opposite of how airlines usually charge. |
| outboundDate | string | No | When to depart. Requires `arrivalId`. - **Exact date**: `2026-12-10` - **Window**: `2026-12-01,2026-12-10` — any day within it Omitted, Google picks the dates from the query, or from whatever is cheapest. |
| infantsInSeat | number | No | Number of infants in their own seat. Counts towards the limit of 9 passengers. |
| travelDuration | enum | No | Preset trip length. Requires `arrivalId`. Cannot be combined with `returnDate` or `tripLength`. - `1` / `week` — about a week (6-8 days) - `2` / `weekend` — a weekend (2-3 days) - `3` / `twoWeeks` — about two weeks (13-15 days) Pairs with `outboundDate` to limit the departure period. Ignored when `type` is `oneWay`.1 | week | 2 | weekend | 3 | twoWeeks |
| excludeAirlines | string | No | Drops these airlines from the deals. Requires `arrivalId`. Cannot be combined with `includeAirlines`. Takes the same values as `includeAirlines`. |
| includeAirlines | string | No | Keeps only these airlines. Requires `arrivalId`. Cannot be combined with `excludeAirlines`. Comma-separated 2-character IATA codes (`AF`, `UA`, `B6`) and Google's alliances `STAR_ALLIANCE`, `SKYTEAM`, `ONEWORLD`. The two can be mixed. An airline that does not serve the route returns an empty `flightDeals` array, not an error. |
Details
From the project READMEdealdata
dealdata is a small local bridge to the hosted HasData Google Flights deals MCP server. Give it a plain-language trip idea — a beach escape, cherry blossom in Japan, a fireworks festival in Hong Kong — plus one origin airport, and Google chooses the destinations and travel dates, returning deals with outbound and return dates, price, flight duration, trip length, stops, operating airline, departure and arrival airports, and a direct Google Flights link. When Google shaped the search itself, a deal may also carry the typical price with its discount and a destination description with a photo, along with the date range Google derived from the query.
The bridge stores no fares of its own. It serves the upstream server's tool list locally, exactly as captured from the live endpoint, and forwards each tool call upstream, returning the result untouched. The captured surface is a single read-only deals search: published fare data only, with no booking, reservation, ticketing or payment tool in it.
Tools
hasdata_google_travel_flights_deals_getGoogleFlightsDeals— turn a trip description into Google Flights deals. Required:q(the plain-language trip description) anddepartureId(one origin airport as a 3-letter uppercase IATA code). Optional:arrivalId(pin one destination by IATA code or location kgmid; every fare filter requires it),type(round trip or one way),travelClass(economy, premium economy, business, first),outboundDateandreturnDate(exact dates or windows),travelDuration(week, weekend, two weeks),tripLength(days, exact or range),stops,maxDuration(minutes per leg),maxPrice,includeAirlines/excludeAirlines,adults,children,infantsInSeat,infantsOnLap(the whole party must not exceed 9), andgl,hl,currencyfor localisation.
Configuration
HASDATA_GOOGLE_FLIGHTS_DEALS_MCP_URL(optional) — override the upstream endpoint. Defaults tohttps://mcp.hasdata.com/mcp?apis=google_travel_flights_deals. (The override hook is this rebuild's own labelled reconstruction.)HASDATA_API_KEY(optional) — when set, every upstream request carries anx-api-key: <key>header, for the caller's own HasData API key. When it is not set, no key header is sent. (The header name and the env name are pinned by the original's registry record; forwarding the key from this env var is a labelled reconstruction — the original surface was captured keyless.)
Forwarding mechanics
On the first tool call the client opens a streamable
HTTP session with the upstream: a JSON-RPC
initialize request (protocolVersion 2025-03-26,
clientInfo name dealdata), then a
notifications/initialized notification, then the
tools/call request carrying the caller's arguments
unchanged. When the upstream answers initialize
with an Mcp-Session-Id header, that value rides on
every later request of the session, which is reused
for the life of the process. Replies may arrive as
plain JSON or as server-sent events; both are read.
Successful upstream results pass through verbatim,
including any isError flag the upstream sets.
Failures — a JSON-RPC error, a non-2xx status, an
unreadable response, or a request that cannot be
completed — come back as an isError result whose
text starts with dealdata error: (this rendering
is this rebuild's own labelled reconstruction).
CLI
The tool is also a subcommand taking one JSON argument string:
npx @reneturcios/dealdata hasdata_google_travel_flights_deals_getGoogleFlightsDeals '{"q":"beach escape","departureId":"LAX"}'
npx @reneturcios/dealdata --version
Exit codes: 0 on success, 1 on an isError
result, 2 on a usage error.
MCP server
npx -y @reneturcios/dealdata mcp
MCP client config:
{
"mcpServers": {
"dealdata": {
"command": "npx",
"args": ["-y", "@reneturcios/dealdata", "mcp"]
}
}
}
Docker
docker run -i ghcr.io/cloudcorprecords/dealdata
docker run --rm ghcr.io/cloudcorprecords/dealdata --version
The container's default command is mcp, so the first
form is a stdio MCP server; any other arguments reach
the CLI normally.
Development
npm install
npm run build
npm test
npm run dev
The test suite runs entirely against a stubbed JSON-RPC upstream — no live network calls.
License
MIT — see LICENSE.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.