VoyageHacks
Server Details
Multilingual travel guides, gear picks and booking links for AI travel agents.
- Status
- Healthy
- Uptime
- 100.0% over 64 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- voyagehacks-com/mcp-server
- GitHub Stars
- 0
- Server Listing
- VoyageHacks MCP Server
TDQS
Scored across 13 tools
Each link tool targets a distinct booking category (flights, hotels, cars, transfers, eSIM, VPN, cards) and the descriptions clearly delimit each. The main overlap is get_booking_links, which bundles the same categories in one call, and the gear pair (search_travel_gear vs recommend_travel_gear) which are close but separable by 'browse a category' versus 'build a kit from a trip description'. An agent can resolve these from the descriptions, but a moment of hesitation remains.
Almost everything follows verb_noun in snake_case: get_*_links, search_articles, search_travel_gear, recommend_travel_gear, find_destination. The get_X_links family is highly predictable, with only minor verb variation (find/recommend/search) that reflects genuinely different actions rather than inconsistency.
13 tools is squarely in the well-scoped range, and each one maps to a real, non-redundant part of the site's affiliate surface (one per booking vertical plus content search/read and gear). No filler tools and no thin coverage.
The surface covers the core lifecycle: discover a destination, research via search_articles/get_article, then get links for flights, hotels, cars, transfers, eSIM, VPN and cards, plus gear discovery and packing. Gaps are minor but real: no train/rail links despite the guides covering trains, no standalone tours/attractions tool (only inside get_booking_links), no travel insurance, and no way to browse guides by section other than full-text search.
Available Tools
13 toolsfind_destinationSuggest where to travel for a month and trip typeARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| month | No | Travel month in English, lowercase, or "flexible" for the next two months. | |
| budget | No | Daily budget: budget (hostels, street food), mid (3-star) or luxury. Defaults to mid. | |
| origin | No | Departure IATA city or airport code for the flight links, e.g. LON. Optional. | |
| country | No | ISO 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. | |
| travelers | No | Who is travelling. Defaults to couple. | |
| trip_type | No | Kind of trip. "campervan" means a road trip; "digital-nomad" means working remotely. |
Output Schema
| Name | Required | Description |
|---|---|---|
| picks | Yes | |
| answers | No | The answers used: month, trip_type, budget, travelers, origin. |
| packing | No | Three packing picks for this kind of trip, each linked to its VoyageHacks buying guide. |
| disclosure | Yes | |
| needsInput | No | 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. |
| tripFinder | No | The same answers on the VoyageHacks trip finder page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnly, idempotent, non-destructive, openWorld), but the description adds real behavioral detail beyond them: the needsInput fallback when month or trip type is missing, the exact output contents, and the affiliate-commission disclosure obligation. It stops short of describing pagination or link-failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and the important constraints (needsInput, no live prices, affiliate disclosure) earn their place, but at roughly 190 words it is wordier than needed: the packing-picks sentence and the enumeration of every link type could be tightened without losing signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no restating, and the description still covers source scope, the needsInput fallback, what each answer carries (temperature, reasons, guide, links, packing picks), and the affiliate disclosure. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns the extra point by naming the five semantic inputs and by clarifying that month and trip_type are effectively required (absent them it returns needsInput) even though the schema marks zero required parameters. Budget, traveler and origin meanings are already fully in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: it suggests three destinations from five trip answers, sourced only from VoyageHacks' own month guides and travel-style lists. It is immediately distinguishable from siblings like get_booking_links or search_articles, which it explicitly does not duplicate (it returns links but does not book or show live prices).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"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" gives clear triggering contexts, and the note that it does not return live prices or book implies routing to the booking-link siblings. However no sibling alternative is named explicitly, so the routing is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_airport_transfer_linksGet airport transfer and taxi linksARead-onlyIdempotentInspect
Return pre-booked airport transfer links: Booking.com Taxis (fixed price, 100+ countries), Kiwitaxi, Welcome Pickups and GetTransfer, plus up to four VoyageHacks guides on getting from that airport to the city centre and what a fair fare looks like. Useful when a user asks how to get from an airport, about taxi or transfer prices, or plans a late-night arrival. It returns booking pages for private and shared transfers: no live quotes, no public transport timetables, and no ride-hailing dispatch. Affiliate links: VoyageHacks may earn a commission at no additional cost to the traveler, which should be disclosed when the links are presented.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Destination city, e.g. Rome. | |
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| airport | No | Airport name or IATA code, e.g. FCO, Bangkok Suvarnabhumi. | |
| country | No | ISO 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| city | No | |
| guides | Yes | Matching VoyageHacks guides that can be cited as sources. |
| region | No | |
| airport | No | |
| providers | Yes | |
| disclosure | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, open-world, non-destructive behavior, and the description adds genuine value beyond them: results are booking pages rather than live quotes, links are affiliate links, and the agent is told to disclose commission to the traveler. It doesn't describe pagination or response shape, but the output schema covers returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary purpose and outcome, then usage triggers, then scope exclusions and the disclosure obligation. Four sentences with no filler, though the provider enumeration could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter, fully-documented, output-schema-backed read tool, the description covers purpose, trigger conditions, output boundaries, and the affiliate disclosure duty. Nothing an agent needs in order to select or call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so city, airport, lang and country are already well documented with formats, defaults and examples. The description adds no parameter-level meaning beyond noting that guides are language-specific, which the schema already conveys; baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return pre-booked airport transfer links'), names the exact providers (Booking.com Taxis, Kiwitaxi, Welcome Pickups, GetTransfer) and the supplementary guides, and clearly separates it from sibling link tools like get_flight_links or get_hotel_links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when the tool is useful ('user asks how to get from an airport, about taxi or transfer prices, or plans a late-night arrival') and rules out adjacent needs ('no live quotes, no public transport timetables, no ride-hailing dispatch'). It does not name a sibling to use for those excluded cases, so routing alternatives are implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_articleRead a VoyageHacks guide as MarkdownARead-onlyIdempotentInspect
Fetch one VoyageHacks page by URL or site path (for example "/en/hotels/best-budget-hotels-in-rome/") and return its body as Markdown, together with the title, canonical URL, language, section, publication date and last-updated date read from the page itself. Useful when the full text of a guide is needed to quote figures accurately, and when a source needs to be cited with a real date. Only HTML pages on voyagehacks.com can be read: the tool cannot fetch other websites, data files or images, and very long pages are truncated with a marker at the cut.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Page URL or site path on voyagehacks.com, e.g. https://voyagehacks.com/de/esim/esim-japan/ or /de/esim/esim-japan/. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Canonical URL. |
| lang | No | |
| title | No | |
| source | Yes | Attribution string for citations. |
| excerpt | No | The page's meta description. |
| section | No | |
| updated | No | ISO date, or null if the page declares none. |
| markdown | Yes | |
| published | No | ISO date, or null if the page declares none. |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, and the description adds substantial behavioral context on top: the tool is restricted to HTML pages on voyagehacks.com, cannot fetch other sites, data files or images, and truncates very long pages with a marker at the cut. The truncation disclosure is exactly the kind of caveat an agent needs before trusting a complete-text read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and return shape in the first sentence, then adds usage rationale and limits. Three sentences with little waste, though enumerating return fields is partly redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with annotations and an output schema, the description covers everything needed: what it returns, what it cannot reach, and how oversized pages behave. Nothing an agent must know before invoking it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, including an example of both accepted forms (full URL and site path). The description restates the URL-or-path duality but adds no syntax, encoding or constraint detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (one VoyageHacks page by URL or site path) and enumerates the returned fields (body as Markdown, title, canonical URL, language, section, dates). This is clearly distinguishable from sibling search_articles, which would find pages rather than read one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage contexts: when full text is needed to quote figures accurately, and when a source must be cited with a real date. It does not explicitly name search_articles as the alternative for discovery, so routing guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_booking_linksGet booking links for a whole tripARead-onlyIdempotentInspect
Return one set of booking and shopping links covering a whole trip in a single call: flight search, hotel search, airport taxi, attractions and tours, car rental, travel eSIM, travel VPN and the travel gear section, all regionalized to the traveler. Accepts route IATA codes, a city and trip dates, so the flight and hotel links are prefilled. The "include" parameter selects which categories are returned, so a trip with no driving can leave out car rental. Useful when a user is planning a trip end to end and wants every option in one place. It returns search links only: no live prices, no availability and no booking. Affiliate links: VoyageHacks may earn a commission at no additional cost to the traveler, which should be disclosed when the links are presented.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City name for the hotel, tours and attractions searches, e.g. Phuket. | |
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| adults | No | Number of adult travelers. Defaults to 2 for hotels and 1 for flights. | |
| origin | No | Origin IATA city or airport code for flights, e.g. LON. | |
| country | No | ISO 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. | |
| include | No | Categories to return. Omit for all of them. | |
| depart_date | No | Outbound flight date and hotel check-in, YYYY-MM-DD. | |
| destination | No | Destination IATA city or airport code, e.g. HKT. | |
| return_date | No | Return flight date and hotel check-out, YYYY-MM-DD. |
Output Schema
| Name | Required | Description |
|---|---|---|
| vpn | No | |
| esim | No | |
| trip | No | |
| guides | No | Matching VoyageHacks guides that can be cited as sources. |
| hotels | No | |
| region | No | |
| flights | No | |
| included | Yes | |
| carRental | No | |
| disclosure | Yes | |
| travelGear | No | |
| airportTaxi | No | |
| attractions | No | |
| hotelsElsewhere | No | The same hotel search on Expedia (via Stay22). |
| toursAndActivities | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description adds genuinely non-obvious behavior: it returns search links only — no live prices, no availability, no booking — and that the links are affiliate links carrying a commission that must be disclosed when presented. That disclosure obligation is nowhere in the structured fields and materially changes how an agent should present results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, inputs, the include filter, the use case, the limitation, and the required affiliate disclosure — every sentence carries content. The opening sentence is slightly overloaded with a long category enumeration, but the overall structure is efficient for a 9-parameter aggregator.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema (return values need not be described) and annotations covering safety, the description supplies what remains: input expectations (IATA codes, city, dates), the include filter's behavior, the hard limitation that no live prices or booking occur, and the mandatory affiliate disclosure. Nothing an agent needs to call or present this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes further by explaining the coupling between parameters — route IATA codes plus city plus trip dates cause the flight and hotel links to be prefilled, and the "include" array selects categories (with an example of omitting car_rental for a non-driving trip). That explains intent and cross-parameter effects the schema only documents individually.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Return one set of booking and shopping links covering a whole trip in a single call") and enumerates the categories covered, so the agent can distinguish it from the single-category siblings like get_flight_links and get_hotel_links without opening a schema. Scope (whole trip, one call) is front-loaded and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Useful when a user is planning a trip end to end and wants every option in one place" gives clear context, and "in a single call" implies the alternative is calling the per-category siblings separately. However, it never explicitly names those alternatives or states when NOT to use this (e.g. when only one category is needed), so the routing guidance is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_car_rental_linksGet car and scooter rental linksARead-onlyIdempotentInspect
Return car and scooter rental comparison links for a destination: EconomyBookings and QEEQ for worldwide comparison, Localrent and GetRentacar for local suppliers with lower deposits in southern Europe, Georgia, the Balkans and Asia, BikesBooking for scooters and motorbikes, and Booking.com Cars, plus up to four VoyageHacks car-rental guides for that country covering real prices, insurance excess and one-way fees. Useful when a user mentions renting a car, a road trip, driving abroad, or an island or countryside trip that needs a vehicle. These are comparison landing pages: dates and the pickup point are entered on the provider site, so pickup_date and dropoff_date are echoed in the response for context rather than embedded in the links. No live quotes, no vehicle availability and no reservation. Affiliate links: VoyageHacks may earn a commission at no additional cost to the traveler, which should be disclosed when the links are presented.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| country | No | ISO 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. | |
| destination | No | Country, island or city where the car is picked up, e.g. Iceland, Crete, Lisbon. | |
| pickup_date | No | Pickup date, YYYY-MM-DD. Echoed in the response; entered on the provider site. | |
| dropoff_date | No | Drop-off date, YYYY-MM-DD. Echoed in the response; entered on the provider site. |
Output Schema
| Name | Required | Description |
|---|---|---|
| guides | Yes | Matching VoyageHacks guides that can be cited as sources. |
| pickup | No | |
| region | No | |
| dropoff | No | |
| providers | Yes | |
| disclosure | Yes | |
| bookingCars | No | |
| destination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly/idempotent/openWorld/non-destructive) by disclosing that these are comparison landing pages with no live quotes, no availability and no reservation, that dates are echoed rather than embedded, and that links are affiliate links requiring disclosure. These are exactly the behavioral caveats an agent needs but cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return value and provider list, then usage, then caveats. Every sentence carries information (providers, triggers, echo behavior, no-quotes disclaimer, affiliate disclosure), though the provider enumeration is dense and slightly prose-heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be described; the description still covers scope, trigger conditions, provider coverage, no-live-quote limitations and affiliate obligations. Nothing an agent needs to call and present results correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds genuinely new semantics: pickup_date and dropoff_date are echoed for context rather than used to build the links. It does not clarify lang/country interaction beyond what the schema already says, so it is not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return car and scooter rental comparison links for a destination') and enumerates the exact providers returned, so an agent can distinguish it from get_flight_links, get_hotel_links, or get_airport_transfer_links without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering situations ('renting a car, a road trip, driving abroad, or an island or countryside trip that needs a vehicle'), which is clear when-to-use context. It stops short of naming an alternative tool or stating when NOT to call it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_credit_card_linksGet travel credit card linksARead-onlyIdempotentInspect
Return the official American Express Germany card pages (Platinum, Gold, American Express Card, Payback and Blue) and the Revolut plans page, the current German fee and welcome-offer figures verified against americanexpress.com, and up to four VoyageHacks guides on points value, lounge access, foreign-transaction fees, Amex compared with Revolut and country-by-country availability. Useful when a user asks about travel rewards, points, miles, lounge access, which card to pay with abroad or foreign-transaction fees. It covers American Express only: it is not a comparison of all issuers, gives no eligibility or approval decision, no credit-score check and no application. Card terms change frequently and vary by market, so figures should be attributed to the issuer page or the linked guide. The card links are plain issuer pages, not affiliate or referral links.
| Name | Required | Description | Default |
|---|---|---|---|
| card | No | Restrict the response to one American Express card. "green" is the American Express Card, successor to the retired Green Card. | |
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| country | No | ISO 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | No | |
| cards | Yes | |
| facts | No | Verified fee and welcome-offer figures, currently published for Germany only. Null elsewhere. |
| guides | Yes | Matching VoyageHacks guides that can be cited as sources. |
| country | No | |
| disclosure | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds real behavioural context on top: it is Amex-only, not an eligibility or approval tool, figures are verified against americanexpress.com and go stale, and the links are plain issuer pages rather than affiliate or referral links. Those are exactly the caveats an agent needs when relaying financial information to a user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded correctly: what is returned first, then when to use it, then the caveats and limits. The first sentence is dense with parenthetical lists, but every sentence carries distinct information and nothing is padded or repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a read-only link-fetching tool with a full output schema and 100% parameter coverage, the description covers everything an agent needs: scope, triggers, exclusions, freshness/attribution caveats and the non-affiliate nature of the links. No return-value documentation is needed because an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enums are self-documenting, so the baseline is 3. The description adds only marginal parameter value – it enumerates the card names and the limit of four guides – and says nothing about what `country` does beyond what the schema already states (Booking.com regional programme).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource set (official Amex Germany card pages for Platinum, Gold, Amex Card, Payback, Blue, plus the Revolut plans page), the verified fee and welcome-offer figures, and up to four VoyageHacks guides. This distinguishes it cleanly from the other link-returning siblings, which cover flights, hotels, cars, eSIM and VPN rather than credit cards.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the triggering questions explicitly (travel rewards, points, miles, lounge access, which card to pay with abroad, foreign-transaction fees) and gives hard exclusions: not a comparison of all issuers, no eligibility or approval decision, no credit-score check, no application. It also tells the caller how to treat the output – attribute figures to the issuer page or linked guide because terms change frequently and vary by market.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_esim_linksGet travel eSIM links for a destinationARead-onlyIdempotentInspect
Return travel eSIM store links (Airalo, covering 200+ countries, plus Yesim, Saily and Drimsim) together with up to four VoyageHacks eSIM guides for that destination covering real per-GB prices, coverage, setup steps and which phones support eSIM. Useful when a user asks about mobile data abroad, SIM cards, roaming charges, staying online on a trip or tethering a laptop. It returns store pages: no live plan prices, no coverage check for a specific handset, and no purchase or activation. Affiliate links: VoyageHacks may earn a commission at no additional cost to the traveler, which should be disclosed when the links are presented.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| destination | No | Country or region the data plan is for, e.g. Japan, Europe, USA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| guides | Yes | Matching VoyageHacks guides that can be cited as sources. |
| providers | Yes | |
| disclosure | Yes | |
| destination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/openWorld/non-destructive, so the bar is lower, yet the description still adds real behavioral context: it returns store pages only, imposes an up-to-four-guides limit, and mandates disclosing the affiliate commission. It does not describe response shape or any rate/caching behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what is returned before the use cases and limitations, and each sentence carries information. It is slightly dense and could be trimmed, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be spelled out, and the description still covers scope, exclusions, guide limit, and the affiliate-disclosure obligation. An agent has everything needed to call and present results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so lang and destination are fully documented in the schema (including the default of "en"). The description adds no extra meaning about destination matching (e.g. country vs. region handling) or language fallback, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (return travel eSIM store links plus VoyageHacks guides for a destination) and names the actual providers. It is clearly distinguishable from sibling tools like get_travel_vpn_links or get_flight_links by naming the eSIM domain explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering scenarios (mobile data abroad, SIM cards, roaming charges, staying online, tethering a laptop) and negative scope (no live prices, no handset coverage check, no purchase/activation). It does not name a sibling alternative, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_flight_linksGet flight search links for a routeARead-onlyIdempotentInspect
Build a flight search link on Booking.com Flights for a route and optional dates, and return up to four VoyageHacks guides on fares, budget airlines and baggage rules for that trip. Pass origin and destination as IATA codes for a prefilled route search; without both, the link opens the general flight search page. Also returns a delayed or cancelled flight compensation link (AirHelp), a Vueling link for short-haul Europe, and, when the route touches their hubs, direct links for Air Serbia (Belgrade) and Air India. The Booking.com link is regionalized to the traveler's country. Useful when a trip involves air travel and the user wants somewhere to compare fares. It returns search links only: no live fares, seat availability or schedules, no booking and no airport transfers. Affiliate links: VoyageHacks may earn a commission at no additional cost to the traveler, which should be disclosed when the links are presented.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| origin | No | Origin IATA city or airport code, e.g. LON, NYC, BER. | |
| country | No | ISO 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. | |
| passengers | No | Number of adult passengers. Defaults to 1. | |
| depart_date | No | Outbound date, YYYY-MM-DD. Omitted dates default to about a month ahead. | |
| destination | No | Destination IATA city or airport code, e.g. HKT, TYO, ROM. | |
| return_date | No | Return date, YYYY-MM-DD. Omit for a one-way search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| route | No | |
| guides | Yes | Matching VoyageHacks guides that can be cited as sources. |
| region | No | |
| vueling | No | |
| airIndia | No | |
| airSerbia | No | |
| disclosure | Yes | |
| flightSearch | Yes | |
| virginAtlantic | No | |
| flightCompensation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=true and destructiveHint=false, the description adds substantial behavioral detail: IATA prefill behavior, what happens without origin and destination, regionalization of the Booking.com link, additional compensation and airline links, affiliate disclosure, and a clear boundary that no live fares, bookings, or transfers are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main purpose and key constraints are front-loaded, and the description is structured around what is returned and what is not. It is somewhat dense and lists multiple airline-specific links, but those details are relevant to the tool's output and affiliate disclosure obligations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity link-generation tool with seven optional parameters and an output schema, the description is complete enough: it explains the returned link types, the guides, regionalization behavior, limitations, and affiliate disclosure. The output schema can carry the exact return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 seven parameters. The description still adds useful context about origin and destination being IATA codes for a prefilled route search and about omitted dates or missing route codes affecting the generated link, though it does not elaborate on parameters like passengers or lang.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-and-resource: building Booking.com flight search links for a route with optional dates, plus VoyageHacks guides. It clearly distinguishes this from sibling link-builder tools by naming flights rather than hotels, cars, transfers, or bookings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition: useful when a trip involves air travel and the user wants to compare fares. It also clarifies the main limitation (search links only, no live fares or booking), though it does not explicitly route the agent to alternatives such as get_hotel_links or get_airport_transfer_links.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hotel_linksGet hotel search links for a cityARead-onlyIdempotentInspect
Build a Booking.com search link for a city or property, with optional check-in and check-out dates, guest count and room count, the same search on Expedia, Vrbo (apartments and holiday homes) and Agoda, plus an IHG brand search link (Holiday Inn, InterContinental, Crowne Plaza) and up to four VoyageHacks guides on the best areas and best-value stays there. The Booking.com link is regionalized to the traveler's country. Useful when a user asks where to stay, or about hotels, hostels or apartments in a place. It returns search links only: no live room rates, no availability check, no reviews and no reservation. Affiliate links: VoyageHacks may earn a commission at no additional cost to the traveler, which should be disclosed when the links are presented.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City, region or property name to search, e.g. Rome, Phuket, Hotel Kossak. | |
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| rooms | No | Number of rooms. Defaults to 1. | |
| adults | No | Number of adults. Defaults to 2. | |
| checkin | No | Check-in date, YYYY-MM-DD. Used only when checkout is also given. | |
| country | No | ISO 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. | |
| checkout | No | Check-out date, YYYY-MM-DD. | |
| children | No | Number of children. Defaults to 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ihg | No | |
| city | No | |
| rooms | No | |
| adults | No | |
| guides | Yes | Matching VoyageHacks guides that can be cited as sources. |
| region | No | |
| checkin | No | |
| checkout | No | |
| children | No | |
| moreStays | No | |
| disclosure | Yes | |
| hotelSearch | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, and the description adds substantial beyond-schema context: regionalization of the Booking.com link, the explicit scope limit (no rates, availability, reviews, reservation), and the affiliate-commission disclosure obligation. That affiliate disclosure requirement is a genuinely useful behavioral trait an agent must act on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is dense and front-loaded with the core action, and every sentence carries information. The first sentence is a long run-on listing channels, which slightly hurts scannability, but nothing is redundant with structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, side-effect-free link generator with an output schema, the description covers scope, limits, regionalization, affiliate obligations and usage triggers. An agent has everything needed to call it correctly without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (city, lang, rooms, adults, children, checkin, checkout, country) is already documented with defaults, bounds and patterns. The description restates check-in/check-out, guest and room counts and country regionalization but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Build a Booking.com search link for a city or property') and enumerates the exact outputs (Booking, Expedia, Vrbo, Agoda, IHG, VoyageHacks guides), which cleanly distinguishes it from siblings like get_booking_links or get_flight_links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear trigger context: 'Useful when a user asks where to stay, or about hotels, hostels or apartments in a place,' and implicitly bounds it by stating it is not for rates, availability, reviews or reservations. It does not name a sibling alternative (e.g. get_booking_links) to route between, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_travel_vpn_linksGet travel VPN linksARead-onlyIdempotentInspect
Return the NordVPN signup link together with up to four VoyageHacks guides on whether a traveler actually needs a VPN, the real risks of hotel and airport Wi-Fi, and watching home streaming services abroad. Useful when a user raises public Wi-Fi safety, working remotely abroad, geo-blocked streaming or online banking while travelling. It returns a signup page and editorial guides: no live pricing, no server list and no account creation. Referral link: VoyageHacks may earn a commission at no additional cost to the user, which should be disclosed when the link is presented.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". |
Output Schema
| Name | Required | Description |
|---|---|---|
| vpn | Yes | |
| guides | Yes | Matching VoyageHacks guides that can be cited as sources. |
| disclosure | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent and non-destructive, so the safety profile is covered. The description adds real value beyond that: it bounds expectations ('no live pricing, no server list and no account creation') and surfaces an obligation not present in any structured field (the referral commission that must be disclosed when the link is presented).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The return contents and usage triggers are front-loaded and every sentence carries information; the only mild bloat is the run-on middle sentence listing topics. No filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description still covers scope, triggers, and the disclosure caveat. Missing only edge details like whether guides are localized per the lang argument, which is otherwise handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema fully documents the single 'lang' enum with its default, so the description adds no parameter meaning. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the NordVPN signup link together with up to four VoyageHacks guides') and enumerates the exact content topics, so the agent can distinguish it from the other get_*_links siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions ('when a user raises public Wi-Fi safety, working remotely abroad, geo-blocked streaming or online banking while travelling'), which tells the agent when to reach for this tool. It does not name an alternative sibling or state when NOT to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_travel_gearBuild a travel gear kit for a tripARead-onlyIdempotentInspect
Turn a trip description into a packing and gear kit drawn from the VoyageHacks travel gear catalog: one product per category, each with the published reason it was picked, its Amazon ASIN and a link to the product on the VoyageHacks guide that reviews it, where it can be bought on Amazon. Takes a plain-language trip summary ("10 days in Japan in October, carry-on only, long-haul red-eye, working remotely") plus optional structured hints (destination, trip length in days, season, activities, luggage constraint, traveler type, budget), all of which are used to weight which categories make the kit. Answers questions of the form "what should I pack for X", "what gear do I need for Y" and "I only have carry-on, what should I bring". It draws on the VoyageHacks editorial catalog, not a search of all of Amazon, and returns published picks only: prices, star ratings, review counts and stock are not available and are never returned, and it produces no clothing sizes and no itinerary. The guides carry Amazon affiliate links: VoyageHacks may earn a commission from qualifying purchases at no additional cost to the buyer, which should be disclosed when the products are presented.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| trip | Yes | Free-text trip description: destination, length, style, flight type, season, gadgets needed. | |
| limit | No | Maximum items in the kit. Defaults to 6. | |
| budget | No | Optional budget level. Recorded in the response; the catalog carries no prices, so it does not filter products. | |
| season | No | Optional season or climate at the destination. | |
| luggage | No | Optional luggage constraint. carry_on_only and personal_item_only weight the packing and compression categories. | |
| activities | No | Optional activities, e.g. ["hiking", "photography", "remote work", "camping", "beach"]. | |
| destination | No | Optional country, region or city, e.g. Japan, Iceland, Thailand. | |
| traveler_type | No | Optional traveler type. | |
| trip_length_days | No | Optional trip length in days. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hub | No | |
| kit | Yes | |
| lang | Yes | |
| trip | Yes | |
| criteria | No | Structured hints that were applied. |
| disclosure | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/openWorld, and the description adds substantial context on top: no prices, ratings, review counts or stock are ever returned; no clothing sizes or itinerary are produced; budget does not filter products; and Amazon affiliate links require disclosure. These are exactly the behavioral traits an agent needs beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries information (scope, output shape, non-returned fields, affiliate disclosure). The opening sentence is a long multi-clause run-on and some phrasing ('its Amazon ASIN and a link to the product... where it can be bought on Amazon') is mildly redundant, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, output-schema-backed tool, the description covers everything an agent must know to call and present results correctly: the free-text plus structured-hint input model, the curated-catalog limitation, the fields that are never returned, and the affiliate disclosure obligation. Return-value explanation is unnecessary given the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the weighting semantics ('used to weight which categories make the kit') and echoes the budget-does-not-filter caveat, but it never mentions the lang or limit parameters, so it does not materially enrich the schema on its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource: turning a trip description into a packing/gear kit drawn from a named, curated catalog, and specifies the output shape (one product per category with reason, ASIN, and guide link). This clearly separates it from the sibling search_travel_gear, since it explicitly says it draws on the editorial catalog 'not a search of all of Amazon.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete triggering queries ('what should I pack for X', 'what gear do I need for Y', 'I only have carry-on, what should I bring') and states the editorial-catalog scope, which implicitly routes agents away from Amazon-wide search. It stops short of explicitly naming a sibling tool or stating when NOT to use it, so it is clear context without full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_articlesSearch VoyageHacks travel guidesARead-onlyIdempotentInspect
Full-text search across the VoyageHacks travel guides, about 680 published pages per language, covering flights, airline reviews, hotels, destinations, car rental, trains, airport transfers, eSIM, travel VPN, travel credit cards, travel gear and month-by-month "where to go" guides. Returns ranked matches with the title, canonical URL, section and a matching excerpt for each. Useful when a travel question needs published prices, comparisons, best-time-to-visit advice or step-by-step detail that can be attributed to a source URL. It searches VoyageHacks content only: not the wider web, not live fares or hotel availability, and it returns no booking or product links (the get_..._links tools do that).
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| limit | No | Maximum results to return. Defaults to 5. | |
| query | Yes | Search terms, e.g. "cheap hotels rome" or "esim japan". Matched against titles, keywords, tags and article text. | |
| section | No | Restrict results to one site section. Omit to search every section. |
Output Schema
| Name | Required | Description |
|---|---|---|
| lang | Yes | |
| query | Yes | |
| results | Yes | |
| section | No | |
| resultCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds real context beyond that: the corpus size, that it indexes VoyageHacks content only, that it returns no live fares or availability, and that booking links live in sibling tools. It omits pagination/empty-result behavior, but the added scope disclosures are meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the search scope and return shape, and every sentence is purposeful (coverage, return format, ideal use case, exclusions). The long enumeration of sections duplicates the section enum in the schema and is slightly wasteful, but the overall structure is efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, yet it summarizes them briefly anyway. Combined with full parameter documentation and rich annotations, the definition gives an agent everything needed to decide to call this tool and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 query, lang, limit and section, including defaults, enums and max length. The description adds no parameter-level detail (no syntax, operators, or matching-behavior nuance) beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb (full-text search) and resource (VoyageHacks travel guides) plus corpus scope (~680 published pages per language) and content coverage. It explicitly distinguishes itself from the sibling link tools ("not the wider web, not live fares... the get_..._links tools do that"), so an agent can tell it apart without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the conditions that select it ("when a travel question needs published prices, comparisons, best-time-to-visit advice or step-by-step detail that can be attributed to a source URL") and the conditions that should route elsewhere (live fares, hotel availability, booking/product links via the get_..._links tools). This is explicit when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_travel_gearSearch the VoyageHacks travel gear catalogARead-onlyIdempotentInspect
Search the VoyageHacks travel gear catalog: about 320 products that appear as picks in roughly 50 published buying guides, including carry-on backpacks, packing cubes and compression bags, universal travel adapters, GaN chargers, airline-compliant power banks, luggage trackers, neck pillows, earplugs and eye masks, toiletry and makeup bags, travel-size bottles, travel routers, translation earbuds and camping and outdoor gear. Each result returns the product name, its category, the published reason it was picked, its Amazon ASIN and a link to the product on the VoyageHacks buying guide that reviews it, where it can be bought on Amazon. Useful when a user asks which travel product to buy, or what to pack for a trip and names a category or a destination. This is the VoyageHacks editorial catalog, not a search of all of Amazon: products outside the published guides are not findable here, and prices, star ratings, review counts and stock are not available and are never returned. The guides carry Amazon affiliate links: VoyageHacks may earn a commission from qualifying purchases at no additional cost to the buyer, which should be disclosed when the products are presented.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to "en". | |
| limit | No | Maximum products to return. Defaults to 6. | |
| query | Yes | What the traveler needs, e.g. "power bank for a long flight", "packing cubes", "adapter for Japan". |
Output Schema
| Name | Required | Description |
|---|---|---|
| hub | No | |
| lang | Yes | |
| query | Yes | |
| products | Yes | |
| disclosure | Yes | |
| productCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), yet the description adds substantial context beyond them: exactly what each result contains (name, category, published pick reason, ASIN, guide link), what is never returned (prices, star ratings, review counts, stock), and a mandatory affiliate-disclosure obligation when presenting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the catalog scope, then results, then caveats, then the affiliate note — a sensible ordering with no filler sentences. The long enumeration of product categories (carry-on backpacks through camping gear) is somewhat bloated and could be trimmed, but it does communicate query coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter, read-only search with full schema coverage, open-world annotations and an output schema, the description covers everything an agent needs: catalog scope, when to invoke, what is returned, what is unavailable, and the disclosure requirement. Return fields are restated despite the output schema, which is mild redundancy rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 query, limit (1-12, default 6) and lang (enum with default). The description adds no parameter-level guidance of its own — its example queries and result-field list duplicate what the schema conveys. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the VoyageHacks travel gear catalog') and pins the scope precisely: ~320 products from ~50 published guides, with product categories enumerated. It explicitly distinguishes itself from an all-of-Amazon search, but never mentions the sibling tool recommend_travel_gear, which is the most plausible confusion point for an agent choosing between the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger: 'Useful when a user asks which travel product to buy, or what to pack for a trip and names a category or a destination.' It also states an exclusion in the form of scope limits (products outside the published guides are not findable, no prices/ratings/stock). What is missing is an explicit alternative — recommend_travel_gear is not named as the tool to use when a specific query is not appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
- Changed
find_destination7 fields changed- removed
Input schema / requiredRemoved value: -[ - "month", - "trip_type" -] - added
Output schema / properties / answersAdded value: +{ + "description": "The answers used: month, trip_type, budget, travelers, origin.", + "type": "object" +} - added
Output schema / properties / needsInputAdded 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" +} - added
Output schema / properties / packingAdded 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" +} - changed
Output schema / properties / picks / items / properties / country / typePrevious value: -"string"New value: +[ + "string", + "null" +] - added
Output schema / properties / picks / items / properties / imageAdded value: +{ + "description": "Photo of the destination on voyagehacks.com.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / requiredPrevious value: -[ - "disclosure", - "tripFinder", - "picks" -]New value: +[ + "disclosure", + "picks" +]
- Changed
get_booking_links1 field changed- added
Output schema / properties / hotelsElsewhereAdded value: +{ + "description": "The same hotel search on Expedia (via Stay22).", + "type": "string" +}
- Changed
get_hotel_links1 field changed- added
Output schema / properties / moreStaysAdded value: +{ + "items": { + "properties": { + "label": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" +}
- Changed
recommend_travel_gear6 fields changed- removed
Output schema / properties / kit / items / properties / affiliateRemoved value: -{ - "description": "True: the buy link is an affiliate link.", - "type": "boolean" -} - removed
Output schema / properties / kit / items / properties / buyUrlRemoved value: -{ - "description": "Amazon product page, carrying the VoyageHacks Associates tag.", - "type": "string" -} - added
Output schema / properties / kit / items / properties / productUrlAdded value: +{ + "description": "The product on its VoyageHacks buying guide (#p-<asin>), where the Amazon buy button is.", + "type": "string" +} - added
Output schema / properties / kit / items / properties / retailerAdded value: +{ + "description": "Where the product is sold. Always \"Amazon\".", + "type": "string" +} - removed
Output schema / properties / kit / items / properties / sourceRemoved value: -{ - "description": "Always \"amazon\".", - "type": "string" -} - changed
Output schema / properties / kit / items / requiredPrevious value: -[ - "name", - "asin", - "buyUrl", - "source", - "affiliate", - "reviewGuide" -]New value: +[ + "name", + "asin", + "productUrl", + "retailer", + "reviewGuide" +]
- Changed
search_travel_gear6 fields changed- removed
Output schema / properties / products / items / properties / affiliateRemoved value: -{ - "description": "True: the buy link is an affiliate link.", - "type": "boolean" -} - removed
Output schema / properties / products / items / properties / buyUrlRemoved value: -{ - "description": "Amazon product page, carrying the VoyageHacks Associates tag.", - "type": "string" -} - added
Output schema / properties / products / items / properties / productUrlAdded value: +{ + "description": "The product on its VoyageHacks buying guide (#p-<asin>), where the Amazon buy button is.", + "type": "string" +} - added
Output schema / properties / products / items / properties / retailerAdded value: +{ + "description": "Where the product is sold. Always \"Amazon\".", + "type": "string" +} - removed
Output schema / properties / products / items / properties / sourceRemoved value: -{ - "description": "Always \"amazon\".", - "type": "string" -} - changed
Output schema / properties / products / items / requiredPrevious value: -[ - "name", - "asin", - "buyUrl", - "source", - "affiliate", - "reviewGuide" -]New value: +[ + "name", + "asin", + "productUrl", + "retailer", + "reviewGuide" +]
1 tool update
- Added
find_destination
11 tool updates
- Changed
get_airport_transfer_links1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
get_booking_links1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
get_car_rental_links1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
get_credit_card_links1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
get_esim_links1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
get_flight_links1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
get_hotel_links1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
get_travel_vpn_links1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
recommend_travel_gear1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
search_articles1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
- Changed
search_travel_gear1 field changed- changed
Input schema / properties / lang / enumPrevious value: -[ - "en", - "de", - "fr", - "es", - "it", - "pl", - "cs", - "ja", - "nl", - "pt", - "zh" -]New value: +[ + "en", + "de", + "fr", + "es", + "it", + "pl", + "ja", + "nl", + "pt", + "zh" +]
1 tool update
- Changed
get_flight_links1 field changed- added
Output schema / properties / virginAtlanticAdded value: +{ + "type": "string" +}
12 tool updates
- Changed
get_airport_transfer_links8 fields changed- changed
Input schema / properties / airport / descriptionPrevious value: -"Airport name or IATA code, e.g. FCO, Bangkok Suvarnabhumi"New value: +"Airport name or IATA code, e.g. FCO, Bangkok Suvarnabhumi." - added
Input schema / properties / airport / maxLengthAdded value: +120 - changed
Input schema / properties / city / descriptionPrevious value: -"Destination city, e.g. Rome"New value: +"Destination city, e.g. Rome." - added
Input schema / properties / city / maxLengthAdded value: +120 - changed
Input schema / properties / country / descriptionPrevious value: -"Optional ISO 3166-1 alpha-2 country of the traveler; defaults to the caller's geolocation"New value: +"ISO 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." - added
Input schema / properties / country / patternAdded value: +"^[A-Za-z]{2}$" - changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "airport": { + "type": [ + "string", + "null" + ] + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "disclosure": { + "type": "string" + }, + "guides": { + "description": "Matching VoyageHacks guides that can be cited as sources.", + "items": { + "properties": { + "section": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "providers": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "region": { + "type": "string" + } + }, + "required": [ + "disclosure", + "providers", + "guides" + ], + "type": "object" +}
- Changed
get_article3 fields changed- changed
Input schema / properties / url / descriptionPrevious value: -"Page URL or path on voyagehacks.com"New value: +"Page URL or site path on voyagehacks.com, e.g. https://voyagehacks.com/de/esim/esim-japan/ or /de/esim/esim-japan/." - added
Input schema / properties / url / maxLengthAdded value: +400 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "excerpt": { + "description": "The page's meta description.", + "type": [ + "string", + "null" + ] + }, + "lang": { + "type": [ + "string", + "null" + ] + }, + "markdown": { + "type": "string" + }, + "published": { + "description": "ISO date, or null if the page declares none.", + "type": [ + "string", + "null" + ] + }, + "section": { + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Attribution string for citations.", + "type": "string" + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "truncated": { + "type": "boolean" + }, + "updated": { + "description": "ISO date, or null if the page declares none.", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Canonical URL.", + "type": "string" + } + }, + "required": [ + "url", + "markdown", + "source" + ], + "type": "object" +}
- Changed
get_booking_links14 fields changed- added
Input schema / properties / adultsAdded value: +{ + "description": "Number of adult travelers. Defaults to 2 for hotels and 1 for flights.", + "maximum": 9, + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / city / descriptionPrevious value: -"Optional city name for the hotel search, e.g. Phuket"New value: +"City name for the hotel, tours and attractions searches, e.g. Phuket." - added
Input schema / properties / city / maxLengthAdded value: +120 - changed
Input schema / properties / country / descriptionPrevious value: -"Optional ISO 3166-1 alpha-2 country of the traveler; defaults to the caller's geolocation"New value: +"ISO 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." - added
Input schema / properties / country / patternAdded value: +"^[A-Za-z]{2}$" - added
Input schema / properties / depart_dateAdded value: +{ + "description": "Outbound flight date and hotel check-in, YYYY-MM-DD.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - changed
Input schema / properties / destination / descriptionPrevious value: -"Optional destination IATA city/airport code, e.g. HKT"New value: +"Destination IATA city or airport code, e.g. HKT." - added
Input schema / properties / destination / maxLengthAdded value: +40 - added
Input schema / properties / includeAdded value: +{ + "description": "Categories to return. Omit for all of them.", + "items": { + "enum": [ + "flights", + "hotels", + "airport_taxi", + "attractions", + "tours", + "car_rental", + "esim", + "vpn", + "travel_gear" + ], + "type": "string" + }, + "maxItems": 9, + "type": "array" +} - added
Input schema / properties / langAdded value: +{ + "description": "Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\".", + "enum": [ + "en", + "de", + "fr", + "es", + "it", + "pl", + "cs", + "ja", + "nl", + "pt", + "zh" + ], + "type": "string" +} - changed
Input schema / properties / origin / descriptionPrevious value: -"Optional origin IATA city/airport code for flights, e.g. LON"New value: +"Origin IATA city or airport code for flights, e.g. LON." - added
Input schema / properties / origin / maxLengthAdded value: +40 - added
Input schema / properties / return_dateAdded value: +{ + "description": "Return flight date and hotel check-out, YYYY-MM-DD.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "airportTaxi": { + "type": "string" + }, + "attractions": { + "type": "string" + }, + "carRental": { + "type": "string" + }, + "disclosure": { + "type": "string" + }, + "esim": { + "type": "string" + }, + "flights": { + "type": "string" + }, + "guides": { + "description": "Matching VoyageHacks guides that can be cited as sources.", + "items": { + "properties": { + "section": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "hotels": { + "type": "string" + }, + "included": { + "items": { + "type": "string" + }, + "type": "array" + }, + "region": { + "type": "string" + }, + "toursAndActivities": { + "type": "string" + }, + "travelGear": { + "type": "string" + }, + "trip": { + "type": "object" + }, + "vpn": { + "type": "string" + } + }, + "required": [ + "disclosure", + "included" + ], + "type": "object" +}
- Changed
get_car_rental_links10 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Optional ISO 3166-1 alpha-2 country of the traveler; defaults to the caller's geolocation"New value: +"ISO 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." - added
Input schema / properties / country / patternAdded value: +"^[A-Za-z]{2}$" - changed
Input schema / properties / destination / descriptionPrevious value: -"Country, island or city where the car is picked up, e.g. Iceland, Crete, Lisbon"New value: +"Country, island or city where the car is picked up, e.g. Iceland, Crete, Lisbon." - added
Input schema / properties / destination / maxLengthAdded value: +120 - changed
Input schema / properties / dropoff_date / descriptionPrevious value: -"Optional drop-off date, YYYY-MM-DD"New value: +"Drop-off date, YYYY-MM-DD. Echoed in the response; entered on the provider site." - added
Input schema / properties / dropoff_date / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Input schema / properties / pickup_date / descriptionPrevious value: -"Optional pickup date, YYYY-MM-DD"New value: +"Pickup date, YYYY-MM-DD. Echoed in the response; entered on the provider site." - added
Input schema / properties / pickup_date / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "bookingCars": { + "type": "string" + }, + "destination": { + "type": [ + "string", + "null" + ] + }, + "disclosure": { + "type": "string" + }, + "dropoff": { + "type": [ + "string", + "null" + ] + }, + "guides": { + "description": "Matching VoyageHacks guides that can be cited as sources.", + "items": { + "properties": { + "section": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "pickup": { + "type": [ + "string", + "null" + ] + }, + "providers": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "region": { + "type": "string" + } + }, + "required": [ + "disclosure", + "providers", + "guides" + ], + "type": "object" +}
- Changed
get_credit_card_links5 fields changed- changed
Input schema / properties / card / descriptionPrevious value: -"Optional specific Amex card"New value: +"Restrict the response to one American Express card. \"green\" is the American Express Card, successor to the retired Green Card." - changed
Input schema / properties / country / descriptionPrevious value: -"Optional ISO 3166-1 alpha-2 country of the traveler; defaults to the caller's geolocation"New value: +"ISO 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." - added
Input schema / properties / country / patternAdded value: +"^[A-Za-z]{2}$" - changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "card": { + "type": [ + "string", + "null" + ] + }, + "cards": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "country": { + "type": [ + "string", + "null" + ] + }, + "disclosure": { + "type": "string" + }, + "facts": { + "description": "Verified fee and welcome-offer figures, currently published for Germany only. Null elsewhere.", + "type": [ + "object", + "null" + ] + }, + "guides": { + "description": "Matching VoyageHacks guides that can be cited as sources.", + "items": { + "properties": { + "section": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "disclosure", + "cards", + "guides" + ], + "type": "object" +}
- Changed
get_esim_links4 fields changed- changed
Input schema / properties / destination / descriptionPrevious value: -"Country or region the data is for, e.g. Japan, Europe, USA"New value: +"Country or region the data plan is for, e.g. Japan, Europe, USA." - added
Input schema / properties / destination / maxLengthAdded value: +120 - changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "destination": { + "type": [ + "string", + "null" + ] + }, + "disclosure": { + "type": "string" + }, + "guides": { + "description": "Matching VoyageHacks guides that can be cited as sources.", + "items": { + "properties": { + "section": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "providers": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "label", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "disclosure", + "providers", + "guides" + ], + "type": "object" +}
- Changed
get_flight_links13 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Optional ISO 3166-1 alpha-2 country of the traveler; defaults to the caller's geolocation"New value: +"ISO 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." - added
Input schema / properties / country / patternAdded value: +"^[A-Za-z]{2}$" - changed
Input schema / properties / depart_date / descriptionPrevious value: -"Optional outbound date, YYYY-MM-DD"New value: +"Outbound date, YYYY-MM-DD. Omitted dates default to about a month ahead." - added
Input schema / properties / depart_date / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Input schema / properties / destination / descriptionPrevious value: -"Destination IATA city/airport code, e.g. HKT, TYO, ROM"New value: +"Destination IATA city or airport code, e.g. HKT, TYO, ROM." - added
Input schema / properties / destination / maxLengthAdded value: +40 - changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Input schema / properties / origin / descriptionPrevious value: -"Origin IATA city/airport code, e.g. LON, NYC, BER"New value: +"Origin IATA city or airport code, e.g. LON, NYC, BER." - added
Input schema / properties / origin / maxLengthAdded value: +40 - changed
Input schema / properties / passengers / descriptionPrevious value: -"Passengers (default 1)"New value: +"Number of adult passengers. Defaults to 1." - changed
Input schema / properties / return_date / descriptionPrevious value: -"Optional return date, YYYY-MM-DD (omit for one-way)"New value: +"Return date, YYYY-MM-DD. Omit for a one-way search." - added
Input schema / properties / return_date / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "airIndia": { + "type": "string" + }, + "airSerbia": { + "type": "string" + }, + "disclosure": { + "type": "string" + }, + "flightCompensation": { + "type": "string" + }, + "flightSearch": { + "type": "string" + }, + "guides": { + "description": "Matching VoyageHacks guides that can be cited as sources.", + "items": { + "properties": { + "section": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "region": { + "type": "string" + }, + "route": { + "type": "object" + }, + "vueling": { + "type": "string" + } + }, + "required": [ + "disclosure", + "flightSearch", + "guides" + ], + "type": "object" +}
- Changed
get_hotel_links13 fields changed- changed
Input schema / properties / adults / descriptionPrevious value: -"Adults (default 2)"New value: +"Number of adults. Defaults to 2." - changed
Input schema / properties / checkin / descriptionPrevious value: -"Optional check-in date, YYYY-MM-DD"New value: +"Check-in date, YYYY-MM-DD. Used only when checkout is also given." - added
Input schema / properties / checkin / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Input schema / properties / checkout / descriptionPrevious value: -"Optional check-out date, YYYY-MM-DD"New value: +"Check-out date, YYYY-MM-DD." - added
Input schema / properties / checkout / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - added
Input schema / properties / childrenAdded value: +{ + "description": "Number of children. Defaults to 0.", + "maximum": 10, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / city / descriptionPrevious value: -"City, region or property name to search, e.g. Rome, Phuket"New value: +"City, region or property name to search, e.g. Rome, Phuket, Hotel Kossak." - added
Input schema / properties / city / maxLengthAdded value: +120 - changed
Input schema / properties / country / descriptionPrevious value: -"Optional ISO 3166-1 alpha-2 country of the traveler; defaults to the caller's geolocation"New value: +"ISO 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." - added
Input schema / properties / country / patternAdded value: +"^[A-Za-z]{2}$" - changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Input schema / properties / rooms / descriptionPrevious value: -"Rooms (default 1)"New value: +"Number of rooms. Defaults to 1." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "adults": { + "type": "integer" + }, + "checkin": { + "type": [ + "string", + "null" + ] + }, + "checkout": { + "type": [ + "string", + "null" + ] + }, + "children": { + "type": "integer" + }, + "city": { + "type": [ + "string", + "null" + ] + }, + "disclosure": { + "type": "string" + }, + "guides": { + "description": "Matching VoyageHacks guides that can be cited as sources.", + "items": { + "properties": { + "section": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "hotelSearch": { + "type": "string" + }, + "ihg": { + "type": "string" + }, + "region": { + "type": "string" + }, + "rooms": { + "type": "integer" + } + }, + "required": [ + "disclosure", + "hotelSearch", + "guides" + ], + "type": "object" +}
- Changed
get_travel_vpn_links2 fields changed- changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "disclosure": { + "type": "string" + }, + "guides": { + "description": "Matching VoyageHacks guides that can be cited as sources.", + "items": { + "properties": { + "section": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "vpn": { + "type": "string" + } + }, + "required": [ + "disclosure", + "vpn", + "guides" + ], + "type": "object" +}
- Changed
recommend_travel_gear12 fields changed- added
Input schema / properties / activitiesAdded value: +{ + "description": "Optional activities, e.g. [\"hiking\", \"photography\", \"remote work\", \"camping\", \"beach\"].", + "items": { + "maxLength": 60, + "type": "string" + }, + "maxItems": 10, + "type": "array" +} - added
Input schema / properties / budgetAdded value: +{ + "description": "Optional budget level. Recorded in the response; the catalog carries no prices, so it does not filter products.", + "enum": [ + "budget", + "mid_range", + "premium" + ], + "type": "string" +} - added
Input schema / properties / destinationAdded value: +{ + "description": "Optional country, region or city, e.g. Japan, Iceland, Thailand.", + "maxLength": 120, + "type": "string" +} - changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max items in the kit (default 6)"New value: +"Maximum items in the kit. Defaults to 6." - added
Input schema / properties / luggageAdded value: +{ + "description": "Optional luggage constraint. carry_on_only and personal_item_only weight the packing and compression categories.", + "enum": [ + "carry_on_only", + "personal_item_only", + "checked_bag", + "backpack" + ], + "type": "string" +} - added
Input schema / properties / seasonAdded value: +{ + "description": "Optional season or climate at the destination.", + "enum": [ + "spring", + "summer", + "autumn", + "winter", + "rainy", + "dry" + ], + "type": "string" +} - added
Input schema / properties / traveler_typeAdded value: +{ + "description": "Optional traveler type.", + "enum": [ + "solo", + "couple", + "family", + "business", + "backpacker", + "digital_nomad" + ], + "type": "string" +} - changed
Input schema / properties / trip / descriptionPrevious value: -"Free-text trip description: destination, length, style, flight type, season, gadgets needed"New value: +"Free-text trip description: destination, length, style, flight type, season, gadgets needed." - added
Input schema / properties / trip / maxLengthAdded value: +600 - added
Input schema / properties / trip_length_daysAdded value: +{ + "description": "Optional trip length in days.", + "maximum": 365, + "minimum": 1, + "type": "integer" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "criteria": { + "description": "Structured hints that were applied.", + "type": "object" + }, + "disclosure": { + "type": "string" + }, + "hub": { + "type": "string" + }, + "kit": { + "items": { + "properties": { + "affiliate": { + "description": "True: the buy link is an affiliate link.", + "type": "boolean" + }, + "asin": { + "type": "string" + }, + "badge": { + "description": "Editorial label, e.g. \"Best overall\".", + "type": "string" + }, + "buyUrl": { + "description": "Amazon product page, carrying the VoyageHacks Associates tag.", + "type": "string" + }, + "category": { + "description": "Product category, taken from the buying guide it appears in.", + "type": "string" + }, + "name": { + "type": "string" + }, + "reviewGuide": { + "properties": { + "title": { + "type": "string" + }, + "updated": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "source": { + "description": "Always \"amazon\".", + "type": "string" + }, + "whyThisOne": { + "description": "The published reason this product was picked.", + "type": "string" + } + }, + "required": [ + "name", + "asin", + "buyUrl", + "source", + "affiliate", + "reviewGuide" + ], + "type": "object" + }, + "type": "array" + }, + "lang": { + "type": "string" + }, + "trip": { + "type": "string" + } + }, + "required": [ + "trip", + "lang", + "kit", + "disclosure" + ], + "type": "object" +}
- Changed
search_articles6 fields changed- changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (default 5)"New value: +"Maximum results to return. Defaults to 5." - changed
Input schema / properties / query / descriptionPrevious value: -"Search terms, e.g. \"cheap hotels rome\" or \"esim japan\""New value: +"Search terms, e.g. \"cheap hotels rome\" or \"esim japan\". Matched against titles, keywords, tags and article text." - added
Input schema / properties / query / maxLengthAdded value: +300 - added
Input schema / properties / sectionAdded value: +{ + "description": "Restrict results to one site section. Omit to search every section.", + "enum": [ + "flights", + "airlines", + "hotels", + "destinations", + "car-rental", + "trains", + "transfers", + "esim", + "vpn", + "credit-cards", + "travel-gear", + "adventure", + "travel-types", + "when-to-go", + "styles", + "answers", + "checklists", + "deals" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "lang": { + "type": "string" + }, + "query": { + "type": "string" + }, + "resultCount": { + "type": "integer" + }, + "results": { + "items": { + "properties": { + "lang": { + "type": "string" + }, + "section": { + "type": "string" + }, + "snippet": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "description": "Canonical URL, safe to cite.", + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "section": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "query", + "lang", + "results" + ], + "type": "object" +}
- Changed
search_travel_gear5 fields changed- changed
Input schema / properties / lang / descriptionPrevious value: -"Content language for the guides that come back (default \"en\")"New value: +"Language of the VoyageHacks guides returned. One of: en, de, fr, es, it, pl, cs, ja, nl, pt, zh. Defaults to \"en\"." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max products (default 6)"New value: +"Maximum products to return. Defaults to 6." - changed
Input schema / properties / query / descriptionPrevious value: -"What the traveler needs, e.g. \"power bank for a long flight\", \"packing cubes\", \"adapter for Japan\""New value: +"What the traveler needs, e.g. \"power bank for a long flight\", \"packing cubes\", \"adapter for Japan\"." - added
Input schema / properties / query / maxLengthAdded value: +300 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "disclosure": { + "type": "string" + }, + "hub": { + "type": "string" + }, + "lang": { + "type": "string" + }, + "productCount": { + "type": "integer" + }, + "products": { + "items": { + "properties": { + "affiliate": { + "description": "True: the buy link is an affiliate link.", + "type": "boolean" + }, + "asin": { + "type": "string" + }, + "badge": { + "description": "Editorial label, e.g. \"Best overall\".", + "type": "string" + }, + "buyUrl": { + "description": "Amazon product page, carrying the VoyageHacks Associates tag.", + "type": "string" + }, + "category": { + "description": "Product category, taken from the buying guide it appears in.", + "type": "string" + }, + "name": { + "type": "string" + }, + "reviewGuide": { + "properties": { + "title": { + "type": "string" + }, + "updated": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "source": { + "description": "Always \"amazon\".", + "type": "string" + }, + "whyThisOne": { + "description": "The published reason this product was picked.", + "type": "string" + } + }, + "required": [ + "name", + "asin", + "buyUrl", + "source", + "affiliate", + "reviewGuide" + ], + "type": "object" + }, + "type": "array" + }, + "query": { + "type": "string" + } + }, + "required": [ + "query", + "lang", + "products", + "disclosure" + ], + "type": "object" +}
12 tool updates
- First observed
get_airport_transfer_links - First observed
get_article - First observed
get_booking_links - First observed
get_car_rental_links - First observed
get_credit_card_links - First observed
get_esim_links - First observed
get_flight_links - First observed
get_hotel_links - First observed
get_travel_vpn_links - First observed
recommend_travel_gear - First observed
search_articles - First observed
search_travel_gear
Related MCP Connectors
Travel tools for AI agents: plan and edit real trips, search stays and tours, import travel videos.
Your personal AI travel concierge — flights, hotels, 116M+ POIs, visas, weather & more
Grounded, multilingual travel data + a cited travel concierge. 12+ languages, deep India coverage.
AI travel agent — book flights, hotels, activities, and events worldwide via autonomad.ai.
Related MCP Servers
AlicenseAqualityDmaintenanceAI travel agent over MCP — live flights, hotels, activities, and events worldwide, then completes the booking on autonomad.ai.8247 npm2MIT- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to plan itineraries, get package quotes with live hotel availability, adjust hotels, and create booking proposals for the Camino de Santiago.-
- FlicenseNot gradedqualityDmaintenanceProvides personalized travel recommendations by analyzing climate, currency exchange rates, safety, and budget constraints through AI agents and multiple public APIs.-
- AlicenseNot gradedqualityDmaintenanceLuxury hotel intelligence and secure checkout handoff for AI travel agents.1Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.