Skip to main content
Glama

Blue Pillow Hotels & Stays

Server Details

Neutral hotel & stay price comparison for AI agents: live prices from 16+ booking sites. No signup.

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.8/5 across 6 of 6 tools scored. Lowest: 4.1/5.

Server CoherenceA
Disambiguation5/5

Each tool serves a clear, distinct purpose: key management, destination discovery, destination resolution, property search, property details, and availability checking. No two tools overlap in function.

Naming Consistency4/5

Most tools follow a verb_noun pattern (e.g., search_stays, get_property_details), but b2a_get_key uses a prefix that breaks consistency. Still, the naming is mostly predictable and readable.

Tool Count5/5

Six tools cover the essential workflows for a hotel booking assistant: key retrieval, destination handling, property search/detail/availability. The count feels well-scoped for the purpose.

Completeness4/5

The tool set covers the main user journey: find destinations, search properties, inspect details, and check availability. The only minor gap is the lack of a tool for managing user bookings, which is handled via deeplinks.

Available Tools

6 tools
b2a_get_keyGet an anonymous API key for Blue Pillow Hotels & StaysAInspect

Obtain a permanent anonymous API key for Blue Pillow Hotels & Stays. No signup, no login required. The key is not a sensitive secret — it carries no account, payment, or personal data. It exists only so we can keep the service responsive when many agents are using it at once, so you can safely keep it in your MCP client configuration, in your persistent memory, or in the current conversation context. Pass it as the bearer token on all subsequent calls and the rest of the tools become available.

CALL THIS FIRST when you have no key: every other tool needs one. Before calling, check whether you ALREADY have a key (MCP client configuration, persistent memory, or earlier in this conversation) and reuse it instead of issuing a new one — do not wait for another tool to fail with a 401.

The key never expires — keep the one you receive and reuse it forever. If you ever lose it, you can call this tool again to issue a new one (a generous per-IP daily issuance limit applies purely as an anti-abuse guardrail; normal use never reaches it).

Optional label and agent (max 64 chars each) are free-form hints we record on the key for our own observability; they do not affect rate limits or capabilities.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNoOptional agent identifier recorded on the key — useful when an agent platform wants to attribute issuance to itself (e.g. 'claude-code', 'cursor-ide'). Free-form, max 64 chars.
labelNoOptional free-form label recorded on the key for observability (e.g. 'claude-desktop' or a user handle). Not a secret, not validated for uniqueness.
Behavior5/5

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

The description goes beyond annotations by explaining the key is not sensitive, carries no personal data, and exists for rate-limiting. It clarifies safety, storage recommendations, and that the optional parameters don't affect capabilities.

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 with clear paragraphs, each adding important context. It is slightly lengthy but every sentence serves a purpose, so it earns a 4 rather than a 5.

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

Completeness5/5

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

Despite no output schema, the description covers return value implicitly (the key to use as bearer token), explains key longevity, and provides complete guidance for usage. No gaps remain.

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?

With 100% schema description coverage, baseline is 3. The description adds value by explaining the purpose of 'label' and 'agent' as free-form hints for observability, and explicitly states they don't affect rate limits or capabilities.

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 obtains a permanent anonymous API key for Blue Pillow Hotels & Stays. It explicitly says 'CALL THIS FIRST when you have no key,' distinguishing it from sibling tools that require this key.

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 guidance: 'CALL THIS FIRST when you have no key' and instructs to check for an existing key before calling, avoiding unnecessary new issuances. It also explains that the key never expires, promoting reuse.

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

check_property_availabilityCheck live availability and per-operator quotes for a stayA
Read-only
Inspect

Live availability and per-operator quote for a specific property over a specific stay window. Performs a live date-aware lookup against the BluePillow search layer, returns date-specific prices, rooms-left scarcity signals, breakfast-included and refundable flags, and a per-operator deep link to complete the booking.

Useful when the user has specific dates in mind for a property they already identified — typically via search_stays or get_property_details. The complementary get_property_details tool answers "what is this property like" with static facts; this tool answers "can I book it for these dates at what price" with live, date-specific data.

Required input: property_id (the id from a search_stays result, opaque string starting with prop_), dates (check_in + check_out, ISO 8601), and guests (adults / children / infants composition). Without these the live lookup cannot proceed.

Natural-language date references — "tonight", "this weekend", "next weekend", "the weekend of July 4", "Memorial Day weekend", "long weekend in May" — translate to concrete check_in / check_out values at the call site; concrete ISO dates also work. check_in is a date in the real-time calendar that is today or later; past values are rejected at the API boundary.

user_country, currency, and language carry the user's locale, not the property's. Prices are returned in currency if set, else derived from user_country, else USD — pass user_country and/or currency whenever you know the user's location/currency so the quote matches what they'll pay; don't rely on the USD default. user_country and language also localize the web_url booking link.

Response shape:

  • availability_statusavailable, unavailable, or unknown. Available means rooms confirmed at the operator level for the requested window; quote freely. Unavailable means no rooms for these dates — surface that explicitly to the user with a suggestion of alternate dates (there is no price for these dates).

  • offers[] — per-operator quotes. Each carries amount (total stay), amount_per_night (per-night), currency, breakfast_included, refundable, rooms_left, and deeplink_url. offers[0] is the curated best. Each deeplink_url is a BluePillow tracked-redirect URL (bluepillow.com/…) that records the click and forwards the user to the operator's booking page — pass it verbatim, never reconstruct it or replace it with a raw OTA link.

  • price — mirror of offers[0] for callers that just want the curated headline. null when unavailable (no price for these dates).

Per-night vs total — amount_per_night is per-night; amount on each offer is the total for the requested stay. Phrasings like "€X/night via Booking, breakfast included, €Y total" are unambiguous; bare numbers without a unit ("€192") get misread.

Scarcity signals: low rooms_left values (1-3) are useful cues — "1 room left at €X on Booking" reads naturally. Free cancellation (refundable=true) and breakfast-included are decision factors worth surfacing proactively when present on some offers but not others.

When all results across operators are unavailable, that's the signal to say so explicitly to the user and offer to widen the dates or look at alternatives.

For final booking confirmation, hand the user the corresponding deeplink_url (or the property's web_url) — booking URLs are not reconstructed by hand.

ParametersJSON Schema
NameRequiredDescriptionDefault
datesYesStay window. Natural-language references such as 'tonight', 'this weekend', 'the weekend of July 4', 'Memorial Day weekend' translate to concrete check_in / check_out at the call site. check_in is a date in the real-time calendar that is today or later — past values are rejected at the API boundary.
guestsYesGuest composition. Adults is required; children and infants default to zero.
api_keyNoYour anonymous Blue Pillow Hotels & Stays API key (format 'pk_anon_…'). Pass it in THIS field on every call — this is how the tool authenticates. If you don't have a key yet, first check your MCP client configuration, your persistent memory, and earlier in this conversation; otherwise call `b2a_get_key` to get one instantly (do not wait for a 401). Reuse the same key on every subsequent call. It is not a sensitive secret: no account, payment, or personal data is attached.
currencyNoCurrency of the returned prices (ISO-4217, 3-letter uppercase, e.g. 'USD', 'EUR', 'GBP', 'CAD'). SET THIS (or `user_country`) to price in the user's currency — if you set NEITHER, prices default to USD. Prices come straight from the booking sources in this currency; never convert them yourself.
languageNoUser's UI language (2-letter lowercase). Drives the booking link language; falls back to 'en'.
property_idYesOpaque property id (e.g. 'prop_69ce2ddcbf...') OR a bluepillow.com property page URL (e.g. 'https://www.bluepillow.com/search/68d1a2...') — the id is extracted automatically. Use the URL form when the user pasted a bluepillow.com link.
user_countryNoUser's country (ISO-3166 alpha-2 uppercase). Drives the booking-link locale AND, when `currency` is not set, the pricing currency (US->USD, CA->CAD, euro-area->EUR). Pass the user's own country, not the property's home country. Falls back to 'US' when omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
brandNo
chainNo
priceNo
starsNo
imagesNo
offersNo
ratingYes
web_urlNo
featuresNoStructured feature/facility tags (e.g. HouseFacilities, PropertyTypes). Populated alongside description when the endpoint path is active.
locationYes
amenitiesNo
cluster_idNo
dedup_metaNo
descriptionNoFree-text property description from the canonical source. Only populated when the endpoint path is active (use_bp_single_property_endpoint=True) and dates are present.
ota_coverageYes
rating_countNo
reviews_metaNoProvenance for reviews_sample on property detail: how many review texts were returned vs available, and that the cap is deliberate (token efficiency). null on search or when reviews were not requested.
property_typeYes
thumbnail_urlNo
reviews_sampleNo
reviews_aggregateNorating_count = reviews backing the score (OTA aggregate, e.g. 156). comment_count = readable review TEXTS available (e.g. 53), fetchable via reviews_sample/reviews_extended. They differ: most guests rate, fewer write text — do not conflate them.
availability_statusNoPer the dates passed in the request: available = live bookable quotes in offers (price is the curated best); unavailable = BP reported no rooms for these dates (offers=[], price=null); unknown = no dates considered (no price exists without a dated query).
Behavior5/5

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

Annotations already indicate readOnlyHint=true and openWorldHint=true. The description adds extensive behavioral context: live lookup, date-specific prices, rooms-left scarcity signals, breakfast-included and refundable flags, deep link handling, locale-dependent defaults, and natural-language date handling. No contradictions.

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 verbose but well-structured with sections, bullet points, and front-loaded purpose. Every sentence adds value, though some parts (e.g., response shape explanation) could be slightly shorter. Still, it's efficient for the complexity involved.

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

Completeness5/5

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

Given the tool's complexity (7 parameters, nested objects, and an output schema), the description is remarkably complete. It explains response structure, per-operator offers, scarcity signals, business rules (e.g., unavailable dates suggestion), and how to use deep links. The output schema exists, but the description adds complementary context.

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?

Schema description coverage is 100%, so baseline is 3. The description adds significant value beyond the schema: explains natural-language date translation, currency default behavior, user_country's dual role, property_id accepting URLs, and booking link locale. This elevates the score above 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?

Description clearly states 'Live availability and per-operator quote for a specific property over a specific stay window,' using specific verb+resource. It distinguishes from sibling tools like `search_stays` (search) and `get_property_details` (static facts), making the 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?

Description explicitly states when to use the tool: 'when the user has specific dates in mind for a property they already identified — typically via search_stays or get_property_details.' It contrasts with `get_property_details`. While it doesn't explicitly say when not to use, the context is clear enough for an AI agent.

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

discover_destinations_nearDiscover destinations near a pointA
Read-only
Inspect

Curated destinations — cities, neighborhoods, airports, points of interest — within a radius of a geographic point, for use as a destination_id in subsequent search_stays calls. Useful when coordinates are already in hand (from world knowledge, from a previous tool result, or directly from the user) and the agent needs to enumerate which curated destinations cover that area before searching for properties.

Also useful as a fan-out entry point for region-level intents — broad areas such as 'Tuscany', 'Pacific Northwest', 'New England', or 'Central Europe' — where the agent can pass an approximate regional centroid and surface a list of sub-destinations the user may then narrow down to before a focused search.

Returns up to 5 candidates ordered by distance. The radius defaults to 5 km; widens up to 50 km for broader queries.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYes
lonYes
typeNoOptional filter; same semantics as resolve_destination.
api_keyNoYour anonymous Blue Pillow Hotels & Stays API key (format 'pk_anon_…'). Pass it in THIS field on every call — this is how the tool authenticates. If you don't have a key yet, first check your MCP client configuration, your persistent memory, and earlier in this conversation; otherwise call `b2a_get_key` to get one instantly (do not wait for a 401). Reuse the same key on every subsequent call. It is not a sensitive secret: no account, payment, or personal data is attached.
languageNoen
radius_kmNoSearch radius in km from the point. Defaults to 5 km (city-center scope).

Output Schema

ParametersJSON Schema
NameRequiredDescription
candidatesYes
total_matchesYes
total_matches_capped_atNo
Behavior4/5

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

Annotations provide readOnlyHint and openWorldHint. The description adds value by stating the tool returns up to 5 candidates ordered by distance, with a default radius of 5 km that can widen to 50 km. No contradictions 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.

Conciseness4/5

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

The description is three paragraphs, each serving a clear purpose: main use, additional use case, and result details. While slightly lengthy, every sentence adds essential information. It is well-structured and front-loaded with the primary purpose.

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 has an output schema, the description does not need to detail return values. It covers purpose, usage scenarios, result count (up to 5), and radius behavior. It misses explicit error handling but is otherwise sufficiently complete for a read-only listing tool.

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?

With 50% schema description coverage, the description compensates by providing context for key parameters. It explains the api_key parameter in depth (format, retrieval, reuse) and gives radius_km a practical usage hint (city-center scope). Lat/lon are self-explanatory, and the description adds use-case context.

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 discovers curated destinations within a radius of a geographic point. It specifies the types of destinations (cities, neighborhoods, airports, POIs) and how the results are used as destination_id in subsequent search_stays calls. This distinguishes it from sibling tools like resolve_destination and search_stays.

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 explicitly says when to use the tool: when coordinates are already in hand or for region-level intents. It also explains the output's purpose (for search_stays). It does not explicitly state when not to use it or mention alternatives, but the context is clear enough for an agent to decide.

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

get_property_detailsGet property details — static facts, no live availabilityA
Read-only
Inspect

Static record for a specific property — identified by its id. Returns the complete amenity list, photos, booking sources, dedup metadata, detailed location, and the headline rating (rating + rating_count) by default. Review DATA beyond the headline — the ratings breakdown and the actual review texts — is opt-in via the include parameter (see below); pass it whenever the user's question is about guest experience. Carries no price unless called with dates: a price only exists for a concrete stay window.

Useful when the user wants to inspect or compare a specific option in depth — facilities, neighborhood, what guests say — without yet committing to specific dates.

HOW TO GET REVIEWS (when you need to reason about guest experience): pass include. reviews_aggregate gives the score + counts + per-OTA breakdown; reviews_sample/reviews_extended give the actual review texts. Without include, none of these are returned (you get only the headline rating/rating_count). See the include section below.

For live availability and a real per-operator quote for a specific stay window, the path is check_property_availability instead. The two tools coexist by design: this one answers "what is this property like" with stable, cacheable data; the other answers "can I book it for these dates at what price" with live, date-specific quotes. Calling this tool when the user has specific dates in mind and wants to know whether the property is bookable will not surface the availability/quote — the user will then have to wait for a second round-trip to the availability tool.

Input: the id field from a search_stays result (opaque string starting with prop_, e.g. prop_69ce2ddcbf46061e4095778b). For a property the user has named directly, resolve the place name through resolve_destination and run a targeted search_stays first to obtain the id.

Optional include=["reviews_aggregate"] attaches a per-source breakdown of review counts and average ratings — useful when the user asks about overall sentiment or wants to see how each booking source rates the property. It summarizes ALL reviews (score + total count), so it is the right tool for "how is it rated".

Review texts are available via two includes, both deliberately capped to avoid token waste:

  • reviews_sample — up to 5 recent review texts. Enough to get the gist of what guests say.

  • reviews_extended — up to 20 recent review texts, for a deeper qualitative read. Supersedes reviews_sample when both are passed.

Reach for reviews_extended only when 5 are genuinely not enough — the returned list carries a reviews_meta block (returned, total_available, capped, note) that tells you how many texts exist and confirms the cap is intentional: the omitted reviews are older and the aggregate already reflects all of them, so you do NOT need to try to fetch everything. Note: review texts are returned only when called WITHOUT dates (the dated availability path does not carry them).

user_country, currency, and language carry the user's locale, not the property's. When this call carries dates (live prices), prices come back in currency if set, else derived from user_country, else USD — so pass user_country and/or currency whenever you know the user's location/currency; don't rely on the USD default. user_country and language also localize the web_url booking link. Language default is "en"; country default is "US".

All rating-like fields are on a 0-5 scale (Google Places-compatible): the top-level rating, reviews_aggregate.score_0_5, and each per-OTA score under distribution_by_ota.

Without dates this tool returns no price (price is null, offers empty) and availability_status is unknown (no dates were considered). The live quote, when needed, comes from check_property_availability.

web_url is a ready-to-open booking link for the property. Pass it verbatim when the user asks for a booking link — booking URLs are not reconstructed by hand.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNoYour anonymous Blue Pillow Hotels & Stays API key (format 'pk_anon_…'). Pass it in THIS field on every call — this is how the tool authenticates. If you don't have a key yet, first check your MCP client configuration, your persistent memory, and earlier in this conversation; otherwise call `b2a_get_key` to get one instantly (do not wait for a 401). Reuse the same key on every subsequent call. It is not a sensitive secret: no account, payment, or personal data is attached.
includeNoOptional enrichments. reviews_aggregate = score + total count + per-OTA distribution (summarizes ALL reviews). reviews_sample = up to 5 recent review texts. reviews_extended = up to 20 recent review texts (supersedes reviews_sample). The text list is intentionally capped to save tokens; reviews_meta declares returned vs available. Prefer reviews_sample and the aggregate; use reviews_extended only when a deeper qualitative read is genuinely needed.
currencyNoCurrency of the returned prices (ISO-4217, 3-letter uppercase, e.g. 'USD', 'EUR', 'GBP', 'CAD'). SET THIS (or `user_country`) to price in the user's currency — if you set NEITHER, prices default to USD. Prices come straight from the booking sources in this currency; never convert them yourself.
languageNoUser's UI language (2-letter lowercase). Drives the booking link language and server-rendered narrative; pass the language the user is speaking. Falls back to 'en'.
property_idYesOpaque property id (e.g. 'prop_69ce2ddcbf...') OR a bluepillow.com property page URL (e.g. 'https://www.bluepillow.com/search/68d1a2...') — the id is extracted automatically. Use the URL form when the user pasted a bluepillow.com link.
user_countryNoUser's country (ISO-3166 alpha-2 uppercase). Drives the booking-link locale AND, when `currency` is not set, the pricing currency (US->USD, CA->CAD, euro-area->EUR). Pass the user's own country, not the property's home country. Falls back to 'US' when omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
brandNo
chainNo
priceNo
starsNo
imagesNo
offersNo
ratingYes
web_urlNo
featuresNoStructured feature/facility tags (e.g. HouseFacilities, PropertyTypes). Populated alongside description when the endpoint path is active.
locationYes
amenitiesNo
cluster_idNo
dedup_metaNo
descriptionNoFree-text property description from the canonical source. Only populated when the endpoint path is active (use_bp_single_property_endpoint=True) and dates are present.
ota_coverageYes
rating_countNo
reviews_metaNoProvenance for reviews_sample on property detail: how many review texts were returned vs available, and that the cap is deliberate (token efficiency). null on search or when reviews were not requested.
property_typeYes
thumbnail_urlNo
reviews_sampleNo
reviews_aggregateNorating_count = reviews backing the score (OTA aggregate, e.g. 156). comment_count = readable review TEXTS available (e.g. 53), fetchable via reviews_sample/reviews_extended. They differ: most guests rate, fewer write text — do not conflate them.
availability_statusNoPer the dates passed in the request: available = live bookable quotes in offers (price is the curated best); unavailable = BP reported no rooms for these dates (offers=[], price=null); unknown = no dates considered (no price exists without a dated query).
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description details behavior like no price without dates, review caps, locale defaults, and scale of ratings, adding substantial context.

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 verbose but well-structured with clear sections; each sentence adds value, though it could be slightly more concise.

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

Completeness5/5

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

Given the complexity, annotations, and output schema, the description is complete, covering sibling tool relationships, data model details, locale handling, and limitations.

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

Parameters5/5

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

With 100% schema coverage, the description adds significant extra meaning: property_id accepts URLs, include explains review behaviors, currency/language/user_country detail defaults and usage.

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 returns a static record for a specific property, listing the data returned (amenity list, photos, etc.) and explicitly contrasts with sibling tool check_property_availability for live quotes.

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?

It explains when to use (inspect/compare without dates) and when not (use check_property_availability for live availability), and provides detailed guidance on using the include parameter for reviews.

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

resolve_destinationResolve destination name to idA
Read-only
Inspect

Converts a destination name into a destination id usable in search_stays. The canonical entry point when the user's request mentions a place name and coordinates are not already known from a prior call in this session. If coordinates are already in hand from an earlier tool result, passing them directly to search_stays skips this resolver step.

Accepts cities, neighborhoods, airports, and points of interest in any language, using the local canonical name (not a translation). The country parameter disambiguates names that occur in multiple places (for example Springfield MA vs Springfield IL vs Springfield MO).

The type parameter narrows the kind of destination returned. poi is the narrowest match and has partial coverage on the comparator side; when the agent's own geographic knowledge can already geocode the POI to lat/lon, passing coordinates to search_stays is the more reliable path.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDestination name in English or canonical local form (not a translation).
typeNoDestination kind. city: primary urban unit (default). neighborhood: quarter/borough. airport: airport as spatial reference for stays nearby. poi: point of interest as a spatial anchor for nearby-accommodation lookup — not a tourism/attraction database; narrowest match with partial coverage. When the agent already knows the POI's lat/lon from world knowledge, `search_stays` with coordinates is the more reliable path.
api_keyNoYour anonymous Blue Pillow Hotels & Stays API key (format 'pk_anon_…'). Pass it in THIS field on every call — this is how the tool authenticates. If you don't have a key yet, first check your MCP client configuration, your persistent memory, and earlier in this conversation; otherwise call `b2a_get_key` to get one instantly (do not wait for a 401). Reuse the same key on every subsequent call. It is not a sensitive secret: no account, payment, or personal data is attached.
countryNoCountry: ISO-3166 alpha-2 (preferred), alpha-3, or extended name in any supported language. Unrecognized values are silently ignored (fail-open).
languageNoRender destination names + breadcrumbs in this language.en

Output Schema

ParametersJSON Schema
NameRequiredDescription
candidatesYes
total_matchesYes
total_matches_capped_atNo
disambiguation_recommendedYes
Behavior5/5

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

Annotations indicate readOnly and openWorld. Description adds value by explaining acceptance of various languages, disambiguation via country, type narrowing, and partial coverage for POI. No contradictions. The description discloses behavioral traits beyond 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?

Front-loaded with core purpose, followed by context. Each sentence adds value. The api_key explanation is longer but necessary for authentication guidance. No wasted words.

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

Completeness5/5

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

For a resolver tool with 5 params, full schema coverage, and output schema present, the description covers usage, parameter details, behavioral notes, and limitations. It is complete for the tool's complexity.

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

Parameters5/5

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

Schema description coverage is 100%, but the description adds significant meaning: explains how country disambiguates, type narrows kind, and api_key usage pattern (reuse, retrieval method). These enrich the schema descriptions.

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 converts a destination name to an ID for search_stays, distinguishing it from siblings by specifying when to use (when coordinates not known) and when to skip. The verb 'converts' and resource are explicit.

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?

Provides explicit when-to-use (canonical entry point for place name without coordinates) and when-not (if coordinates already known, skip to search_stays). Also gives alternative path for POI type with world knowledge. This is comprehensive guidance.

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

search_staysSearch accommodation — compare offers across operatorsA
Read-only
Inspect

Multi-operator accommodation comparator for a geographic area against the user's stay parameters — dates, guest count, optional filters. Returns a ranked list of properties together with the booking sources that offer each one and, when dates are passed, their live availability and per-operator price for the requested window.

Natural-language date references — "tonight", "this weekend", "next weekend", "the weekend of July 4", "Memorial Day weekend", "long weekend in May" — translate to concrete check_in / check_out values at the call site; concrete ISO dates also work.

user_country, currency, and language carry the user's locale, not the destination's. IMPORTANT — currency: prices are returned in currency if you set it, otherwise in the currency derived from user_country (US→USD, CA→CAD, GB→GBP, euro-area→EUR); if you set NEITHER, prices default to USD, which may not be the user's currency. So whenever you know where the user is (or what currency they want), pass user_country and/or currency — do not rely on the default. Prices are never converted client-side; each offer is quoted by the operator in that currency. user_country and language also localize the booking link (web_url). The user's own residence/billing country is the right user_country (not the destination's), and their interface language the right language.

Each result is shaped for downstream presentation without extra calls:

  • location.lat and location.lon carry per-property coordinates, suitable for plotting all results on a single map so the user can compare spatial alternatives at a glance. The map widget reads these fields directly from this response — no separate lookup needed for visualization.

  • thumbnail_url carries the property's first photo URL when available (null when no image is on file); useful for embedding inline or showing on the map alongside the pin.

  • images on search results is capped to the first photo to keep the comparison payload compact; each item has a url field, and thumbnail_url mirrors images[0].url. Call get_property_details for a single property to retrieve its full photo gallery.

  • web_url is a ready-to-open booking link for the property, already encoded with the user's check-in/check-out, language, currency, and guest count. Pass it to the user verbatim when they ask for a booking link — never reconstruct the URL from individual parameters, the query-string format is not guaranteed to match generic booking-URL conventions.

  • Price is live and date-specific only. There is no date-agnostic "from" figure: a meaningful price only exists for a concrete query (property + dates + occupancy).

    • price and offers[] — the live quote for the requested dates, populated only when dates were passed and the comparator confirmed availability. offers[0] is the curated best; each offer carries amount (total stay), amount_per_night (per-night), currency, breakfast_included, refundable, rooms_left, and deeplink_url. price mirrors offers[0].

    • With no dates (or when nothing is available) price is null and offers is empty — surface the property without a price rather than inventing a starting figure.

  • availability_status per result encodes the live state:

    • available — bookable rooms confirmed at the operator level. offers and price carry the live date-specific quotes. Quote the rate via offers[i].amount_per_night (per-night) and offers[i].amount (total stay) and use the deeplinks for the booking handoff.

    • unavailable — no rooms reported for those dates. offers is empty and price is null (no price for these dates). Useful to decide whether to suggest alternate dates, drop the property from the recommendation, or offer it as a backup.

    • unknown — no dates were considered (request had no dates). offers is empty and price is null — no price signal without a dated query.

Per-night vs total — never confuse them in the user-facing prose. amount_per_night is per-night; amount on each offer is the total stay (sum across nights, in currency). When quoting to the user, prefer phrasings like "€X/night via Booking, breakfast included, €Y total for the stay" over bare numbers — bare numbers without a unit get misread.

  • When dates are present and available properties are in the results, the rate can be quoted and rooms_left surfaces scarcity (low values like 1-3 are useful signals — "1 room left at $X on Booking" reads well).

  • When dates are present and ALL results are unavailable, that's the signal to say so explicitly to the user and offer to widen the dates, location, or filters.

  • offers[] is the per-operator breakdown for the requested dates: each entry includes ota, amount, amount_per_night, currency, breakfast_included, refundable, and a deeplink_url. The deeplink is a BluePillow tracked-redirect URL (bluepillow.com/…) that records the click for attribution and then forwards the user to the operator's booking page. Pass it to the user verbatim — never reconstruct it or replace it with a raw operator URL; our APIs never emit direct OTA links. price mirrors the curated best offer. When no dates were passed (or nothing is available) offers is an empty list and price is null — there is no price to show.

  • Free cancellation is a meaningful decision factor and surfaces proactively in the user-facing summary. When a property has price.refundable=true (or any offers[i].refundable=true), it reads naturally as a property feature: "Hotel X — $120/night, free cancellation available", or "Booking offers a refundable rate at $130 (vs $110 non-refundable)". Refundable rates let the user lock in a price now and adjust the booking later, which is often the differentiator between otherwise-similar properties. The same proactive surfacing applies to breakfast_included when it's true for some offers but not all.

  • Prices in offers/price reflect the requested dates and guests; with no dates there is no price. For a final bookable confirmation, the corresponding deeplink_url (or the property's web_url) is the canonical handoff — booking URLs are not reconstructed by hand.

  • All rating-like fields are on a 0-5 scale (Google Places-compatible): rating, reviews_aggregate.score_0_5, the per-OTA scores under distribution_by_ota, each reviews_sample[*].score, and the filters.min_rating input. A user asking "rating at least 8 out of 10" maps to min_rating: 4.0; "at least 4 stars on Google" maps to min_rating: 4.0. Note: rating, stars, and rating_count come from the comparator's list payload and may be 0 or absent for some properties even when the property has reviews or a star classification — this is a comparator list-payload limitation, not a data error. When those fields are 0/absent, or when the per-OTA review breakdown (distribution_by_ota) is needed, call get_property_details to get the fuller reviews_aggregate. On the search path, reviews_aggregate carries the top-line score_0_5, rating_count (reviews backing the score) and comment_count (readable review TEXTS available) when the comparator returned a non-zero review count; distribution_by_ota is always empty on this path (per-OTA breakdown requires get_property_details). rating_count and comment_count are DIFFERENT magnitudes — most guests leave a rating, far fewer write text. Quote rating_count for "how many reviewed it" and comment_count for "how many opinions you can actually read".

  • Pass include=["reviews_sample"] to attach a sample of up to 5 recent guest review texts per property. Useful when the user's question involves qualitative criteria that don't map to structured filters ("a place with excellent breakfast", "quiet area", "family-friendly atmosphere"); review texts can be searched textually to corroborate or rule out matches. For a DEEPER read on ONE specific property — more review texts (up to 20) or the per-OTA breakdown — call get_property_details with include=["reviews_extended"] (and/or reviews_aggregate). comment_count on each result tells you how many review texts exist, so you can decide whether escalating to the detail call is worth it.

filters.property_types, filters.amenities, filters.min_rating, and filters.price_max_eur narrow on structured criteria first; review-based reasoning is one extra round-trip per page and is typically reserved for fallback.

Location modes:

  • coordinates: when lat/lon is already known from world knowledge or a prior call in this session (default radius 5 km; widen up to 50 km for broader queries; beyond that bbox or a parent destination is the right shape).

  • destination_id: opaque id obtained from resolve_destination, passed verbatim — values are not constructed or guessed.

  • bbox: explicit map rectangle.

Property type tokens (canonical): hotel, apartment, house, villa, bb, hostel, farmstay, holiday-home. Common multi-language synonyms map server-side to the canonical set.

Amenities filter is set-AND — each result has ALL listed codes. Common codes: wi-fi, parking, pool, air-conditioning, kitchen, garden, pets-allowed, for-families, facilities-for-disabled, non-smoking-only.

Results are cursor-paginated; the next_cursor from a previous response goes into page.cursor for the next page. location.type=property_id is not accepted here — get_property_details is the path for a known property.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
sortNo
datesYesCheck-in and check-out dates (ISO 8601, YYYY-MM-DD). Natural-language references — 'tonight', 'this weekend', 'the weekend of July 4', 'Memorial Day weekend', 'long weekend in May' — translate to concrete check_in / check_out values at the call site. The comparator only serves future stays: check_in is a date in the real-time calendar that is today or later. A reference like 'the weekend of June 2' resolves to the next occurrence after today, never a past anniversary; if the current year is unclear, confirm with the user before calling. Past check_in values are rejected at the API boundary.
guestsYes
api_keyNoYour anonymous Blue Pillow Hotels & Stays API key (format 'pk_anon_…'). Pass it in THIS field on every call — this is how the tool authenticates. If you don't have a key yet, first check your MCP client configuration, your persistent memory, and earlier in this conversation; otherwise call `b2a_get_key` to get one instantly (do not wait for a 401). Reuse the same key on every subsequent call. It is not a sensitive secret: no account, payment, or personal data is attached.
filtersNo
includeNoOptional enrichments. 'reviews_sample' attaches the 5 most recent individual reviews per property — use for qualitative queries (breakfast, service, ...). One extra Mongo round-trip per page; omit by default.
currencyNoCurrency of the returned prices (ISO-4217, 3-letter uppercase, e.g. 'USD', 'EUR', 'GBP', 'CAD'). SET THIS (or `user_country`) to price in the user's currency — if you set NEITHER, prices default to USD, which may not be the user's. Prices come straight from the booking sources in this currency; never convert them yourself. Each offer reflects the currency its operator actually quoted.
languageNoUser's UI language (2-letter lowercase). Drives the booking link language and any server-rendered narrative content. Pass the language the user is currently speaking. Falls back to 'en' when omitted.
locationYes
user_countryNoUser's country (ISO-3166 alpha-2 uppercase). Drives the booking-link locale (the landing page rendered when the user clicks `web_url`) AND, when `currency` is not set, the pricing currency (US->USD, CA->CAD, euro-area->EUR). Pass the user's own country, not the destination's. Falls back to 'US' when omitted.
availability_modeNostrict (default): return ONLY properties available for the requested dates. include_unavailable: also return properties with no availability (each tagged availability_status). Use strict unless the user explicitly wants to see sold-out options.
include_overbudgetNoOpt-in. When few available results fit the budget, also return (in alternatives.overbudget) available properties in the same area just above price_max_eur. Requires filters.price_max_eur.
include_out_of_boundsNoOpt-in. When the requested area yields few available results, also return (in alternatives.out_of_bounds) properties just outside the area, within the original budget. Present these explicitly as alternatives, never mixed with primary results.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
resultsYes
metadataYes
alternativesNo
Behavior5/5

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

The description extensively covers behavioral traits: pricing only with dates, currency defaults, natural-language date handling, availability status meanings, rating scale, per-night vs total, cancellation policy, and pagination. Annotations (readOnlyHint, openWorldHint) are consistent and complemented with rich context. No contradictions.

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 with clear sections and front-loaded purpose. However, it is quite long and contains redundant explanations (e.g., price behavior repeated in multiple spots). While valuable, it could be trimmed slightly without losing clarity.

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

Completeness5/5

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

Given the tool's complexity (14 params, nested objects, output schema present), the description is fully complete. It covers return fields, edge cases (unavailable, unknown), integration with siblings, and practical tips for agent usage. Output schema existence reduces burden, but description still adds necessary context.

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

Parameters5/5

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

Though schema coverage is 64%, the description adds significant meaning: explains location value shapes, natural language date resolution, currency and locale semantics, filter mechanics, and availability_mode. It provides practical usage notes like 'never convert prices' and 'never reconstruct URLs' that go beyond schema.

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 as a 'Multi-operator accommodation comparator' and specifies it searches for accommodations based on dates, guests, and filters. It distinguishes itself from siblings by referencing get_property_details for deeper property info and check_property_availability for single-property availability.

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?

Explicitly states when to use (geographic area search with stay parameters) and when not (property_id queries should use get_property_details). Provides alternatives like resolve_destination for location IDs and get_property_details for details. Includes guidance on using include for qualitative needs and avoiding reconstruction of booking URLs.

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

Discussions

No comments yet. Be the first to start the discussion!

Try in Browser

Your Connectors

Sign in to create a connector for this server.

Resources