About faregrid
faregrid is a local bridge to the hosted FlightPowers MCP server for searching live Google Flights fares. It returns flight details and historical price bands for comparison, but does not provide booking or payment functions.
Key features
- 01Search one-way and round-trip fares
- 02Search date ranges and multiple destinations
- 03Filter by airline, stops, and price
- 04Return flight details and booking links
- 05Assess fares against historical price bands
Use cases
- 01Compare fares across several dates
- 02Find flights matching stop or airline criteria
- 03Check a fare against its historical range
MCP support
faregrid exposes flight-search tools to MCP clients and forwards calls to the hosted FlightPowers MCP server. Results include vendor booking links, but there are no booking or payment tools.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
2Saved tool list · updated 1w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | No | Maximum flights to return, after merging and sorting. |
| sort_by | string | No | "best" (the default) and "price" both order by price, cheapest first; "duration" orders shortest first. Applied across all results. |
| verbose | boolean | No | Returns every field the upstream sends on each fare, and every fare that was selected, with no row bound. Off by default: a result carries the best rows by the requested sort_by in a compact shape (dates, destination, airline, stops, duration, price, trip length and the booking link), because a wide search over a month and several destinations otherwise produces a megabyte of JSON that some hosts refuse to put in the conversation at all. When true, it adds the arrival times, the per-leg stop counts, the raw stop details and every row past results_returned; results_total always says how many there were. |
| currency | string | No | ISO currency code, default "usd". |
| max_price | any | No | Only flights at or below this price are returned. |
| max_stops | any | No | Maximum stops per flight. 0 means non-stop only. |
| seat_type | any | No | 1 economy, 2 premium economy, 3 business, 4 first. |
| passengers | any | No | One entry per traveller, not a count: 1 adult, 2 child (aged 2-11), 3 infant on lap, 4 infant in seat, e.g. [1, 1, 2] for two adults and a child. At least one adult, each infant on lap needs its own adult, at most 9. Left out, it means one adult. A counts list [adults, children, infants], e.g. [2, 1, 0], or a bare [2] for two adults, is recognised and converted to codes before the search; a list that is valid as codes is searched as codes. |
| to_airport | any | Yes | Destination airport. One IATA code ("BCN"), several separated by commas ("BCN,LIS,ATH"), or a list (["BCN","LIS","ATH"]) -- every shape is accepted and the destinations are compared in the same search. |
| from_airport | string | Yes | Origin IATA code, e.g. "TLV". One origin per search; a second one is refused rather than searched. |
| max_searches | any | No | The searches this call may make, up or down. Unset is the normal behaviour: with the caller's own key the cap covers the request when the request is reasonable (a whole month at three trip lengths is 93 combinations and a whole month x 3 nights x 3 destinations is 279; both run in full) and anything past it is sampled evenly across the range rather than cut short. A lower value spends fewer searches on a wide search; a higher one -- to a hard maximum of 300 -- covers a grid wider than that. |
| use_fallback | any | No | Default: unset. Switches the search to a second, independent flight data source instead of the usual Google Flights page read. Unset already escalates to that source once, automatically, after a search's retries have failed. true forces it inline on every attempt -- much slower, and it can time out. false disables it entirely, that automatic retry included. |
| airline_codes | any | No | Restricts the search to these airline codes, e.g. ["LY"]. |
| departure_date | any | No | Single departure date, "YYYY-MM-DD". |
| arrival_time_max | any | No | Latest arrival hour, 0-23. |
| arrival_time_min | any | No | Earliest arrival hour, 0-23. |
| departure_date_to | any | No | Last date of a departure range. |
| departure_time_max | any | No | Latest departure hour, 0-23. |
| departure_time_min | any | No | Earliest departure hour, 0-23. |
| departure_date_from | any | No | First date of a departure range. |
| exclude_airline_codes | any | No | Airline codes left out of the results. |
Details
From the project READMEfaregrid
faregrid is a small local bridge to the hosted FlightPowers MCP server, which reads live flight prices from Google Flights. Give it an origin and a destination, plus either a single date or a whole date range, and it answers with fares, airlines, durations, stop counts, a bookable link for each flight, and the historical price band that shows whether a fare is unusually cheap or expensive for that route.
The bridge keeps no fare data 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 search only: results carry a buy_link to
book on the vendor's own flow, and there is no booking,
purchase, or payment tool in it.
Tools
search_oneway_flights— one-way fares. Required:from_airportandto_airport(IATA codes; the destination may be several codes as"BCN,LIS,ATH"or["BCN","LIS","ATH"]). Optional:departure_date, or a range viadeparture_date_from/departure_date_to,max_stops,airline_codes,exclude_airline_codes, departure and arrival hour windows,currency(default"usd"),max_price,seat_type,passengers,sort_by(default"best"),limit(default 10),max_searches,use_fallback, andverbose. One call can search every date/destination combination in a range.search_roundtrip_flights— round-trip fares, priced as paired legs rather than two separate one-ways. Required:from_airportandto_airport. Optional: the same departure date or range fields as the one-way tool, plusreturn_dateornights(a trip length, or a list like[5, 6, 7]),max_departure_stops,max_return_stops,departure_airline_codes,return_airline_codes,returns_per_outbound, and the sharedcurrency,max_price,seat_type,passengers,sort_by,limit,max_searches,use_fallback, andverbosefields.
Fares go stale within minutes, so a current price always comes from a new search rather than an earlier result.
Configuration
FLIGHTPOWERS_MCP_URL(optional) — override the upstream endpoint. Defaults tohttps://flights.flightpowers.com/mcp. (The override hook is this rebuild's own labelled reconstruction.)FLIGHTPOWERS_API_KEY(optional) — when set, every upstream request carries anx-rapidapi-key: <key>header, for the caller's own RapidAPI key for the Google Flights Live API. When it is not set, no key header is sent and the upstream applies its free sign-in allowance. NoAuthorizationheader is ever sent. (This forwarding is also 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
faregrid), 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 faregrid error: (this rendering
is this rebuild's own labelled reconstruction).
CLI
Each tool is also a subcommand taking one JSON argument string:
npx @reneturcios/faregrid search_oneway_flights '{"from_airport":"TLV","to_airport":"BCN","departure_date":"2026-11-10"}'
npx @reneturcios/faregrid search_roundtrip_flights '{"from_airport":"TLV","to_airport":"BCN,LIS","departure_date_from":"2026-11-01","departure_date_to":"2026-11-07","nights":[3,4]}'
npx @reneturcios/faregrid --version
Exit codes: 0 on success, 1 on an isError
result, 2 on a usage error.
MCP server
npx -y @reneturcios/faregrid mcp
MCP client config:
{
"mcpServers": {
"faregrid": {
"command": "npx",
"args": ["-y", "@reneturcios/faregrid", "mcp"]
}
}
}
Docker
docker run -i ghcr.io/cloudcorprecords/faregrid
docker run --rm ghcr.io/cloudcorprecords/faregrid --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.