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
TDQS
The two tools have clearly distinct granularities: search_hotels targets a destination and returns multiple properties, while find_hotel_by_name targets a specific named property. There is no meaningful overlap in what the tools are meant to do.
Both tools follow a predictable verb + noun pattern: search_hotels and find_hotel_by_name. The naming style is consistent and immediately conveys what each tool does.
With only two tools, the server feels minimal but is narrowly scoped to live hotel search and single-property lookup. The count is borderline rather than clearly well-scoped.
The core hotel search workflow is covered: destination-wide search and targeted property lookup with live pricing, review scores, room type, and booking links. Minor gaps exist around additional filtering or property-detail operations, but agents can work around them.
Available Tools
2 toolsfind_hotel_by_nameFlightPowers: find one hotel by nameARead-onlyInspect
FlightPowers single-property lookup: live Booking.com 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?
The description goes well beyond the annotations, disclosing that rates go stale within minutes, that results should never be reused, that the caller must supply their own RapidAPI key, and that the response reports usage in api_usage. It also explains that price_as_seen_from gaps are real but require repeated calls to confirm. No contradiction with the readOnlyHint/destructiveHint 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 longer than average but every section earns its place: purpose and input first, then pricing-behavior caveats, then authentication and quota information. It is well-structured and front-loaded with the core lookup behavior.
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 an external API read tool with 7 parameters and an output schema, the description covers the essential operational context: live data behavior, staleness, authentication mechanism, quota attribution, and usage reporting. An agent has everything needed to invoke it correctly and interpret the operational constraints.
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?
The schema already documents all parameters well, but the description adds meaningful guidance: no internal property ID is needed, adding the city helps disambiguate chain properties, and price_as_seen_from should be tested with repeated calls before reporting a gap. This is real value beyond the schema descriptions.
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 'FlightPowers single-property lookup' and specifies exactly what it does: live Booking.com availability and pricing for one named property. It clearly distinguishes itself from the sibling search_hotels by being the single-property counterpart.
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 explicitly states the intended use cases: 'check one specific hotel, or to track a single property's price over time.' It does not explicitly name search_hotels as the alternative for multi-property discovery, but the single-property framing makes the dividing line clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_hotelsFlightPowers: search hotelsARead-onlyInspect
FlightPowers hotel search: live Booking.com 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?
Annotations already signal read-only and non-destructive, but the description adds substantial behavioral context: rates 'go stale within minutes,' calls are not idempotent, and usage counts against the caller's own RapidAPI plan. It also warns that apparent country gaps can be artifacts ('never read one call per country as a gap'), which is exactly the kind of nuance an agent needs. No contradiction with the 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?
Organized into purpose, caveats, freshness, and auth sections; every sentence is dense with operational signal. The price-parity guidance slightly repeats the schema, but it is important enough to reinforce. There is no filler.
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?
Given the output schema exists and annotations cover safety, the description closes the remaining gaps: external API key requirement, usage billing, result freshness, and the rate-parity procedure. An agent could invoke this tool correctly without needing follow-up clarification.
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?
Schea covers all 9 parameters (100%), so the baseline is 3. The description adds real value beyond the schema by documenting the hidden auth parameter (x-rapidapi-key header, ?rapidapi_key= query, or client key field, first non-empty wins) and by reinforcing the free-text destination semantics and the price_as_seen_from parity methodology. It doesn't add new detail for filters/currency/adults, but the schema already handles those.
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?
One sentence states the tool's verb and resource: 'live Booking.com availability and nightly prices for a destination and date range.' It specifies free-text input and the returned fields. The 'no other travel tool here can do' claim differentiates it from siblings like find_hotel_by_name without confusing the two.
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?
Explicitly positions this as the tool for free-text destination/date-range searches and the only tool for `price_as_seen_from` resident-pricing comparisons ('no other travel tool here can do'). It gives concrete invocation guidance (hold one property fixed, call each country a few times, never reuse stale results) and a hard prerequisite (caller's own RapidAPI key). It doesn't enumerate every when-not-to-use case, but the alternatives are clearly implied.
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+ property71MIT
- 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