Booking.com Hotel Search (Live Prices)
Server Details
Live Booking.com hotel prices, plus per-country pricing for rate-parity monitoring.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- mtnrabi/travel-agent-skills
- GitHub Stars
- 0
Available Tools
2 toolsfind_hotel_by_nameFind one hotel by nameARead-onlyInspect
Get availability and pricing for one named property. Input: the hotel name a person would type (adding the city helps when a chain has many properties) plus check-in and check-out dates -- no internal property ID needed, the resolution is done for you. Returns the property's price, review score, room type and a booking link. Use it to check one specific hotel, or to track a single property's price over time.
price_as_seen_from prices the stay as a shopper resident in that country would see it. Gaps are real but usually modest and property-dependent, and rates move between calls, so call each country a few times on this same property before reporting a gap.
Rates go stale within minutes: never reuse an earlier result.
Requires the caller's own RapidAPI key for the Booking Live API. Get one (free tier available) at https://rapidapi.com/mtnrabi/api/booking-live-api, then pass it as an x-rapidapi-key header (preferred), a ?rapidapi_key= query parameter on the server URL, or your client's own API key field -- first non-empty wins. Usage counts against the caller's own RapidAPI plan, not ours; every response reports what it spent and what is left in api_usage.
| Name | Required | Description | Default |
|---|---|---|---|
| adults | No | Number of adult guests. | |
| children | No | Number of children sharing the room. | |
| currency | No | ISO currency code for the prices returned, e.g. "usd". | |
| hotel_name | Yes | The property name a person would type, e.g. "Hotel Artemide". Adding the city ("Hotel Artemide Rome") disambiguates a chain with many properties. No internal property ID is needed. | |
| checkin_date | Yes | First night of the stay, "YYYY-MM-DD". | |
| checkout_date | Yes | Departure morning, "YYYY-MM-DD". Must be after checkin_date. | |
| price_as_seen_from | No | Two-letter country code, e.g. "de". Prices the stay as a shopper resident in that country would see it. Call each country a few times on this same property before reporting a gap, because rates move between calls and gaps are usually modest and property-dependent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| results | Yes | The itineraries or properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. |
| api_usage | No | What this call cost the caller's own RapidAPI plan, and what remains on it. Present on every response that reached the upstream, including a degraded one -- a search that failed was still billed. |
| signup_url | No | Where the caller subscribes or changes plan. |
| result_count | No | |
| needs_api_key | No | True when no usable RapidAPI key arrived with the call, or the upstream rejected the one that did. No search was run and nothing was billed; signup_url and message say how to fix it. |
| applied_filters | No | Which of the requested filters the upstream actually applied. Untyped: the shape is the upstream's, echoed through. |
| quota_exhausted | No | True when the caller's RapidAPI plan has no requests left for the current period. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive, but the description adds substantial behavioral context: rates go stale within minutes, results must not be reused, pricing gaps are property-dependent and move between calls, caller's own RapidAPI key is required, and api_usage is reported. No contradiction with annotations.
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 somewhat long but every sentence earns its place: core purpose, input guidance, return fields, use cases, caveats, stale-data warning, and auth requirements. It is front-loaded with the main function and structures the fine print afterward, making it easy to scan.
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?
The description covers what the tool does, required inputs, return contents, usage caveats, authentication requirements, and quota implications. With an output schema present and annotations indicating read-only behavior, nothing essential is missing for an agent to select and invoke this tool 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 100%, so the schema already documents all parameters. The description adds meaningful nuance for hotel_name (typed as a person would, adding city disambiguates, no internal ID) and for price_as_seen_from (shopper-resident pricing, call multiple times before reporting gaps). This goes beyond the schema's baseline definitions.
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: 'Get availability and pricing for one named property.' It is clearly distinguished from the sibling search_hotels by emphasizing a single named property and no internal ID need, with explicit use cases (check one hotel, track a single property's price over time).
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 context for when to use the tool: checking one specific hotel or tracking a single property. It implies the alternative (broader search) by contrast, though it does not explicitly name search_hotels or state when to prefer it. It also provides practical usage guidance around stale rates and calling each country multiple times.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_hotelsSearch hotelsARead-onlyInspect
Search live hotel availability and nightly prices for a destination and date range. Input: a free-text destination the way a person would say it ("Rome", "Tokyo Shibuya"), plus check-in and check-out dates. Returns each property's price, review score, room type, location and a booking link.
Set price_as_seen_from to a two-letter country code to price the same stay the way a shopper resident in that country would see it, which no other travel tool here can do. Gaps are real but usually modest and property-dependent, and rates move between calls, so hold one named property fixed, call each country a few times, and never read one call per country as a gap.
Rates go stale within minutes: never reuse an earlier result, search again.
Requires the caller's own RapidAPI key for the Booking Live API. Get one (free tier available) at https://rapidapi.com/mtnrabi/api/booking-live-api, then pass it as an x-rapidapi-key header (preferred), a ?rapidapi_key= query parameter on the server URL, or your client's own API key field -- first non-empty wins. Usage counts against the caller's own RapidAPI plan, not ours; every response reports what it spent and what is left in api_usage.
| Name | Required | Description | Default |
|---|---|---|---|
| adults | No | Number of adult guests. Defaults to the upstream default when omitted. | |
| filters | No | Property filters to apply, e.g. ["free_cancellation", "breakfast_included"]. An unknown name is rejected with the list of valid ones rather than being ignored. | |
| children | No | Number of children sharing the room. | |
| currency | No | ISO currency code for the prices returned, e.g. "usd". | |
| destination | Yes | Where to stay, in free text the way a person would say it, e.g. "Rome" or "Tokyo Shibuya". A city, district, landmark or region all work; no internal location ID is needed. | |
| checkin_date | Yes | First night of the stay, "YYYY-MM-DD". | |
| checkout_date | Yes | Departure morning, "YYYY-MM-DD". Must be after checkin_date. | |
| budget_per_night | No | Only return properties at or below this nightly price, in `currency`. | |
| price_as_seen_from | No | Two-letter country code, e.g. "de". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. For a rate-parity check hold one named property fixed and call each country a few times, because rates move between calls and one call per country can show a gap that is not there. Omit it for a neutral price. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| results | Yes | The itineraries or properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. |
| api_usage | No | What this call cost the caller's own RapidAPI plan, and what remains on it. Present on every response that reached the upstream, including a degraded one -- a search that failed was still billed. |
| signup_url | No | Where the caller subscribes or changes plan. |
| result_count | No | |
| needs_api_key | No | True when no usable RapidAPI key arrived with the call, or the upstream rejected the one that did. No search was run and nothing was billed; signup_url and message say how to fix it. |
| applied_filters | No | Which of the requested filters the upstream actually applied. Untyped: the shape is the upstream's, echoed through. |
| quota_exhausted | No | True when the caller's RapidAPI plan has no requests left for the current period. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/destructive annotations, the description reveals that results go stale within minutes, rates move between calls, and repeated calls are required for reliable parity gaps. It also discloses authentication mechanics (multiple accepted key locations, first non-empty wins) and api_usage reporting. No statement contradicts the readOnlyHint/openWorldHint annotations.
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 dense but well structured: purpose, parity caveat, freshness warning, and API key setup each get their own paragraph, with no filler. The main action is front-loaded in the first sentence. It is longer than minimal but every sentence carries operational information.
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 9-parameter live-search tool with an output schema, the description covers what is needed to call it safely: destination/date semantics, required API key, rate volatility, parity-use guidance, and response accounting via api_usage. With annotations covering safety and an output schema covering returns, nothing significant is missing. The only mild gap is explicit sibling routing, which was already scored in usage_guidelines.
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 schema already documents all 9 parameters. The description mostly echoes the schema's destination and price_as_seen_from guidance rather than adding new parameter-level semantics. Authentication and rate staleness guidance are valuable context but are not about the input parameters, so the baseline score of 3 applies.
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 opens with 'Search live hotel availability and nightly prices for a destination and date range,' which names a specific action, resource, and scope. It also lists return fields (price, review score, room type, location, booking link) and contrasts free-text destination search with the sibling's name-based lookup. This leaves little ambiguity about what the tool does.
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 clearly identifies when to use live destination-and-date searches, including free-text destinations and rate-parity use cases ('which no other travel tool here can do'). It does not explicitly state 'use find_hotel_by_name when you already know the hotel name,' so the alternative/exclusion guidance is less direct than it could be. Prerequisites (RapidAPI key) and freshness requirements are stated, which helps call selection.
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. Dates show when Glama detected each change.
2 tool updates
- Changed
find_hotel_by_name1 field changed- changed
Input schema / properties / price_as_seen_from / descriptionPrevious value: -"Two-letter country code, e.g. \"de\". Prices the stay as a shopper resident in that country would see it, which is what makes a rate-parity check on one property possible."New value: +"Two-letter country code, e.g. \"de\". Prices the stay as a shopper resident in that country would see it. Call each country a few times on this same property before reporting a gap, because rates move between calls and gaps are usually modest and property-dependent."
- Changed
search_hotels1 field changed- changed
Input schema / properties / price_as_seen_from / descriptionPrevious value: -"Two-letter country code, e.g. \"de\". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. This is what makes rate-parity and geo-pricing checks possible; omit it for a neutral price."New value: +"Two-letter country code, e.g. \"de\". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. For a rate-parity check hold one named property fixed and call each country a few times, because rates move between calls and one call per country can show a gap that is not there. Omit it for a neutral price."
2 tool updates
- Changed
find_hotel_by_name4 fields changed- added
Output schema / descriptionAdded value: +"A completed hotel search. The hotels upstream reports no search-status header, so these results carry no search_status field." - added
Output schema / propertiesAdded value: +{ + "api_usage": { + "additionalProperties": true, + "description": "What this call cost the caller's own RapidAPI plan, and what remains on it. Present on every response that reached the upstream, including a degraded one -- a search that failed was still billed.", + "properties": { + "note": { + "description": "The same figures as a sentence, for the model to relay.", + "type": "string" + }, + "plan_requests_limit": { + "type": "integer" + }, + "plan_requests_remaining": { + "type": "integer" + }, + "requests_used_by_this_call": { + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "applied_filters": { + "description": "Which of the requested filters the upstream actually applied. Untyped: the shape is the upstream's, echoed through." + }, + "message": { + "type": "string" + }, + "needs_api_key": { + "description": "True when no usable RapidAPI key arrived with the call, or the upstream rejected the one that did. No search was run and nothing was billed; signup_url and message say how to fix it.", + "type": "boolean" + }, + "quota_exhausted": { + "description": "True when the caller's RapidAPI plan has no requests left for the current period.", + "type": "boolean" + }, + "result_count": { + "minimum": 0, + "type": "integer" + }, + "results": { + "description": "The itineraries or properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "signup_url": { + "description": "Where the caller subscribes or changes plan.", + "type": "string" + } +} - added
Output schema / requiredAdded value: +[ + "results" +] - added
Output schema / titleAdded value: +"Hotel search result"
- Changed
search_hotels4 fields changed- added
Output schema / descriptionAdded value: +"A completed hotel search. The hotels upstream reports no search-status header, so these results carry no search_status field." - added
Output schema / propertiesAdded value: +{ + "api_usage": { + "additionalProperties": true, + "description": "What this call cost the caller's own RapidAPI plan, and what remains on it. Present on every response that reached the upstream, including a degraded one -- a search that failed was still billed.", + "properties": { + "note": { + "description": "The same figures as a sentence, for the model to relay.", + "type": "string" + }, + "plan_requests_limit": { + "type": "integer" + }, + "plan_requests_remaining": { + "type": "integer" + }, + "requests_used_by_this_call": { + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "applied_filters": { + "description": "Which of the requested filters the upstream actually applied. Untyped: the shape is the upstream's, echoed through." + }, + "message": { + "type": "string" + }, + "needs_api_key": { + "description": "True when no usable RapidAPI key arrived with the call, or the upstream rejected the one that did. No search was run and nothing was billed; signup_url and message say how to fix it.", + "type": "boolean" + }, + "quota_exhausted": { + "description": "True when the caller's RapidAPI plan has no requests left for the current period.", + "type": "boolean" + }, + "result_count": { + "minimum": 0, + "type": "integer" + }, + "results": { + "description": "The itineraries or properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "signup_url": { + "description": "Where the caller subscribes or changes plan.", + "type": "string" + } +} - added
Output schema / requiredAdded value: +[ + "results" +] - added
Output schema / titleAdded value: +"Hotel search result"
2 tool updates
- Changed
find_hotel_by_name7 fields changed- added
Input schema / properties / adults / descriptionAdded value: +"Number of adult guests." - added
Input schema / properties / checkin_date / descriptionAdded value: +"First night of the stay, \"YYYY-MM-DD\"." - added
Input schema / properties / checkout_date / descriptionAdded value: +"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date." - added
Input schema / properties / children / descriptionAdded value: +"Number of children sharing the room." - added
Input schema / properties / currency / descriptionAdded value: +"ISO currency code for the prices returned, e.g. \"usd\"." - added
Input schema / properties / hotel_name / descriptionAdded value: +"The property name a person would type, e.g. \"Hotel Artemide\". Adding the city (\"Hotel Artemide Rome\") disambiguates a chain with many properties. No internal property ID is needed." - added
Input schema / properties / price_as_seen_from / descriptionAdded value: +"Two-letter country code, e.g. \"de\". Prices the stay as a shopper resident in that country would see it, which is what makes a rate-parity check on one property possible."
- Changed
search_hotels9 fields changed- added
Input schema / properties / adults / descriptionAdded value: +"Number of adult guests. Defaults to the upstream default when omitted." - added
Input schema / properties / budget_per_night / descriptionAdded value: +"Only return properties at or below this nightly price, in `currency`." - added
Input schema / properties / checkin_date / descriptionAdded value: +"First night of the stay, \"YYYY-MM-DD\"." - added
Input schema / properties / checkout_date / descriptionAdded value: +"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date." - added
Input schema / properties / children / descriptionAdded value: +"Number of children sharing the room." - added
Input schema / properties / currency / descriptionAdded value: +"ISO currency code for the prices returned, e.g. \"usd\"." - added
Input schema / properties / destination / descriptionAdded value: +"Where to stay, in free text the way a person would say it, e.g. \"Rome\" or \"Tokyo Shibuya\". A city, district, landmark or region all work; no internal location ID is needed." - added
Input schema / properties / filters / descriptionAdded value: +"Property filters to apply, e.g. [\"free_cancellation\", \"breakfast_included\"]. An unknown name is rejected with the list of valid ones rather than being ignored." - added
Input schema / properties / price_as_seen_from / descriptionAdded value: +"Two-letter country code, e.g. \"de\". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. This is what makes rate-parity and geo-pricing checks possible; omit it for a neutral price."
2 tool updates
- First observed
find_hotel_by_name - First observed
search_hotels
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Booking.com stays by destination and dates, and full property details, as structured JSON.
Remote MCP server for hotel rate monitoring, parity checks, and pricing intelligence via Apify.
Travel & commerce intelligence for AI agents: search, book & price-track hotels, events, retail.
Neutral hotel & stay price comparison for AI agents: live prices from 16+ booking sites. No signup.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceBook hotels worldwide — search, price, prebook & book across 249 countries. 65 tools for hotel search, flights, loyalty, analytics. Zero API keys needed. at best prices for hotels 3 M+ property221MIT
- 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
- FlicenseNot gradedqualityDmaintenanceEnables real-time hotel search and pricing data from Booking.com for AI agents and Claude.72-
- AlicenseAqualityAmaintenanceEnables MCP clients to search stays by destination and dates with rich filters and read full property details as structured JSON, without needing a Booking.com account or self-hosting.425114MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
The two tools have clearly distinct scopes: one resolves a specific named property, the other searches a destination. An agent would not confuse 'find_hotel_by_name' with 'search_hotels' because the inputs and outputs differ meaningfully.
Both names follow a verb_noun pattern with underscores, though 'find_hotel_by_name' includes a modifier while 'search_hotels' is plain. This is a minor stylistic deviation, not a source of confusion.
Two tools is minimal for a hotel search server, but the pair covers the two fundamental entry points: a specific property lookup and a destination search. It feels slightly thin rather than well-scoped.
For a server focused on live prices and availability, the two tools cover the essential queries: destination-level search and property-level lookup. There is no booking or filtering tool, but those are outside the stated purpose, making the surface adequate.