CruiseHops
Server Details
Search and compare Carnival and Royal Caribbean cruises, itineraries, cabin offers and recorded price history. Explore Viator tours and activities at supported cruise ports. Free, read-only access with no account or API key required. Confirm final prices and availability with the provider.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP ยท MCP 2025-11-25
- URL
TDQS
Scored across 11 tools
Most tools have clearly distinct roles, especially the research tools versus the two presentation widgets. There is some potential confusion between search_cruises, list_departures, and compare_sailings, and between find_port_excursions and present_excursions, but the descriptions explain the intended workflow well.
All tool names use snake_case with a verb-first pattern, making them readable and predictable. Minor inconsistency appears in noun choices such as cruise/sailing/departure and port_excursions/excursion_ports, but the overall convention is stable.
Eleven tools are well-scoped for a cruise research and excursion planning server. Each tool appears to cover a distinct stage of discovery, comparison, detail lookup, and presentation.
The surface covers cruise search, term suggestions, departures, sailing details, price history, comparison, and presentation, plus a parallel excursion workflow. Minor gaps exist around richer ship/port metadata and live booking/availability, though live booking appears intentionally out of scope.
Available Tools
11 toolscompare_sailingsCompare cruisesARead-onlyIdempotentInspect
Compare two to four distinct sailings and optional exact offer IDs. Defaults to lowest current captured two-adult offer; occupancy is explicit per offer. No live or family quote.
| Name | Required | Description | Default |
|---|---|---|---|
| sailings | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| items | Yes | |
| priceContext | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds useful behavioral context by saying it defaults to the lowest current captured two-adult offer, that occupancy is explicit per offer, and that live or family quotes are not included.
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 short, front-loaded sentences with no wasted text. Constraints, defaults, occupancy behavior, and the live/family exclusion are all communicated efficiently.
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 comparison tool with an output schema and read-only annotations, the description covers the key scope, defaults, and limitations. It does not explain error handling for invalid or unavailable offers, but the essential information needed to invoke the tool correctly is present.
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 description clarifies the top-level sailings parameter as two to four distinct sailings and notes that exact offer IDs are optional. The nested schema already documents sailingId, offerId, cabinClass, and eventSelector in detail, while the description adds selection/default meaning around those fields.
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: compare two to four distinct sailings, with optional exact offer IDs. This clearly distinguishes it from single-sailing siblings such as get_sailing and from search-oriented tools like search_cruises.
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: comparison is limited to two to four distinct sailings and uses captured offers by default. It also states an exclusion, 'No live or family quote,' but does not explicitly name alternative sibling tools for those cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_port_excursionsFind port excursionsARead-onlyIdempotentInspect
Search Viator on demand only when the user asks for activities or excursions. Use a port ID from list_excursion_ports or get_sailing itinerary.portId. Pass the port visit date, not the cruise departure date. Optional q searches activity keywords such as snorkeling or food tours within that port; preserve it across pagination. Returns suggestions near the port, NOT verified time-ashore matches or live availability. Prices are indicative, may differ for the date/party, and are not cruise fares. Preserve complete affiliate URLs. No reviews or protected unique content. No widget.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| date | No | ||
| page | No | ||
| portId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds meaningful behavioral limits beyond annotations: results are suggestions near the port, not verified time-ashore matches or live availability; prices are indicative and not cruise fares; affiliate URLs must be preserved; reviews/protected content and widgets are excluded.
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 front-loaded with the core action and on-demand condition, and most sentences add concrete constraints. It is a dense single paragraph, and fragments like "No widget" are terse enough to be slightly underspecified rather than maximally clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an external search tool with no output schema and no schema parameter descriptions, the definition covers key invocation rules and important output caveats. It still omits explicit response-shape guidance and direct page-parameter behavior, leaving minor gaps.
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?
With 0% schema description coverage, the description must carry parameter meaning. It explains portId provenance, date as the port visit date, and q as activity keyword search preserved across pagination, but page is only indirectly mentioned through pagination and lacks direct semantics.
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: "Search Viator" for "activities or excursions" at a port. It also distinguishes the port-ID source siblings list_excursion_ports and get_sailing, though it does not explicitly differentiate this search from get_excursion or present_excursions.
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 explicit usage conditions: search only on demand when the user asks for activities/excursions. It also names where to get portId, clarifies that date must be the port visit date rather than the cruise departure date, and explains preserving q across pagination.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_excursionExplore an excursionARead-onlyIdempotentInspect
Fetch details only for a Viator product the user selected from find_port_excursions. Returns allowed product content and an affiliate booking URL; no reviews, protected content or live availability. Verify meeting point, return timing and availability on Viator.
| Name | Required | Description | Default |
|---|---|---|---|
| productCode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, open-world, and non-destructive behavior. The description adds substantial context by stating what is returned (allowed product content and an affiliate booking URL) and what is not (reviews, protected content, live availability), which is exactly the kind of behavioral detail annotations cannot convey.
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 tightly written sentences. The source constraint is front-loaded, the return scope follows, and the verification caveat closes it without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only lookup with no output schema, the description covers the important gaps: what it returns, what it excludes, and why certain details must still be confirmed externally on Viator. An agent has enough context to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the semantic load for productCode. It does so by clarifying that the value is a Viator product selected from find_port_excursions, rather than an arbitrary code, though it does not restate the schema's character pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: fetch details for a Viator product. It explicitly distinguishes this from the discovery sibling find_port_excursions and limits scope to a product the user already selected.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the prerequisite source: use only after the user selected a product from find_port_excursions. It also tells the agent to verify meeting point, return timing, and availability on Viator, leaving little ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_price_historyView cabin price historyARead-onlyIdempotentInspect
Read one exact captured offer context's price history. contextKey is required from get_sailing offers. Never blends cabins, fares, markets, guest counts or events. Dates select overlapping captured observation spans; maxPoints retains the latest points.
| Name | Required | Description | Default |
|---|---|---|---|
| dateTo | No | Inclusive latest observation date (YYYY-MM-DD). | |
| dateFrom | No | Inclusive earliest observation date; includes captured spans that overlap this date. | |
| maxPoints | No | Retain latest matching observations, default 100, maximum 200. | |
| sailingId | Yes | Stable sailing ID from search_cruises items[].id or list_departures items[].id. | |
| contextKey | Yes | Exact offers[].contextKey from get_sailing, identifying cabin/fare/occupancy/market/event; never infer or combine contexts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| series | Yes | |
| sailingId | Yes | |
| truncated | Yes | |
| priceContext | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world. The description adds valuable behavioral context beyond them: the strict non-blending guarantee and the fact that dates select overlapping observation spans rather than exact-point matches. Return-value specifics are covered by the output 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?
Three tight sentences, front-loaded with the read scope and populated with the key constraint (required contextKey) and the two non-obvious semantics (span overlap, latest-point retention). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Five params fully documented in schema, output schema exists, annotations cover safety โ the description fills the remaining gaps: the hard dependency on get_sailing, the anti-blending rule, and the overlap/retention semantics. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real meaning: it reinforces contextKey's source and strictness and clarifies that dateFrom/dateTo operate on overlapping spans (not point containment) and that maxPoints retains the latest points. This is additive on top of an already complete schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one exact captured offer context's price history') with a scoping claim that distinguishes it from siblings โ no other sibling deals with price history. An agent can identify the tool and its precision level immediately.
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 directs the agent to obtain contextKey from get_sailing offers and warns never to infer or blend contexts, which establishes the prerequisite flow. However, it does not name an alternative when the agent lacks a contextKey (e.g., get_sailing first) as an explicit 'use X instead' route.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sailingExplore a sailingARead-onlyIdempotentInspect
Explore a CruiseHops sailing page: itinerary, cabin fares, price-history context and links to the website and official provider. Research only; no widget. Read sailing itinerary, cabin-filtered offers and booking URLs. Amenities and media are omitted by default; request them explicitly only when needed. No live availability or party total is guaranteed.
| Name | Required | Description | Default |
|---|---|---|---|
| offerId | No | Exact current available two-adult offer ID from get_sailing offers[].id; must belong to this sailing/event. | |
| sailingId | Yes | Stable sailing ID from search_cruises items[].id or list_departures items[].id. | |
| cabinClass | No | Normalized cabin class: inside, oceanview, balcony, suite, or other, as captured on the offer. | |
| includeMedia | No | Default false. Set true only when media is requested. | |
| eventSelector | No | Exact source eventSelector from a search result or offer; empty string is a valid standard event. | |
| includeAmenities | No | Default false. Set true only when the user asks about on-board facilities or opens the amenities section. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| ship | Yes | |
| media | Yes | |
| offers | Yes | |
| sailing | Yes | |
| itinerary | Yes | |
| selection | Yes | |
| priceContext | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is fully covered. The description adds genuinely useful behavior: amenities and media are omitted by default, and no live availability or party total is guaranteed. That is real value, but it does not disclose response shape or pagination/limits, keeping it at a solid 3-4 borderline; the default-omission semantics push it to 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and resource, then the constraints. Four short sentences with no filler, though the fragment style ('Research only; no widget.') is terse enough that it reads as telegraphic rather than fully polished.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and rich annotations cover the safety profile. It closes the remaining gaps an agent would care about (default-omitted content, no guaranteed live availability), leaving only minor omissions around limits or error 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 description coverage is 100%, so every parameter including offerId provenance, cabinClass normalization, and the includeMedia/includeAmenities defaults is already documented in the schema. The description only restates the opt-in behavior for amenities/media, adding no syntax or provenance detail beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Explore a CruiseHops sailing page') and enumerates what it returns: itinerary, cabin fares, price-history context, links. It implicitly contrasts with a widget-based sibling via 'Research only; no widget', but never names compare_sailings or get_price_history, so sibling differentiation is partial.
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?
'Research only; no widget' establishes a clear usage context and rules out the presentation path, and the sentence on amenities/media tells the agent when to enable optional includes. It stops short of naming explicit alternatives for overlapping needs like price history or comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_departuresExplore departure datesARead-onlyIdempotentInspect
List bounded, paginated unique dated sailings for a public ship-itinerary group ID. Preserves cabin/date filters; older event-specific group IDs remain supported.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Free-text cruise search; use suggest_cruise_terms to resolve precise entity names. | |
| page | No | One-based result page; default 1. | |
| ship | No | Source-native ship ID from items[].ship.id, not a suggestion term ID. Prefer terms for names. | |
| sort | No | ||
| view | No | Default groups combines departures for each ship itinerary; sailings returns one row per unique dated sailing. Event-specific fares remain available within each sailing. | |
| terms | No | Stable term IDs from suggest_cruise_terms; prefer these for entity-name filtering. | |
| dateTo | No | Inclusive latest departure date (YYYY-MM-DD). | |
| source | No | Source ID: carnival or royal_caribbean. | |
| amenity | No | Exact captured amenity name from get_sailing ship.amenities[].name. | |
| groupId | Yes | Public ship-itinerary group ID from search_cruises items[].groupId; this is not a sailing ID. Older event-specific group IDs remain supported. | |
| dateFrom | No | Inclusive earliest departure date (YYYY-MM-DD). | |
| pageSize | No | Items per page, 1โ50; default 3. | |
| returnBy | No | Inclusive latest disembarkation date, YYYY-MM-DD; excludes unknown return dates. This deadline never expands with dateFlexDays. | |
| nightsMax | No | Maximum nights, inclusive. Prefer nightsMin/nightsMax for cruise trip lengths; legacy durationMin/durationMax are days-only. | |
| nightsMin | No | Minimum nights. Uses advertised nights, otherwise calendar nights between captured departure and return dates. Unknown durations cannot match. | |
| roundtrip | No | ||
| cabinClass | No | Normalized cabin class: inside, oceanview, balcony, suite, or other, as captured on the offer. | |
| destination | No | Shared destination suggestion ID or destination label. Umbrella destinations such as Caribbean include mapped subregions across cruise lines. Specific regions remain strict; generic Caribbean does not imply Eastern Caribbean. Prefer suggest_cruise_terms to resolve names. | |
| durationMax | No | Maximum normalized duration in days, not advertised nights. | |
| durationMin | No | Minimum normalized duration in days, not advertised nights. | |
| visitedPort | No | Visited port selection: shared port suggestion ID or source-native items[].visitedPorts[].id. Reviewed equivalent ports match across cruise lines; source still restricts the line. | |
| dateFlexDays | No | Optional departure flexibility, 0โ30 days before dateFrom and after dateTo. Requires both dates when positive. Exact matches stay in items; outside-window options are separate dateAlternatives. All other filters remain strict. Use only when the user permits flexible dates. | |
| departurePort | No | Departure port selection: shared port suggestion ID or source-native items[].departurePort.id. Reviewed equivalent ports match across cruise lines; source still restricts the line. Different embarkation ports remain distinct. | |
| priceMaxCents | No | Maximum captured USD cents per person for two guests; 50000 means USD 500/person. Not a party total. | |
| departureTerms | No | Port IDs from suggest_cruise_terms, matching departure only (OR within this list). General terms ports also match visited ports. Other filters still apply. | |
| includeUnavailable | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| page | Yes | |
| items | Yes | |
| total | Yes | |
| groupId | Yes | |
| pageSize | Yes | |
| priceContext | Yes | |
| dateAlternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish read-only, idempotent, non-destructive, and closed-world behavior. The description adds useful behavioral context: results are bounded and paginated, cabin/date filters are preserved, and legacy event-specific group IDs are supported.
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 two concise sentences with no wasted text. The core purpose is front-loaded, followed by the relevant filter and legacy-support caveat.
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 26-parameter tool, the description is short, but the schema has 88% description coverage and an output schema exists. The description covers the core contract and legacy behavior, leaving detailed parameter semantics to the well-documented schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 88%, so the schema already documents most parameters in detail. The description only mentions cabin/date filter preservation and the group ID scope, adding little parameter 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 states a specific verb and resource: 'List bounded, paginated unique dated sailings' scoped to a public ship-itinerary group ID. It is clear what the tool does, though it does not explicitly distinguish itself from siblings like search_cruises or compare_sailings.
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?
Usage is implied by the required group ID and the note that older event-specific group IDs remain supported, but the description does not explicitly say when to use this tool instead of search_cruises, compare_sailings, or get_sailing. The schema adds that groupId comes from search_cruises, but the description itself provides only indirect guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_excursion_portsExplore excursion portsARead-onlyIdempotentInspect
List local cruise ports and whether excursion searches are supported. No Viator product request. Use the returned port ID for find_port_excursions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, so the safety profile needs no restating. The description's 'No Viator product request' adds genuine context about the absence of an external product call, consistent with openWorldHint=false, and it discloses what the result contains beyond a bare ID list.
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, front-loaded with the resource and purpose before the follow-up instruction. Nothing is padded or restated from the title or annotations.
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 no parameters and no output schema, the description must carry the return-value information itself, and it does: ports with a supported/unsupported flag plus the ID to use downstream. For a trivial lookup tool this leaves no meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate, and the 100% coverage baseline applies. The description does not need to explain inputs and correctly spends its words on output and follow-up instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List local cruise ports') plus the flag it returns ('whether excursion searches are supported'), and adds a scoping note ('No Viator product request'). It is clearly distinguishable from the excursion-search siblings, though it does not differentiate itself from other list_* tools such as list_departures.
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 routes the agent forward: 'Use the returned port ID for find_port_excursions' tells the caller this is a prerequisite lookup step rather than the search itself. No when-not-to-use condition is given, but the intended sequence is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
present_cruisesYour CruiseHops shortlistARead-onlyIdempotentInspect
Present the final shortlist of one to three selected sailings in ONE interactive widget. Call once after research, preserving exact offer IDs, cabin classes and event selectors. Research tools do not render widgets. Do not repeat all widget details in prose.
| Name | Required | Description | Default |
|---|---|---|---|
| sailings | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| items | Yes | |
| priceContext | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond the annotations: it renders one interactive widget, should be called once, and replaces prose repetition of widget details. The annotations already establish that this is read-only, idempotent, and non-destructive. It does not need to explain return values because an output schema 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 front-loaded with the core action and resource, followed by timing, ID-preservation, and prose guidance. Every sentence is relevant, and there is no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, output schema, and simple one-parameter structure, the description is nearly complete for correct invocation. It covers purpose, timing, widget behavior, and preservation requirements, though it could explicitly mention the required sailingId field.
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 description partially compensates for the low schema description coverage by naming exact offer IDs, cabin classes, event selectors, and the one-to-three limit. However, it does not mention the required sailingId field or other schema-level constraints. It adds meaningful preservation guidance but leaves gaps that the schema must cover.
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: presenting the final shortlist of one to three selected sailings in one interactive widget. It clearly distinguishes this final presentation step from research tools, which do not render widgets. An agent can identify the tool's role without opening the 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?
The description gives clear timing guidance: call once after research, with one to three selected sailings. It also says research tools do not render widgets, which implicitly routes research calls elsewhere. It does not name specific sibling alternatives or explicitly state when not to call it, so it falls just 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.
present_excursionsExplore port experiencesARead-onlyIdempotentInspect
Open ONE interactive port-experience browser when the user wants excursions, tours or activities. Omit portId to let the user choose a port without calling Viator. Supply a supported local portId and optional visit date and activity keywords q to show matching experiences. This makes a fresh on-demand search; use the returned data as the current result. Preserve requested filters. Do not fetch details for every result. Users can change ports, dates, keywords and pages, inspect one selected experience and open Viator booking links. Suggestions are not verified to fit time ashore; no live availability. Use only on an experience request, never automatically for every cruise search.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| date | No | ||
| page | No | ||
| portId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses that the call makes a fresh on-demand search, that suggestions are not verified to fit time ashore, and that there is no live availability. It also explains that users can change filters and open Viator booking links, and warns not to fetch details for every result. This is strong behavioral context for an interactive, read-only browser tool.
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 front-loaded with the core action and follows with useful constraints. Some UI workflow detail, such as users changing ports, dates, keywords and pages, is helpful but slightly verbose for a tool description.
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 complex interactive tool, it covers when to call, filter behavior, safety warnings, and user-facing interactions. However, with no output schema, it does not describe the returned data shape, and it does not state where to obtain a supported portId.
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?
With 0% schema description coverage, the description compensates for most parameters: it explains portId omission and supported local values, optional visit date, and activity keywords q. The page parameter is only implied through 'pages', so pagination semantics are not fully explicit.
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?
It uses a specific verb and resource: 'Open ONE interactive port-experience browser' for excursions, tours or activities. This clearly distinguishes the presentation/browser action from data-fetching siblings like find_port_excursions and get_excursion, and the first sentence is front-loaded.
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 conditions: use only on an experience request, never automatically for every cruise search, and omit portId to let the user choose a port without calling Viator. It also says not to fetch details for every result. It does not explicitly name sibling alternatives such as find_port_excursions or get_excursion, so it falls short of the highest tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cruisesFind cruisesARead-onlyIdempotentInspect
Find cruise recommendations and deals on CruiseHops across Carnival and Royal Caribbean by destination, departure port, dates, cabin and budget. Returns sailing links for further exploration on CruiseHops. Research only; no widget. Default three choices. Do not add cabin or budget constraints the user did not give. Search captured cruise sailings using typed filters. Prices are USD cents per person for two guests, not live or family quotes. Filter before grouping and choosing lowest cabin price. Use term IDs from suggest_cruise_terms for precise names.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Free-text cruise search; use suggest_cruise_terms to resolve precise entity names. | |
| page | No | One-based result page; default 1. | |
| ship | No | Source-native ship ID from items[].ship.id, not a suggestion term ID. Prefer terms for names. | |
| sort | No | ||
| view | No | Default groups combines departures for each ship itinerary; sailings returns one row per unique dated sailing. Event-specific fares remain available within each sailing. | |
| terms | No | Stable term IDs from suggest_cruise_terms; prefer these for entity-name filtering. | |
| dateTo | No | Inclusive latest departure date (YYYY-MM-DD). | |
| source | No | Source ID: carnival or royal_caribbean. | |
| amenity | No | Exact captured amenity name from get_sailing ship.amenities[].name. | |
| dateFrom | No | Inclusive earliest departure date (YYYY-MM-DD). | |
| pageSize | No | Items per page, 1โ50; default 3. | |
| returnBy | No | Inclusive latest disembarkation date, YYYY-MM-DD; excludes unknown return dates. This deadline never expands with dateFlexDays. | |
| nightsMax | No | Maximum nights, inclusive. Prefer nightsMin/nightsMax for cruise trip lengths; legacy durationMin/durationMax are days-only. | |
| nightsMin | No | Minimum nights. Uses advertised nights, otherwise calendar nights between captured departure and return dates. Unknown durations cannot match. | |
| roundtrip | No | ||
| cabinClass | No | Normalized cabin class: inside, oceanview, balcony, suite, or other, as captured on the offer. | |
| destination | No | Shared destination suggestion ID or destination label. Umbrella destinations such as Caribbean include mapped subregions across cruise lines. Specific regions remain strict; generic Caribbean does not imply Eastern Caribbean. Prefer suggest_cruise_terms to resolve names. | |
| durationMax | No | Maximum normalized duration in days, not advertised nights. | |
| durationMin | No | Minimum normalized duration in days, not advertised nights. | |
| visitedPort | No | Visited port selection: shared port suggestion ID or source-native items[].visitedPorts[].id. Reviewed equivalent ports match across cruise lines; source still restricts the line. | |
| dateFlexDays | No | Optional departure flexibility, 0โ30 days before dateFrom and after dateTo. Requires both dates when positive. Exact matches stay in items; outside-window options are separate dateAlternatives. All other filters remain strict. Use only when the user permits flexible dates. | |
| departurePort | No | Departure port selection: shared port suggestion ID or source-native items[].departurePort.id. Reviewed equivalent ports match across cruise lines; source still restricts the line. Different embarkation ports remain distinct. | |
| priceMaxCents | No | Maximum captured USD cents per person for two guests; 50000 means USD 500/person. Not a party total. | |
| departureTerms | No | Port IDs from suggest_cruise_terms, matching departure only (OR within this list). General terms ports also match visited ports. Other filters still apply. | |
| includeUnavailable | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| page | Yes | |
| view | Yes | |
| items | Yes | |
| total | Yes | |
| pageSize | Yes | |
| recovery | No | |
| priceContext | Yes | |
| selectedTerms | Yes | |
| totalSailings | Yes | |
| dateAlternatives | No | |
| selectedDepartureTerms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile, and the description adds meaningful behavioral context: results are captured cruise sailings rather than live quotes, prices are USD cents per person for two guests, and filtering should occur before grouping or choosing lowest cabin price. It does not mention rate limits or pagination behavior, but those are not central to the tool's safety profile.
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 front-loaded with the core purpose and constraints, and most sentences carry actionable information. It is slightly dense and includes a bit of repetition between 'Find cruise recommendations' and 'Search captured cruise sailings,' but it remains efficient for a 25-parameter search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex 25-parameter schema, output schema, and helpful annotations, the description provides enough context to call the tool correctly. It covers the research-only nature, default result count, user-constraint caution, term ID usage, and price semantics. It could go further by naming when to use this versus compare_sailings or list_departures, but it is broadly complete.
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 high at 88%, so the schema already documents most parameters. The description still adds value by emphasizing term IDs from suggest_cruise_terms for precise entity names and by warning not to add cabin or budget constraints the user did not provide. It also clarifies price interpretation, though that is already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb and resource: find cruise recommendations and deals on CruiseHops across Carnival and Royal Caribbean, filtered by destination, departure port, dates, cabin, and budget. It also clarifies that it searches captured cruise sailings and returns sailing links, but it does not explicitly distinguish itself from siblings such as compare_sailings or list_departures.
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 provides useful usage context: research only, no widget, default three choices, and do not add cabin or budget constraints the user did not give. It also directs agents to use term IDs from suggest_cruise_terms for precise names. However, it does not explicitly state when to choose this tool over alternatives like compare_sailings or present_cruises.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_cruise_termsFind ships and destinationsBRead-onlyIdempotentInspect
Suggest matching ship, port, destination and cruise line names, including suffix words. Returns stable term IDs for search filters.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | ||
| page | No | One-based result page; default 1. | |
| ship | No | Source-native ship ID from items[].ship.id, not a suggestion term ID. Prefer terms for names. | |
| sort | No | ||
| view | No | Default groups combines departures for each ship itinerary; sailings returns one row per unique dated sailing. Event-specific fares remain available within each sailing. | |
| limit | No | ||
| terms | No | Stable term IDs from suggest_cruise_terms; prefer these for entity-name filtering. | |
| cursor | No | ||
| dateTo | No | Inclusive latest departure date (YYYY-MM-DD). | |
| source | No | Source ID: carnival or royal_caribbean. | |
| amenity | No | Exact captured amenity name from get_sailing ship.amenities[].name. | |
| dateFrom | No | Inclusive earliest departure date (YYYY-MM-DD). | |
| pageSize | No | Items per page, 1โ50; default 3. | |
| returnBy | No | Inclusive latest disembarkation date, YYYY-MM-DD; excludes unknown return dates. This deadline never expands with dateFlexDays. | |
| nightsMax | No | Maximum nights, inclusive. Prefer nightsMin/nightsMax for cruise trip lengths; legacy durationMin/durationMax are days-only. | |
| nightsMin | No | Minimum nights. Uses advertised nights, otherwise calendar nights between captured departure and return dates. Unknown durations cannot match. | |
| roundtrip | No | ||
| cabinClass | No | Normalized cabin class: inside, oceanview, balcony, suite, or other, as captured on the offer. | |
| destination | No | Shared destination suggestion ID or destination label. Umbrella destinations such as Caribbean include mapped subregions across cruise lines. Specific regions remain strict; generic Caribbean does not imply Eastern Caribbean. Prefer suggest_cruise_terms to resolve names. | |
| durationMax | No | Maximum normalized duration in days, not advertised nights. | |
| durationMin | No | Minimum normalized duration in days, not advertised nights. | |
| visitedPort | No | Visited port selection: shared port suggestion ID or source-native items[].visitedPorts[].id. Reviewed equivalent ports match across cruise lines; source still restricts the line. | |
| dateFlexDays | No | Optional departure flexibility, 0โ30 days before dateFrom and after dateTo. Requires both dates when positive. Exact matches stay in items; outside-window options are separate dateAlternatives. All other filters remain strict. Use only when the user permits flexible dates. | |
| departurePort | No | Departure port selection: shared port suggestion ID or source-native items[].departurePort.id. Reviewed equivalent ports match across cruise lines; source still restricts the line. Different embarkation ports remain distinct. | |
| priceMaxCents | No | Maximum captured USD cents per person for two guests; 50000 means USD 500/person. Not a party total. | |
| departureTerms | No | Port IDs from suggest_cruise_terms, matching departure only (OR within this list). General terms ports also match visited ports. Other filters still apply. | |
| includeUnavailable | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| items | Yes | |
| total | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds useful behavior by mentioning suffix-word matching and stable term ID returns, but it does not explain matching behavior, limits, empty-result behavior, or pagination beyond what the schema provides.
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 two sentences with no wasted text. It front-loads the core purpose and follows with the return/usage detail, which is efficient and appropriately sized.
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?
This is a 27-parameter tool, and the description does not explain how the many optional filter parameters affect suggestions or why a suggestion endpoint accepts date, price, cabin, and itinerary filters. The output schema reduces the need to describe return values, but the gap between the simple description and the complex input schema leaves important context unstated.
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 78%, so most parameters already have meaning in the schema and the baseline expectation is schema-driven. The description does not explain any parameter, including the required 'q', so it fails to add meaning beyond the schema, though the schema itself carries substantial parameter documentation.
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 set: 'Suggest matching ship, port, destination and cruise line names' and adds that it returns stable term IDs. It is clearer than a generic search tool, but it does not explicitly distinguish itself from siblings such as search_cruises or list_departures.
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 'Returns stable term IDs for search filters' implies the intended downstream use, but the description gives no explicit when-to-use guidance, exclusions, or named alternatives among the sibling tools. Usage is inferable rather than stated.
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
- First observed
compare_sailings - First observed
find_port_excursions - First observed
get_excursion - First observed
get_price_history - First observed
get_sailing - First observed
list_departures - First observed
list_excursion_ports - First observed
present_cruises - First observed
present_excursions - First observed
search_cruises - First observed
suggest_cruise_terms
Related MCP Servers
- AlicenseNot gradedqualityCmaintenancePerplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.2Apache 2.0
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs113 npm54 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1618 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent โ real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.