mcpField
D
dealdata

dealdata

Local
github.com/CloudCorpRecordsMaps & Travel0Updated 2d ago

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

  1. 01Search deals from a natural-language trip idea
  2. 02Set an origin airport and optional destination
  3. 03Filter dates, cabin, stops, and price
  4. 04Return flight, trip, and airline details
  5. 05Provide direct Google Flights links

Use cases

  1. 01Find beach-trip flight deals from an origin airport
  2. 02Filter flights by date range and trip length
  3. 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.

mcp.json · Universal config
{
"mcpServers": {
"cloudcorprecords-dealdata": {
"command": "npx",
"args": [
"-y",
"@reneturcios/dealdata"
]
}
}
}
Run commandnpx -y @reneturcios/dealdata

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npm@reneturcios/dealdata0.1.0
ocighcr.io/cloudcorprecords/dealdata:0.1.0

Tools

1

Saved tool list · updated 2d ago

ParameterTypeRequiredDescription
qstringYesFree-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`.
glstringNoThe 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`.
hlstringNoThe 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`.
typeenumNoFlight 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
stopsenumNoMaximum 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
adultsnumberNoNumber 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.
childrennumberNoNumber of children, priced at their own fare. Counts towards the limit of 9 passengers.
currencystringNoParameter defines the currency of the returned prices Provide one exact documented value (71 allowed), e.g. `ALL`, `DZD`.
maxPricenumberNoMaximum 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.
arrivalIdstringNoPins 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.
returnDatestringNoWhen 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`.
tripLengthstringNoTrip 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`.
departureIdstringYesDeparture 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.
maxDurationnumberNoMaximum 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.
travelClassenumNoTravel 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
infantsOnLapnumberNoNumber 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.
outboundDatestringNoWhen 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.
infantsInSeatnumberNoNumber of infants in their own seat. Counts towards the limit of 9 passengers.
travelDurationenumNoPreset 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
excludeAirlinesstringNoDrops these airlines from the deals. Requires `arrivalId`. Cannot be combined with `includeAirlines`. Takes the same values as `includeAirlines`.
includeAirlinesstringNoKeeps 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 README

dealdata

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) and departureId (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), outboundDate and returnDate (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), and gl, hl, currency for localisation.

Configuration

  • HASDATA_GOOGLE_FLIGHTS_DEALS_MCP_URL (optional) — override the upstream endpoint. Defaults to https://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 an x-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

Markdown supported

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.