azair-eu-mcp
MCP server for azair.eu that enables flexible-date cheap flight searches across European low-cost airlines, with multi-airport, metro-area, and advanced filter support.
README
✈️ azair-eu-mcp
MCP server for azair.eu — cheap flight search across European low-cost airlines with flexible dates. Give your AI assistant the power to hunt for bargain flights the way humans do on azair: loose date ranges, multiple airports, metro areas, and every advanced filter from the azair search form.
Features
- 🔎 Flexible-date search — the core azair superpower: pick a date range, get the cheapest day combinations within it
- 🛫 Multi-airport search — search from several airports at once (e.g.
PRG+BRQ+NUE) - 🏙️ Metro-area search — cover all airports of a city via metro codes (e.g.
MIL_ALL→ MXP, BGY, LIN) - 🌍 Anywhere mode — destination
XXXsearches the whole continent - ⚙️ All advanced filters — weekdays, time windows, stopover length, transfers, Schengen-only, clubs, and more
- 💱 Multi-currency — EUR, USD, GBP, PLN, CZK, and all azair currencies
- ✍️ Structured results — clean JSON with prices, dates, per-segment flight details, and booking links
Quick start
Ask your assistant (Claude, Cursor, Windsurf, …):
Find cheap return flights from Prague to anywhere in Italy between August and January, min 5 nights, max 8 nights, any Milan or Rome airport.
or directly:
search_flights(src_airport="PRG", src_airports=["BRQ", "NUE"],
dst_airport="MXP", dst_airports=["LIN", "BGY"], dst_metro_code="MIL_ALL",
dep_date="2026-08-01", arr_date="2027-01-31",
min_days_stay=5, max_days_stay=8)
Example response:
{
"total_price": 33.33,
"currency": "EUR",
"length_of_stay_days": 6,
"outbound_date": "Thu 20/08/26",
"return_date": "Wed 26/08/26",
"outbound_segments": [
{
"airline": "Ryanair",
"airline_iata": "FR",
"flight_number": "FR3601",
"departure_airport": "Prague",
"departure_airport_code": "PRG",
"departure_time": "09:00",
"arrival_airport": "Bologna",
"arrival_airport_code": "BLQ",
"arrival_time": "10:30",
"duration": "12:10 h / 1 change",
"price": 33.33,
"currency": "EUR"
}
],
"return_segments": [],
"booking_url": "book/b.php?b=RlJQUkdCTFEyNjA4MjUzNjAxMTAwMjAyNi0wOC0wMSswMjoxM2Vud3d3LmF6YWlyLmV1"
}
Returns up to 180 results, each with total price, dates, outbound/return segments (airline, flight number, times, duration, leg price), and a direct booking URL.
Tools
search_flights
Full-featured flight search mirroring the azair search form, including advanced parameters.
| Parameter | Type | Default | Description |
|---|---|---|---|
src_airport |
string | — | Source airport IATA code (e.g. WMI, STN) |
dst_airport |
string | — | Destination IATA code or XXX for anywhere |
src_airports |
string[] | — | Additional source airports, e.g. BRQ, NUE together with PRG |
dst_airports |
string[] | — | Additional destination airports, e.g. LIN, BGY together with MXP |
src_metro_code |
string | — | Source metro code covering all its airports, e.g. MIL_ALL |
dst_metro_code |
string | — | Destination metro code covering all its airports, e.g. MIL_ALL |
dep_date |
string | — | Earliest departure, DD.MM.YYYY or YYYY-MM-DD |
arr_date |
string | — | Latest return, DD.MM.YYYY or YYYY-MM-DD |
min_days_stay |
int | 2 |
Minimum trip length in days |
max_days_stay |
int | 7 |
Maximum trip length in days |
adults |
int | 1 |
Adults (1-9) |
children |
int | 0 |
Children (0-8) |
infants |
int | 0 |
Infants (0-8) |
currency |
string | EUR |
EUR, USD, GBP, PLN, CZK, … |
max_changes |
int | 1 |
Max stopovers per leg (0-3, 0 = direct flights only) |
is_oneway |
bool | false |
One-way instead of return |
schengen_only |
bool | false |
Only transfers inside the Schengen area |
allow_transfer |
bool | false |
Allow ground transfer between airports |
departure_weekdays |
int[] | all | Departure weekdays, 0=Mon..6=Sun |
return_weekdays |
int[] | all | Return weekdays |
min_hour_outbound |
string | 0:00 |
Earliest outbound time |
max_hour_outbound |
string | 24:00 |
Latest outbound time |
min_hour_inbound |
string | 0:00 |
Earliest inbound time |
max_hour_inbound |
string | 24:00 |
Latest inbound time |
min_hour_stay |
string | 0:45 |
Minimum stopover time |
max_hour_stay |
string | 23:20 |
Maximum stopover time |
next_day |
int | 0 |
Allow overnight stopovers |
same_dep |
bool | true |
Return to the same departure airport |
same_arr |
bool | true |
Return from the same arrival airport |
search_airports
Resolve IATA codes and airport names before searching — useful for finding the right code for a city.
| Parameter | Type | Description |
|---|---|---|
query |
string | IATA code or partial name (e.g. WMI, London, Barcelona) |
Returns up to 50 matching airports with code and name.
Installation
git clone <repo-url> azair-eu-mcp
cd azair-eu-mcp
uv sync
Usage
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"azair-eu-mcp": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/azair-eu-mcp", "python", "main.py"]
}
}
}
Cursor / Windsurf
Add the same command in the MCP servers settings.
Any MCP client
Run the server directly — it speaks MCP over stdio:
uv run python main.py
Development
uv sync
uv run python main.py
Sanity-check a search without spinning up the server:
uv run python -c "
import asyncio
from azair.models import SearchParams
from azair.client import fetch_search_results
from azair.parser import parse_results
async def main():
html = await fetch_search_results(SearchParams(
src_airport='PRG', dst_airport='STN',
dep_date='2026-08-01', arr_date='2026-08-31',
))
print(len(parse_results(html)), 'results')
asyncio.run(main())
"
How it works
- Azair exposes no public JSON API — results are scraped from the HTML search results page (
azfin.php) - The airport database is fetched once from azair's static JS asset and cached in memory
- Multi-airport and metro codes are sent exactly as the azair web app does (bracket notation +
srcapN/dstapNparams)
Notes
- Azair uses an expired SSL certificate — the server bypasses SSL verification
- Search times vary (10-60s) depending on the query scope
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。