Skip to main content
Glama

HotelZero

An MCP (Model Context Protocol) server that searches hotels on Booking.com using Playwright browser automation. Features 80+ filter options for precise hotel searches.

Features

  • Comprehensive Filtering: 80+ filters covering property types, amenities, accessibility, activities, and more

  • Real Booking.com Data: Uses actual Booking.com filter codes reverse-engineered from their URL parameters

  • Sponsored Ad Filtering: Automatically excludes paid/promoted listings (native ads with nad_ tracking)

  • Smart Scoring: Results are scored and ranked by how well they match your criteria

  • Match Transparency: Each result shows why it matched your filters

Related MCP server: Hotels MCP Server

Installation

npm install -g hotelzero

# Install Playwright browser (Chromium)
npx playwright install chromium

Or run directly with npx:

npx hotelzero

Proxy Support

For heavy usage or to avoid IP blocks, you can configure a proxy server via the HOTELZERO_PROXY environment variable:

# HTTP proxy
HOTELZERO_PROXY=http://proxy.example.com:8080 npx hotelzero

# HTTP proxy with authentication
HOTELZERO_PROXY=http://user:pass@proxy.example.com:8080 npx hotelzero

# SOCKS5 proxy
HOTELZERO_PROXY=socks5://proxy.example.com:1080 npx hotelzero

# SOCKS5 proxy with authentication
HOTELZERO_PROXY=socks5://user:pass@proxy.example.com:1080 npx hotelzero

When a proxy is configured, you'll see confirmation in the startup logs:

Proxy enabled: http://proxy.example.com:8080
HotelZero v1.8.0 running on stdio

Logging

HotelZero uses structured logging via pino. Logs are written to stderr to avoid interfering with the MCP stdio transport.

Log Level

Control log verbosity with the HOTELZERO_LOG_LEVEL environment variable:

# Available levels: trace, debug, info, warn, error, fatal, silent
# Default: info

# Debug mode - verbose output for troubleshooting
HOTELZERO_LOG_LEVEL=debug npx hotelzero

# Silent mode - no logs
HOTELZERO_LOG_LEVEL=silent npx hotelzero

# Error only - minimal output
HOTELZERO_LOG_LEVEL=error npx hotelzero

Log Output

Logs are JSON-formatted for easy parsing:

{"level":"info","time":"2026-02-15T12:00:00.000Z","service":"hotelzero","module":"server","version":"1.11.0","transport":"stdio","msg":"HotelZero server started"}
{"level":"info","time":"2026-02-15T12:00:01.000Z","service":"hotelzero","module":"browser","msg":"Browser initialized"}
{"level":"info","time":"2026-02-15T12:00:02.000Z","service":"hotelzero","module":"browser","destination":"Paris","msg":"Starting hotel search"}

Session Persistence

HotelZero automatically saves browser session data (cookies, localStorage) to reduce bot detection and avoid repeated CAPTCHA challenges.

How It Works

  • Sessions are automatically saved after each successful request

  • On startup, the previous session is loaded if available

  • Default session location: ~/.hotelzero/session.json

Custom Session Path

Use HOTELZERO_SESSION_PATH to specify a custom location:

# Custom session file location
HOTELZERO_SESSION_PATH=/path/to/session.json npx hotelzero

# Disable session persistence (use empty string)
HOTELZERO_SESSION_PATH="" npx hotelzero

Clearing Sessions

If you experience issues, you can delete the session file:

rm ~/.hotelzero/session.json

Quick Start

Run as MCP Server

Add to your MCP client configuration (e.g., Claude Desktop, OpenCode):

{
  "mcpServers": {
    "hotelzero": {
      "command": "npx",
      "args": ["hotelzero"]
    }
  }
}

Available Tools

find_hotels

Search for hotels with comprehensive filtering. This is the primary tool with all 80+ filter options.

Example:

{
  "destination": "San Juan, Puerto Rico",
  "checkIn": "2026-03-07",
  "checkOut": "2026-03-14",
  "beachfront": true,
  "freeWifi": true,
  "fitness": true,
  "minRating": 8
}

search_hotels

Basic hotel search without filters. Use this for simple queries when you don't need specific criteria.

Example:

{
  "destination": "Paris, France",
  "checkIn": "2026-06-01",
  "checkOut": "2026-06-05",
  "guests": 2,
  "rooms": 1
}

get_hotel_details

Get detailed information about a specific hotel including full amenity list, description, and photos.

Example:

{
  "url": "https://www.booking.com/hotel/pr/condado-vanderbilt.html"
}

Complete Filter Reference

Basic Search Parameters

Parameter

Type

Required

Description

destination

string

Yes

City or location (e.g., "San Juan, Puerto Rico")

checkIn

string

Yes

Check-in date (YYYY-MM-DD)

checkOut

string

Yes

Check-out date (YYYY-MM-DD)

guests

number

No

Number of guests (default: 2)

rooms

number

No

Number of rooms (default: 1)

currency

string

No

Currency code (USD, EUR, GBP, JPY, etc.) Default: USD

sortBy

enum

No

Sort results: popularity, price_lowest, price_highest, rating, distance

Rating & Price

Filter

Type

Description

minRating

number

Minimum review score: 6=Pleasant, 7=Good, 8=Very Good, 9=Wonderful

minPrice

number

Minimum price per night

maxPrice

number

Maximum price per night

Property Type

Filter

Type

Options

propertyType

enum

hotel, apartment, resort, villa, vacation_home, hostel, bnb, guesthouse, homestay, motel, inn, lodge, chalet, campground, glamping, boat, capsule, ryokan, riad, country_house, farm_stay

starRating

number

1, 2, 3, 4, or 5 stars

Beach & Location

Filter

Type

Description

beachfront

boolean

Property is directly on the beach

beachAccess

boolean

Property has beach access

oceanView

boolean

Room with ocean/sea view

maxDistanceFromCenter

enum

half_mile, 1_mile, 2_miles

Hotel Facilities

Filter

Description

freeWifi

Free WiFi throughout property

pool

Swimming pool

spa

Spa/wellness center

fitness

Fitness center/gym

parking

Parking available

restaurant

On-site restaurant

bar

On-site bar/lounge

roomService

24-hour front desk/room service

airportShuttle

Airport shuttle service

hotTub

Hot tub/Jacuzzi

sauna

Sauna

garden

Garden

terrace

Terrace

nonSmokingRooms

Non-smoking rooms available

familyRooms

Family rooms

evCharging

Electric vehicle charging station

casino

Casino

golf

Golf course nearby (within 2 miles)

tennis

Tennis court

bbqFacilities

BBQ facilities

laundry

Laundry service

concierge

Concierge service

businessCenter

Business center

Room Facilities

Filter

Description

airConditioning

Air conditioning

kitchen

Kitchen or kitchenette

balcony

Private balcony

privatePool

Private pool

privateBathroom

Private bathroom

bath

Bathtub

tv

Television

minibar

Minibar

safe

In-room safe

washingMachine

Washing machine in unit

soundproofing

Soundproofed rooms

Bed Type

Filter

Options

bedType

king, queen, double, twin, single

Meal Plans

Filter

Description

breakfast

Breakfast included in rate

allInclusive

All-inclusive package

selfCatering

Self-catering with kitchen amenities

Stay Type & Policies

Filter

Description

petFriendly

Pets allowed

adultsOnly

Adults-only property

lgbtqFriendly

LGBTQ+ friendly (Booking.com Travel Proud)

freeCancellation

Free cancellation available

noPrepayment

No prepayment required

noBookingFee

Book without credit card

Sustainability

Filter

Description

sustainabilityCertified

Has sustainability certification

Activities

Filter

Description

snorkeling

Snorkeling available

diving

Diving/scuba available

fishing

Fishing available

hiking

Hiking trails nearby

cycling

Cycling/biking available

skiing

Skiing nearby

waterSports

Water sports available

horseRiding

Horse riding available

Accessibility - Property Level

Filter

Description

grabRails

Grab rails in bathroom

raisedToilet

Raised toilet

loweredSink

Lowered sink

braille

Braille signage

tactileSigns

Tactile signs

auditoryGuidance

Auditory guidance

Accessibility - Room Level

Filter

Description

wheelchairAccessible

Entire unit wheelchair accessible

groundFloor

Ground floor unit available

elevatorAccess

Upper floors accessible by elevator

walkInShower

Walk-in shower

rollInShower

Roll-in shower (wheelchair accessible)

showerChair

Shower chair available

Hotel Chains

Filter

Options

hotelChain

marriott, hilton, hyatt, ihg, wyndham, best_western, accor, choice, radisson, ritz_carlton, four_seasons, fairmont, sheraton, westin, w_hotels, courtyard, residence_inn, hampton, embassy_suites, doubletree


Example Queries

Beach Vacation in Puerto Rico

{
  "destination": "San Juan, Puerto Rico",
  "checkIn": "2026-03-07",
  "checkOut": "2026-03-14",
  "beachfront": true,
  "freeWifi": true,
  "fitness": true,
  "pool": true,
  "minRating": 8
}

Luxury Ski Resort

{
  "destination": "Aspen, Colorado",
  "checkIn": "2026-01-15",
  "checkOut": "2026-01-22",
  "propertyType": "resort",
  "starRating": 5,
  "skiing": true,
  "spa": true,
  "hotTub": true,
  "minRating": 9
}

Family Beach Trip with All-Inclusive

{
  "destination": "Cancun, Mexico",
  "checkIn": "2026-07-01",
  "checkOut": "2026-07-08",
  "guests": 4,
  "rooms": 2,
  "beachfront": true,
  "allInclusive": true,
  "familyRooms": true,
  "pool": true,
  "freeCancellation": true
}

Accessible City Center Hotel

{
  "destination": "London, UK",
  "checkIn": "2026-04-01",
  "checkOut": "2026-04-05",
  "maxDistanceFromCenter": "half_mile",
  "wheelchairAccessible": true,
  "elevatorAccess": true,
  "walkInShower": true,
  "freeWifi": true
}

Pet-Friendly Road Trip Stop

{
  "destination": "Portland, Oregon",
  "checkIn": "2026-05-10",
  "checkOut": "2026-05-12",
  "petFriendly": true,
  "parking": true,
  "freeCancellation": true,
  "maxPrice": 200
}

Digital Nomad Long Stay

{
  "destination": "Lisbon, Portugal",
  "checkIn": "2026-06-01",
  "checkOut": "2026-06-30",
  "propertyType": "apartment",
  "kitchen": true,
  "freeWifi": true,
  "washingMachine": true,
  "maxDistanceFromCenter": "1_mile",
  "maxPrice": 150
}

Romantic Getaway

{
  "destination": "Santorini, Greece",
  "checkIn": "2026-09-15",
  "checkOut": "2026-09-20",
  "adultsOnly": true,
  "oceanView": true,
  "privatePool": true,
  "breakfast": true,
  "spa": true,
  "minRating": 9
}

Japanese Cultural Experience

{
  "destination": "Kyoto, Japan",
  "checkIn": "2026-04-01",
  "checkOut": "2026-04-07",
  "propertyType": "ryokan",
  "breakfast": true,
  "minRating": 8
}

Eco-Friendly Adventure

{
  "destination": "Costa Rica",
  "checkIn": "2026-02-01",
  "checkOut": "2026-02-08",
  "sustainabilityCertified": true,
  "hiking": true,
  "snorkeling": true,
  "diving": true
}

Golf Trip

{
  "destination": "Scottsdale, Arizona",
  "checkIn": "2026-03-01",
  "checkOut": "2026-03-05",
  "propertyType": "resort",
  "golf": true,
  "spa": true,
  "restaurant": true,
  "bar": true
}

How It Works

Server-Side Filtering

Filters are applied via Booking.com's nflt URL parameter using reverse-engineered filter codes. For example:

  • beachfront: true adds ht_beach=1

  • freeWifi: true adds hotelfacility=107

  • fitness: true adds popular_activities=11

  • minRating: 8 adds review_score=80

Client-Side Scoring

After fetching results, each hotel is scored based on how well it matches your criteria:

  • +20 points: Beach-related filters when property mentions beach

  • +15 points: Rating 9.0+ ("Excellent")

  • +10 points: Each matched amenity (WiFi, pool, gym, etc.)

  • +5 points: 500+ reviews (trustworthiness bonus)

Results are sorted by match score, so the best matches appear first.

Sponsored Ad Filtering

Booking.com injects paid "native ads" into search results. These are identified and excluded by:

  1. Detecting nad_ (native ad tracking) in the hotel card HTML or links

  2. Checking for explicit "Ad", "Sponsored", or "Promoted" labels

This ensures you only see organic results, not paid placements.


Output Format

Each hotel result includes:

1. Hotel Name
   Price: $XXX per night
   Rating: X.X/10 Rating Text (XXX reviews)
   Location: X.X miles from center
   Amenities: Pool, Free WiFi, Gym, ...
   Match Score: XX
   Why it matches: Near beach, Has WiFi, Has gym, ...
   Book: https://www.booking.com/hotel/...

Technical Details

Architecture

src/
├── index.ts      # MCP server with tool definitions
├── browser.ts    # Playwright automation & filter mappings
└── test*.ts      # Test scripts

Dependencies

  • @modelcontextprotocol/sdk - MCP server SDK

  • playwright - Browser automation

  • zod - Schema validation

Browser Configuration

  • Headless Mode: Runs without visible browser window

  • Anti-Detection: Custom user agent and disabled automation flags

  • User Agent Rotation: Randomly selects from 14 realistic browser profiles (Chrome, Firefox, Safari, Edge) on each session

  • Auto-Scrolling: Loads more results by scrolling the page

  • Popup Handling: Automatically dismisses cookie banners and sign-in modals

Filter Code Mappings

All Booking.com filter codes are mapped in browser.ts:

const FILTER_CODES = {
  propertyType: { hotel: "ht_id=204", resort: "ht_id=206", ... },
  hotelfacility: { freeWifi: 107, pool: 433, spa: 54, ... },
  roomfacility: { airConditioning: 11, kitchen: 999, ... },
  popularActivities: { fitness: 11, golf: 12, skiing: 13, ... },
  chaincode: { marriott: 1080, hilton: 1078, ... },
  // ... 20+ filter categories
};

Limitations

  • Rate Limiting: Booking.com may rate-limit or block automated requests

  • Results Cap: Returns ~25 results per search (first page + scroll load)

  • Price Accuracy: Prices may vary based on availability and timing

  • Filter Availability: Some filters may not apply to all destinations


Troubleshooting

"Browser not initialized"

Run npx playwright install chromium to install the browser.

npx playwright install chromium

If that doesn't work, try forcing a reinstall:

npx playwright install chromium --force

No results returned

  • Check dates: Ensure check-in/check-out dates are in the future

  • Verify destination: Try more specific locations like "Paris, France" instead of just "Paris"

  • Reduce filters: Too many filters can result in zero matches - try removing some

  • Check availability: Some destinations may have no availability for your dates

CAPTCHA or Access Denied

If you encounter CAPTCHA challenges:

  1. Wait 5-10 minutes before retrying

  2. Check your session: Delete the session file and try again

    rm ~/.hotelzero/session.json
  3. Use a proxy: Consider configuring a proxy server (see Proxy Support)

  4. Reduce request frequency: Avoid making many rapid requests

Blocked by Booking.com

  • Rate limiting: Wait a few minutes before retrying

  • Session issues: Clear the session file (rm ~/.hotelzero/session.json)

  • IP blocked: Use a proxy server or try from a different network

  • User agent rotation: HotelZero rotates user agents automatically, but excessive use from one IP can still trigger blocks

Proxy not working

  • Verify accessibility: Test the proxy with curl first

    curl -x http://proxy:8080 https://www.booking.com
  • Check credentials: Ensure username/password are URL-encoded if they contain special characters

  • Protocol support: Ensure the proxy supports HTTPS connections

  • Connection timeout: Some proxies may be slow - try a different one

Prices or Data Missing

  • Dynamic loading: Some data loads asynchronously; try increasing timeouts

  • Currency issues: Specify currency explicitly with currency: "USD"

  • Regional differences: Some properties may not show prices for certain regions

Session Issues

If you experience inconsistent behavior:

# Clear the session and start fresh
rm ~/.hotelzero/session.json

# Or disable session persistence entirely
HOTELZERO_SESSION_PATH="" npx hotelzero

Debug Mode

Enable debug logging to see detailed information:

HOTELZERO_LOG_LEVEL=debug npx hotelzero

This will show:

  • URL being requested

  • Filters being applied

  • Number of results found

  • Any errors or warnings

Tests Failing

If you're running the test suite and tests fail:

  1. Network issues: Tests hit live Booking.com - check your connection

  2. Rate limiting: Wait a few minutes between test runs

  3. Selector changes: Booking.com may have updated their HTML structure


API Response Schema

HotelResult (from find_hotels / search_hotels)

interface HotelResult {
  name: string;                    // Hotel name
  price: number | null;            // Price per night as number (null if not shown)
  priceDisplay: string;            // Formatted price string (e.g., "$199")
  rating: number | null;           // Review score 0-10 (null if no reviews)
  ratingText: string;              // Rating description (e.g., "Excellent", "Very Good")
  reviewCount: number | null;      // Number of reviews (null if not shown)
  location: string;                // Neighborhood/area name
  distanceToCenter: string;        // Distance from center (e.g., "0.5 miles from center")
  amenities: string[];             // Detected amenities (e.g., ["Pool", "Free WiFi", "Spa"])
  highlights: string[];            // Special highlights (e.g., ["Free Cancellation"])
  link: string;                    // Full Booking.com URL for the hotel
  thumbnailUrl: string | null;     // Hotel thumbnail image URL (null if not available)
  availability: string | null;     // Availability status (e.g., "Only 2 rooms left!")
  matchScore?: number;             // Relevance score based on filters (only with filters)
  matchReasons?: string[];         // Why this hotel matched (only with filters)
}

HotelDetails (from get_hotel_details / compare_hotels)

interface HotelDetails {
  name: string;                    // Hotel name
  url: string;                     // Booking.com URL
  rating: number | null;           // Review score 0-10
  ratingText: string;              // Rating description
  reviewCount: number | null;      // Total number of reviews
  starRating: number | null;       // Official star rating 1-5
  address: string;                 // Full address
  description: string;             // Hotel description text
  highlights: string;              // Property highlights summary
  pricePerNight: number | null;    // Price per night as number
  priceDisplay: string;            // Formatted price per night
  totalPrice: string;              // Total stay price (formatted)
  checkInTime: string;             // Check-in time (e.g., "15:00")
  checkOutTime: string;            // Check-out time (e.g., "11:00")
  popularFacilities: string[];     // Top facilities list
  allFacilities: string[];         // Complete facilities list
  roomTypes: string[];             // Available room type names
  photos: string[];                // Photo URLs
  nearbyAttractions: string[];     // Nearby points of interest
  guestReviewHighlights: string[]; // Notable review excerpts
  locationInfo: string;            // Location description
}

AvailabilityResult (from check_availability)

interface AvailabilityResult {
  available: boolean;              // Whether rooms are available
  hotelName: string;               // Hotel name
  checkIn: string;                 // Check-in date (YYYY-MM-DD)
  checkOut: string;                // Check-out date (YYYY-MM-DD)
  guests: number;                  // Number of guests searched
  rooms: number;                   // Number of rooms searched
  roomOptions: RoomOption[];       // Available room types
  lowestPrice: number | null;      // Lowest price found
  lowestPriceDisplay: string;      // Formatted lowest price
  message: string;                 // Status message
  url: string;                     // Booking URL with dates
}

interface RoomOption {
  name: string;                    // Room type name
  price: number | null;            // Price as number
  priceDisplay: string;            // Formatted price
  sleeps: number | null;           // Maximum occupancy
  features: string[];              // Room features
  bedType: string;                 // Bed configuration
  cancellation: string;            // Cancellation policy
  breakfast: string;               // Meal plan info
}

ReviewsResult (from get_reviews)

interface ReviewsResult {
  hotelName: string;               // Hotel name
  overallRating: number | null;    // Overall score 0-10
  totalReviews: number;            // Total review count
  ratingBreakdown: RatingBreakdown; // Scores by category
  reviews: Review[];               // Individual reviews
  url: string;                     // Hotel URL
}

interface RatingBreakdown {
  staff: number | null;            // Staff rating
  facilities: number | null;       // Facilities rating
  cleanliness: number | null;      // Cleanliness rating
  comfort: number | null;          // Comfort rating
  valueForMoney: number | null;    // Value rating
  location: number | null;         // Location rating
  freeWifi: number | null;         // WiFi rating
}

interface Review {
  title: string;                   // Review title
  rating: number | null;           // Individual score 0-10
  date: string;                    // Review date
  travelerType: string;            // Traveler type (e.g., "Couple", "Family")
  country: string;                 // Reviewer's country
  stayDate: string;                // When they stayed
  roomType: string;                // Room they booked
  nightsStayed: string;            // Length of stay
  positive: string;                // Positive comments
  negative: string;                // Negative comments
}

PriceCalendarResult (from get_price_calendar)

interface PriceCalendarResult {
  hotelName: string;               // Hotel name
  startDate: string;               // Calendar start (YYYY-MM-DD)
  endDate: string;                 // Calendar end (YYYY-MM-DD)
  nights: number;                  // Number of nights checked
  currency: string;                // Currency code
  prices: DatePrice[];             // Price for each date
  lowestPrice: number | null;      // Lowest price in range
  lowestPriceDate: string | null;  // Date with lowest price
  highestPrice: number | null;     // Highest price in range
  highestPriceDate: string | null; // Date with highest price
  averagePrice: number | null;     // Average price
  url: string;                     // Hotel URL
}

interface DatePrice {
  date: string;                    // Date (YYYY-MM-DD)
  price: number | null;            // Price as number
  priceDisplay: string;            // Formatted price
  available: boolean;              // Whether available
  currency: string;                // Currency code
}

Error Response

When an error occurs, the response includes:

interface ErrorResponse {
  content: [{
    type: "text";
    text: string;                  // Error message with code and help text
  }];
  isError: true;
}

Error codes:

  • BROWSER_NOT_INITIALIZED - Call init() first

  • NAVIGATION_FAILED - Page load failed

  • RATE_LIMITED - Too many requests

  • CAPTCHA_DETECTED - CAPTCHA challenge encountered

  • NO_RESULTS - Search returned no results

  • DESTINATION_NOT_FOUND - Invalid destination

  • NETWORK_ERROR - Connection issue

  • TIMEOUT - Request timed out

  • BLOCKED - Access denied by Booking.com


License

MIT

Available Tools

7 tools
check_availabilityA

Check room availability and prices for a specific hotel on given dates. Returns available room types, prices, and booking details.

ParametersJSON Schema
NameRequiredDescriptionDefault
roomsNoNumber of rooms (default: 1)
guestsNoNumber of guests (default: 2)
checkInYesCheck-in date (YYYY-MM-DD)
checkOutYesCheck-out date (YYYY-MM-DD)
hotelUrlYesBooking.com hotel URL to check

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must convey safety and side-effect information. The verb 'check' implies a read-only operation, and the description adds that it 'returns available room types, prices, and booking details,' giving some behavioral insight. However, it does not explicitly state that no booking is made or that prices are not guaranteed, which would be useful for a tool carrying no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two concise sentences that are front-loaded with the primary action ('Check room availability and prices') and follow up with output details. There is no filler or redundancy, making it highly efficient and easy for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (5 parameters, no output schema, no annotations), the description adequately covers the core purpose and return value. It does not go into detail about exact output fields or limitations, but it provides enough context for an agent to select and invoke the tool correctly. The absence of an output schema is partially mitigated by mentioning available room types, prices, and booking details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with all parameters documented (e.g., hotelUrl, checkIn, checkOut, rooms, guests). The description adds minimal parameter-related meaning beyond the schema, only echoing 'specific hotel' and 'given dates.' Since the schema already covers the parameters fully, a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Check room availability and prices for a specific hotel on given dates.' This specifies the verb ('check'), resource ('room availability and prices'), and scope ('specific hotel', 'given dates'), distinguishing it from sibling tools like find_hotels (searching hotels) and compare_hotels (comparing options).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool: when you have a 'specific hotel' and 'given dates.' It implies this tool is for checking availability rather than searching or comparing, but it does not explicitly state alternatives or exclusions. Sibling names like find_hotels and compare_hotels indicate alternatives, but the description itself could have explicitly said 'use this when you already have a hotel URL.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_hotelsA

Compare 2-3 hotels side-by-side. Provide Booking.com URLs from search results to see a detailed comparison of ratings, prices, amenities, and facilities.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesArray of 2-3 Booking.com hotel URLs to compare

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It explains the input constraint (Booking.com URLs from search results) and the output aspects, but does not mention error behavior, data freshness, or potential limitations. This is acceptable but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: the first states the core action, the second specifies the input source and comparison aspects. No redundant words; all information is relevant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with a clear schema and no output schema, the description covers the purpose, input requirements, and expected comparison details. It could further specify the output format, but the listed comparison aspects suffice for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents the 'urls' parameter clearly (Array of 2-3 Booking.com hotel URLs). The description adds the valuable instruction that URLs should come from search results, which is not in the schema. This extra guidance elevates it above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool compares 2-3 hotels side-by-side with specific aspects (ratings, prices, amenities, facilities). This distinguishes it from sibling tools that search, get details, or check availability, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context that the input should be Booking.com URLs obtained from search results, implying usage after a search. It does not explicitly contrast with alternatives or state when not to use, so it earns a 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_hotelsA

Search for hotels with comprehensive filtering options. Supports 80+ filters including:

  • Property types (hotel, resort, villa, apartment, hostel, B&B, glamping, ryokan, etc.)

  • Star ratings (1-5 stars)

  • Beach/location (beachfront, ocean view, distance from center)

  • Amenities (pool, spa, gym, WiFi, parking, restaurant, bar, hot tub, casino, golf, tennis)

  • Room features (A/C, kitchen, balcony, private pool, bathtub, minibar, safe)

  • Bed types (king, queen, double, twin, single)

  • Meal plans (breakfast, all-inclusive, self-catering)

  • Policies (pet-friendly, adults-only, LGBTQ+ friendly, free cancellation)

  • Activities (snorkeling, diving, fishing, hiking, skiing, water sports)

  • Accessibility (wheelchair, elevator, walk-in shower, grab rails, braille)

  • Hotel chains (Marriott, Hilton, Hyatt, IHG, Ritz-Carlton, Four Seasons, etc.) Results are scored and ranked by how well they match the criteria.

ParametersJSON Schema
NameRequiredDescriptionDefault
tvNoTV
barNoBar
spaNoSpa/wellness
bathNoBathtub
golfNoGolf nearby
poolNoSwimming pool
safeNoIn-room safe
limitNoMaximum results to return (default: 25, max: 100)
roomsNoNumber of rooms
saunaNoSauna
casinoNoCasino
divingNoDiving
gardenNoGarden
guestsNoNumber of guests
hikingNoHiking
hotTubNoHot tub/Jacuzzi
skiingNoSkiing
sortByNoSort results by
tennisNoTennis
balconyNoBalcony
bedTypeNoBed type
brailleNoBraille signage
checkInYesCheck-in date (YYYY-MM-DD)
cyclingNoCycling
fishingNoFishing
fitnessNoFitness center/gym
kitchenNoKitchen/kitchenette
laundryNoLaundry service
minibarNoMinibar
parkingNoParking
terraceNoTerrace
checkOutYesCheck-out date (YYYY-MM-DD)
currencyNoCurrency code (USD, EUR, GBP, JPY, etc.)USD
freeWifiNoFree WiFi
maxPriceNoMaximum price per night
minPriceNoMinimum price per night
breakfastNoBreakfast included
conciergeNoConcierge
grabRailsNoGrab rails
minRatingNoMinimum rating: 6=Pleasant, 7=Good, 8=Very Good, 9=Wonderful
oceanViewNoRoom with ocean/sea view
adultsOnlyNoAdults only
beachfrontNoBeachfront property
evChargingNoEV charging
hotelChainNoHotel chain
restaurantNoRestaurant
snorkelingNoSnorkeling
starRatingNoStar rating (1-5)
beachAccessNoHas beach access
destinationYesCity or location (e.g., 'San Juan, Puerto Rico')
familyRoomsNoFamily rooms
groundFloorNoGround floor
horseRidingNoHorse riding
loweredSinkNoLowered sink
petFriendlyNoPet friendly
privatePoolNoPrivate pool
roomServiceNo24-hour room service
showerChairNoShower chair
waterSportsNoWater sports
allInclusiveNoAll-inclusive
noBookingFeeNoNo booking fee
noPrepaymentNoNo prepayment
propertyTypeNoProperty type
raisedToiletNoRaised toilet
rollInShowerNoRoll-in shower
selfCateringNoSelf-catering
tactileSignsNoTactile signs
walkInShowerNoWalk-in shower
bbqFacilitiesNoBBQ facilities
lgbtqFriendlyNoLGBTQ+ friendly
soundproofingNoSoundproofing
airportShuttleNoAirport shuttle
businessCenterNoBusiness center
elevatorAccessNoElevator access
washingMachineNoWashing machine
airConditioningNoAir conditioning
nonSmokingRoomsNoNon-smoking rooms
privateBathroomNoPrivate bathroom
auditoryGuidanceNoAuditory guidance
freeCancellationNoFree cancellation
wheelchairAccessibleNoWheelchair accessible
maxDistanceFromCenterNoMax distance from center
sustainabilityCertifiedNoSustainability certified

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of disclosing behavior. It adds useful context by stating that results are scored and ranked by how well they match criteria, and it enumerates the breadth of filter categories. It doesn't explicitly mention read-only behavior or output format, but 'search' implies a non-mutating operation and the ranking statement clarifies the result behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose. The bullet-style category list is useful for navigating an 83-parameter schema, though it is somewhat long. Every sentence serves a purpose, and the content is not redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high schema complexity and no output schema, the description provides a strong overview of capabilities and result ranking. It does not explicitly mention required parameters or default limits, but the schema covers those. The absence of a clear statement about return shape is a minor gap, but overall the description is adequate for an agent to select and use the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's category list loosely maps to the parameters (e.g., amenities, room features, policies) but does not add per-parameter details beyond what the schema already provides. It adds no value in clarifying individual parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches for hotels with comprehensive filtering, which is a specific action on a specific resource. However, it does not differentiate from the sibling tool 'search_hotels', which likely performs a similar function, so it misses the opportunity to distinguish itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'comprehensive filtering options' implies usage when many filtering criteria are needed, but there is no explicit guidance on when to use this tool vs. 'search_hotels' or other siblings. No exclusions or alternative tool recommendations are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hotel_detailsA

Get detailed information about a specific hotel including full amenity list, description, and photos

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesBooking.com URL for the hotel

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It implies a read-only operation via 'Get' and specifies the response content, but does not disclose error handling, prerequisites, or potential side effects. For a simple getter, the main behavioral traits (read-only, output coverage) are adequately conveyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, front-loaded with the action, and contains no unnecessary words. It is concise and to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema, the description covers the core purpose and return content. It lacks usage guidance and doesn't mention the URL prerequisite, but the schema fills that gap. Overall, it is sufficiently complete for a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with the parameter 'url' documented as 'Booking.com URL for the hotel'. The description does not add any meaning beyond the schema; it doesn't even reference the URL parameter, so no additional value is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'detailed information about a specific hotel', listing specific content types (amenity list, description, photos). This distinguishes it from siblings like find_hotels (searching) and get_reviews (reviews only).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention that it requires a hotel URL or that it is intended for known specific hotels, leaving the agent without explicit context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_price_calendarA

Get prices for a hotel across multiple dates to find the cheapest time to stay. Shows nightly prices, identifies the lowest/highest price dates, and calculates average pricing. Useful for flexible travelers looking for the best deal.

ParametersJSON Schema
NameRequiredDescriptionDefault
roomsNoNumber of rooms (default: 1)
guestsNoNumber of guests (default: 2)
nightsNoNumber of nights to check (default: 14, max: 30)
currencyNoCurrency code (default: USD)
hotelUrlYesBooking.com hotel URL to check prices for
startDateYesStart date for price calendar (YYYY-MM-DD)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains what the tool shows (nightly prices, lowest/highest dates, average pricing), which covers the output behavior. However, it does not disclose any potential limitations, error conditions, or dependencies beyond the schema, missing an opportunity to provide richer context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the main action, and every sentence earns its place: purpose, what it shows, and target user. There is no redundancy or fluff, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description does a good job explaining the return value by mentioning nightly prices, lowest/highest dates, and average pricing. It is reasonably complete for a read-only price lookup tool, though it does not discuss edge cases or error handling, which prevents a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add significant meaning beyond the schema; it only implies the relevance of 'multiple dates' to the startDate and nights parameters. The schema already documents each parameter clearly, so the description adds marginal value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb and resource: 'Get prices for a hotel across multiple dates.' It also differentiates from sibling tools by focusing on price comparison across dates and deriving insights like lowest/highest dates and averages, which is distinct from availability checks or hotel search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: 'Useful for flexible travelers looking for the best deal.' This implies the tool is for date-flexible price comparison rather than single-date checking. However, it does not explicitly mention alternatives or exclusions, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reviewsA

Get guest reviews for a specific hotel. Returns overall rating, rating breakdown by category (staff, facilities, cleanliness, comfort, value, location, WiFi), and individual reviews with positive/negative comments, reviewer info, and stay details.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of reviews to fetch (default: 10, max: 50)
sortByNoSort reviews by
filterByNoFilter by traveler type
hotelUrlYesBooking.com hotel URL to get reviews for

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. It discloses what the tool returns (overall rating, breakdown, individual reviews with comments and reviewer info) but does not mention potential behaviors like default limit, sorting defaults, pagination, or error conditions. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first states the purpose, the second lists return details. It is front-loaded with the core verb and resource and contains zero fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description explains return values in good detail. It covers the essential behavior for a list/review tool, though it lacks notes on pagination or error handling. Given the moderate complexity, it is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for all parameters, including defaults and enums. The description adds no additional parameter-level meaning beyond what the schema already provides. Baseline 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get guest reviews for a specific hotel' with a specific verb and resource. It distinguishes itself from siblings like get_hotel_details by focusing exclusively on reviews and detailing the return content, including rating breakdown and individual review details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly communicates when to use the tool: when you need guest reviews for a specific hotel, and the required hotelUrl parameter signals that you must already have a hotel URL. It does not explicitly name alternatives or exclusions, but the context makes the use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_hotelsA

Basic hotel search without filters. Use find_hotels for filtered searches.

ParametersJSON Schema
NameRequiredDescriptionDefault
roomsNoNumber of rooms
guestsNoNumber of guests
checkInYesCheck-in date (YYYY-MM-DD)
checkOutYesCheck-out date (YYYY-MM-DD)
destinationYesCity or location

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description bears the full burden. It discloses the key constraint 'without filters', which is a meaningful behavioral trait. However, it omits any details about output format, pagination, or error behavior, leaving some gaps for a search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly concise, consisting of two short sentences. It is front-loaded with the core purpose and contains no extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and full schema coverage, the description adequately covers the essential purpose and usage advice. There is no output schema, so return values need not be explained. Lacks deeper behavioral details but is sufficient for a basic search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% parameter description coverage for destination, checkIn, checkOut, rooms, and guests. The tool description adds no additional parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a 'basic hotel search without filters', which specifies the tool's function and scope. It distinguishes from sibling find_hotels by explicitly noting the lack of filters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Use find_hotels for filtered searches' directly names the alternative tool for filtered use cases, telling the agent when to choose this tool.

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.

  1. 7 tool updatesv1.15.2
    • First observedcheck_availability
    • First observedcompare_hotels
    • First observedfind_hotels
    • First observedget_hotel_details
    • First observedget_price_calendar
    • First observedget_reviews
    • First observedsearch_hotels

TDQS

A4.1/5.0
Disambiguation4/5

Most tools have clearly distinct purposes (search, details, compare, availability, reviews, price calendar). The main overlap is between find_hotels and search_hotels, but the descriptions clarify that find_hotels is the filtered version and search_hotels is basic, making the distinction manageable.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: find_hotels, search_hotels, get_hotel_details, compare_hotels, check_availability, get_reviews, get_price_calendar. No mixed conventions or vague verbs.

Tool Count5/5

Seven tools is well within the ideal 3-15 range. Each tool covers a distinct aspect of the hotel search and comparison workflow, and none feel redundant or unnecessary.

Completeness4/5

The tool surface covers the core hotel discovery and planning workflow: searching, filtering, detailed views, comparisons, availability checks, reviews, and price trends. The only notable gap is the lack of a booking/reservation tool, but the server's purpose may be limited to research and comparison rather than booking.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/insprd/hotelzero'

If you have feedback or need assistance with the MCP directory API, please join our Discord server