Skip to main content
Glama

Pinpoint Flights

Search flights

search_flights
Read-onlyIdempotent

Search flights on Pinpoint Flights, a flight search with very deep filters: exact time windows, nonstop vs. price trade-offs, bags, fare rules, airlines to avoid, flexible dates and trip lengths, nearby airports, several destinations at once. Fill in only what the traveller said and leave everything else out (defaults apply). If something that changes the results is missing (dates, how long the stay is, an airport we can't place), no search runs: you get questions back to ask the traveller, then call again with the answers. Each traveller has 7 searches a day, so ask before searching when the request is vague, and don't run near-identical searches to compare: one search already prices many date combinations. Repeating a search from the last 24 hours is free. Results come with a link to the full results on pinpoint.flights, and each flight that can be booked has its own book_url: show the traveller the best match and every flight in each section (up to 10 in all), in rank order, each with its price, times, stops, airline and book_url, not just the top one or two; mention same-price swaps when a flight lists them; and give them the results link too, since booking happens there.

How to fill the fields (these are the rules the site's own assistant follows; where they say "readback", that means what you tell the traveller):

  • Places: copy what the user said (city, airport code, country, region). Do not invent airport codes. If several destinations are named as alternatives ("Bali or Thailand"), list them all; the engine picks the cheapest. When the user names the airport they prefer in a city ("I strongly prefer DCA"), that airport is the place: don't also list the city, and don't describe a preference the filters can't hold.

  • Dates: express them as intents relative to today (relative_days), as months (YYYY-MM), or as absolute dates only when the user gave one. Never compute a calendar date yourself from phrases like "next spring"; use kind=month with the months you mean, or ask. A month that has already passed this year means next year's (in September, "May or June" is May–June of next year); a date or month that is today or later means this year. Nobody books flights in the past, so never remark on it; just state the resolved dates ("May or June 2027"), never "(those months have passed)".

  • Hard vs soft: "never / only / has to / must / can't" → hard (mode=hard, exclude, required). "prefer / rather not / ideally / would love / if it's less than X more" → soft with the premium the user stated (pct or usd). A soft preference with no stated premium gets premium=null; the engine applies a default and your readback must say so.

  • Travellers: adults are 12+. Children aged 2–17 go in childrenAges with their ages (ask for ages only if they matter and are missing). A baby or infant under 2 is a lap infant (infants) unless the user says it gets its own seat or a car seat (infantsInSeat).

  • Money is per person unless the user says "total" or "for the family/group".

  • Bags: if the user doesn't mention bags, use carryOn=1, checked=0 (not -1) and say so in the readback. Bags are pooled only when the user speaks of the group's checked bags ("two bags for the family"): then checked is the group total and pooled=true, but carryOn is still per traveller ("everyone has a carry-on" = carryOn 1).

  • "Sit together", "seats next to each other", "pick our seats" → excludeBasicEconomy=true (basic fares don't allow seat selection) and fare.seatSelection=required.

  • Trip length: never guess one. A round trip with no stated length, return date or return window leaves tripLength and the return dates unstated and asks how long they want to stay (field dates.tripLength); the readback must not assume a length. If the description says something about the stay that doesn't settle it, the question names it and why ("You said about two weeks, but also back before the 9th, which allows 6 days at most. Which matters more?"). If the user gives a preferred length and a maximum but no minimum, leave minDays null and ask what the shortest acceptable trip is. A short trip described by weekdays or as "a long weekend" ("leave Thursday or Friday, back Sunday or Monday") gets the tripLength that fits, here minDays 2 and maxDays 4, so the engine never pairs a Thursday with a Monday ten days later.

  • Weekday arithmetic: if fixed outbound and return weekdays are combined with a trip length that cannot satisfy both ("leave Saturday, back Sunday, 10 days"), keep both as stated: the weekdays, and the length as tripLength.preferredDays with minDays and maxDays unstated. Don't add a question of your own about it: the engine asks which one gives. The readback says the two don't fit together and that I'll ask.

  • Time-of-day windows: if the user gives a window without saying which direction, set it on outbound and set timesApplyToBothDirections=null and ask.

  • Hard vs ideal times: "no earlier than / not past / the earliest I can leave / shouldn't arrive after" are hard bounds (departNotBefore, arriveNotAfter…). "Ideally / around / preferably" times are the ideal window, never hard: "ideally around 2pm" = idealArriveFrom 13:00, idealArriveTo 15:00; "ideally 8pm to 11pm" = idealDepartFrom 20:00, idealDepartTo 23:00.

  • Clock times without AM or PM: "7:59", "at 8" or "leaves 7:40" with no AM/PM is ambiguous, including the times of a flight the traveller mentions for reference ("my flight departs 7:59"). Don't pick one and don't guess from what seems likely: ask ("Is 7:59 in the morning or the evening?", field dates.timeOfDay). It is settled only when the traveller writes AM or PM, uses 24-hour time somewhere in the request (an hour of 13 or more, or a leading zero like 07:30), or says it in words ("in the morning", "tonight", "noon"). A time given with a flight number needs no question: the flight number settles it (see Exact flights).

  • Exact flights: when the traveller wants to be on a specific flight ("ideally the same flight as my DL2729", "the 7am Delta, DL1003, if possible"), put its flight number in exactFlights for that direction. It is soft: premium only if they state one ("much rather" = pct 30), zeros otherwise (the engine's default applies). "A little earlier or later is fine if cheaper" needs nothing more: the named flight ranks first and the others still show. A flight that is only background is not a preference: one they say is fine but not needed ("the exact same flight would also be fine"), or one they want to get away from (a layover they want to avoid goes in the stop or layover fields).

  • Times tied to one date: "the earliest I can leave is 7pm on the 27th" is a return window with onlyOnDate set to that date (an absolute date the user gave). It does not apply to other dates: when the user also allows a fallback date ("or the 28th if needed"), the window must carry onlyOnDate so flights on the fallback date are not held to it.

  • Blackouts are only dates the traveller cannot fly at all that would otherwise be inside the departure or return windows. Days spent working or busy at the destination are already outside the return window; don't list them. Never black out a day the traveller can fly part of; that is a time window with onlyOnDate.

  • A preferred date inside a date window ("I'd much rather leave the 27th; the 28th only if it's much cheaper") is a soft weekday preference for that date's weekday (returnDays or outboundDays, mode=soft) with the premium. The readback may only describe preferences that are set in the intent.

  • arriveBy is for a deadline at the destination ("must be there by 9am on the 14th") that should pull the departure date earlier. When the departure date is already fixed, an arrival time limit is outboundTimes.arriveNotAfter only; leave arriveBy unstated.

  • Stops: "nonstop only / direct only / no connections" → nonstop.mode=hard and maxStops=0. "Prefer nonstop / no layovers if possible / nonstop strongly preferred unless much cheaper" → nonstop.mode=soft with the premium (the premium over a one-stop flight) and maxStops=-1, so connections still show when they are much cheaper. When stops aren't mentioned, leave nonstop unstated: the engine's default preference applies.

  • Strength of a soft preference with no number: plain "prefer" → zeros in the premium (the engine default applies). Stressed ("strongly prefer", "much rather", "unless it's much cheaper", "much much cheaper") → pct 30.

  • Ranking: the engine defaults to "balanced" common sense: it values the traveller's time at about $25 per hour per person against the fastest option and mildly dislikes stops and long layovers, so a slightly dearer nonstop or much shorter itinerary ranks first (the cheaper one is still shown). Set rankBy=cheapest only when the user says they want the absolute cheapest, that price is all that matters, or that duration/stops don't matter; otherwise rankBy=unstated. Mention ranking in the readback only when it is "cheapest".

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "search_flights"
  }
}

Input Schema

NameRequiredDescriptionDefault
bagsNoBags to include in the price: carry-ons and checked bags (per person, or shared across the group when pooled)
fareNoFare rules: basic economy excluded or not, refundable, changeable, largest acceptable change fee, seat selection
cabinNoCabin class, whether mixing cabins between legs is fine, and any upgrade the traveller wants priced
routeNoStops and connections: nonstop as a requirement or a preference, layover lengths, overnight and self-transfer connections, airports or countries to avoid, total travel time
budgetNoThe most the traveller will pay in USD, per person or for the whole group
oneWayNotrue for a one-way trip; leave out for a round trip
originNoWhere the trip starts: the places the traveller named, and whether nearby airports are acceptable
rankByNocheapest only if the user says the absolute cheapest / price is all that matters / doesn't care about duration or stops
airlinesNoAirlines and alliances to prefer, to rather not fly (soft), or never to fly (hard), with any exceptions
arriveByNoA deadline at the destination: the date, and optionally the local time, they must have arrived by
stopoverNoA deliberate multi-day stop on the way: where, on which direction, for how many days, and how much extra it may cost
amenitiesNoOn-board needs: wifi, a lie-flat seat, and the flight length from which they matter
blackoutsNoYYYY-MM-DD dates the user cannot travel, only if stated absolutely
travelersNoWho is flying: adults, each child's age, babies on a lap or in their own seat, and nationalities when given
returnDaysNoDays of the week for the return flight, hard or soft as for outboundDays
tripLengthNoHow many days the stay lasts: a minimum, a preferred length, a maximum, and whether a different length is fine when cheaper
destinationNoWhere the trip goes: one place, or several as alternatives (the cheapest wins)
returnTimesNoClock-time limits for the return flight, as for outboundTimes
departLatestNoLatest date the traveller can leave; the same as departEarliest for one fixed date
exactFlightsNo'Prefer exact flight': a specific flight the traveller wants to be on, such as the one someone they travel with is booked on
outboundDaysNoDays of the week for the depart flight, as a requirement (hard) or a preference (soft, with how much more they would pay for it)
returnLatestNoLatest date the traveller can fly back
outboundTimesNoClock-time limits for the depart flight: hard not-before / not-after bounds and softer ideal windows, for departure and arrival
departEarliestNoEarliest date the traveller can leave: an absolute date, days from today, or a whole month
returnEarliestNoEarliest date the traveller can fly back
timesApplyToBothDirectionsNoyes when the traveller gave one set of times meant for both the depart and the return flight

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/idempotent/non-destructive, and the description adds concrete operational context beyond them: a hard quota ('7 searches a day'), a free-repeat window ('Repeating a search from the last 24 hours is free'), the question-back failure mode, and the exact expected output shape (results link on pinpoint.flights, per-flight book_url, up to 10 flights in rank order with price/times/stops/airline). No behavioral claims conflict with the annotations.

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?

Well organized: a front-loaded overview of purpose, limits, and output contract, followed by a scannable bulleted 'How to fill the fields' section keyed to parameter groups. The volume is justified by 26 nested parameters, but several bullets (weekday arithmetic, blackouts) are dense enough that the whole is longer than ideal for quick reference.

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

Completeness5/5

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

For a 26-parameter, nested, mutation-free search with no output schema, the description covers the missing piece an agent most needs – the shape and presentation of results (rank order, book_url per bookable flight, same-price swaps, results link). Combined with the field-filling rules, an agent has enough to invoke it correctly and report back faithfully.

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?

Although schema coverage is 100%, the description contributes substantial meaning the schema cannot: hard-vs-soft mapping of user phrasing to mode/exclude/required, the 'stressed preference = pct 30 / plain prefer = zeros' convention, bag pooling defaults (carryOn=1, checked=0 when unmentioned), trip-length never-guess rule, and AM/PM ambiguity handling tied to dates.timeOfDay. This is genuine interpretive guidance, not restatement.

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 opening states a specific verb and resource ('Search flights on Pinpoint Flights') and immediately characterizes the tool's distinguishing trait – 'very deep filters: exact time windows, nonstop vs. price trade-offs, bags, fare rules...'. An agent knows exactly what this does and what breadth of inputs it accepts without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use and when-not-to-act guidance: 'Fill in only what the traveller said', ask before searching when the request is vague, and 'don't run near-identical searches to compare: one search already prices many date combinations'. It also states the contingency path – if dates, stay length, or an unrecognized airport are missing, no search runs and questions come back instead.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.