Skip to main content
Glama

Suggest where to travel for a month and trip type

find_destination
Read-onlyIdempotent

Suggest three destinations for a trip from five answers: the month (or "flexible"), the kind of trip (beach, city break, hiking, ski, road trip, adventure or working remotely), the budget, who is travelling and, optionally, the departure airport. Picks come only from VoyageHacks' own where-to-go month guides and travel-style lists, with the average high temperature each month guide states, the reasons it fits, the destination guide to cite, and booking links for that trip: hotels and flights dated in the chosen month, plus tours, car rental or an eSIM where they fit. This is the same matching as the trip finder on voyagehacks.com. Useful when a user asks where to go, for holiday ideas for a month, or for a destination that suits a family, a couple or a budget. Each answer also carries three packing picks for that kind of trip, linked to the VoyageHacks buying guides. When the month or the trip type is missing it returns no picks, only the questions that are still open with their allowed answers (needsInput). It does not return live prices or availability and cannot book. Affiliate links: VoyageHacks may earn a commission at no additional cost to the traveler, which should be disclosed when the links are presented.

Input Schema

NameRequiredDescriptionDefault
langNoLanguage of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en".
monthNoTravel month in English, lowercase, or "flexible" for the next two months.
budgetNoNightly hotel budget for the whole room, in euros: "budget" (under 60), "mid" (60 to 120), "upper" (120 to 250), "luxury" (250 and up), or the traveller's own range as "min-max", e.g. "80-150" ("300-0" = no upper limit). Convert other currencies to euros first. Defaults to mid.
nightsNoTrip length in nights for the dated links, the stay estimate and the trip total. Defaults to 7.
originNoDeparture IATA city or airport code for the flight links, e.g. LON. Optional.
countryNoISO 3166-1 alpha-2 country the traveler is booking from, e.g. US, DE, GB. Selects the regional Booking.com programme. Defaults to the caller's geolocation, then to the language default.
travelersNoWho is travelling. Defaults to couple.
trip_typeNoKind of trip. "campervan" means a road trip; "digital-nomad" means working remotely.
trip_budgetNoBudget for the WHOLE trip in euros, everyone travelling, return flights and hotel together, as "min-max", e.g. "1500-3000" ("4000-0" = no upper limit). Preferred over budget: with an origin, each pick is costed with the cheapest recent round-trip fare found from there. Convert other currencies to euros first.

Output Schema

NameRequiredDescriptionDefault
picksYes
answersNoThe answers used: month, trip_type, budget, travelers, origin.
packingNoThree packing picks for this kind of trip, each linked to its VoyageHacks buying guide.
disclosureYes
needsInputNoPresent when month or trip_type was missing: the questions to ask, each with its allowed answers. No picks are returned until they are answered.
tripFinderNoThe same answers on the VoyageHacks trip finder page.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / picks / items / properties / withinTripBudget
      Added value: +{
      +  "description": "true: flights for everyone plus a typical room fit under the trip_budget (the hotel range is capped at what the budget leaves). false: a closest option shown only because fewer than three places fit; say so. null: no trip_budget given.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
  2. Changed15 schema fields changed
    • changedInput schema / properties / budget / description
      Previous value: -"Daily budget: budget (hostels, street food), mid (3-star) or luxury. Defaults to mid."New value: +"Nightly hotel budget for the whole room, in euros: \"budget\" (under 60), \"mid\" (60 to 120), \"upper\" (120 to 250), \"luxury\" (250 and up), or the traveller's own range as \"min-max\", e.g. \"80-150\" (\"300-0\" = no upper limit). Convert other currencies to euros first. Defaults to mid."
    • removedInput schema / properties / budget / enum
      Removed value: -[
      -  "budget",
      -  "mid",
      -  "luxury"
      -]
    • addedInput schema / properties / budget / maxLength
      Added value: +12
    • addedInput schema / properties / budget / pattern
      Added value: +"^(budget|mid|upper|luxury|\\d{1,5}-\\d{1,5})$"
    • addedInput schema / properties / nights
      Added value: +{
      +  "description": "Trip length in nights for the dated links, the stay estimate and the trip total. Defaults to 7.",
      +  "enum": [
      +    3,
      +    7,
      +    14
      +  ],
      +  "type": "integer"
      +}
    • addedInput schema / properties / trip_budget
      Added value: +{
      +  "description": "Budget for the WHOLE trip in euros, everyone travelling, return flights and hotel together, as \"min-max\", e.g. \"1500-3000\" (\"4000-0\" = no upper limit). Preferred over budget: with an origin, each pick is costed with the cheapest recent round-trip fare found from there. Convert other currencies to euros first.",
      +  "maxLength": 13,
      +  "pattern": "^\\d{1,6}-\\d{1,6}$",
      +  "type": "string"
      +}
    • addedOutput schema / properties / picks / items / properties / bestMonths
      Added value: +{
      +  "description": "Months (1-12) the destination guide recommends.",
      +  "items": {
      +    "type": "integer"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / picks / items / properties / budgetFit
      Added value: +{
      +  "description": "in: a hotel level fits the budget; over: even the cheapest level costs more; under: the dearest level costs less.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / picks / items / properties / fareEUR
      Added value: +{
      +  "description": "Cheapest round-trip economy fare per person from the origin that Aviasales users found for the travel month in the last few days (Travelpayouts data API). Not a live quote; null when none was found or no origin was given.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / picks / items / properties / flightEstimate
      Added value: +{
      +  "description": "Nonstop flight time estimated from the great-circle distance, e.g. \"about 2 h 30\". Not a schedule.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / picks / items / properties / hotelLevel
      Added value: +{
      +  "description": "lo (budget hotel or guesthouse), mid (3 to good 4-star) or hi (4 to 5-star).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / picks / items / properties / hotelPerNightEUR
      Added value: +{
      +  "description": "Typical double-room price per night [min, max] in euros at the level closest to the budget, from the VoyageHacks guides and published averages; null when no figure is published. Not a live price.",
      +  "items": {
      +    "type": "number"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / picks / items / properties / stayEstimateEUR
      Added value: +{
      +  "description": "hotelPerNightEUR x nights x rooms.",
      +  "items": {
      +    "type": "number"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / picks / items / properties / tripBudgetFit
      Added value: +{
      +  "description": "in, over or under the trip_budget, from tripTotalEUR.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / picks / items / properties / tripTotalEUR
      Added value: +{
      +  "description": "fareEUR x travellers + stayEstimateEUR: the whole trip [min, max]; null when either part is unknown.",
      +  "items": {
      +    "type": "number"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  3. Changed7 schema fields changed
    • removedInput schema / required
      Removed value: -[
      -  "month",
      -  "trip_type"
      -]
    • addedOutput schema / properties / answers
      Added value: +{
      +  "description": "The answers used: month, trip_type, budget, travelers, origin.",
      +  "type": "object"
      +}
    • addedOutput schema / properties / needsInput
      Added value: +{
      +  "description": "Present when month or trip_type was missing: the questions to ask, each with its allowed answers. No picks are returned until they are answered.",
      +  "items": {
      +    "properties": {
      +      "field": {
      +        "type": "string"
      +      },
      +      "options": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "question": {
      +        "type": "string"
      +      },
      +      "required": {
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "field",
      +      "question",
      +      "options"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / packing
      Added value: +{
      +  "description": "Three packing picks for this kind of trip, each linked to its VoyageHacks buying guide.",
      +  "items": {
      +    "properties": {
      +      "asin": {
      +        "type": "string"
      +      },
      +      "badge": {
      +        "description": "Editorial label, e.g. \"Best overall\".",
      +        "type": "string"
      +      },
      +      "category": {
      +        "description": "Product category, taken from the buying guide it appears in.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "productUrl": {
      +        "description": "The product on its VoyageHacks buying guide (#p-<asin>), where the Amazon buy button is.",
      +        "type": "string"
      +      },
      +      "retailer": {
      +        "description": "Where the product is sold. Always \"Amazon\".",
      +        "type": "string"
      +      },
      +      "reviewGuide": {
      +        "properties": {
      +          "title": {
      +            "type": "string"
      +          },
      +          "updated": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "title",
      +          "url"
      +        ],
      +        "type": "object"
      +      },
      +      "whyThisOne": {
      +        "description": "The published reason this product was picked.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "asin",
      +      "productUrl",
      +      "retailer",
      +      "reviewGuide"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / picks / items / properties / country / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / picks / items / properties / image
      Added value: +{
      +  "description": "Photo of the destination on voyagehacks.com.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "disclosure",
      -  "tripFinder",
      -  "picks"
      -]New value: +[
      +  "disclosure",
      +  "picks"
      +]
  4. Added

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: the needsInput fallback returning open questions instead of picks, the absence of live prices/availability, the affiliate-commission disclosure obligation, and the composition of each answer (temperature, fit reasons, guide to cite, dated links, packing picks). These are operational traits an agent could not derive from readOnly/idempotent/openWorld hints alone.

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 the core action and inputs, then progressively adds source, return contents, use cases, fallback and limits; nearly every sentence carries new information. The single dense paragraph is long and the affiliate sentence could be tightened, but nothing is outright filler.

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 9-parameter, open-world recommendation tool with an output schema, the description covers inputs, data provenance, fallback behavior, limitations and licensing obligations. An agent has everything needed to decide to call it and to interpret a needsInput response.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline applies; the description restates the five key inputs and translates trip types (road trip, working remotely) into the enum vocabulary, but omits mention of nights, country, trip_budget and lang. Its framing of which answers matter is mildly useful but largely duplicates the schema.

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 and output count ("Suggest three destinations") tied to a concrete input set (month, trip type, budget, travellers, origin) and names the data source (VoyageHacks month guides and travel-style lists). It is also distinguishable from the link-builder siblings by explicitly positioning itself as the recommendation engine ("same matching as the trip finder on voyagehacks.com") that only returns no picks when month/trip type are absent.

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?

Gives clear trigger conditions ("when a user asks where to go, for holiday ideas for a month, or for a destination that suits a family, a couple or a budget") and a negative boundary ("does not return live prices or availability and cannot book"). It does not, however, name any sibling tool to route to when the user actually wants booking or raw link lookups.

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.