Award Flight Daily Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Award Flight Daily Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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_statsAll environment and program configuration lives in config.py:
/data/award_flights.duckdbfastmcp>=1.0.0
pydantic>=2.0
duckdb==1.1.3Stdio mode (local):
python -m mcp_server.serverHTTP mode (remote):
python -m mcp_server.server --http 8001SearchInput(
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.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.