BookHotels.direct
Server Details
Is a hotel cheaper on its own website than on Booking.com? An honest, like-for-like check.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 3 tools
check_direct_price initiates a comparison, report_hotel_price supplies the hotel's own prices to complete a check, and report_booking records the traveller's booking outcome. Their roles are distinct, though check_direct_price and report_hotel_price both involve price comparison and could momentarily overlap.
All names use snake_case and start with a clear action verb followed by an object. 'check_direct_price' uses an adjective ('direct') unlike the report_* tools, which is a minor inconsistency but still readable.
Three tools map directly to the narrow workflow: one check and two feedback reports. That is appropriately scoped for a single-purpose price-comparison service; each tool earns its place.
The surface covers the check-and-report lifecycle, including fallback when automated reading fails and reporting booking outcomes. Minor gaps exist, such as no explicit retrieval of prior checks or support for multiple rooms, but these are likely by design.
Available Tools
3 toolscheck_direct_priceCheck the hotel's own price against Booking.comARead-onlyInspect
Checks whether a hotel is cheaper on its own website than on Booking.com, for one stay. Give the hotel, the dates, the guests and, when you have it, the total Booking.com shows for the whole stay with its meal plan and cancellation terms. BookHotels.direct reads the hotel's own booking site live, applying the public promo codes and free-club prices it knows for that hotel, or uses a traveller's read of the same stay from the last 24 hours, and compares like for like: same hotel, dates and guests, with every difference in room, meal plan or cancellation stated. The answer is honest either way: when Booking.com is cheaper, it says so. When the hotel's site cannot be read automatically, the answer gives the link to the hotel's own site for these dates and asks you to report the prices shown there with report_hotel_price. Without a Booking.com total, the answer gives the hotel's own price and, when the evidence allows, an estimated saving, always labelled as an estimate with its basis. Only Booking.com prices can be compared. One room per check.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | The town or city the hotel is in, e.g. "Sitges". Helps find hotels we have not checked before. | |
| hotel | Yes | The hotel's name as the traveller sees it, e.g. "Hotel Calipolis". | |
| adults | No | Number of adults (default 2). | |
| checkin | Yes | Check-in date, YYYY-MM-DD. | |
| checkout | Yes | Check-out date, YYYY-MM-DD. | |
| language | No | Language of the check page for the traveller (default en). | |
| booking_url | No | Optional: the Booking.com address of the hotel's page (https://www.booking.com/hotel/…). Only the address is read, to recognise the hotel and the dates; the page is never opened. | |
| booking_room | No | The room name of the Booking.com offer, when shown. | |
| booking_total | No | The total Booking.com shows for the whole stay, in euros, when known. Without it you get the hotel's own price and, when the evidence allows, an estimated saving. | |
| children_ages | No | Each child's age on the day of check-out, one number per child. Leave out when no children travel. Hotels price children by age, so ages are needed for families. | |
| booking_meal_plan | No | The meal plan of the Booking.com offer, when Booking.com shows it. | |
| booking_taxes_extra | No | Taxes Booking.com lists on top of its total, in euros (e.g. a city tax), when shown. | |
| booking_cancellation | No | The cancellation terms of the Booking.com offer, when Booking.com shows them: free cancellation, non-refundable, or partly refundable. | |
| booking_taxes_included | No | true when Booking.com says its total includes taxes and charges; false when it lists taxes on top. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/openWorldHint/openWorld it discloses how the answer is produced: a live read of the hotel's own booking site, promo-code and free-club pricing, or a traveller's read from the last 24 hours, and comparison 'like for like' with every room/meal/cancellation difference stated. It also flags the non-deterministic character implied by idempotentHint=false and is honest about failure modes and estimate labelling.
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?
Purpose and inputs come first, then behaviour, then the fallback path — a good front-loaded order with no filler sentences. It is dense but the booking_total behaviour is stated twice (prose and schema), costing a little tightness.
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 14-parameter, no-output-schema tool this covers what an agent needs: required inputs, which optionals improve fidelity, what the answer contains (comparison verdict, link fallback, labelled estimate with basis), and the comparison's limits. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds conditional priority ('when you have it', the meal plan and cancellation terms) and explains the consequence of omitting booking_total. It does not walk through the taxes or children_ages semantics, which remain schema-only.
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 precise verb and comparison ('Checks whether a hotel is cheaper on its own website than on Booking.com, for one stay'), naming both data sources and the unit of work. An agent knows exactly what question this tool answers, and the sibling names (report_booking, report_hotel_price) are routed away from it explicitly.
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?
Gives positive conditions (supply hotel, dates, guests and, 'when you have it', the Booking.com total), branches (without a total you get the hotel's own price plus a labelled estimate), a fallback path ('asks you to report the prices shown there with report_hotel_price'), and hard exclusions ('Only Booking.com prices can be compared. One room per check.').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_bookingReport that the traveller bookedAIdempotentInspect
When the traveller tells you they booked a hotel after a check_direct_price answer, report whether they booked it on the hotel's own website, with the check_id. Only report what the traveller told you. Nothing about the traveller is sent or kept: only that the check led to a booking, and its total when given.
| Name | Required | Description | Default |
|---|---|---|---|
| check_id | Yes | The check_id returned by check_direct_price. | |
| total_paid | No | The total the traveller says they paid, in euros, when they say it. | |
| booked_direct | Yes | true when the traveller booked on the hotel's own website; false when they booked elsewhere or not at all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the bar is lower. The description adds real value beyond them: a privacy guarantee ('Nothing about the traveller is sent or kept') and the data-accuracy rule to report only first-hand traveller claims. Idempotency is left to annotations, which is acceptable.
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 that front-load the trigger condition, then the data-source rule, then the privacy note. Every sentence carries distinct information, with only mild overlap between 'Only report what the traveller told you' and the privacy clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter write tool with an output schema absent but annotations covering safety and idempotency, the description supplies trigger, data-source discipline, and privacy behavior. Nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds cross-parameter meaning: check_id must come from a prior check_direct_price call, and 'its total when given' reinforces that total_paid is optional and conditionally supplied. This goes slightly beyond the schema's own text.
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 (report) and resource (whether a booking happened, and whether it was direct) and anchors it to the check_direct_price flow, so the agent can tell it apart from check_direct_price and report_hotel_price. No ambiguity about what the tool records.
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?
Gives an explicit trigger: 'When the traveller tells you they booked a hotel after a check_direct_price answer.' It also constrains the data source ('Only report what the traveller told you'). It doesn't name the sibling alternatives or when-not to call it, keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_hotel_priceReport the prices seen on the hotel's own siteAInspect
After check_direct_price asked you to open the hotel's own website for a stay, report the prices that site showed for the same dates and guests, and get the honest comparison with Booking.com. Give the check_id from check_direct_price and one entry per room or rate you saw, each with its total for the whole stay in euros and, when shown, its meal plan and cancellation terms. Report only what the hotel's own site showed; leave a field out when the site did not say it. The report is kept anonymously so the next traveller asking about the same stay gets an answer at once.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | The town or city the hotel is in, e.g. "Sitges". Helps find hotels we have not checked before. | |
| hotel | No | The hotel's name as the traveller sees it, e.g. "Hotel Calipolis". | |
| adults | No | Number of adults (default 2). | |
| offers | Yes | The rooms and rates the hotel's own site showed for the stay. | |
| checkin | No | Check-in date, YYYY-MM-DD. | |
| check_id | No | The check_id returned by check_direct_price. | |
| checkout | No | Check-out date, YYYY-MM-DD. | |
| page_url | No | The address of the hotel's page where you saw the prices (only its host is kept). | |
| booking_url | No | Optional: the Booking.com address of the hotel's page (https://www.booking.com/hotel/…). Only the address is read, to recognise the hotel and the dates; the page is never opened. | |
| booking_room | No | The room name of the Booking.com offer, when shown. | |
| booking_total | No | The total Booking.com shows for the whole stay, in euros, when known. Without it you get the hotel's own price and, when the evidence allows, an estimated saving. | |
| children_ages | No | Each child's age on the day of check-out, one number per child. Leave out when no children travel. Hotels price children by age, so ages are needed for families. | |
| booking_meal_plan | No | The meal plan of the Booking.com offer, when Booking.com shows it. | |
| booking_taxes_extra | No | Taxes Booking.com lists on top of its total, in euros (e.g. a city tax), when shown. | |
| booking_cancellation | No | The cancellation terms of the Booking.com offer, when Booking.com shows them: free cancellation, non-refundable, or partly refundable. | |
| booking_taxes_included | No | true when Booking.com says its total includes taxes and charges; false when it lists taxes on top. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=false, and the description corroborates the write behavior by explaining the side effect: 'The report is kept anonymously so the next traveller asking about the same stay gets an answer at once.' It also adds a data-integrity rule ('Report only what the hotel's own site showed; leave a field out when the site did not say it') that 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?
Front-loaded with the trigger and handoff ('After check_direct_price…'), then what to submit, then a one-sentence rationale for the anonymous storage. No sentence is redundant with the title or schema.
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 16-parameter tool with no output schema, the description covers the workflow, the required check_id, the offer-entry shape and the omission rule, and hints at the returned comparison/saving. It leaves the exact response shape to be inferred, but the schema's parameter text fills most remaining 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?
Schema coverage is 100%, so the baseline is 3; the description earns a notch above by giving an inclusion rule beyond the schema — omit fields the site did not state — and by clarifying that each offer entry needs a whole-stay total in euros plus, when present, meal plan and cancellation terms.
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: report the prices the hotel's own site showed for the same stay, and get a Booking.com comparison. It distinguishes itself from the sibling check_direct_price by naming the sequencing ('After check_direct_price asked you to open the hotel's own website'), so an agent can place it without opening a 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 trigger is explicit: use this after check_direct_price has sent you to the hotel's own site, and pass the check_id it returned. It doesn't state an explicit when-not (e.g. what to do if the site showed no prices), but the preconditions and required handoff are clear.
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.
3 tool updates
- First observed
check_direct_price - First observed
report_booking - First observed
report_hotel_price
Related MCP Connectors
Hotels that book direct: search, live-availability links, and AI-agent readiness checks.
Hotels ranked by real comfort, not commission: efficient AC, comfy beds, soundproof rooms and more
Independent hotel research from guest reviews: bed bugs, pests, noise and hidden fees.
Compare hotel prices, room options and booking providers with live HotelUse searches.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables verified, bookable hotel price checking with tax-inclusive totals, OTA tax status flags, and durable Booking.com fallback links for budget travel planning.MIT
- AlicenseBqualityAmaintenanceOfficial MCP server for MAQAMI, a hotel and flight booking platform with 3M+ hotels. Search live hotel rates and flights, look up places, airports and hotel details, then prebook and book. Remote Streamable HTTP endpoint, no API key required.4186 npm2MIT
- AlicenseAqualityBmaintenanceTravel award search: compare cash vs points on hotels, flights & cars, cents-per-point, and book319MIT
- AlicenseNot gradedqualityDmaintenanceLuxury hotel intelligence and secure checkout handoff for AI travel agents.1Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.