Skip to main content
Glama

Search flights

search_flights
Read-onlyIdempotent

Call this tool to find flights once the traveler has told you their dates. It handles one-way trips, round trips, two possible dates each way, and up to three airports on each side at once.

Before you call it, you need four things from the traveler: where they are flying from, where they are flying to, the date they want to leave, and, for a round trip, the date they want to come back. If the traveler has not told you any of these, ask them for everything that is missing in one question. Do not pick dates for the traveler. Do not guess whether the trip is one way or a round trip.

A question like "what is the cheapest flight from Newark to Los Angeles" still needs dates. Ask the traveler when they want to go and whether it is one way or a round trip, then call this tool. If the traveler does not have dates yet, offer to set up a bucket list alert with add_flight_bucket_list, which watches the route for them and alerts them when a good fare appears.

Search as soon as you have those four things. After the results, offer ways to narrow the choice: cabin, stops, airlines, times of day.

You can search up to two departure dates and two return dates in one call by joining them with _ (for example 2026-11-20_2026-11-21).

Fill in origin, destination, depart_date and, for a round trip, return_date. You can also pass the traveler's own words in query and leave the fields you do not know empty. SlickTrip fills in only what the traveler's words say. It does not guess the rest.

The answer lists priced itineraries, cheapest first, each with an itinerary_id for track_flight and search_return_flights, and a search_url.

When the traveler wants to be alerted about a route over flexible months, or does not have dates yet, use add_flight_bucket_list.

Input Schema

NameRequiredDescriptionDefault
legsNoMulti-city trip: the legs in order, 2 to 5, each one airport or city code per side and one date. When given, origin / destination / depart_date / return_date are ignored.
sortNoOrder of results.price
cabinNoCabin class.economy
queryNoThe traveler's request in their own words, used to fill any field left empty.
originNoA 3-letter airport code (JFK) or a city code for all its airports (NYCA, LOND, ROME); up to 3 joined with _ (JFK_EWR). A clear place name works too. When the traveler names a city rather than an airport, send the city (its name or code), not one of its airports: one airport can miss the cheapest or the only flights. Unsure of the code: call find_places.
displayNocompact: one line per option, more options, far fewer tokens; full: every field (what the cards draw). Empty picks for you: compact when the app shows no cards, full when it does.
airlinesNoOnly these marketing carriers, as IATA codes or names.
max_stopsNoMost stops allowed: 0 nonstop, 1, or 2 (2 or more: any number).
travelersNoTravelers who need a seat (adults and children). Fares are quoted for all of them together; one booking holds up to 9 (a larger group gets a suggested split). A baby under 2 on a lap is not a seat and is not counted here.
depart_dateNoYYYY-MM-DD. A second date joined with _ searches both as flexible dates (2026-11-03_2026-11-04); at most 2 per direction.
destinationNoA 3-letter airport code (JFK) or a city code for all its airports (NYCA, LOND, ROME); up to 3 joined with _ (JFK_EWR). A clear place name works too. When the traveler names a city rather than an airport, send the city (its name or code), not one of its airports: one airport can miss the cheapest or the only flights. Unsure of the code: call find_places.
lap_infantsNoBabies under 2 who will sit on an adult's lap (no seat of their own). Not counted in travelers and not in the quoted fare; the answer says how airlines charge them.
max_resultsNoHow many results to return, 1-50.
return_dateNoYYYY-MM-DD for a round trip; empty for one way.
arrive_afterNoHH:MM, local time at that airport.
checked_bagsNoChecked bags per traveler (0 to 2). Bag fees are only priced for flights within the US and Canada; for other flights the answer says the prices do not include them. The prices then include the bag fees, shown as price_with_bags next to the fare.
depart_afterNoHH:MM, local time at that airport.
user_requestNoOptional, and it works in the traveler's favor. Quote the traveler's latest message about this trip exactly as they wrote it, in their wording, language and spelling, not a summary. SlickTrip runs its own travel parser on these words: when a search fails or comes back empty, it compares what the traveler said with the arguments sent and returns a corrected search, so you can fix it without asking them again. It has caught Cancun sent as MEX instead of CUN, and travelers dropped from the party. A summary loses exactly the details it checks. If the message only answers a question ("yes, the 20th"), quote the message where they asked for the trip. Send the same quote on every call for this request. Leave out anything not about the trip, and never include names, contact details, or payment or ID information. The words also help SlickTrip improve its search.
arrive_beforeNoHH:MM, local time at that airport.
carry_on_bagsNoCarry-on bags per traveler (0 or 1). The prices then include the bag fees, shown as price_with_bags next to the fare.
depart_beforeNoHH:MM, local time at that airport.
max_price_usdNoHighest fare to show, USD, as the TOTAL for all travelers together: for a per-person budget, multiply by travelers (2 people at $300 each = 600). Unlike bucket lists, whose price bar is per traveler.
lower_emissionsNoOnly itineraries with lower emissions than is typical for the route.
exclude_airlinesNoLeave out itineraries with any flight sold by these carriers (IATA codes, names or an alliance), by flight number or airline name: for 'not Gol' or 'avoid Air India'.
max_layover_hoursNoLongest layover allowed at every connection, in hours (half hours allowed): for 'layovers no longer than 5 hours'.
min_layover_hoursNoShortest layover allowed at every connection, in hours (half hours allowed): for 'at least 2 hours to connect'.
max_duration_hoursNoLongest itinerary to show, in hours.
connecting_airportsNoOnly itineraries that change planes at these airports (codes or city codes), nonstops included: for 'US connections only' name the hubs.
no_overnight_layoversNoLeave out itineraries with an overnight layover: for 'no overnight at the transit airport'.
exclude_connecting_airportsNoLeave out itineraries that change planes at these airports (codes or city codes).

Output Schema

NameRequiredDescriptionDefault
codeNoOn an error: a machine-readable kind, e.g. unknown_place
noteNoGuidance on trip type or why empty
fieldNoOn unknown_place: which argument (origin, destination, ...)
countsNopriced, matching_filters, returned integers
searchNoRoute dict: origin, destination, names, destination_image, cabin, travelers, dates, trip_type, legs (multi-city), search_key, served_from, retrieved_at
statusNook | no_data | error | sign_in_required
filtersNoFilters as the caller gave them (max_stops, airlines, max_price_usd, ...)
messageNoError or sign-in message from the server wrapper
highlightsNoThe spread over every matching fare: cheapest, cheapest_nonstop, fastest, earliest, latest; each with itinerary_id, price, airlines, stops, duration_minutes, departs_at
search_urlNoslicktrip.com search page link with attribution
itinerariesNoItems: itinerary_id, price {total_usd, per_traveler_usd}, outbound leg, needs_leg, track_url, optional depart_date + search_key
searched_asNoWhat the search assumed: trip type, travelers, cabin
suggestionsNoOn unknown_place: places to offer the traveler, each with code, name, kind (airport, all airports in the city, nearby airport), city, country
places_assumedNoPlace names this call resolved on its own, e.g. 'Portland = Portland, OR (PDX)'; tell the traveler

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / carry_on_bags / description
      Previous value: -"Carry-on bags per traveler (0-1). Prices then include the bag fees: search_flights shows them as price_with_bags next to the fare; a calendar or bucket list prices every day with them."New value: +"Carry-on bags per traveler (0 or 1). The prices then include the bag fees, shown as price_with_bags next to the fare."
    • changedInput schema / properties / checked_bags / description
      Previous value: -"Checked bags per traveler (0-2), priced only for flights within the US and Canada (elsewhere the answer says the prices do not include them). Prices then include the bag fees: search_flights shows them as price_with_bags next to the fare; a calendar or bucket list prices every day with them."New value: +"Checked bags per traveler (0 to 2). Bag fees are only priced for flights within the US and Canada; for other flights the answer says the prices do not include them. The prices then include the bag fees, shown as price_with_bags next to the fare."
    • changedInput schema / properties / max_stops / anyOf
      Previous value: -[
      -  {
      -    "maximum": 2,
      -    "minimum": 0,
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 9,
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / max_stops / description
      Previous value: -"Most stops allowed: 0 nonstop, 1, or 2."New value: +"Most stops allowed: 0 nonstop, 1, or 2 (2 or more: any number)."
  2. Changed1 schema field changed
    • changedInput schema / properties / checked_bags / description
      Previous value: -"Checked bags per traveler (0-2). Prices then include the bag fees: search_flights shows them as price_with_bags next to the fare; a calendar or bucket list prices every day with them."New value: +"Checked bags per traveler (0-2), priced only for flights within the US and Canada (elsewhere the answer says the prices do not include them). Prices then include the bag fees: search_flights shows them as price_with_bags next to the fare; a calendar or bucket list prices every day with them."
  3. Changed9 schema fields changed
    • addedInput schema / properties / carry_on_bags
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 1,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Carry-on bags per traveler (0-1). Prices then include the bag fees: search_flights shows them as price_with_bags next to the fare; a calendar or bucket list prices every day with them.",
      +  "title": "Carry On Bags"
      +}
    • addedInput schema / properties / checked_bags
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 2,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Checked bags per traveler (0-2). Prices then include the bag fees: search_flights shows them as price_with_bags next to the fare; a calendar or bucket list prices every day with them.",
      +  "title": "Checked Bags"
      +}
    • addedInput schema / properties / connecting_airports
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Only itineraries that change planes at these airports (codes or city codes), nonstops included: for 'US connections only' name the hubs.",
      +  "examples": [
      +    [
      +      "MIA",
      +      "ATL",
      +      "IAH"
      +    ]
      +  ],
      +  "title": "Connecting Airports"
      +}
    • addedInput schema / properties / exclude_airlines
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Leave out itineraries with any flight sold by these carriers (IATA codes, names or an alliance), by flight number or airline name: for 'not Gol' or 'avoid Air India'.",
      +  "examples": [
      +    [
      +      "G3"
      +    ],
      +    [
      +      "Gulf Air",
      +      "Air India"
      +    ]
      +  ],
      +  "title": "Exclude Airlines"
      +}
    • addedInput schema / properties / exclude_connecting_airports
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Leave out itineraries that change planes at these airports (codes or city codes).",
      +  "examples": [
      +    [
      +      "DOH"
      +    ],
      +    [
      +      "LOND"
      +    ]
      +  ],
      +  "title": "Exclude Connecting Airports"
      +}
    • addedInput schema / properties / lower_emissions
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Only itineraries with lower emissions than is typical for the route.",
      +  "title": "Lower Emissions"
      +}
    • addedInput schema / properties / max_layover_hours
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 26,
      +      "minimum": 0.5,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Longest layover allowed at every connection, in hours (half hours allowed): for 'layovers no longer than 5 hours'.",
      +  "title": "Max Layover Hours"
      +}
    • addedInput schema / properties / min_layover_hours
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 26,
      +      "minimum": 0.5,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Shortest layover allowed at every connection, in hours (half hours allowed): for 'at least 2 hours to connect'.",
      +  "title": "Min Layover Hours"
      +}
    • addedInput schema / properties / no_overnight_layovers
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Leave out itineraries with an overnight layover: for 'no overnight at the transit airport'.",
      +  "title": "No Overnight Layovers"
      +}
  4. Changed10 schema fields changed
    • changedInput schema / $defs / Leg / properties / destination / description
      Previous value: -"A 3-letter airport code (JFK), or a city code that searches every airport in the city (SlickTrip's 4-letter codes: NYCA New York, LOND London, ROME Rome, TYOA Tokyo). Up to 3 places joined with _ search them together (JFK_EWR). A place name works when one place clearly matches; otherwise the result is an unknown_place error listing suggestions. Unsure of the code: call find_places."New value: +"A 3-letter airport code (JFK), or a city code that searches every airport in the city (SlickTrip's 4-letter codes: NYCA New York, LOND London, ROME Rome, TYOA Tokyo). Up to 3 places joined with _ search them together (JFK_EWR). A place name works when one place clearly matches; otherwise the result is an unknown_place error listing suggestions. When the traveler names a city rather than an airport, send the city (its name or code), not one of its airports: one airport can miss the cheapest or the only flights. Unsure of the code: call find_places."
    • changedInput schema / $defs / Leg / properties / origin / description
      Previous value: -"A 3-letter airport code (JFK), or a city code that searches every airport in the city (SlickTrip's 4-letter codes: NYCA New York, LOND London, ROME Rome, TYOA Tokyo). Up to 3 places joined with _ search them together (JFK_EWR). A place name works when one place clearly matches; otherwise the result is an unknown_place error listing suggestions. Unsure of the code: call find_places."New value: +"A 3-letter airport code (JFK), or a city code that searches every airport in the city (SlickTrip's 4-letter codes: NYCA New York, LOND London, ROME Rome, TYOA Tokyo). Up to 3 places joined with _ search them together (JFK_EWR). A place name works when one place clearly matches; otherwise the result is an unknown_place error listing suggestions. When the traveler names a city rather than an airport, send the city (its name or code), not one of its airports: one airport can miss the cheapest or the only flights. Unsure of the code: call find_places."
    • changedInput schema / properties / destination / description
      Previous value: -"A 3-letter airport code (JFK) or a city code for all its airports (NYCA, LOND, ROME); up to 3 joined with _ (JFK_EWR). A clear place name works too. Unsure of the code: call find_places."New value: +"A 3-letter airport code (JFK) or a city code for all its airports (NYCA, LOND, ROME); up to 3 joined with _ (JFK_EWR). A clear place name works too. When the traveler names a city rather than an airport, send the city (its name or code), not one of its airports: one airport can miss the cheapest or the only flights. Unsure of the code: call find_places."
    • addedInput schema / properties / display
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "compact",
      +        "full"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "compact: one line per option, more options, far fewer tokens; full: every field (what the cards draw). Empty picks for you: compact when the app shows no cards, full when it does.",
      +  "title": "Display"
      +}
    • addedInput schema / properties / lap_infants
      Added value: +{
      +  "default": 0,
      +  "description": "Babies under 2 who will sit on an adult's lap (no seat of their own). Not counted in travelers and not in the quoted fare; the answer says how airlines charge them.",
      +  "maximum": 9,
      +  "minimum": 0,
      +  "title": "Lap Infants",
      +  "type": "integer"
      +}
    • changedInput schema / properties / origin / description
      Previous value: -"A 3-letter airport code (JFK) or a city code for all its airports (NYCA, LOND, ROME); up to 3 joined with _ (JFK_EWR). A clear place name works too. Unsure of the code: call find_places."New value: +"A 3-letter airport code (JFK) or a city code for all its airports (NYCA, LOND, ROME); up to 3 joined with _ (JFK_EWR). A clear place name works too. When the traveler names a city rather than an airport, send the city (its name or code), not one of its airports: one airport can miss the cheapest or the only flights. Unsure of the code: call find_places."
    • changedInput schema / properties / travelers / description
      Previous value: -"Travelers. Fares are quoted for all of them together; one booking holds up to 9 (a larger group gets a suggested split)."New value: +"Travelers who need a seat (adults and children). Fares are quoted for all of them together; one booking holds up to 9 (a larger group gets a suggested split). A baby under 2 on a lap is not a seat and is not counted here."
    • changedInput schema / properties / user_request / anyOf
      Previous value: -[
      -  {
      -    "maxLength": 300,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 500,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / user_request / description
      Previous value: -"Optional. The traveler's current travel request, briefly, in their own words. Used to interpret this search, suggest a corrected search if it fails, and improve SlickTrip's search. Include only this request; not earlier conversation, names, contact details, or payment or ID information."New value: +"Optional, and it works in the traveler's favor. Quote the traveler's latest message about this trip exactly as they wrote it, in their wording, language and spelling, not a summary. SlickTrip runs its own travel parser on these words: when a search fails or comes back empty, it compares what the traveler said with the arguments sent and returns a corrected search, so you can fix it without asking them again. It has caught Cancun sent as MEX instead of CUN, and travelers dropped from the party. A summary loses exactly the details it checks. If the message only answers a question (\"yes, the 20th\"), quote the message where they asked for the trip. Send the same quote on every call for this request. Leave out anything not about the trip, and never include names, contact details, or payment or ID information. The words also help SlickTrip improve its search."
    • changedInput schema / properties / user_request / examples
      Previous value: -[
      -  "cheap nonstop to Lisbon early May",
      -  "family of 8 in Albufeira, 4 nights mid November"
      -]New value: +[
      +  "we're 6 friends from madrid, want somewhere cheap and fun in europe dec 20-24, morning flights pls",
      +  "necesito llevar a mi mamá de Calgary a Kolkata a fines de octubre, no puede hacer escala en Estados Unidos"
      +]
  5. Changed8 schema fields changed
    • changedInput schema / $defs / Leg / properties / destination / description
      Previous value: -"A 3-letter airport code (JFK), or a city code that searches every airport in the city (NYC, LON, ROM, TYO). Up to 3 airports joined with _ search them together (JFK_EWR). A place name works when one place clearly matches; otherwise the result is an unknown_place error listing suggestions. Unsure of the code: call find_places."New value: +"A 3-letter airport code (JFK), or a city code that searches every airport in the city (SlickTrip's 4-letter codes: NYCA New York, LOND London, ROME Rome, TYOA Tokyo). Up to 3 places joined with _ search them together (JFK_EWR). A place name works when one place clearly matches; otherwise the result is an unknown_place error listing suggestions. Unsure of the code: call find_places."
    • changedInput schema / $defs / Leg / properties / destination / examples
      Previous value: -[
      -  "JFK",
      -  "ROM",
      -  "JFK_EWR"
      -]New value: +[
      +  "JFK",
      +  "NYCA",
      +  "JFK_EWR"
      +]
    • changedInput schema / $defs / Leg / properties / origin / description
      Previous value: -"A 3-letter airport code (JFK), or a city code that searches every airport in the city (NYC, LON, ROM, TYO). Up to 3 airports joined with _ search them together (JFK_EWR). A place name works when one place clearly matches; otherwise the result is an unknown_place error listing suggestions. Unsure of the code: call find_places."New value: +"A 3-letter airport code (JFK), or a city code that searches every airport in the city (SlickTrip's 4-letter codes: NYCA New York, LOND London, ROME Rome, TYOA Tokyo). Up to 3 places joined with _ search them together (JFK_EWR). A place name works when one place clearly matches; otherwise the result is an unknown_place error listing suggestions. Unsure of the code: call find_places."
    • changedInput schema / $defs / Leg / properties / origin / examples
      Previous value: -[
      -  "JFK",
      -  "ROM",
      -  "JFK_EWR"
      -]New value: +[
      +  "JFK",
      +  "NYCA",
      +  "JFK_EWR"
      +]
    • changedInput schema / properties / destination / description
      Previous value: -"A 3-letter airport code (JFK) or a city code for all its airports (NYC, LON, ROM); up to 3 joined with _ (JFK_EWR). A clear place name works too. Unsure of the code: call find_places."New value: +"A 3-letter airport code (JFK) or a city code for all its airports (NYCA, LOND, ROME); up to 3 joined with _ (JFK_EWR). A clear place name works too. Unsure of the code: call find_places."
    • changedInput schema / properties / destination / examples
      Previous value: -[
      -  "JFK",
      -  "ROM",
      -  "JFK_EWR"
      -]New value: +[
      +  "JFK",
      +  "NYCA",
      +  "JFK_EWR"
      +]
    • changedInput schema / properties / origin / description
      Previous value: -"A 3-letter airport code (JFK) or a city code for all its airports (NYC, LON, ROM); up to 3 joined with _ (JFK_EWR). A clear place name works too. Unsure of the code: call find_places."New value: +"A 3-letter airport code (JFK) or a city code for all its airports (NYCA, LOND, ROME); up to 3 joined with _ (JFK_EWR). A clear place name works too. Unsure of the code: call find_places."
    • changedInput schema / properties / origin / examples
      Previous value: -[
      -  "JFK",
      -  "ROM",
      -  "JFK_EWR"
      -]New value: +[
      +  "JFK",
      +  "NYCA",
      +  "JFK_EWR"
      +]
  6. First observed

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds real sequencing/behavioral context (search as soon as prerequisites are met, SlickTrip fills only what the traveler's words say and does not guess, results are cheapest-first with itinerary_id/search_url), but it does not disclose auth, rate limits, or error behavior beyond the unknown_place note in the schema.

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?

Front-loaded with purpose and prerequisites, then alternatives and return shape. It is long, but justified for a 30-parameter agentic tool; the only redundancy is the closing sentence re-stating the add_flight_bucket_list guidance already given mid-description.

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?

Given complexity (30 params, nested legs, open-world search) the description covers the full workflow: prerequisites, routing to alternatives, flexible-date syntax, and the shape/next-steps of results. With an output schema present, return-value detail is optional and its presence is a bonus, not a gap.

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 description coverage is 100%, so the schema already documents all 30 parameters thoroughly. The description partly restates this by listing origin/destination/depart_date/return_date and the query fallback, adding only light workflow framing rather than new parameter meaning; baseline 3 is appropriate when the schema carries the load.

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?

States a specific verb (search) and resource (flights) and immediately scopes the behavior: one-way, round trip, two dates per direction, up to three airports per side. It also names the sibling it is not (add_flight_bucket_list) for the no-dates case, so an agent can route without opening schemas.

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?

Explicitly states the precondition (four traveler facts), what to do when they are missing (ask once, never guess dates or trip type), and the alternative tool when the traveler has no dates. It even handles the tempting edge case ('cheapest flight from Newark to LA') by requiring dates first.

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.

Resources