
Flight search with very deep filters, from your assistant. Fla. Seller of Travel Reg. No. ST150266
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional to connect, needed to search: Bearer <your connector key>. The key is free: get a personal link at https://pinpoint.flights/connect and use its last part. Without it the server connects and lists its tool, and a search answers with where to get a key.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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".
Bags to include in the price: carry-ons and checked bags (per person, or shared across the group when pooled)
Fare rules: basic economy excluded or not, refundable, changeable, largest acceptable change fee, seat selection
Cabin class, whether mixing cabins between legs is fine, and any upgrade the traveller wants priced
Stops and connections: nonstop as a requirement or a preference, layover lengths, overnight and self-transfer connections, airports or countries to avoid, total travel time
The most the traveller will pay in USD, per person or for the whole group
true for a one-way trip; leave out for a round trip
Where the trip starts: the places the traveller named, and whether nearby airports are acceptable
cheapest only if the user says the absolute cheapest / price is all that matters / doesn't care about duration or stops
Airlines and alliances to prefer, to rather not fly (soft), or never to fly (hard), with any exceptions
A deadline at the destination: the date, and optionally the local time, they must have arrived by
A deliberate multi-day stop on the way: where, on which direction, for how many days, and how much extra it may cost
On-board needs: wifi, a lie-flat seat, and the flight length from which they matter
YYYY-MM-DD dates the user cannot travel, only if stated absolutely
Who is flying: adults, each child's age, babies on a lap or in their own seat, and nationalities when given
Days of the week for the return flight, hard or soft as for outboundDays
How many days the stay lasts: a minimum, a preferred length, a maximum, and whether a different length is fine when cheaper
Where the trip goes: one place, or several as alternatives (the cheapest wins)
Clock-time limits for the return flight, as for outboundTimes
Latest date the traveller can leave; the same as departEarliest for one fixed date
'Prefer exact flight': a specific flight the traveller wants to be on, such as the one someone they travel with is booked on
Days of the week for the depart flight, as a requirement (hard) or a preference (soft, with how much more they would pay for it)
Latest date the traveller can fly back
Clock-time limits for the depart flight: hard not-before / not-after bounds and softer ideal windows, for departure and arrival
Earliest date the traveller can leave: an absolute date, days from today, or a whole month
Earliest date the traveller can fly back
yes when the traveller gave one set of times meant for both the depart and the return flight
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http pinpoint-flights https://pinpoint.flights/mcp
Headers
Authorization (optional, not in the config above): Optional to connect, needed to search: Bearer <your connector key>. The key is free: get a personal link at https://pinpoint.flights/connect and use its last part. Without it the server connects and lists its tool, and a search answers with where to get a key.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".
| Argument | Type | Description |
|---|---|---|
| bags | object | Bags to include in the price: carry-ons and checked bags (per person, or shared across the group when pooled) |
| fare | object | Fare rules: basic economy excluded or not, refundable, changeable, largest acceptable change fee, seat selection |
| cabin | object | Cabin class, whether mixing cabins between legs is fine, and any upgrade the traveller wants priced |
| route | object | Stops and connections: nonstop as a requirement or a preference, layover lengths, overnight and self-transfer connections, airports or countries to avoid, total travel time |
| budget | object | The most the traveller will pay in USD, per person or for the whole group |
| oneWay | boolean | true for a one-way trip; leave out for a round trip |
| origin | object | Where the trip starts: the places the traveller named, and whether nearby airports are acceptable |
| rankBy | string | cheapest only if the user says the absolute cheapest / price is all that matters / doesn't care about duration or stops |
| airlines | object | Airlines and alliances to prefer, to rather not fly (soft), or never to fly (hard), with any exceptions |
| arriveBy | object | A deadline at the destination: the date, and optionally the local time, they must have arrived by |
| stopover | object | A deliberate multi-day stop on the way: where, on which direction, for how many days, and how much extra it may cost |
| amenities | object | On-board needs: wifi, a lie-flat seat, and the flight length from which they matter |
| blackouts | array | YYYY-MM-DD dates the user cannot travel, only if stated absolutely |
| travelers | object | Who is flying: adults, each child's age, babies on a lap or in their own seat, and nationalities when given |
| returnDays | object | Days of the week for the return flight, hard or soft as for outboundDays |
| tripLength | object | How many days the stay lasts: a minimum, a preferred length, a maximum, and whether a different length is fine when cheaper |
| destination | object | Where the trip goes: one place, or several as alternatives (the cheapest wins) |
| returnTimes | object | Clock-time limits for the return flight, as for outboundTimes |
| departLatest | object | Latest date the traveller can leave; the same as departEarliest for one fixed date |
| exactFlights | object | 'Prefer exact flight': a specific flight the traveller wants to be on, such as the one someone they travel with is booked on |
| outboundDays | object | Days of the week for the depart flight, as a requirement (hard) or a preference (soft, with how much more they would pay for it) |
| returnLatest | object | Latest date the traveller can fly back |
| outboundTimes | object | Clock-time limits for the depart flight: hard not-before / not-after bounds and softer ideal windows, for departure and arrival |
| departEarliest | object | Earliest date the traveller can leave: an absolute date, days from today, or a whole month |
| returnEarliest | object | Earliest date the traveller can fly back |
| timesApplyToBothDirections | string | yes when the traveller gave one set of times meant for both the depart and the return flight |
{
"type": "object",
"properties": {
"bags": {
"type": "object",
"properties": {
"pooled": {
"type": "boolean"
},
"carryOn": {
"type": "integer"
},
"checked": {
"type": "integer"
}
},
"description": "Bags to include in the price: carry-ons and checked bags (per person, or shared across the group when pooled)"
},
"fare": {
"type": "object",
"properties": {
"changeable": {
"enum": [
"any",
"preferred",
"required"
],
"type": "string"
},
"refundable": {
"enum": [
"any",
"preferred",
"required"
],
"type": "string"
},
"seatSelection": {
"enum": [
"any",
"preferred",
"required"
],
"type": "string"
},
"changeFeeMaxUsd": {
"type": "number"
},
"excludeBasicEconomy": {
"type": "boolean"
}
},
"description": "Fare rules: basic economy excluded or not, refundable, changeable, largest acceptable change fee, seat selection"
},
"cabin": {
"type": "object",
"properties": {
"default": {
"enum": [
"economy",
"premium_economy",
"business",
"first"
],
"type": "string"
},
"allowMixed": {
"type": "boolean"
},
"upgradeReportCabin": {
"enum": [
"economy",
"premium_economy",
"business",
"first",
"none"
],
"type": "string",
"description": "cabin the user wants a price delta reported for, or none"
},
"economyOkUnderHours": {
"type": "number"
},
"lieFlatOnLegsOverHours": {
"type": "number"
},
"upgradeReportMaxDeltaUsd": {
"type": "number"
}
},
"description": "Cabin class, whether mixing cabins between legs is fine, and any upgrade the traveller wants priced"
},
"route": {
"type": "object",
"properties": {
"nonstop": {
"type": "object",
"properties": {
"mode": {
"enum": [
"hard",
"soft",
"unstated"
],
"type": "string"
},
"premium": {
"type": "object",
"properties": {
"pct": {
"type": "number",
"description": "percent more the user would pay"
},
"usd": {
"type": "number",
"description": "dollars more the user would pay"
}
}
}
},
"description": "'nonstop only' = hard; 'prefer nonstop / no layovers if possible' = soft with the premium"
},
"maxStops": {
"type": "integer",
"description": "; 0 = nonstop only (only when nonstop.mode=hard)"
},
"preferHubs": {
"type": "array",
"items": {
"type": "string"
},
"description": "City names or codes the user said"
},
"avoidAirports": {
"type": "array",
"items": {
"type": "string"
},
"description": "IATA codes only if the user said them"
},
"maxLayoverMin": {
"type": "integer"
},
"minLayoverMin": {
"type": "integer"
},
"allowSelfTransfer": {
"enum": [
"yes",
"no",
"unstated"
],
"type": "string"
},
"maxTotalTravelHours": {
"type": "number"
},
"allowOvernightLayover": {
"enum": [
"yes",
"no",
"unstated"
],
"type": "string"
},
"avoidTransitCountries": {
"type": "array",
"items": {
"type": "string"
},
"description": "ISO-2 codes"
},
"excludeTransitVisaRoutings": {
"type": "boolean"
},
"selfTransferRequireSavingsPct": {
"type": "number"
}
},
"description": "Stops and connections: nonstop as a requirement or a preference, layover lengths, overnight and self-transfer connections, airports or countries to avoid, total travel time"
},
"budget": {
"type": "object",
"properties": {
"maxUsdTotal": {
"type": "number"
},
"maxUsdPerPerson": {
"type": "number"
}
},
"description": "The most the traveller will pay in USD, per person or for the whole group"
},
"oneWay": {
"type": "boolean",
"description": "true for a one-way trip; leave out for a round trip"
},
"origin": {
"type": "object",
"properties": {
"places": {
"type": "array",
"items": {
"type": "string"
},
"description": "Cities, airports or codes the user named as departure points"
},
"nearbyOk": {
"enum": [
"yes",
"no",
"unstated"
],
"type": "string"
},
"nearbySavings": {
"type": "object",
"properties": {
"pct": {
"type": "number",
"description": "percent more the user would pay"
},
"usd": {
"type": "number",
"description": "dollars more the user would pay"
}
},
"description": "How much cheaper a nearby airport must be"
},
"nearbyRadiusMiles": {
"type": "number"
}
},
"description": "Where the trip starts: the places the traveller named, and whether nearby airports are acceptable"
},
"rankBy": {
"enum": [
"balanced",
"cheapest",
"unstated"
],
"type": "string",
"description": "cheapest only if the user says the absolute cheapest / price is all that matters / doesn't care about duration or stops"
},
"airlines": {
"type": "object",
"properties": {
"avoid": {
"type": "array",
"items": {
"type": "string"
},
"description": "soft: 'rather not'"
},
"exclude": {
"type": "array",
"items": {
"type": "string"
},
"description": "hard: 'never'"
},
"exceptions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"carrier": {
"type": "string"
},
"premium": {
"type": "object",
"properties": {
"pct": {
"type": "number",
"description": "percent more the user would pay"
},
"usd": {
"type": "number",
"description": "dollars more the user would pay"
}
}
},
"nonstopOnly": {
"type": "boolean"
}
}
}
},
"preferPremium": {
"type": "object",
"properties": {
"pct": {
"type": "number",
"description": "percent more the user would pay"
},
"usd": {
"type": "number",
"description": "dollars more the user would pay"
}
}
},
"preferCarriers": {
"type": "array",
"items": {
"type": "string"
},
"description": "IATA codes"
},
"preferAlliances": {
"type": "array",
"items": {
"enum": [
"STAR",
"ONEWORLD",
"SKYTEAM"
],
"type": "string"
}
}
},
"description": "Airlines and alliances to prefer, to rather not fly (soft), or never to fly (hard), with any exceptions"
},
"arriveBy": {
"type": "object",
"properties": {
"date": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD when kind=absolute"
},
"days": {
"type": "integer",
"description": "offset from today when kind=relative_days"
},
"kind": {
"enum": [
"absolute",
"relative_days",
"month",
"unstated"
],
"type": "string"
},
"month": {
"type": "string",
"description": "YYYY-MM when kind=month"
}
}
},
"time": {
"type": "string",
"description": "HH:MM local or empty"
}
},
"description": "A deadline at the destination: the date, and optionally the local time, they must have arrived by"
},
"stopover": {
"type": "object",
"properties": {
"days": {
"type": "integer"
},
"places": {
"type": "array",
"items": {
"type": "string"
}
},
"stated": {
"type": "boolean"
},
"direction": {
"enum": [
"outbound",
"return"
],
"type": "string"
},
"maxAddedUsd": {
"type": "number"
}
},
"description": "A deliberate multi-day stop on the way: where, on which direction, for how many days, and how much extra it may cost"
},
"amenities": {
"type": "object",
"properties": {
"wifi": {
"enum": [
"yes",
"no",
"unstated"
],
"type": "string"
},
"lieFlat": {
"enum": [
"yes",
"no",
"unstated"
],
"type": "string"
},
"onSegmentHoursGte": {
"type": "number"
}
},
"description": "On-board needs: wifi, a lie-flat seat, and the flight length from which they matter"
},
"blackouts": {
"type": "array",
"items": {
"type": "string"
},
"description": "YYYY-MM-DD dates the user cannot travel, only if stated absolutely"
},
"travelers": {
"type": "object",
"properties": {
"adults": {
"type": "integer"
},
"infants": {
"type": "integer",
"description": "babies under 2 on a lap (the default for a baby)"
},
"childrenAges": {
"type": "array",
"items": {
"type": "integer"
},
"description": "ages 2-17, one per child"
},
"infantsInSeat": {
"type": "integer",
"description": "babies under 2 with their own seat, only if the user says so"
},
"nationalities": {
"type": "array",
"items": {
"type": "string"
},
"description": "ISO-2 codes"
}
},
"description": "Who is flying: adults, each child's age, babies on a lap or in their own seat, and nationalities when given"
},
"returnDays": {
"type": "object",
"properties": {
"days": {
"type": "array",
"items": {
"enum": [
"MON",
"TUE",
"WED",
"THU",
"FRI",
"SAT",
"SUN"
],
"type": "string"
}
},
"mode": {
"enum": [
"hard",
"soft",
"unstated"
],
"type": "string"
},
"premium": {
"type": "object",
"properties": {
"pct": {
"type": "number",
"description": "percent more the user would pay"
},
"usd": {
"type": "number",
"description": "dollars more the user would pay"
}
}
}
},
"description": "Days of the week for the return flight, hard or soft as for outboundDays"
},
"tripLength": {
"type": "object",
"properties": {
"maxDays": {
"type": "integer"
},
"minDays": {
"type": "integer"
},
"preferredDays": {
"type": "integer"
},
"flexibleIfCheaper": {
"type": "boolean"
}
},
"description": "How many days the stay lasts: a minimum, a preferred length, a maximum, and whether a different length is fine when cheaper"
},
"destination": {
"type": "object",
"properties": {
"places": {
"type": "array",
"items": {
"type": "string"
},
"description": "Cities, countries, regions or codes; several = alternatives, cheapest wins"
},
"nearbyOk": {
"enum": [
"yes",
"no",
"unstated"
],
"type": "string"
}
},
"description": "Where the trip goes: one place, or several as alternatives (the cheapest wins)"
},
"returnTimes": {
"type": "object",
"properties": {
"onlyOnDate": {
"type": "string",
"description": "YYYY-MM-DD when these times are tied to one date the user named ('7pm on the 27th'), else empty"
},
"idealArriveTo": {
"type": "string",
"description": "soft, HH:MM or empty"
},
"idealDepartTo": {
"type": "string",
"description": "soft, HH:MM or empty"
},
"arriveNotAfter": {
"type": "string",
"description": "hard, HH:MM or empty"
},
"departNotAfter": {
"type": "string",
"description": "hard, HH:MM or empty"
},
"arriveNotBefore": {
"type": "string",
"description": "hard, HH:MM or empty"
},
"departNotBefore": {
"type": "string",
"description": "hard, HH:MM or empty"
},
"idealArriveFrom": {
"type": "string",
"description": "soft, HH:MM or empty"
},
"idealDepartFrom": {
"type": "string",
"description": "soft 'ideally' window, HH:MM or empty"
}
},
"description": "Clock-time limits for the return flight, as for outboundTimes"
},
"departLatest": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD when kind=absolute"
},
"days": {
"type": "integer",
"description": "offset from today when kind=relative_days"
},
"kind": {
"enum": [
"absolute",
"relative_days",
"month",
"unstated"
],
"type": "string"
},
"month": {
"type": "string",
"description": "YYYY-MM when kind=month"
}
},
"description": "Latest date the traveller can leave; the same as departEarliest for one fixed date"
},
"exactFlights": {
"type": "object",
"properties": {
"return": {
"type": "array",
"items": {
"type": "string"
},
"description": "the same for the return flight"
},
"premium": {
"type": "object",
"properties": {
"pct": {
"type": "number",
"description": "percent more the user would pay"
},
"usd": {
"type": "number",
"description": "dollars more the user would pay"
}
}
},
"outbound": {
"type": "array",
"items": {
"type": "string"
},
"description": "flight numbers the traveller wants to be on for the depart flight, like DL2729; empty if none"
}
},
"description": "'Prefer exact flight': a specific flight the traveller wants to be on, such as the one someone they travel with is booked on"
},
"outboundDays": {
"type": "object",
"properties": {
"days": {
"type": "array",
"items": {
"enum": [
"MON",
"TUE",
"WED",
"THU",
"FRI",
"SAT",
"SUN"
],
"type": "string"
}
},
"mode": {
"enum": [
"hard",
"soft",
"unstated"
],
"type": "string"
},
"premium": {
"type": "object",
"properties": {
"pct": {
"type": "number",
"description": "percent more the user would pay"
},
"usd": {
"type": "number",
"description": "dollars more the user would pay"
}
}
}
},
"description": "Days of the week for the depart flight, as a requirement (hard) or a preference (soft, with how much more they would pay for it)"
},
"returnLatest": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD when kind=absolute"
},
"days": {
"type": "integer",
"description": "offset from today when kind=relative_days"
},
"kind": {
"enum": [
"absolute",
"relative_days",
"month",
"unstated"
],
"type": "string"
},
"month": {
"type": "string",
"description": "YYYY-MM when kind=month"
}
},
"description": "Latest date the traveller can fly back"
},
"outboundTimes": {
"type": "object",
"properties": {
"onlyOnDate": {
"type": "string",
"description": "YYYY-MM-DD when these times are tied to one date the user named ('7pm on the 27th'), else empty"
},
"idealArriveTo": {
"type": "string",
"description": "soft, HH:MM or empty"
},
"idealDepartTo": {
"type": "string",
"description": "soft, HH:MM or empty"
},
"arriveNotAfter": {
"type": "string",
"description": "hard, HH:MM or empty"
},
"departNotAfter": {
"type": "string",
"description": "hard, HH:MM or empty"
},
"arriveNotBefore": {
"type": "string",
"description": "hard, HH:MM or empty"
},
"departNotBefore": {
"type": "string",
"description": "hard, HH:MM or empty"
},
"idealArriveFrom": {
"type": "string",
"description": "soft, HH:MM or empty"
},
"idealDepartFrom": {
"type": "string",
"description": "soft 'ideally' window, HH:MM or empty"
}
},
"description": "Clock-time limits for the depart flight: hard not-before / not-after bounds and softer ideal windows, for departure and arrival"
},
"departEarliest": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD when kind=absolute"
},
"days": {
"type": "integer",
"description": "offset from today when kind=relative_days"
},
"kind": {
"enum": [
"absolute",
"relative_days",
"month",
"unstated"
],
"type": "string"
},
"month": {
"type": "string",
"description": "YYYY-MM when kind=month"
}
},
"description": "Earliest date the traveller can leave: an absolute date, days from today, or a whole month"
},
"returnEarliest": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD when kind=absolute"
},
"days": {
"type": "integer",
"description": "offset from today when kind=relative_days"
},
"kind": {
"enum": [
"absolute",
"relative_days",
"month",
"unstated"
],
"type": "string"
},
"month": {
"type": "string",
"description": "YYYY-MM when kind=month"
}
},
"description": "Earliest date the traveller can fly back"
},
"timesApplyToBothDirections": {
"enum": [
"yes",
"no",
"unstated"
],
"type": "string",
"description": "yes when the traveller gave one set of times meant for both the depart and the return flight"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 11, 2026.
A very long tool description (over 4,000 characters) is hard to review and easy to hide instructions in.
Fix: Keep the description to what the tool does and when to use it; move reference material to resources or docs.