Open source · GPL-3.0 · Python 3.12+
MCP server for flight price search via the Aviasales / Travelpayouts Data API
Thirteen read-only MCP tools for Claude Code, Claude Desktop and Cursor: fares by route and month, cheapest day, flexible dates, airport lookup.
What it does
- Flight prices: fares by route on a date or across a month, the cheapest day to fly and prices for the days around your dates.
- Budget and inspiration search: cheapest destinations from a city and flights inside a budget, even with no destination.
- Place names resolve to IATA codes: lookup_cities and find_nearest_airports, ranked by great-circle distance with no third-party geocoder.
- All thirteen tools only read: none books, buys, writes or changes anything.
- Booking links carry adults, children, infants and cabin class; every price response has a min/median/max price_summary.
- Runs as a Docker image, from PyPI with uvx, or as a one-click .mcpb for Claude Desktop; optional streamable-HTTP with a bearer token.
Example prompts
Ask in plain language. The server picks the tool.
- How much is a flight from Moscow to Istanbul in March?
- What is the cheapest day to fly to Bangkok in September?
- I am flying Berlin to Lisbon on 12 May and back on the 19th. Would shifting a day either way be cheaper?
- Where can I fly from St Petersburg for under 30 000 rubles?
- Which airport should I fly into for Pattaya, and what does it cost from Dubai?
Install
Paste this into a terminal. It is the same docker command every client block
below runs; the process speaks MCP on stdin and waits there.
AVIASALES_API_TOKEN=your-token-here AVIASALES_MARKET=ru \
docker run -i --rm \
-e AVIASALES_API_TOKEN \
-e AVIASALES_MARKET \
ghcr.io/stufently/aviasales-mcp:latest
You need Docker, and a free Travelpayouts API token from
https://www.travelpayouts.com/programs/100/tools/api. A wrong token still
lets the process start (so does no token at all in the Docker image); it
surfaces as an error on the first search.
AVIASALES_MARKET is optional — see Configuration. Drop
that variable and its -e pair if you do not need it.
:latest follows releases; pin a version tag (:0.5.3) if you would rather
upgrade by hand.
Without Docker, the same server is on PyPI as
aviasales-mcp (Python 3.12+).
uvx fetches and runs it in one step:
AVIASALES_API_TOKEN=your-token-here AVIASALES_MARKET=ru uvx aviasales-mcp
pip install aviasales-mcp puts the same aviasales-mcp command on your PATH.
In a client config, use "command": "uvx", "args": ["aviasales-mcp"] with the
token in env instead of the docker command in the blocks below.
FAQ
How do I install Aviasales MCP?
Run the Docker image ghcr.io/stufently/aviasales-mcp:latest with AVIASALES_API_TOKEN in the environment, or without Docker run uvx aviasales-mcp (Python 3.12+). The README has ready configs for Claude Code, Claude Desktop, Cursor, Windsurf, Zed and Codex.
Which token do I need?
A free Travelpayouts API token from travelpayouts.com/programs/100/tools/api. A wrong or missing token still lets the process start; it surfaces as an error on the first search.
Are the prices live?
No. The Data API serves a cache of recent searches, not live availability. A fare can be gone by the time the link opens, and an empty result means nobody searched that route recently, not that the route does not exist.
Do prices include all passengers and the cabin class?
No. Prices are always per adult in economy. Passenger count and cabin class are encoded into each ticket's booking_link, which opens Aviasales with the full party pre-filled and shows the real total.
Can it book or buy tickets?
No. The server searches and links out; it never holds or buys a ticket. All thirteen tools are read-only.
Why does AVIASALES_MARKET matter?
The price cache is per market: the same route in the same currency comes back at a different price for ru and us. Unset, the server reads the ru market.
Documentation pages
- aviasales-mcpMCP server for flight price search via Aviasales / Travelpayouts Data API. Thirteen read-only tools that let Claude Code, Claude Desktop, Cursor or any…