loading…
Search for a command to run...
loading…
Official Industry Standard MCP for Travel Awards, Points, and more. Search award flight availability across multiple airline loyalty programs, find sweet spots,
Official Industry Standard MCP for Travel Awards, Points, and more. Search award flight availability across multiple airline loyalty programs, find sweet spots, check transfer partners, and get market stats all via MCP.
A FastMCP server that wraps the Award Flight Daily database (12.3M award flight records across 25 loyalty programs) and exposes it to AI agents via tools.
The Award Flight Daily MCP server provides 7 core tools for searching, analyzing, and optimizing award travel:
mcp_server/
├── __init__.py # Package definition
├── config.py # Constants: programs, cabins, banks
├── server.py # FastMCP server entry point (7 tools registered)
├── db/
│ ├── __init__.py
│ └── queries.py # DuckDB queries (read-only, parameterized)
├── models/
│ ├── __init__.py
│ ├── inputs.py # 8 Pydantic input models with validators
│ └── responses.py # Formatting helpers (JSON/Markdown)
└── tools/
├── __init__.py
├── search.py # afd_search_award_flights
├── programs.py # afd_list_programs, afd_get_program_details
├── routes.py # afd_get_route_availability
├── sweet_spots.py # afd_find_sweet_spots
├── transfers.py # afd_check_transfer_partners
└── analytics.py # afd_get_market_stats
All environment and program configuration lives in config.py:
/data/award_flights.duckdbfastmcp>=1.0.0
pydantic>=2.0
duckdb==1.1.3
Stdio mode (local):
python -m mcp_server.server
HTTP mode (remote):
python -m mcp_server.server --http 8001
SearchInput(
origin="JFK", # Required: IATA code(s)
destination="NRT", # Required: IATA code(s)
date_from="2026-06-01", # Required: YYYY-MM-DD
date_to="2026-06-30", # Required: YYYY-MM-DD
cabin=CabinClass.BUSINESS, # Optional: Y/W/J/F (default J)
source="united,aeroplan", # Optional: program filter
direct_only=False, # Optional: nonstop only
max_miles=100000, # Optional: mileage cap
min_seats=1, # Optional: min seats (default 1)
limit=50, # Optional: results limit (default 50, max 200)
offset=0, # Optional: pagination offset
response_format=ResponseFormat.JSON # Optional: JSON or Markdown
)
Returns: Paginated flight results with mileage, taxes, seats, airlines, equipment.
ListProgramsInput(
response_format=ResponseFormat.JSON
)
Returns: All 25 programs with:
ProgramDetailInput(
program="united", # Required: program slug
response_format=ResponseFormat.JSON
)
Returns: Deep stats for one program:
RouteInput(
origin="JFK",
destination="NRT",
cabin=CabinClass.BUSINESS,
source=None, # Optional: filter by program
response_format=ResponseFormat.JSON
)
Returns: All dates for a route with mileage, taxes, seats per program.
SweetSpotInput(
cabin=CabinClass.BUSINESS,
origin=None, # Optional
destination=None, # Optional
limit=25,
response_format=ResponseFormat.JSON
)
Returns: Best-value routes ranked by minimum mileage cost.
TransferInput(
bank="chase", # Optional: bank slug
program="united", # Optional: program slug
response_format=ResponseFormat.JSON
)
Returns: Credit card → airline transfer mappings with:
MarketStatsInput(
response_format=ResponseFormat.JSON
)
Returns: Aggregate database stats:
All inputs use Pydantic with validation:
Invalid inputs raise ValidationError with detailed messages.
Full structured response with pagination metadata:
{
"total": 1234,
"count": 50,
"offset": 0,
"has_more": true,
"cabin": "J",
"results": [
{
"id": "...",
"source": "united",
"origin": "JFK",
"destination": "NRT",
"date": "2026-06-15",
"mileage": 75000,
"taxes": 11.20,
"seats": 2,
"direct": true,
"airlines": "United",
"equipment": "B787",
"updated_at": "2026-03-26T12:34:56"
}
]
}
Human-readable output with formatting:
# Award Flight Search Results
**1234 flights found** | Cabin: Business | Showing 50
## JFK → NRT | 2026-06-15
- **75,000 miles** + $11.20 taxes | united
- Nonstop | 2 seats | United B787
...
All queries are:
expired_at IS NULL (active records only)Connection is lazy-loaded on first query and reused.
ValidationError with field detailsThe MCP layer handles serialization of errors to the client.
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"award-flight-daily-mcp-server": {
"command": "npx",
"args": []
}
}
}