viator-mcp
This server is an MCP connector to the Viator Partner API (read-only) that lets you search tours/activities, get product details, availability, attractions, destinations, and reference data from Claude or any MCP client.
Search products with structured filters (destination, tags, price, dates, rating, duration, flags), sorting, paging, and compact summaries.
Get full product details by product code: descriptions, inclusions/exclusions, itinerary, options, cancellation policy, review summary, booking URL.
Free-text search across products, attractions, and destinations (e.g. "colosseum underground tour").
Search attractions by destination and get attraction details (hours, reviews, linked product codes).
Check availability schedules for a product: seasons, days, start times, unavailable dates, and per-option age-band pricing.
List destinations and resolve location references (meeting/pickup points, IDs) with names, addresses, coordinates.
Get exchange rates between supported currencies to convert supplier-currency prices.
List product tags for filtering, with parent-tag hierarchy and localized names.
Health check tool to verify API key resolution and authentication status.
All tools are read-only; product URLs include affiliate campaign tracking when desired.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@viator-mcpsearch for food tours in Rome"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
viator-mcp
MCP server for the Viator Partner API (v2) — search tours, activities and experiences for Claude. Search the catalog with structured filters or free text, get product details and availability schedules, browse attractions and destinations, all over stdio.
Developed and maintained by AI (Claude Code). Use at your own discretion.
Quick start
{
"mcpServers": {
"viator": {
"command": "npx",
"args": ["-y", "@chrischall/viator-mcp"],
"env": { "VIATOR_API_KEY": "your-viator-partner-api-key" }
}
}
}Get a key by signing up as a Viator affiliate at partnerresources.viator.com — the Basic Access tier is free. This server targets that tier: read-only search/content/availability; no booking endpoints (product results carry a productUrl for booking on viator.com, tagged with your affiliate id).
Related MCP server: Rezdy Agent MCP Server
Tools
Area | Tools |
Products |
|
Search |
|
Attractions |
|
Availability |
|
Reference |
|
Health |
|
All tools are read-only. vt_search_products and vt_search_freetext accept compact: true for slim summaries (code, title, price, rating, booking URL) instead of full records.
Environment
Variable | Required | Description |
| yes | Viator Partner API key (sent as |
| no | API host (default production; set |
| no |
|
| no | Seconds to cache identical reads (default |
| no | Seconds to cache reference data — destinations, tags, locations, exchange rates (default |
Viator rate-limits per endpoint on a rolling 10-second window and answers 429/503 with Retry-After; the client honors it (one retry) and the response cache absorbs repeated identical calls.
Development
npm install
npm test # vitest; no real network calls
npm run build # tsc + esbuild bundleThe API surface this server is coded against is pinned in docs/VIATOR-API.md.
License
MIT
Available Tools
11 toolsvt_get_attractionARead-only
Get details for one Viator attraction by id — name, destination, opening hours, review summary, mapped product codes, and the attraction URL.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it. | |
| attraction_id | Yes | Viator attraction id | |
| campaign_value | No | Affiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds the list of returned fields, which is helpful behavioral context, but it does not disclose any additional behavior such as rate limits, error handling, or response format beyond what annotations already imply. With annotations covering the safety profile, this is adequate but not enriched.
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?
A single, tightly written sentence that front-loads the core purpose and lists the key return fields without redundancy. Every word earns its place; there is no fluff or unnecessary detail.
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 simple getter with one required parameter and read-only annotations, the description is complete. It lists the return fields, the schema documents all parameters, and the openWorldHint annotation covers unexpected fields. Nothing an agent needs to 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% — all three parameters (attraction_id, view, campaign_value) have descriptions in the schema. The tool description itself does not add any parameter-specific meaning beyond what the schema provides, 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?
The description clearly states the verb 'Get' and the resource 'details for one Viator attraction by id', and enumerates the specific fields returned (name, destination, opening hours, review summary, mapped product codes, and the attraction URL). It distinguishes itself from sibling search tools by emphasizing 'by id', making it unmistakably a single-resource getter.
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?
The phrase 'by id' strongly implies the tool is used when the attraction id is already known, as opposed to search tools like vt_search_attractions. However, it does not explicitly state when not to use it or name alternatives, but the context is clear enough for an agent to infer the appropriate use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vt_get_availability_scheduleARead-only
Get the availability schedule and pricing for a Viator product — seasons, days of week, start times, unavailable dates, and per-age-band pricing for every product option. NOTE: prices are in the SUPPLIER's currency (see the currency field); convert with vt_get_exchange_rates.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it. | |
| product_code | Yes | Viator product code, e.g. 5010SYDNEY |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, covering the safety profile. The description adds non-obvious behavioral context by warning that prices are in the supplier's currency and pointing to the currency field and conversion tool, which an agent would not infer from annotations alone. No contradiction exists.
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 description is a single information-dense sentence with a short, targeted note for the currency caveat. It front-loads the resource and avoids repeating schema details, so every clause earns its place.
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 read-only lookup with two well-documented parameters, the description conveys the key return dimensions, the currency caveat, and the conversion path. Since there is no output schema, this level of detail is sufficient for an agent to know what to expect and how to handle prices.
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%: both product_code and view already have detailed descriptions. The description restates some response-level concepts like per-age-band pricing but adds no new parameter-level meaning beyond what the schema provides, so the baseline score of 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?
The description uses a specific verb ('Get') and a specific resource ('availability schedule and pricing for a Viator product'), then names the concrete data dimensions returned: seasons, days of week, start times, unavailable dates, and per-age-band pricing. This clearly distinguishes the tool from sibling search/product/tag tools without requiring the agent to inspect schemas.
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?
The intended use is reasonably implied by the phrase 'availability schedule and pricing for a Viator product,' but there is no explicit when-to-use guidance or named alternative. The only cross-tool note directs the agent to vt_get_exchange_rates for currency conversion, which is useful but does not help choose this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vt_get_exchange_ratesARead-only
Get exchange rates between currencies Viator supports — needed to convert supplier-currency prices from vt_get_availability_schedule. Reference data — cached.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it. | |
| source_currencies | No | Source currency codes (e.g. ["EUR"]) | |
| target_currencies | No | Target currency codes (e.g. ["USD"]) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds value with 'Reference data — cached', which discloses that rates are cached reference data rather than live quotes, informing expectations about freshness. This is a useful behavioral addition beyond the structured annotations.
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?
Two short, telegraphic sentences front-load the purpose, then add the integration hint and caching note. There is no filler; every clause either clarifies scope or gives behavioral context.
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 only three well-documented parameters, read-only/open-world annotations, and no output schema, the description covers the essential 'why' (price conversion after availability schedule) and 'what to expect' (cached reference data). The only minor gap is the absence of a note about default behavior when source/target arrays are omitted, but the schema's clarity keeps this from being a substantial shortfall.
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%: the view parameter has a detailed response-shape explanation, and source_currencies/target_currencies both provide enum lists and examples. The description itself adds no parameter-level detail, but the schema fully documents the parameters, so 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?
The description states a specific verb and resource: 'Get exchange rates between currencies Viator supports'. It also ties the purpose to a concrete downstream use case ('needed to convert supplier-currency prices from vt_get_availability_schedule'), which distinguishes it clearly from every sibling tool, all of which are about products, attractions, destinations, or health.
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?
The description explicitly tells the agent when this tool is needed: after vt_get_availability_schedule, to convert supplier-currency prices. While it doesn't list alternatives or when-not-to-use conditions, no sibling appears to offer exchange rates, so the provided context is a clear and sufficient directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vt_get_locationsARead-only
Resolve Viator location references (e.g. "LOC-...", meeting points, pickup points from product details) to names, addresses, and coordinates. Up to 500 references per call. Reference data — cached.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it. | |
| location_refs | Yes | Location reference ids from product content (max 500) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, lowering the burden on the description. The description adds useful behavioral context: a 500-reference batch ceiling and the fact that reference data is cached. This helps an agent anticipate limits and stability without contradicting annotations.
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 description is a single, well-structured sentence with no filler. The primary verb and resource are front-loaded, examples are compact, and the batch limit and caching note each earn their place in under the same clause.
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 simple two-parameter read-only lookup tool, the description covers inputs, outputs, and key constraints. The view parameter semantics are fully handled by the schema, and the output categories are stated in the description. It is nearly complete, missing only minor details like error or empty-result behavior.
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 schema fully documents both parameters. The description adds helpful examples of valid references and the output shape, but it does not substantially extend what the schema already states. 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?
The description states a specific verb ('Resolve'), a clear resource ('Viator location references'), and the expected output ('names, addresses, and coordinates'). The examples ('LOC-...', meeting points, pickup points) make the tool's role unmistakable and distinguish it from product search or attraction search siblings.
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?
The phrase 'from product details' and the concrete examples make the intended use case clear: when you have Viator location reference IDs and need human-readable details. It does not explicitly name alternatives or exclusion criteria, but the context is strong enough for an agent to choose this tool confidently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vt_get_productARead-only
Get full details for one Viator product by product code — description, inclusions/exclusions, itinerary, product options, cancellation policy, booking URL, review summary.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it. | |
| product_code | Yes | Viator product code, e.g. 5010SYDNEY | |
| campaign_value | No | Affiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering safety. The description adds value by listing exactly what fields the tool returns (description, inclusions/exclusions, itinerary, etc.), which is behaviorally useful. It does not mention error cases or edge behavior, but with annotations covering the safety profile, this is a minor gap.
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?
A single, information-dense sentence that front-loads the core purpose and enumerates the return content. There is zero waste; every clause earns its place.
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 simple get-by-code tool with thorough schema documentation and read-only/open-world annotations, the description covers the key return fields. It does not describe output structure (no output schema), but the field list gives the agent enough to know what to expect. No critical usage detail 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%: all three parameters (product_code, view, campaign_value) have detailed descriptions, including the view enum's explanation of compact vs. full. The description itself adds no parameter information beyond what the schema already provides, 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?
The description states a specific verb ('Get'), a precise resource ('one Viator product'), and the key identifier ('by product code'), and enumerates the returned content (description, inclusions/exclusions, itinerary, options, cancellation policy, booking URL, review summary). This clearly differentiates it from sibling search/list tools like vt_search_products or vt_get_attraction.
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?
The description strongly implies usage context: you need a product code to fetch details, which is distinct from search tools that find products. It does not explicitly name alternatives or state when not to use it, but the wording 'Get full details for one Viator product by product code' gives clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vt_healthcheckVerify credentials and upstream reachabilityARead-onlyIdempotent
Resolves the credential the way real tools do, then makes one authenticated request to api.viator.com. Reports which source supplied the credential, whether api.viator.com accepted it, the round-trip time, and a plain-English hint distinguishing 'no credential' from 'credential rejected' from 'a api.viator.com-side problem'. Read-only; never returns the credential itself. Call this when a real tool fails and you want to know which hop broke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description goes well beyond these by explaining exactly how the credential is resolved, that exactly one authenticated request is made, what metrics are reported, and that the credential itself is never returned. This gives an agent a clear model of the tool's runtime 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?
The description is three sentences with no filler: the first explains the mechanism, the second enumerates the reported outputs, and the third covers safety and usage. It is front-loaded, specific, and every sentence adds operational value.
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 zero-parameter, read-only diagnostic tool with no output schema, the description fully covers what an agent needs: behavior, return contents, safety (never returns credential), and when to call it. The sibling context and annotations cover the remaining operational constraints.
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?
The tool has zero parameters, so the schema provides nothing to document and the baseline is 4. The description does not need to explain parameters; it instead explains what the no-input call returns, which is the relevant semantic content for this tool.
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 diagnostic verb ('healthcheck', 'resolves the credential ... makes one authenticated request') and clearly distinguishes this from the data-fetching sibling tools like vt_search_products and vt_get_product. It identifies the target resource (api.viator.com) and the exact outputs reported, leaving no ambiguity about what the tool does.
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?
The description gives an explicit trigger: 'Call this when a real tool fails and you want to know which hop broke.' This clearly positions it as a diagnostic fallback relative to the sibling tools. It does not name specific alternatives or state when not to use it, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vt_list_destinationsARead-only
List every Viator destination (cities, regions, countries) with ids, parent hierarchy, IATA codes, time zones, and coordinates. Use the destinationId with vt_search_products / vt_search_attractions. Reference data — cached.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it. | |
| campaign_value | No | Affiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint; the description adds that the data is cached reference data and that the list is comprehensive ('every ... destination'), helping the agent judge freshness and scope. It does not mention pagination or response volume, but for a read-only cached list the added context is a meaningful improvement over annotations alone.
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?
Three short sentences, each earning its place: purpose and returned fields, downstream usage, and cached-reference status. No filler, no restatement of schema fields, and no redundant phrasing.
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 tool with no required parameters, no output schema, and full schema coverage, the description conveys what fields are returned, how to consume the output (destinationId), and that the data is cached. The only notable omission is volume/pagination guidance, which is minor for a cached reference-data listing.
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%, and the schema already explains view's compact/full behavior and campaign_value's URL-appending effect. The description itself adds no parameter-level detail beyond the downstream destinationId usage, so the 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?
The description uses a specific verb ('List'), a precise resource ('every Viator destination'), and enumerates the returned fields (ids, parent hierarchy, IATA codes, time zones, coordinates). It also states the downstream use of destinationId, but it does not explicitly differentiate from the similar-sounding sibling vt_get_locations, so differentiation is implicit rather than explicit.
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 clear usage context: this is cached reference data whose destinationId is meant to be consumed by vt_search_products / vt_search_attractions. It does not state when not to use it or compare it against a lookup 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.
vt_list_product_tagsARead-only
List all Viator product tags (tag id → names in every locale, with parent-tag hierarchy). Use tag ids to filter vt_search_products. Reference data — cached.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds behavioral context beyond annotations by noting that the data is cached, that it returns every locale, and that it includes a parent-tag hierarchy. No contradictions with annotations.
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?
Two sentences with no filler. The core action and response shape are front-loaded, followed by the primary usage guidance and a short cached-data note. Every clause adds value.
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 simple read-only list tool with one optional parameter and no output schema, the description covers the action, response contents, relationship to sibling tools, and data freshness. Nothing essential for an agent to select and 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 description coverage is 100% and the single optional parameter `view` has its own detailed description explaining compact vs full response shapes. The tool description does not add parameter-level detail, 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?
The description opens with a specific verb and resource: 'List all Viator product tags', and details the exact response shape: tag id → names in every locale, plus parent-tag hierarchy. This clearly distinguishes it from sibling search tools like vt_search_products and vt_list_destinations.
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?
The description explicitly states the intended use case: 'Use tag ids to filter vt_search_products.' It also signals that this is reference data and cached, which informs when to call it. It does not explicitly list when not to use it or alternative tools, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vt_search_attractionsARead-only
List attractions (landmarks, museums, points of interest) in a Viator destination, including the product codes mapped to each attraction. Use vt_list_destinations to find destination ids.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort key (default: DEFAULT) | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it. | |
| count | No | Results per page (max 30; default 10) | |
| start | No | 1-based index of the first result | |
| campaign_value | No | Affiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns | |
| destination_id | Yes | Destination id (from vt_list_destinations) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and openness profile is covered. The description adds only the product-code detail, not behavioral traits such as pagination behavior or result limits, but with annotations present the bar is lower.
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?
Two sentences: the first front-loads the tool's purpose and payload, the second provides the essential prerequisite. No filler or repetition of schema content.
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?
All required invocation details are present: the required destination_id is explained, the response includes product codes, and paging/sort parameters are self-documenting in the schema. Since there is no output schema, a bit more return-shape detail would make it fully complete, but the current description is sufficient for a straightforward listing call.
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?
The schema covers all six parameters with descriptions, including defaults, ranges, and the source of destination_id, so the description doesn't need to add much. It reinforces destination_id's origin but adds no new parameter-level meaning beyond 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?
The description names a specific verb ('List') and resource ('attractions in a Viator destination'), with examples of what counts as an attraction and a distinctive detail: product codes mapped to each attraction. This clearly differentiates it from sibling tools like vt_get_attraction or vt_search_products.
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 direct prerequisite: 'Use vt_list_destinations to find destination ids.' It doesn't explicitly state when not to use the tool or compare against alternatives like vt_search_freetext, but the context for using it is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vt_search_freetextARead-only
Free-text search across Viator products, attractions, and destinations (e.g. "colosseum underground tour"). The fastest way to find things when you don't have a destination id yet.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Product sort key | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact (default) projects the PRODUCT results down to their product code, title, from-price and currency, rating, review count, duration, confirmation type, flags, booking URL and cover image and strips image/avatar URLs from the attraction and destination results; "full" returns Viator's payload untouched. | |
| count | No | Results per page per type (max 50; default 10) | |
| order | No | Sort direction | |
| start | No | 1-based index of the first result (per type) | |
| currency | No | Currency for request/response prices (default USD) | USD |
| end_date | No | Only products operating on/before this date (YYYY-MM-DD) | |
| max_price | No | Maximum product from-price (in currency) | |
| min_price | No | Minimum product from-price (in currency) | |
| min_rating | No | Minimum average traveler rating (0-5) | |
| start_date | No | Only products operating on/after this date (YYYY-MM-DD) | |
| destination | No | Restrict product results to a destination id | |
| search_term | Yes | Free-text search term | |
| search_types | No | Which result types to return (default: PRODUCTS only) | |
| campaign_value | No | Affiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description doesn't need to cover the safety profile. The description adds the cross-type search scope but makes a performance claim ('fastest way') without qualification. It doesn't disclose return format or pagination, but given annotations carry the safety burden, this is adequate.
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?
Two sentences with zero waste. The search scope and example are front-loaded, and the usage guidance ('when you don't have a destination id yet') is placed second. Every word earns its place.
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?
The description covers purpose, scope, and usage context, and the schema fully documents parameters. The main gap is result structure since there's no output schema, but the 'view' parameter partially documents response shape. Adequate for the tool's primary use case.
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% — all 15 parameters are documented in the input schema. The description itself adds no parameter-level detail, relying on the schema, which is the appropriate baseline. No extra value beyond schema coverage, but none is needed.
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 (search), resource (Viator products, attractions, destinations), and gives a concrete example ('colosseum underground tour'). It clearly distinguishes from siblings like vt_search_products and vt_search_attractions by emphasizing the free-text, cross-type scope.
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 the usage condition: 'the fastest way to find things when you don't have a destination id yet.' This tells the agent when to choose it over destination-scoped searches. However, it doesn't name alternatives explicitly or state exclusions (e.g., when to use vt_search_products instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vt_search_productsARead-only
Search Viator tours, activities and experiences with structured filters (destination, tags, price, dates, rating, duration). Returns product summaries with pricing and booking URLs. Use vt_list_destinations to find destination ids and vt_list_product_tags for tag ids.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort key (default: DEFAULT — Viator relevance) | |
| tags | No | Tag ids products must match (from vt_list_product_tags) | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact (default) projects each result down to its product code, title, from-price and currency, rating, review count, duration, confirmation type, flags, booking URL and cover image, falling back to the raw response if Viator's shape drifts; "full" returns Viator's payload untouched. | |
| count | No | Results per page (max 50; default 10) | |
| flags | No | Product flags, e.g. FREE_CANCELLATION, LIKELY_TO_SELL_OUT, PRIVATE_TOUR | |
| order | No | Sort direction | |
| start | No | 1-based index of the first result to return | |
| currency | No | Currency for request/response prices (default USD) | USD |
| end_date | No | Only products operating on/before this date (YYYY-MM-DD) | |
| max_rating | No | Maximum average traveler rating (0-5) | |
| min_rating | No | Minimum average traveler rating (0-5) | |
| start_date | No | Only products operating on/after this date (YYYY-MM-DD) | |
| destination | No | Destination id (from vt_list_destinations), e.g. "732" for Paris | |
| lowest_price | No | Minimum from-price (in currency) | |
| highest_price | No | Maximum from-price (in currency) | |
| campaign_value | No | Affiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns | |
| max_duration_minutes | No | Maximum product duration in minutes | |
| min_duration_minutes | No | Minimum product duration in minutes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context about what is returned ('product summaries with pricing and booking URLs'), which goes beyond the annotations and the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The verb, resource, and scope are front-loaded; the output behavior comes second; the dependency pointers come last. Every sentence earns its place.
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 18 optional parameters, no output schema, and rich annotations, the description covers the essential invocation context: what it searches, what filters exist, and where to get required IDs. The schema handles parameter-level details, so little is missing for an agent to call this tool 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 baseline is 3. The description adds value beyond the schema by enumerating the filter dimensions (destination, tags, price, dates, rating, duration) and directing the agent to sibling tools for valid destination/tag ids.
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 ('Search'), the resource ('Viator tours, activities and experiences'), and the key differentiator ('structured filters'). This separates it from vt_search_freetext (unstructured) and vt_search_attractions (different resource type) without needing to inspect either sibling's 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?
Clearly gives prerequisite steps: 'Use vt_list_destinations to find destination ids and vt_list_product_tags for tag ids.' It also implies structured-search context from the tool name and description, but does not explicitly name alternatives like vt_search_attractions or vt_search_freetext as 'don't use this when...' cases.
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.
11 tool updates
v2.0.0- Changed
vt_get_attraction1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_get_availability_schedule1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_get_exchange_rates1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_get_locations1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_get_product1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_healthcheck1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_list_destinations1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_list_product_tags1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_search_attractions1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_search_freetext1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
vt_search_products1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
11 tool updates
v1.2.1- Changed
vt_get_attraction1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
vt_get_availability_schedule1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
vt_get_exchange_rates1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
vt_get_locations1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
vt_get_product1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Added
vt_healthcheck - Changed
vt_list_destinations1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
vt_list_product_tags1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
vt_search_attractions1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Viator's payload untouched. No field projection on this tool — every other field comes back as Viator sent it.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
vt_search_freetext2 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "default": false, - "description": "Return slim product summaries instead of full records", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact (default) projects the PRODUCT results down to their product code, title, from-price and currency, rating, review count, duration, confirmation type, flags, booking URL and cover image and strips image/avatar URLs from the attraction and destination results; \"full\" returns Viator's payload untouched.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
vt_search_products2 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "default": false, - "description": "Return a slim summary per product (code, title, price, rating, URL) instead of full records", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact (default) projects each result down to its product code, title, from-price and currency, rating, review count, duration, confirmation type, flags, booking URL and cover image, falling back to the raw response if Viator's shape drifts; \"full\" returns Viator's payload untouched.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
10 tool updates
v1.0.5- First observed
vt_get_attraction - First observed
vt_get_availability_schedule - First observed
vt_get_exchange_rates - First observed
vt_get_locations - First observed
vt_get_product - First observed
vt_list_destinations - First observed
vt_list_product_tags - First observed
vt_search_attractions - First observed
vt_search_freetext - First observed
vt_search_products
TDQS
Scored across 11 tools
Each tool targets a distinct resource or action—products, attractions, destinations, tags, locations, availability, exchange rates—and the structured vs. free-text search split is clearly explained. Cross-references in descriptions make it easy for an agent to choose the right tool without confusion.
All tools share the vt_ prefix and mostly follow a verb_noun pattern with search/get/list. Minor deviations like vt_search_freetext and the one-word vt_healthcheck keep it from being perfectly consistent, but the overall naming is predictable and readable.
Eleven tools is well-scoped for a Viator discovery server: search, details, reference data, availability, exchange rates, and diagnostics each earn their place. There is no significant redundancy or padding.
The set covers the full read-side workflow: destination/tag discovery, product and attraction search, detail retrieval, availability and pricing, currency conversion, and location resolution. Booking is intentionally not included, with booking URLs provided instead, so there are no obvious dead ends.
Maintenance
Related MCP Connectors
Hotel booking MCP server. Search, book, and manage reservations across 250K+ properties worldwide.
AI marketplace — flights, tours, activities, transport & more via MCP. No auth required.
Flight search MCP server providing search, pagination, and itinerary details for AI assistants.
Aggregated travel MCP — flights, tours, activities, price checks, visas, and more.
Related MCP Servers
- AlicenseBqualityDmaintenanceThis MCP server provides access to TripAdvisor data for planning vacations, enabling users to search for and get details about locations, attractions, restaurants, and hotels through an interactive planning experience.42Apache 2.0
- FlicenseBqualityDmaintenanceAn MCP server for integrating with the Rezdy Agent API to manage travel marketplace products and bookings. It enables travel agents to search availability, process payments, and manage customer relationships using natural language.162-
- FlicenseNot gradedqualityDmaintenanceMCP server for travel program search, comparison, and booking via Yourttoo API, optimized for LLMs with token-saving responses.-
- AlicenseNot gradedqualityBmaintenanceMCP server for the Travelpayouts (Aviasales) API. It provides 13 tools for flight search, price calendars, hotel search, and airport/airline/city lookup.56 npmMIT