BookHotels.direct

Is a hotel cheaper on its own website than on Booking.com? An honest, like-for-like check.

Should I use this

Quality & Safety

A
Description quality
93%
Schema completeness
100%
Naming quality
87%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,040Tokens (tool definitions)
~6.2 KBTypical response size
Moderate attention impact (1.59% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "hotel-price-check": {
      "url": "https://bookhotels.direct/mcp"
    }
  }
}

Remote endpoints

https://bookhotels.direct/mcpstreamable-http

What it can do

Tool inventory

Tools (3)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢check_direct_price(hotel, city, booking_url, checkin, checkout, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "hotel": {
      "type": "string",
      "description": "The hotel's name as the traveller sees it, e.g. \"Hotel Calipolis\"."
    },
    "city": {
      "type": "string",
      "description": "The town or city the hotel is in, e.g. \"Sitges\". Helps find hotels we have not checked before."
    },
    "booking_url": {
      "type": "string",
      "description": "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."
    },
    "checkin": {
      "type": "string",
      "description": "Check-in date, YYYY-MM-DD."
    },
    "checkout": {
      "type": "string",
      "description": "Check-out date, YYYY-MM-DD."
    },
    "adults": {
      "type": "integer",
      "minimum": 1,
      "maximum": 8,
      "description": "Number of adults (default 2)."
    },
    "children_ages": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 0,
        "maximum": 17
      },
      "maxItems": 6,
      "description": "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_total": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "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."
    },
    "booking_meal_plan": {
      "type": "string",
      "enum": [
        "room_only",
        "breakfast",
        "half_board",
        "full_board",
        "all_inclusive"
      ],
      "description": "The meal plan of the Booking.com offer, when Booking.com shows it."
    },
    "booking_cancellation": {
      "type": "string",
      "enum": [
        "free",
        "non_refundable",
        "partial"
      ],
      "description": "The cancellation terms of the Booking.com offer, when Booking.com shows them: free cancellation, non-refundable, or partly refundable."
    },
    "booking_room": {
      "type": "string",
      "description": "The room name of the Booking.com offer, when shown."
    },
    "booking_taxes_included": {
      "type": "boolean",
      "description": "true when Booking.com says its total includes taxes and charges; false when it lists taxes on top."
    },
    "booking_taxes_extra": {
      "type": "number",
      "minimum": 0,
      "description": "Taxes Booking.com lists on top of its total, in euros (e.g. a city tax), when shown."
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "es"
      ],
      "description": "Language of the check page for the traveller (default en)."
    }
  },
  "required": [
    "hotel",
    "checkin",
    "checkout"
  ],
  "additionalProperties": false
}
🟢report_hotel_price(check_id, offers, page_url, hotel, city, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "check_id": {
      "type": "string",
      "description": "The check_id returned by check_direct_price."
    },
    "offers": {
      "type": "array",
      "minItems": 1,
      "maxItems": 12,
      "description": "The rooms and rates the hotel's own site showed for the stay.",
      "items": {
        "type": "object",
        "properties": {
          "room": {
            "type": "string",
            "description": "Room name as the hotel's site shows it."
          },
          "rate": {
            "type": "string",
            "description": "Rate name, when shown (e.g. \"Non refundable\", \"Web offer\")."
          },
          "total": {
            "type": "number",
            "exclusiveMinimum": 0,
            "description": "Total for the whole stay, in euros."
          },
          "meal_plan": {
            "type": "string",
            "enum": [
              "room_only",
              "breakfast",
              "half_board",
              "full_board",
              "all_inclusive"
            ]
          },
          "cancellation": {
            "type": "string",
            "enum": [
              "free",
              "non_refundable",
              "partial"
            ]
          },
          "tourist_tax_included": {
            "type": "boolean",
            "description": "true when the site says the total includes the local tourist tax; false when it says the tax comes on top or is paid at the hotel."
          },
          "tourist_tax": {
            "type": "number",
            "minimum": 0,
            "description": "The tourist tax amount for the stay, when the site states it."
          },
          "member_price": {
            "type": "boolean",
            "description": "true when this is a price for members of the hotel's free club."
          },
          "code": {
            "type": "string",
            "description": "A promo code the hotel's site shows publicly and that this price uses, if any."
          }
        },
        "required": [
          "total"
        ],
        "additionalProperties": false
      }
    },
    "page_url": {
      "type": "string",
      "description": "The address of the hotel's page where you saw the prices (only its host is kept)."
    },
    "hotel": {
      "type": "string",
      "description": "The hotel's name as the traveller sees it, e.g. \"Hotel Calipolis\"."
    },
    "city": {
      "type": "string",
      "description": "The town or city the hotel is in, e.g. \"Sitges\". Helps find hotels we have not checked before."
    },
    "booking_url": {
      "type": "string",
      "description": "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."
    },
    "checkin": {
      "type": "string",
      "description": "Check-in date, YYYY-MM-DD."
    },
    "checkout": {
      "type": "string",
      "description": "Check-out date, YYYY-MM-DD."
    },
    "adults": {
      "type": "integer",
      "minimum": 1,
      "maximum": 8,
      "description": "Number of adults (default 2)."
    },
    "children_ages": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 0,
        "maximum": 17
      },
      "maxItems": 6,
      "description": "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_total": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "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."
    },
    "booking_meal_plan": {
      "type": "string",
      "enum": [
        "room_only",
        "breakfast",
        "half_board",
        "full_board",
        "all_inclusive"
      ],
      "description": "The meal plan of the Booking.com offer, when Booking.com shows it."
    },
    "booking_cancellation": {
      "type": "string",
      "enum": [
        "free",
        "non_refundable",
        "partial"
      ],
      "description": "The cancellation terms of the Booking.com offer, when Booking.com shows them: free cancellation, non-refundable, or partly refundable."
    },
    "booking_room": {
      "type": "string",
      "description": "The room name of the Booking.com offer, when shown."
    },
    "booking_taxes_included": {
      "type": "boolean",
      "description": "true when Booking.com says its total includes taxes and charges; false when it lists taxes on top."
    },
    "booking_taxes_extra": {
      "type": "number",
      "minimum": 0,
      "description": "Taxes Booking.com lists on top of its total, in euros (e.g. a city tax), when shown."
    }
  },
  "required": [
    "offers"
  ],
  "additionalProperties": false
}
🟢report_booking(check_id, booked_direct, total_paid)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "check_id": {
      "type": "string",
      "description": "The check_id returned by check_direct_price."
    },
    "booked_direct": {
      "type": "boolean",
      "description": "true when the traveller booked on the hotel's own website; false when they booked elsewhere or not at all."
    },
    "total_paid": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "The total the traveller says they paid, in euros, when they say it."
    }
  },
  "required": [
    "check_id",
    "booked_direct"
  ],
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded3 tools