Skip to main content
Glama

Find cheap multi-country trips

find_trips
Read-onlyIdempotent

Finds cheap trips through several cities and countries in Europe or Southeast Asia, strung from non-stop one-way fares seen in the last few days: you give a start city (or a home airport outside the region: the trip then starts with a flight from the nearest big airport we have fares from), a window for the first flight, how many places and nights in each, and a flight budget, and optionally the kinds of place (beaches, islands, capitals ...), countries to keep to or skip and cities per country; it picks the cities. Returns the cheapest three trips, each with its flights, fare ages, cabin-bag notes and a link to the trip on faredice.com.

Input Schema

NameRequiredDescriptionDefault
endNohome: the last flight returns to the start city (with home, to the airport the trip flew in through). Default anywhere.
fromNoStart city: a name ("Lisbon") or IATA city code ("LIS"), "anywhere" to start in any of the region's busiest cities, or a country ("anywhere in Germany", "Spain") to start in any of its cities. Needed unless home is given.
homeNoThe traveller's home airport when it is outside the region: a town ("Calgary", "London, Ontario") or IATA code ("YYC"). Trips then start with a flight in from the nearest big airport we have fares from (Toronto, New York, Sydney ...), usually with a stop, and from there it's the same trip. The budget covers that flight; getting from home to that airport isn't in the prices. With home, from is used only when we can't fly from that home.
startNoEarliest day for the first flight, YYYY-MM-DD. Fares cover about the next 90 days. Default: a week from today.
untilNoLatest day for the first flight, YYYY-MM-DD. Default: two weeks after start.
regionNoWhere the trip goes. Default europe.
cabin_bagNotrue: the traveller takes a cabin bag (the wheeled one for the overhead locker), so the budget and the ranking count each flight's usual price for one where we know it; a flight whose bag price we don't know counts €35, the dearest bag price we know, so the total is an estimate (see unpriced_cabin_bags). Default false: fares alone.
countriesNoISO country codes ("ES", "PT"): every stop is in one of these.
passportsNoISO country codes of the traveller's passports ("US", "IN"): countries that need a visa in advance are left out.
visa_freeNoWith passports: only countries that need no visa of any kind, leaving out e-visas, ETAs and visas on arrival as well as visas needed before flying.
budget_eurNoMost to spend on all the flights, in euros, for all the travellers together (up to 5,000 each).
held_visasNoValid visas the traveller already holds, with passports: "schengen" opens the Schengen area (its days counted against 90 in any 180) and the countries outside it that admit Schengen visa holders; "uk" and "us" open the countries that admit holders of those. The traveller still checks the visa's own dates and entries.
nights_maxNoMost nights in each place.
nights_minNoFewest nights in each place.
places_maxNoMost places to stay in. Default 12, any number.
places_minNoFewest places to stay in. Default 4.
travellersNoHow many adults travel together. Default 1. Every price in the answer, and the budget, is then for all of them.
warm_min_cNoOnly places whose typical daytime high for the month of the stay is at least this many °C, from long-term weather station averages (a place without them is left out). For winter sun in Europe.
then_regionNoWith home: after region, fly on to this other region and home from there, in one trip (europe then southeast-asia, or the reverse). Three long flights: home into region, one across (from or to London or Paris), and home from then_region; each a separate ticket, all in the total and the budget. Homes: Vancouver or Los Angeles, or an airport within 1,000 km of them. The trip always ends home; places_min splits between the regions. A budget of about 2,000 euros fits most.
kinds_of_placeNoKinds of place, from our notes on each city: per kind, "only" (every stop is one), "none" (no stop is one) or at least n stops of it (1-4), e.g. {"beaches": 2, "capitals": "none"}. One kind can be "only". Ski counts only from December to mid-April, and only in Europe. The start and the return don't count as stops.
skip_countriesNoISO country codes to leave out of the trip.
cities_per_countryNoMost cities in any one country. Default 1; 0 for any number (answers write it "any").

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / warm_min_c
      Added value: +{
      +  "description": "Only places whose typical daytime high for the month of the stay is at least this many °C, from long-term weather station averages (a place without them is left out). For winter sun in Europe.",
      +  "enum": [
      +    16,
      +    18,
      +    20,
      +    22,
      +    25
      +  ],
      +  "type": "integer"
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / places_max / description
      Previous value: -"Most places to stay in."New value: +"Most places to stay in. Default 12, any number."
    • changedInput schema / properties / places_min / description
      Previous value: -"Fewest places to stay in."New value: +"Fewest places to stay in. Default 4."
  3. Changed1 schema field changed
    • addedInput schema / properties / visa_free
      Added value: +{
      +  "description": "With passports: only countries that need no visa of any kind, leaving out e-visas, ETAs and visas on arrival as well as visas needed before flying.",
      +  "type": "boolean"
      +}
  4. Changed1 schema field changed
    • changedInput schema / properties / cities_per_country / description
      Previous value: -"Most cities in any one country. Default 1; 0 for any number."New value: +"Most cities in any one country. Default 1; 0 for any number (answers write it \"any\")."
  5. Changed4 schema fields changed
    • addedInput schema / properties / cities_per_country
      Added value: +{
      +  "description": "Most cities in any one country. Default 1; 0 for any number.",
      +  "maximum": 3,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / countries
      Added value: +{
      +  "description": "ISO country codes (\"ES\", \"PT\"): every stop is in one of these.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 12,
      +  "type": "array"
      +}
    • addedInput schema / properties / kinds_of_place
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Kinds of place, from our notes on each city: per kind, \"only\" (every stop is one), \"none\" (no stop is one) or at least n stops of it (1-4), e.g. {\"beaches\": 2, \"capitals\": \"none\"}. One kind can be \"only\". Ski counts only from December to mid-April, and only in Europe. The start and the return don't count as stops.",
      +  "properties": {
      +    "beaches": {
      +      "oneOf": [
      +        {
      +          "maximum": 4,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        {
      +          "enum": [
      +            "only",
      +            "none"
      +          ],
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "capitals": {
      +      "oneOf": [
      +        {
      +          "maximum": 4,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        {
      +          "enum": [
      +            "only",
      +            "none"
      +          ],
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "islands": {
      +      "oneOf": [
      +        {
      +          "maximum": 4,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        {
      +          "enum": [
      +            "only",
      +            "none"
      +          ],
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "lakes": {
      +      "oneOf": [
      +        {
      +          "maximum": 4,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        {
      +          "enum": [
      +            "only",
      +            "none"
      +          ],
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "mountains": {
      +      "oneOf": [
      +        {
      +          "maximum": 4,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        {
      +          "enum": [
      +            "only",
      +            "none"
      +          ],
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "old_towns": {
      +      "oneOf": [
      +        {
      +          "maximum": 4,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        {
      +          "enum": [
      +            "only",
      +            "none"
      +          ],
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "ski": {
      +      "oneOf": [
      +        {
      +          "maximum": 4,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        {
      +          "enum": [
      +            "only",
      +            "none"
      +          ],
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "small_towns": {
      +      "oneOf": [
      +        {
      +          "maximum": 4,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        {
      +          "enum": [
      +            "only",
      +            "none"
      +          ],
      +          "type": "string"
      +        }
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / skip_countries
      Added value: +{
      +  "description": "ISO country codes to leave out of the trip.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
  6. Changed3 schema fields changed
    • changedInput schema / properties / budget_eur / description
      Previous value: -"Most to spend on all the flights, in euros."New value: +"Most to spend on all the flights, in euros, for all the travellers together (up to 5,000 each)."
    • changedInput schema / properties / budget_eur / maximum
      Previous value: -5000New value: +30000
    • addedInput schema / properties / travellers
      Added value: +{
      +  "description": "How many adults travel together. Default 1. Every price in the answer, and the budget, is then for all of them.",
      +  "maximum": 6,
      +  "minimum": 1,
      +  "type": "integer"
      +}
  7. Changed1 schema field changed
    • addedInput schema / properties / then_region
      Added value: +{
      +  "description": "With home: after region, fly on to this other region and home from there, in one trip (europe then southeast-asia, or the reverse). Three long flights: home into region, one across (from or to London or Paris), and home from then_region; each a separate ticket, all in the total and the budget. Homes: Vancouver or Los Angeles, or an airport within 1,000 km of them. The trip always ends home; places_min splits between the regions. A budget of about 2,000 euros fits most.",
      +  "enum": [
      +    "europe",
      +    "southeast-asia"
      +  ],
      +  "type": "string"
      +}
  8. Changed1 schema field changed
    • changedInput schema / properties / cabin_bag / description
      Previous value: -"true: the traveller takes a cabin bag (the wheeled one for the overhead locker), so the budget and the ranking count each flight's usual price for one where we know it; a flight whose bag price we don't know counts at its fare (see unpriced_cabin_bags). Default false: fares alone."New value: +"true: the traveller takes a cabin bag (the wheeled one for the overhead locker), so the budget and the ranking count each flight's usual price for one where we know it; a flight whose bag price we don't know counts €35, the dearest bag price we know, so the total is an estimate (see unpriced_cabin_bags). Default false: fares alone."
  9. Changed1 schema field changed
    • addedInput schema / properties / cabin_bag
      Added value: +{
      +  "description": "true: the traveller takes a cabin bag (the wheeled one for the overhead locker), so the budget and the ranking count each flight's usual price for one where we know it; a flight whose bag price we don't know counts at its fare (see unpriced_cabin_bags). Default false: fares alone.",
      +  "type": "boolean"
      +}
  10. Changed1 schema field changed
    • addedInput schema / properties / held_visas
      Added value: +{
      +  "description": "Valid visas the traveller already holds, with passports: \"schengen\" opens the Schengen area (its days counted against 90 in any 180) and the countries outside it that admit Schengen visa holders; \"uk\" and \"us\" open the countries that admit holders of those. The traveller still checks the visa's own dates and entries.",
      +  "items": {
      +    "enum": [
      +      "schengen",
      +      "uk",
      +      "us"
      +    ],
      +    "type": "string"
      +  },
      +  "maxItems": 3,
      +  "type": "array"
      +}
  11. Changed1 schema field changed
    • changedInput schema / properties / from / description
      Previous value: -"Start city: a name (\"Lisbon\") or IATA city code (\"LIS\"), or \"anywhere\" to start in any of the region's busiest cities. Needed unless home is given."New value: +"Start city: a name (\"Lisbon\") or IATA city code (\"LIS\"), \"anywhere\" to start in any of the region's busiest cities, or a country (\"anywhere in Germany\", \"Spain\") to start in any of its cities. Needed unless home is given."
  12. Changed4 schema fields changed
    • changedInput schema / properties / end / description
      Previous value: -"home: the last flight returns to the start city. Default anywhere."New value: +"home: the last flight returns to the start city (with home, to the airport the trip flew in through). Default anywhere."
    • changedInput schema / properties / from / description
      Previous value: -"Start city: a name (\"Lisbon\") or IATA city code (\"LIS\"), or \"anywhere\" to start in any of the region's busiest cities."New value: +"Start city: a name (\"Lisbon\") or IATA city code (\"LIS\"), or \"anywhere\" to start in any of the region's busiest cities. Needed unless home is given."
    • addedInput schema / properties / home
      Added value: +{
      +  "description": "The traveller's home airport when it is outside the region: a town (\"Calgary\", \"London, Ontario\") or IATA code (\"YYC\"). Trips then start with a flight in from the nearest big airport we have fares from (Toronto, New York, Sydney ...), usually with a stop, and from there it's the same trip. The budget covers that flight; getting from home to that airport isn't in the prices. With home, from is used only when we can't fly from that home.",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "from"
      -]New value: +[]
  13. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare this a read-only, idempotent, non-destructive, closed-world operation, so the safety profile is covered. The description adds real behavioral context beyond that: fares are 'seen in the last few days,' only the cheapest three trips come back, and results include flight details, fare ages, cabin-bag notes and a faredice.com link.

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 purpose is front-loaded in the opening clause and every subsequent clause maps to a real input or output concern. It is essentially one very long sentence with heavy sub-clause nesting, which is dense but justified given the 22-parameter surface, though it could be broken up for readability.

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 complex, fully-optional-parameter tool with no output schema, the description covers the workflow, the required-in-practice inputs, and the shape of the return (cheapest three trips with flights, fare ages, bag notes, link). Combined with the exhaustive schema, an agent has everything needed to invoke it correctly.

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 22 parameters thoroughly, including the nuance of home airports, visa/passport handling and the cabin-bag pricing caveat. The description summarizes the key inputs in prose but adds no syntax or format detail beyond the schema, making the baseline of 3 appropriate.

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 opens with a specific verb and resource ('Finds cheap trips through several cities and countries') and pins the scope to Europe or Southeast Asia, sourced from recent non-stop one-way fares. This distinguishes it from the sibling fare tools (nonstop_fares, nonstop_from) by making clear it assembles multi-city itineraries rather than retrieving individual fares.

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?

It lays out the inputs that drive the search (start city or home airport, flight window, places/nights, budget) and the optional refinements (kinds of place, countries to keep/skip, cities per country), which gives clear context for when this tool applies. It stops short of explicitly naming the sibling tools or stating when to prefer them over this one, so it is not a full 5.

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