Skip to main content
Glama

hotelbeds-mcp-server

An MCP server that wraps the Hotelbeds (HBX Group) Hotel Booking and Content APIs, exposing nine tools for searching, booking, managing and enriching hotel reservations from any MCP client. Built as the hotel counterpart to duffel-mcp-server.

A thought-through proof of concept — validated end to end against the Hotelbeds sandbox, but not production-ready.

Status

  • Nine tools, validated end to end through the MCP protocol against the Hotelbeds test environment (api.test.hotelbeds.com).

  • Flights-only sibling lives in duffel-mcp-server; this one is hotels-only.

  • stdio transport, designed to run locally alongside an MCP client such as Claude Desktop.

Related MCP server: TripWeaver MCP Server

Tools

Booking lifecycle

Tool

Hotelbeds call

Purpose

search_hotels

POST /hotel-api/1.0/hotels

Availability by destination or hotel codes. Returns rateKeys.

check_rate

POST /hotel-api/1.0/checkrates

Re-validate a rateKey for its authoritative price. Required when rateType is RECHECK.

create_booking

POST /hotel-api/1.0/bookings

Book a rate — surface-and-reconfirm (see below).

get_booking

GET /hotel-api/1.0/bookings/{ref}

Retrieve a booking and its status.

get_cancellation_quote

DELETE …?cancellationFlag=SIMULATION

Cancellation charge without cancelling.

cancel_booking

DELETE …?cancellationFlag=CANCELLATION

Permanently cancel. Requires confirm=true.

Content

Tool

Hotelbeds call

Purpose

list_destinations

GET /hotel-content-api/1.0/locations/destinations

Resolve destination codes for a country (feed as destinationCode to search_hotels).

list_hotels_content

GET /hotel-content-api/1.0/hotels

Browse a destination's static portfolio — names, categories, coordinates, addresses.

get_hotel_details

GET /hotel-content-api/1.0/hotels/{codes}/details

Full content for chosen hotels: description, images, facilities, address, phones, boards.

The Content API shares the same keypair and signature as the Booking API — it just lives at the /hotel-content-api/1.0/ base path (hbContentGet in src/client.js). Image path values are relative GIATA paths; the server prefixes them with https://photos.hotelbeds.com/giata/bigger/ to produce usable URLs.

The two canonical flows

Book: search_hotels → check_rate (only when a rate's rateType is RECHECK) → create_booking → get_booking.

create_booking is a deliberate two-step, because the Hotelbeds sandbox injects price drift between checkrate and booking:

  1. Call it without acceptedNet. It re-validates the rate and returns status: "CONFIRMATION_REQUIRED" with currentNet — no booking is made.

  2. Call again with acceptedNet set to that currentNet. If the live price is still within tolerance (default 2%), it books and returns CONFIRMED; if the price rose beyond tolerance, it re-surfaces instead of booking. A price drop never blocks.

Cancel: get_cancellation_quote (SIMULATION — returns the charge, booking stays live) → cancel_booking (CANCELLATION, confirm: true). The same quote-then-commit safety as the booking step.

Quick start

npm install
cp .env.example .env     # then fill in your Hotel API keypair
npm run smoke            # walks the full loop against the sandbox

Connecting to Claude Desktop

Add to claude_desktop_config.json (standard build: %APPDATA%\Claude\ on Windows, ~/Library/Application Support/Claude/ on macOS; the Windows Store/MSIX build lives under %LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\). On Windows, note the doubled backslashes.

{
  "mcpServers": {
    "hotelbeds": {
      "command": "node",
      "args": ["/absolute/path/to/hotelbeds-mcp-server/src/index.js"],
      "env": {
        "HOTELBEDS_API_KEY": "your_hotel_api_key",
        "HOTELBEDS_SECRET": "your_hotel_api_secret"
      }
    }
  }
}

Behind a TLS-inspecting corporate proxy (e.g. Zscaler), Node will reject the HTTPS calls with UNABLE_TO_GET_ISSUER_CERT_LOCALLY. Add "NODE_EXTRA_CA_CERTS": "/path/to/corp-root-ca.cer" to the env block to trust the corporate root CA. Then restart Claude Desktop fully.

Testing a tool in isolation

npm run smoke spawns the server over stdio and exercises all nine tools. To hit one handler directly without the protocol:

node --input-type=module -e "
import { searchHotels } from './src/tools/search-hotels.js';
const r = await searchHotels({ checkIn:'2026-09-15', checkOut:'2026-09-17', destinationCode:'PMI', adults:2, limit:3 });
console.log(r.content[0].text);
"

(Requires HOTELBEDS_API_KEY / HOTELBEDS_SECRET in the environment.)

Credentials

Register at the Hotelbeds APItude developer portal and request the Hotel API test keypair. The one keypair authenticates both the Booking and Content APIs. Auth is Api-key + X-Signature, where the signature is SHA256(apiKey + secret + unixTimestampSeconds) in hex, recomputed per request (handled in src/client.js). Set HOTELBEDS_BASE_URL to https://api.hotelbeds.com for live; it defaults to the test endpoint.

Project structure

src/
  index.js            MCP server — registers the nine tools
  client.js           signed request helpers (hbRequest for booking, hbContentGet for content)
  util.js             tool-result formatting
  tools/
    search-hotels.js        check-rate.js           create-booking.js
    get-booking.js          get-cancellation-quote.js  cancel-booking.js
    list-destinations.js    list-hotels-content.js  get-hotel-details.js
test/
  smoke.mjs           end-to-end stdio smoke test
docs/
  content-api.md      Content API field/shape notes

Known limitations

  • Single-room bookings. create_booking handles one room per booking; multi-room would extend the paxes/roomId mapping across several rateKeys.

  • Flights-only scope elsewhere. Transfers and Activities are not included (Hotelbeds has sunset its Activities API; Transfers would need its own keypair).

  • facilities is noisy. Hotelbeds returns real amenities alongside structural metadata (e.g. "Number of floors") in the same array; the server passes them through unfiltered.

  • stdio only. To host remotely, convert to Streamable HTTP and add Bearer-token auth — an open endpoint would let anyone create or cancel real bookings on your account.

Licence

MIT © 2026 Karan Rao

Available Tools

9 tools
cancel_bookingCancel bookingA

Permanently cancel a booking. Requires confirm=true. Use get_cancellation_quote first to see the charge.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true to actually cancel — a guard against accidental cancellation.
referenceYesBooking reference to cancel.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the two key traits: the action is irreversible ('Permanently') and a confirm guard prevents accidental execution. It does not mention auth/permission requirements, refund side effects, or idempotency, so it stops short of full disclosure.

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 with zero filler, and the irreversible nature plus the confirm requirement are front-loaded ahead of the optional-prerequisite hint. 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 two-parameter destructive tool with no output schema, the description covers purpose, irreversibility, guard, and the recommended pre-step. It is largely complete, though it omits what happens on failure or what the cancellation returns (refund/charge confirmation).

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 both parameters are already documented in the schema, including the 'Must be true' guard semantics for confirm. The description restates the confirm requirement but adds no format or value detail beyond the schema, so baseline 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?

States a specific verb and resource ('Permanently cancel a booking') and immediately distinguishes the operation from sibling reads like get_booking and get_cancellation_quote through the word 'Permanently'. The scope is unambiguous without consulting the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the prerequisite alternative explicitly ('Use get_cancellation_quote first to see the charge') and states the gating condition ('Requires confirm=true'). The agent knows both the sequencing and the guard needed before invoking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_rateCheck rateA

Re-validate one or more rateKeys and return the authoritative current price. Required before booking when a rate's rateType is RECHECK.

ParametersJSON Schema
NameRequiredDescriptionDefault
rateKeysYesOne or more rateKeys from search_hotels to re-validate.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses the core trait (re-validation returning current price) and a booking precondition, but omits error behavior, idempotency, auth requirements, and whether the returned price is held.

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 purpose is front-loaded and immediately followed by the critical booking precondition.

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 tool is simple (one required param, full schema coverage), and the description covers its purpose, input source, precondition, and that it returns a current price. It lacks detail on the returned price shape per rateKey and error behavior, but is sufficient for basic invocation.

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 description already says 'One or more rateKeys from search_hotels to re-validate.' The tool description repeats this without adding syntax, format, or per-key return meaning, so baseline 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?

States a specific verb (Re-validate) and resource (rateKeys) plus the outcome (authoritative current price). It also distinguishes itself from search_hotels by naming it as the source of rateKeys and from create_booking by stating its precondition role.

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?

Gives an explicit trigger: 'Required before booking when a rate's rateType is RECHECK.' This clear context tells the agent when to call it, but it does not explicitly state when not to use it or name an alternative for non-RECHECK rates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_bookingCreate bookingA

Book a rate. Two-step surface-and-reconfirm: call once WITHOUT acceptedNet to surface the live price, then again WITH acceptedNet set to that price to commit. Re-surfaces if the price moves beyond tolerance.

ParametersJSON Schema
NameRequiredDescriptionDefault
paxesYesAll guests; must match the rate's occupancy.
remarkNo
rateKeyYesrateKey to book (from search_hotels or check_rate).
toleranceNoAllowed % price increase before re-confirmation is required.
holderNameYesLead guest first name.
acceptedNetNoThe net price you have agreed to pay. OMIT on the first call to receive a price quote. On the second call, set it to the currentNet the first call returned, to commit.
holderSurnameYesLead guest surname.
clientReferenceNoYour own booking reference for reconciliation. Auto-generated if omitted (Hotelbeds requires one).

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden; it discloses the non-obvious two-phase quoting/committing behavior and the price-tolerance re-confirmation loop, which the schema alone would not make clear. It omits irreversibility/permissions/payment consequences and the fact that a successful second call creates a real reservation, which are material for a mutation tool.

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, zero filler, and the critical first-vs-second-call distinction is front-loaded before the tolerance caveat. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description should carry return-value expectations; it conveys that the first call yields a live price and the second commits, but not what a committed booking returns (reference, status) or failure modes. Adequate for the happy path, incomplete for the full call cycle.

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 88%, so the schema already documents acceptedNet's quote-then-commit semantics and tolerance. The description reinforces the acceptedNet usage but adds no syntax, format, or edge-case detail beyond it, so the baseline 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?

States a specific verb+resource ('Book a rate') and immediately scopes it with the two-step surface-and-reconfirm protocol. An agent can distinguish this committing action from the sibling read tools (search_hotels, check_rate) 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit sequencing: call once WITHOUT acceptedNet to get a price, then again WITH acceptedNet set to that price to commit, and notes re-surfacing when price moves beyond tolerance. It does not name sibling alternatives (e.g. check_rate) or when-not-to-use, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bookingGet bookingB

Retrieve a booking by reference, including its current status.

ParametersJSON Schema
NameRequiredDescriptionDefault
referenceYesHotelbeds booking reference, e.g. '1-8278844'.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. 'Retrieve' correctly signals a non-mutating read and 'including its current status' hints at what is returned, but nothing is said about authorization, behavior for unknown or expired references, or error handling.

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?

One sentence, zero waste, with the operation and lookup key front-loaded. Nothing needs to be trimmed and nothing is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema this is only marginally sufficient. Since no output schema exists, the description should describe what the returned booking looks like beyond a bare mention of 'current status', leaving a gap an agent cannot fill from structured fields.

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%: the single 'reference' parameter is already documented in the schema with an example format ('1-8278844'). The description names the parameter's role but adds no syntax or validation detail beyond the schema, so baseline 3 applies.

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?

States a specific verb (Retrieve), resource (booking), and lookup key (by reference), plus the salient payload element (current status). It does not differentiate itself from siblings such as cancel_booking, create_booking, or get_cancellation_quote, so an agent must infer the boundary from names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus cancel_booking, get_cancellation_quote, or create_booking. 'By reference' implies it operates on an existing booking, but no prerequisites, alternates, or when-not conditions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cancellation_quoteGet cancellation quoteA

Return the cancellation charge for a booking WITHOUT cancelling it (simulation). The booking remains active.

ParametersJSON Schema
NameRequiredDescriptionDefault
referenceYesBooking reference to quote a cancellation for.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the single most important trait: this is a read-only simulation with no state change ('booking remains active'). It does not cover error behavior for an invalid reference, permission needs, or whether the quoted charge is guaranteed at cancellation time.

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 sentences, zero filler, with the non-destructive guarantee front-loaded in caps for emphasis. Nothing here is redundant.

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 one-parameter read tool this is close to complete, and 'return the cancellation charge' hints at the return value despite no output schema. It could still say more about what the quote contains or how failures are reported.

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% for the single 'reference' parameter, so the schema already documents it fully. The description adds no format, validation, or lookup semantics beyond what the schema provides, making the baseline 3 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?

States a specific verb (return) and resource (the cancellation charge for a booking) and immediately scopes it as a simulation that does not cancel. This cleanly separates it from the sibling cancel_booking, which an agent could otherwise confuse it with.

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 makes the usage context clear — this is the preview path, the booking stays active — which implies 'use before deciding to cancel'. It does not explicitly name cancel_booking as the alternative or state when a quote is unavailable, so it falls just short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hotel_detailsGet hotel detailsB

Full static content for one or more hotels: description, images, facilities, address, coordinates, phones, boards.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNoContent language code, e.g. 'ENG'.ENG
maxImagesNoMax image URLs to return per hotel.
hotelCodesYesOne hotel code, or several, to fetch full content for.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden; it does signal a read-only 'static content' retrieval and lists the returned fields, which gives some transparency. However, it omits whether codes must first come from search_hotels, whether unknown codes error or return empty, and any rate or language limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence, front-loaded with scope ('one or more hotels') followed by the payload list. No filler or restated name; slightly dense but earns its words.

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?

There is no output schema, so the description compensates by enumerating the returned static fields (description, images, facilities, address, coordinates, phones, boards), which is what an agent needs. Only the absence of any usage routing or failure behavior keeps it short of complete.

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 baseline is 3. The description reinforces the key semantic that hotelCodes accepts 'one or more' hotels, matching the integer-or-array schema, but adds nothing about language or maxImages beyond what the schema already documents.

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?

States a specific verb and resource ('full static content for one or more hotels') and enumerates the content returned, so the agent knows exactly what it retrieves. It does not explicitly distinguish itself from the sibling list_hotels_content, whose name suggests overlapping content, leaving some ambiguity about which to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisite, and no mention of alternatives despite two other sibling tools (search_hotels, list_hotels_content) that plausibly overlap. The agent must infer that this is the detail-fetch step after a search, which is reasonable but unstated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_destinationsList destinationsA

List Hotelbeds destination codes for a country (optionally filtered by name). Use the code as destinationCode in search_hotels.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax destinations to return.
countryCodeYesISO country code to list destinations for, e.g. 'ES', 'GB'.
nameContainsNoOptional case-insensitive filter on the destination name.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden, and it does disclose the key behavioral trait: this is a code-lookup that feeds search_hotels rather than a search itself. It implies a safe read but never states that the operation is non-mutating or mentions rate limits or result-count behavior beyond the schema's limit field.

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 sentences, front-loaded with what the tool returns and followed by how to use the output. Every clause earns its place with no filler.

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 three-parameter list tool with a fully documented schema and no output schema, the definition says what comes back (destination codes) and how to consume it. It stops just short of describing pagination/limit interaction or the shape of each returned item, which keeps it from a 5.

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%, so countryCode, nameContains, and limit are all documented in the schema itself. The description only restates country scoping and the optional name filter, adding no format or semantics beyond the structured fields; baseline 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?

States a specific verb and resource (list destination codes) plus the scoping constraint (for a country, optional name filter). The 'Hotelbeds destination codes' phrasing and the downstream tie to search_hotels make it immediately distinguishable from lookup siblings like get_hotel_details or list_hotels_content.

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 tells the agent when to use the result: 'Use the code as destinationCode in search_hotels,' which routes it correctly in the booking flow. It does not name a competing alternative or state when not to use this tool, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_hotels_contentList hotels (content)A

Browse the static hotel portfolio for a destination or set of hotel codes — names, categories, coordinates, addresses.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax hotels to return (max 100).
hotelCodesNoSpecific hotel codes. Provide this OR destinationCode.
destinationCodeNoDestination code, e.g. 'PMI'. Provide this OR hotelCodes.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the behavioral burden. 'Static hotel portfolio' usefully signals read-only, non-live content (no rates or availability), but it never states the operation is non-mutating outright, nor does it describe pagination/limit behavior or any auth requirements. Partial coverage for a read tool.

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 em-dash-delimited sentence that front-loads the verb and resource and then lists outputs. Every clause earns its place with no filler.

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 no output schema, the description wisely enumerates the returned fields, and with no annotations it correctly frames the data as static. For a simple three-parameter, zero-required list tool this is close to sufficient; only pagination behavior and permission expectations remain unstated.

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 each parameter already documents itself, including the mutually exclusive 'provide this OR' relationship. The description's 'destination or set of hotel codes' restates that without adding format, syntax, or defaulting 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.

Purpose4/5

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

States a specific verb and resource ('Browse the static hotel portfolio') and enumerates the returned fields (names, categories, coordinates, addresses), so the agent knows this is a content lookup rather than a live-availability query. It does not explicitly name the near-neighbor siblings search_hotels or get_hotel_details, so the boundary is inferred rather than stated.

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 description and schema together convey the two entry modes (by destination or by hotel codes), which implies when to reach for it. However, it offers no explicit guidance on when to prefer search_hotels, get_hotel_details, or check_rate instead, and no prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_hotelsSearch hotelsC

Search hotel availability by destination code or hotel codes for given dates and occupancy. Returns hotels with bookable rateKeys.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax hotels to return.
roomsNoNumber of rooms.
adultsNoAdults per room.
checkInYesCheck-in date, YYYY-MM-DD.
checkOutYesCheck-out date, YYYY-MM-DD.
childrenNoChildren per room.
hotelCodesNoSpecific Hotelbeds hotel codes. Provide this OR destinationCode.
childrenAgesNoAge of each child; required when children > 0.
destinationCodeNoHotelbeds destination code, e.g. 'PMI'. Provide this OR hotelCodes.
maxRatesPerHotelNoMax (cheapest) rates to return per hotel.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden but only states that results include bookable rateKeys. It omits authentication needs, rate limits, pagination behavior, and what happens when no hotels are available.

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 wasted words. The primary action and scope are front-loaded, followed by a brief return-value note.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter search tool with no output schema and no annotations, the description is minimal. It lacks usage guidance, result semantics beyond 'bookable rateKeys', and any workflow relationship to siblings like check_rate or create_booking.

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%, so all 10 parameters are already documented. The description repeats destinationCode/hotelCodes, dates, and occupancy without adding syntax, defaults, or format details beyond the schema.

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 states a specific verb (Search) and resource (hotel availability) with the scope (destination code or hotel codes, dates, occupancy). It implies differentiation from content-only siblings, but does not explicitly name any alternative tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus siblings such as check_rate or list_hotels_content. The only usage hint is the schema's 'Provide this OR hotelCodes' constraint, which is already in structured data.

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. 9 tool updatesv1.0.0
    • First observedcancel_booking
    • First observedcheck_rate
    • First observedcreate_booking
    • First observedget_booking
    • First observedget_cancellation_quote
    • First observedget_hotel_details
    • First observedlist_destinations
    • First observedlist_hotels_content
    • First observedsearch_hotels

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation4/5

Most tools are clearly distinct (search vs book vs cancel vs quote). Minor overlap between list_hotels_content and get_hotel_details, both returning static hotel content, but the browse-vs-detail distinction is described well enough. check_rate vs search_hotels are also differentiated by the recheck purpose.

Naming Consistency5/5

Every tool follows a consistent snake_case verb_noun pattern (search_hotels, check_rate, create_booking, get_cancellation_quote, list_destinations). Verbs are used predictably across the set.

Tool Count5/5

Nine tools is well-scoped for a hotel booking domain, covering search, content, booking, and cancellation without redundancy. Each tool earns its place.

Completeness4/5

Strong lifecycle coverage: search, rate recheck, create, get, cancel, and cancellation quote, plus static content and destination lookup. Minor gaps like modifying an existing booking or listing a user's bookings, but core workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers