Skip to main content
Glama
nstevens

flight-finder

by nstevens

flight-finder

Find the genuinely best flight — cash or points — by ranking every option against what a mile is actually worth to you.

Three ways to use this

  • 🧠 Build your own with Claude Code → GUIDE.md

  • 🛠 Run the code → below

  • 🚀 Just use it → hosted version (coming soon)

What it does

Award availability and cash fares live in a dozen places and change by the hour. flight-finder pulls both — cash fares (via Google Flights) and award space (via the seats.aero Pro API) — then ranks every option using your per-program cents-per-mile valuations and travel preferences. It also enriches each option with seat-quality detail from AeroLOPA — cabin layout, seat counts, and the actual seat map for the specific aircraft (tail-number matched) — so you're comparing the seat you'll actually sit in, not just the price. "Is this a good deal?" becomes a number, not a vibe. And it runs as an MCP server, so you can plan trips conversationally in Claude Code: "find me SEA→Tokyo in business under 120k points."

Related MCP server: PointsYeah MCP Server

Quickstart

uv sync
cp .env.example .env                      # add SEATS_AERO_API_KEY (+ optional AEROLOPA_API_ID / AEROLOPA_API_SECRET for seat maps)
# edit config/profile.yaml + config/programs.yaml (home airports, point balances, cpm values)
uv run ff search --from SEA --to FCO --depart 2026-11-21 --cabin BUSINESS
uv run ff awards --from SEA --to FCO --start 2026-11-18 --end 2026-11-23 --cabin business
uv run ff plan trips/example-trip.yaml --out trips/example-shortlist.md

MCP (Claude Code)

claude mcp add flight-finder --scope user \
  -- uv --directory /path/to/flight-finder run python -m flight_finder.mcp_server

Tools: search_cash_one_way, search_cash_round_trip, search_awards, find_positioning_flights, get_seat_map, plan_trip.

How it works

src/flight_finder/
  offer.py            # normalized Offer (cash or award) + Segment
  config.py           # profile + programs + env
  cash/                # Google Flights wrapper + multi-origin × date fan-out
  awards/              # seats.aero Pro client
  strategy/scorer.py   # cpm-based cost + preference-aware ranking  ← the core idea
  seatmaps/            # AeroLOPA enrichment: cabin product + seat map per aircraft (tail-matched)
  planner.py           # combines it all behind a TripSpec
  cli.py · mcp_server.py

The interesting decision: a single normalized Offer for cash and award, so the scorer can compare them on one axis — your dollar value — instead of apples-to-oranges price vs. miles.

What I learned building this

The hard part wasn't the model — it was the valuation layer. The same award seat is a steal or a trap depending on which points you hold, what you value, and even which seat you'll actually sit in. Encoding that judgment is what turns a search into a recommendation. It's true of most useful AI products: the model is the commodity; the context and the scoring are the moat.

Built with Claude Code

Built nights and weekends, mostly by talking to Claude — scaffolded, iterated, and tested through Claude Code.

License

MIT

Available Tools

6 tools
find_positioning_flightsA

Find positioning flights from from_city to return_hub near return_date. Useful for the asymmetric-return trick: main award returns from a hub (e.g. LHR); family needs to get there from Italy. Candidates must be verified as refundable on the airline site before booking.

ParametersJSON Schema
NameRequiredDescriptionDefault
from_cityYes
return_hubYes
return_dateYes
earliest_days_beforeNo
cabinNoECONOMY
adultsNo
childrenNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states the tool finds flights and mentions a post-verification step, but does not disclose any behavioral traits like rate limits, authentication needs, or whether results are cached. It is adequate but could add more transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each serving a clear purpose: state the function, explain the use case, and provide a cautionary note. It is front-loaded and wastes no words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters, 0% schema coverage, and no output schema, the description is incomplete. It does not explain return values, how to interpret results, or the meaning of parameters like `earliest_days_before` or `cabin`. An AI agent would need additional information to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, and the description only mentions `from_city`, `return_hub`, and `return_date` by name without explaining their formats or constraints. Parameters like `earliest_days_before`, `cabin`, `adults`, and `children` are left entirely to the schema, which is insufficient. The description should compensate by explaining these parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it finds positioning flights from `from_city` to `return_hub` near `return_date`. It explains the context (asymmetric-return trick) and distinguishes itself from sibling tools like `search_awards` or `search_cash_one_way` by focusing on positioning flights for a specific travel pattern.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool (for the asymmetric-return trick) and provides a critical guideline: candidates must be verified as refundable on the airline site before booking. It lacks explicit when-not-to-use instructions or alternatives, but the context is sufficient for an AI agent to understand its appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_seat_mapA

AeroLOPA cabin product + seat map URL for a specific aircraft.

Provide either `slug` (e.g. "ba-351") to skip resolution, or both
`carrier` (IATA, e.g. "BA") and `aircraft` (IATA code or displayed name).

Returns the structured CabinProduct dict — aircraft type, per-cabin pitch /
width / recline / amenities, free-text seat notes, and the
direct-CDN-cached seat map SVG URL. All cabins are included; pick the one
matching your offer cabin via `cabins[].cabin_type_name`.
ParametersJSON Schema
NameRequiredDescriptionDefault
carrierNo
aircraftNo
slugNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses the return structure and that it's a read-only lookup, but doesn't mention errors, auth, or rate limits. Adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with purpose first, then usage, then return details. Slightly long but every sentence adds value; no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description covers input, output structure, and usage patterns well. Missing edge cases like conflict between slug and carrier/aircraft, but overall complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but the description compensates fully by explaining each parameter with examples and expected formats (IATA codes, displayed names, slug pattern). Adds significant value beyond schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves cabin product and seat map URL for a specific aircraft, with a specific verb and resource. It distinguishes from sibling tools which are about flight search and trip planning.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes two parameter combinations (slug or carrier+aircraft) and when to use each, but doesn't explicitly state when NOT to use or mention alternative tools. Still clear enough for correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_tripC

Run the full trip planner on a trips/*.yaml file.

ParametersJSON Schema
NameRequiredDescriptionDefault
trip_yaml_pathYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Does not disclose whether tool modifies state, requires authentication, or produces output. Only mentions input file.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence is appropriately brief and front-loaded. No unnecessary words, though could benefit from more detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Missing crucial details: what the planner does, required YAML structure, side effects, return values. Minimal for a tool with no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description links 'trip_yaml_path' to a YAML file pattern. Adds basic meaning but lacks format, constraints, or examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states it runs a full trip planner on a YAML file, but the verb 'run' is vague and doesn't specify what the planner does. It distinguishes from sibling search tools only implicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Siblings are specific search tools, but no explicit when/when-not advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_awardsD

Award search via seats.aero Pro API.

ParametersJSON Schema
NameRequiredDescriptionDefault
origin_airportsYes
destination_airportsYes
start_dateYes
end_dateYes
cabinNobusiness
sourcesNo
only_direct_flightsNo
takeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

D1.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must disclose behavior. It fails to mention API authentication, rate limits, data freshness, pagination, or any side effects. The single sentence is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise but under-specified. Valuable space is used for a vague statement, missing critical details. Conciseness should not sacrifice completeness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 8 parameters (4 required), no annotations, and no parameter descriptions, the description is completely inadequate. It does not mention output or behavior, leaving the agent blind.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description adds zero parameter meaning. Parameters like origin_airports, cabin, sources are not explained. The description compensates nothing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states 'Award search via seats.aero Pro API', which identifies the verb and resource but is vague. It does not differentiate from sibling tools like search_cash_one_way or search_cash_round_trip, leaving the agent unclear about when to use this specifically.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidelines on when to use vs alternatives. Sibling tools exist for cash searches and positioning flights, but the description offers no context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_cash_one_wayC

Cash-fare one-way search via fli (Google Flights).

ParametersJSON Schema
NameRequiredDescriptionDefault
originYes
destinationYes
depart_dateYes
cabinNoBUSINESS
stopsNoANY
adultsNo
childrenNo
depart_hour_window_fromNo
depart_hour_window_toNo
top_nNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description must fully convey behavioral traits. It only mentions 'via fli (Google Flights)' which hints at the data source but omits details on authentication, rate limits, error handling, or what happens if parameters are invalid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise (one sentence) and front-loaded with the core purpose. It wastes no words. However, it could be slightly expanded to cover key missing aspects without becoming verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (10 parameters, no schema descriptions, no annotations), the description is insufficient. It fails to explain how to effectively use parameters like cabin, stops, hour windows, or top_n. The presence of an output schema reduces the need to describe return values, but guidance on input is lacking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description adds no meaning to any of the 10 parameters. Parameter names like 'origin' and 'destination' are self-explanatory, but the description does not clarify format, constraints (e.g., airport codes vs city names), or how 'depart_hour_window' works.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it's a 'cash-fare one-way search via fli (Google Flights)', specifying the verb (search), resource (cash-fare one-way), and data source. This distinguishes it from the sibling tool 'search_cash_round_trip' which is for round trips.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives. The description does not indicate scenarios, prerequisites, or when not to use it. Sibling tool names imply alternatives but no explicit direction is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_cash_round_tripC

Cash-fare round-trip search via fli (Google Flights).

ParametersJSON Schema
NameRequiredDescriptionDefault
originYes
destinationYes
depart_dateYes
return_dateYes
cabinNoBUSINESS
stopsNoANY
adultsNo
childrenNo
top_nNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does not disclose any behavioral traits such as rate limits, caching, or whether the search is real-time. Output schema exists but the description adds no behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is concise but under-specified. It does not earn its place because it fails to provide critical details about parameters or usage, making it insufficiently informative for the agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 9 parameters (4 required) and 0% schema coverage, the description is severely incomplete. It lacks context on required inputs, optional parameters, or any edge cases. Output schema exists but is not referenced.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the tool description mentions no parameter details (e.g., required fields origin, destination, dates). The agent gets no help understanding parameter meaning or format beyond the schema structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a cash-fare round-trip search using Google Flights (fli), and the name distinguishes it from sibling tools like search_awards and search_cash_one_way. However, 'Cash-fare' could be misinterpreted, and the description adds little beyond the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. It does not mention that it is for paid flights rather than awards, or that it differs from one-way searches. Context from sibling names implies this, but the description lacks direct usage advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 6 tool updatesv0.1.0
    • First observedfind_positioning_flights
    • First observedget_seat_map
    • First observedplan_trip
    • First observedsearch_awards
    • First observedsearch_cash_one_way
    • First observedsearch_cash_round_trip

TDQS

B3.2/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct aspect of flight finding: positioning flights, seat maps, trip planning, award search, and cash search (one-way and round trip). No overlaps.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case (e.g., find_positioning_flights, get_seat_map, search_awards).

Tool Count5/5

Six tools cover the core functionality of a flight finder without excess. The scope is well-scoped and manageable.

Completeness4/5

The set covers major flight search types (award, cash) and trip planning, but lacks tools for flight status, booking management, or filtering by amenities. Minor gaps exist.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nstevens/flight-finder'

If you have feedback or need assistance with the MCP directory API, please join our Discord server