Skip to main content
Glama
chrischall
by chrischall

viator-mcp

npm

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

vt_search_products, vt_get_product, vt_list_product_tags

Search

vt_search_freetext

Attractions

vt_search_attractions, vt_get_attraction

Availability

vt_get_availability_schedule

Reference

vt_list_destinations, vt_get_locations, vt_get_exchange_rates

Health

vt_healthcheck — is this connector working? Reports whether VIATOR_API_KEY resolved, whether Viator accepted it, and what to fix. Start here when another tool fails: an empty result can mean "no products" or "never authenticated".

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

VIATOR_API_KEY

yes

Viator Partner API key (sent as exp-api-key)

VIATOR_API_BASE_URL

no

API host (default production; set https://api.sandbox.viator.com/partner for a sandbox key)

VIATOR_LANGUAGE

no

Accept-Language for response text (default en-US)

VIATOR_CACHE_TTL

no

Seconds to cache identical reads (default 60; 0 disables)

VIATOR_STATIC_CACHE_TTL

no

Seconds to cache reference data — destinations, tags, locations, exchange rates (default 3600)

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 bundle

The API surface this server is coded against is pinned in docs/VIATOR-API.md.

License

MIT

Available Tools

11 tools
vt_get_attractionA
Read-only

Get details for one Viator attraction by id — name, destination, opening hours, review summary, mapped product codes, and the attraction URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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_idYesViator attraction id
campaign_valueNoAffiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_scheduleA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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_codeYesViator product code, e.g. 5010SYDNEY

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_ratesA
Read-only

Get exchange rates between currencies Viator supports — needed to convert supplier-currency prices from vt_get_availability_schedule. Reference data — cached.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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_currenciesNoSource currency codes (e.g. ["EUR"])
target_currenciesNoTarget currency codes (e.g. ["USD"])

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_locationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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_refsYesLocation reference ids from product content (max 500)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_productA
Read-only

Get full details for one Viator product by product code — description, inclusions/exclusions, itinerary, product options, cancellation policy, booking URL, review summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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_codeYesViator product code, e.g. 5010SYDNEY
campaign_valueNoAffiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 reachabilityA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_destinationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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_valueNoAffiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_tagsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: '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.

Usage Guidelines4/5

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_attractionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort key (default: DEFAULT)
viewNoResponse 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.
countNoResults per page (max 30; default 10)
startNo1-based index of the first result
campaign_valueNoAffiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns
destination_idYesDestination id (from vt_list_destinations)

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_freetextA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoProduct sort key
viewNoResponse 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.
countNoResults per page per type (max 50; default 10)
orderNoSort direction
startNo1-based index of the first result (per type)
currencyNoCurrency for request/response prices (default USD)USD
end_dateNoOnly products operating on/before this date (YYYY-MM-DD)
max_priceNoMaximum product from-price (in currency)
min_priceNoMinimum product from-price (in currency)
min_ratingNoMinimum average traveler rating (0-5)
start_dateNoOnly products operating on/after this date (YYYY-MM-DD)
destinationNoRestrict product results to a destination id
search_termYesFree-text search term
search_typesNoWhich result types to return (default: PRODUCTS only)
campaign_valueNoAffiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_productsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort key (default: DEFAULT — Viator relevance)
tagsNoTag ids products must match (from vt_list_product_tags)
viewNoResponse 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.
countNoResults per page (max 50; default 10)
flagsNoProduct flags, e.g. FREE_CANCELLATION, LIKELY_TO_SELL_OUT, PRIVATE_TOUR
orderNoSort direction
startNo1-based index of the first result to return
currencyNoCurrency for request/response prices (default USD)USD
end_dateNoOnly products operating on/before this date (YYYY-MM-DD)
max_ratingNoMaximum average traveler rating (0-5)
min_ratingNoMinimum average traveler rating (0-5)
start_dateNoOnly products operating on/after this date (YYYY-MM-DD)
destinationNoDestination id (from vt_list_destinations), e.g. "732" for Paris
lowest_priceNoMinimum from-price (in currency)
highest_priceNoMaximum from-price (in currency)
campaign_valueNoAffiliate campaign tracking id — appended to the productUrl/attractionUrl/destinationUrl Viator returns
max_duration_minutesNoMaximum product duration in minutes
min_duration_minutesNoMinimum product duration in minutes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 11 tool updatesv2.0.0
    • Changedvt_get_attraction1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_get_availability_schedule1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_get_exchange_rates1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_get_locations1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_get_product1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_healthcheck1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_list_destinations1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_list_product_tags1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_search_attractions1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_search_freetext1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedvt_search_products1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 11 tool updatesv1.2.1
    • Changedvt_get_attraction1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedvt_get_availability_schedule1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedvt_get_exchange_rates1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedvt_get_locations1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedvt_get_product1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Addedvt_healthcheck
    • Changedvt_list_destinations1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedvt_list_product_tags1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedvt_search_attractions1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedvt_search_freetext2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "default": false,
        -  "description": "Return slim product summaries instead of full records",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedvt_search_products2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "default": false,
        -  "description": "Return a slim summary per product (code, title, price, rating, URL) instead of full records",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / view
        Added 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"
        +}
  3. 10 tool updatesv1.0.5
    • First observedvt_get_attraction
    • First observedvt_get_availability_schedule
    • First observedvt_get_exchange_rates
    • First observedvt_get_locations
    • First observedvt_get_product
    • First observedvt_list_destinations
    • First observedvt_list_product_tags
    • First observedvt_search_attractions
    • First observedvt_search_freetext
    • First observedvt_search_products

TDQS

A4.3/5.0

Scored across 11 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers