---
canonical_url: "https://docs.composio.dev/toolkits/viator_mcp"
markdown_url: "https://docs.composio.dev/toolkits/viator_mcp.md"
product: "platform"
version: null
last_updated: null
---

# Viator MCP

Search and book tours, activities, and travel experiences around the world with Viator.

- **Category:** scheduling & booking
- **Auth:** NO_AUTH
- **Composio-managed OAuth available?** N/A
- **Tools:** 2
- **Triggers:** 0
- **Slug:** `VIATOR_MCP`
- **Version:** 20260913_00

## Tools

### Get experience details

**Slug:** `VIATOR_MCP_GET_EXPERIENCE_DETAILS`

Retrieves enriched information for a specific Viator experience, including detailed descriptions, highlights, imagery, pricing, duration, key features, and the click-out URL.It also returns what is included and excluded in the price, high-level itinerary metadata, bookable experience options, traveler age bands and booking constraints, start/end locations and traveler pickup, additional information such as requirements and restrictions, available language guides, associated destinations, the operating time zone, the operator, every image for the experience with its available dimension variants and captions, and the cancellation policy covering the refund terms, weather and minimum-traveler cancellation conditions, and how much is refundable depending on how far in advance the booking is cancelled.The model should call this tool only when the user clearly refers to a specific experience—either by selecting it in the UI or by asking follow-up questions such as “Tell me more about…”;if multiple experiences were shown, the model must resolve ambiguity by asking which one the user means. This tool is intended for deepening experience understanding rather than search, and should only be invoked with a code previously returned by search_experiences. get_experience_details only returns high-level itinerary metadata. Full itinerary content, including the sequence of stops and activities, detailed descriptions, and location information, is available through get_experience_itinerary. Clients should call that tool on demand when the traveler asks for more detail about what happens during the experience.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `code` | string | Yes | (required) Unique identifier of the Viator experience to retrieve details for.This value must correspond to an experience previously returned by the search_experiences tool.The model must not guess or make up experience IDs; if the user request is ambiguous (e.g., multiple items shown), the model must ask which experience they mean before calling the tool. |
| `locale` | string | No | (optional) The language/locale code requested for content localization (e.g., en-US, en-GB, fr-FR).If not provided by the user, the model should infer it from context or default to en.Used to descriptions, highlights, and content where available. |
| `currency` | string | No | (optional) Currency code for from-price display (e.g., USD, EUR, GBP).When provided, fromPrice and fromPriceBeforeDiscount are populated.When omitted, pricing fields are not returned.Should match the currency used in the preceding search_experiences call when available. |
| `language` | string | No | (deprecated) This value is deprecated and should not be sent. Please only send the locale. |
| `sessionId` | string | Yes | (mandatory) A unique identifier, ideally an UUID, for the current user conversation. The same identifier should be used until the user opens a new chat. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `sessionId` | string | Yes |  |
| `experienceDetails` | object | Yes |  |

### Search experiences

**Slug:** `VIATOR_MCP_SEARCH_EXPERIENCES`

Retrieves a curated list of Viator experiences based on a free-text search of what the user wants (destination, activity type, and preferences), plus trip dates and optional refiners (budget, duration, etc.).
The model must supply a non-blank searchTerm as natural language describing where and what the user is looking for (e.g. "walking tours in Paris, France", "kid friendly food experiences in Rome"). Dates, prices, duration limits, and currency belong in their dedicated parameters—not inside searchTerm.
The model must provide searchTerm and dates before calling this tool. The model may re-issue a refined searchExperiences call whenever the user adds, removes, or adjusts refinement criteria (e.g., kid-friendly, price range, shorter duration) to narrow or improve the results.
If the tool returns zero results, the model must proactively guide the user toward a successful refinement. It should review the parameters used in the failed request and recommend the most appropriate based on the proposed logic:"
If > 1 categories applied, suggest removing some categories. Eg: “It looks like those categories combined are too restrictive. Would you like to narrow it down?”
If the query requests a specific feature (eg private tour), suggest removing this constraint. Eg: “Private tours may be limited in this area, would you like to consider group options too?”
If duration (avg from/to) > XX, suggest trying a shorter duration.
If duration (avg from/to) < XX, suggest trying a longer duration.
If price constraint was applied, suggest widening (or removing) price limits.
Else, suggest broaden location search. Eg: “Nothing matches in central Siena, should we try Tuscany or nearby towns?”

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | (optional) Maximum number of products to return, between 1 and 10.If omitted, defaults to 5.Not intended as a user-facing refinement mechanism; the model should not use it to alter intent. |
| `locale` | string | No | (optional) The language/locale code requested for content localization (e.g., en-US, en-GB, fr-FR).If not provided by the user, the model should infer it from context or default to en.Used to localize title, and other content where available. |
| `endDate` | string | Yes | (required) The last date the user is available to participate in an experience, formatted as ISO-8601 (YYYY-MM-DD).Also derived from natural-language expressions (e.g., 'this summer', 'next weekend', 'early April', 'tomorrow'); if the user gives a single day, set endDate = startDate. When resolving these expressions, use the destination timezone from searchTerm when inferable, otherwise the user's timezone. Must be >= startDate. Used to widen search results to a date range. |
| `toPrice` | number | No | (optional) Maximum per-person price to include in search, expressed in the requested currency.Used when the user expresses a maximum budget (e.g., “under $100”) |
| `currency` | string | No | (optional) Currency code used for interpreting and filtering prices.The model should infer currency from context when possible (e.g., GBP if the user is in the UK; USD if the user specifies dollars).Default value: USDValid ISO currency codes include: AED, ARS, AUD, BRL, CAD, CHF, CLP, CNY, COP, DKK, EUR, FJD, GBP, HKD, IDR, ILS, INR, ISK, JPY, KRW, MXN, MYR, NOK, NZD, PEN, PHP, PLN, SEK, SGD, THB, TRY, TWD, USD, VND, ZAR |
| `duration` | integer | No | (optional) User preference for maximum experience length, expressed in minutes.Used to filter results to experiences at or below this duration. |
| `fromPrice` | number | No | (optional) Minimum per-person price to include in search, expressed in the requested currency.Used when the user specifies a lower budget boundary (e.g., “at least €50”). |
| `sessionId` | string | Yes | (mandatory) A unique identifier, ideally an UUID, for the current user conversation. The same identifier should be used until the user opens a new chat. |
| `startDate` | string | Yes | (required) The first date the user is available to participate in an experience, formatted as ISO-8601 (YYYY-MM-DD).The model must convert natural-language expressions (e.g., 'this summer', 'next weekend', 'early April', 'tomorrow') into a specific ISO date before calling the tool. When resolving these expressions, if searchTerm names a destination, use that location's local timezone. Otherwise, use the user's current timezone. The date must not be in the past. Must be before the endDate. |
| `searchTerm` | string | Yes | (required) Natural-language description of what the user is looking for. Must be non-blank and at most 500 characters; the tool rejects empty, whitespace-only, or over-length values. Include destination, activity type, and preferences in this single free-text query (e.g. 'walking tours in Paris, France'). Do not embed dates, prices, duration limits, or currency here—use the dedicated fields. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `sessionId` | string | Yes |  |
| `experiences` | array | Yes |  |
