Koskamo

BookHotels.direct MCP

An MCP server that allows AI assistants to compare hotel prices on a hotel's own website against Booking.com for the same stay, providing a verdict on which is cheaper without taking bookings or payments.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

BookHotels.direct MCP logo, by BookHotels.directVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by BookHotels.direct
MCP endpoint (Streamable HTTP)
https://bookhotels.direct/mcp
Vendor documentation

What you can do with it

  • Check if a hotel is cheaper on its own website than on Booking.com
  • Report hotel price details for a specific stay
  • Report when a traveller books after a price check

Source and maintenance

Vendor evidenceRegistry 0.46.1

Protocol and capabilities

Server
bookhotels-direct 0.62.0
MCP protocol
2025-06-18
Tools
3 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "resources": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

BookHotels.direct checks whether a hotel is cheaper on its own website than on Booking.com for the same stay, honestly either way. Use check_direct_price when a traveller looks at a hotel on Booking.com (or asks whether booking direct is cheaper): give the hotel, the dates, the guests with each child's age, and the Booking.com total with its meal plan and cancellation terms when known. If the answer has next_step.action = "visit_hotel_site", open next_step.url (the hotel's own site for those dates), read the totals it shows, and send them with report_hotel_price. Show the traveller the verdict with its differences, and the book_url to book on the hotel's own site. If the traveller later says they booked, report it with report_booking. BookHotels.direct never takes bookings or payments.

Tools

3 advertised

check_direct_price — Check the hotel's own price against Booking.com
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

check_direct_price input schema
{
  "type": "object",
  "required": [
    "hotel",
    "checkin",
    "checkout"
  ],
  "properties": {
    "city": {
      "type": "string",
      "description": "The town or city the hotel is in, e.g. \"Sitges\". Helps find hotels we have not checked before."
    },
    "hotel": {
      "type": "string",
      "description": "The hotel's name as the traveller sees it, e.g. \"Hotel Calipolis\"."
    },
    "adults": {
      "type": "integer",
      "maximum": 8,
      "minimum": 1,
      "description": "Number of adults (default 2)."
    },
    "checkin": {
      "type": "string",
      "description": "Check-in date, YYYY-MM-DD."
    },
    "checkout": {
      "type": "string",
      "description": "Check-out date, YYYY-MM-DD."
    },
    "language": {
      "enum": [
        "en",
        "es"
      ],
      "type": "string",
      "description": "Language of the check page for the traveller (default en)."
    },
    "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."
    },
    "booking_room": {
      "type": "string",
      "description": "The room name of the Booking.com offer, when shown."
    },
    "booking_total": {
      "type": "number",
      "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.",
      "exclusiveMinimum": 0
    },
    "children_ages": {
      "type": "array",
      "items": {
        "type": "integer",
        "maximum": 17,
        "minimum": 0
      },
      "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_meal_plan": {
      "enum": [
        "room_only",
        "breakfast",
        "half_board",
        "full_board",
        "all_inclusive"
      ],
      "type": "string",
      "description": "The meal plan of the Booking.com offer, when Booking.com shows it."
    },
    "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."
    },
    "booking_cancellation": {
      "enum": [
        "free",
        "non_refundable",
        "partial"
      ],
      "type": "string",
      "description": "The cancellation terms of the Booking.com offer, when Booking.com shows them: free cancellation, non-refundable, or partly refundable."
    },
    "booking_taxes_included": {
      "type": "boolean",
      "description": "true when Booking.com says its total includes taxes and charges; false when it lists taxes on top."
    }
  },
  "additionalProperties": false
}
check_direct_price annotations
{
  "title": "Check the hotel's own price",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
report_hotel_price — Report the prices seen on the hotel's own site
Advertised by the server during the last successful anonymous check.

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.

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

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.

report_booking input schema
{
  "type": "object",
  "required": [
    "check_id",
    "booked_direct"
  ],
  "properties": {
    "check_id": {
      "type": "string",
      "description": "The check_id returned by check_direct_price."
    },
    "total_paid": {
      "type": "number",
      "description": "The total the traveller says they paid, in euros, when they say it.",
      "exclusiveMinimum": 0
    },
    "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."
    }
  },
  "additionalProperties": false
}
report_booking annotations
{
  "title": "Report a booking",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

check-card — BookHotels.direct check card

Advertised by the server during the last successful anonymous check.

The verdict of a check: both prices or the estimate, the hotel's offer, and the link to book on the hotel's own site.

check-card URI
ui://bookhotels-direct/check-card-v1.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
574 ms
95th percentile latency
574 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 574 ms · metadata changed · 3 tool(s), 1 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http bookhotels-direct-mcp https://bookhotels.direct/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add bookhotels-direct-mcp --url https://bookhotels.direct/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable bookhotels-direct-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "bookhotels-direct-mcp": {
      "url": "https://bookhotels.direct/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "bookhotels-direct-mcp": {
      "type": "streamableHttp",
      "url": "https://bookhotels.direct/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start bookhotels-direct-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "bookhotels-direct-mcp": {
      "type": "http",
      "url": "https://bookhotels.direct/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http bookhotels-direct-mcp https://bookhotels.direct/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "bookhotels-direct-mcp": {
      "url": "https://bookhotels.direct/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "bookhotels-direct-mcp": {
      "serverUrl": "https://bookhotels.direct/mcp"
    }
  }
}

Let your agent find its tools

Find servers like BookHotels.direct MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run BookHotels.direct MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing