# Blue Pillow Hotels & Stays (remote · mcp.b2a.bluepillow.com)

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

- Trust score: 61/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `mcp.b2a.bluepillow.com`: 61/100 (this document), [markdown](https://verifymcp.io/servers/com-bluepillow-hotels/mcp.md), [page](https://verifymcp.io/servers/com-bluepillow-hotels/mcp)

## Channel facts

- Endpoint: `https://mcp.b2a.bluepillow.com/`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 5 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 51/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 7833 tokens (~1305/item across 6 items; 6 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 94/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 80% of tool parameters carry a description.
  - Structured output schemas are declared (83% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http com-bluepillow-hotels https://mcp.b2a.bluepillow.com/
```

### Codex

```toml
[mcp_servers.com-bluepillow-hotels]
url = "https://mcp.b2a.bluepillow.com/"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-bluepillow-hotels": {
      "type": "remote",
      "url": "https://mcp.b2a.bluepillow.com/",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-bluepillow-hotels --url https://mcp.b2a.bluepillow.com/ --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-bluepillow-hotels:
    url: "https://mcp.b2a.bluepillow.com/"
```

### Other

```json
{
  "mcpServers": {
    "com-bluepillow-hotels": {
      "type": "http",
      "url": "https://mcp.b2a.bluepillow.com/"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 61, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 60, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 59, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 58, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 57, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 56)

First indexed and scored.

## MCP tools (6)

### `search_stays` (~3072 tokens)

Search accommodation — compare offers across operators

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 comparis…

Input parameters:

- `api_key` (string): Your 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 cli…
- `availability_mode` (string): strict (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 u…
- `currency` (string): Currency 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 U…
- `dates` (object, required): Check-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 con…
- `filters` (object)
- `guests` (object, required)
- `include` (array): Optional 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…
- `include_out_of_bounds` (boolean): Opt-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 alt…
- `include_overbudget` (boolean): Opt-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.
- `language` (string): User'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.
- `location` (object, required)
- `page` (object)
- `sort` (string)
- `user_country` (string): User'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,…

Output parameters:

- `alternatives` (object)
- `metadata` (object)
- `page` (object)
- `results` (array)

### `get_property_details` (~1434 tokens)

Get property details — static facts, no live availability

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 — use…

Input parameters:

- `api_key` (string): Your 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 cli…
- `currency` (string): Currency 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 U…
- `include` (array): Optional 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…
- `language` (string): User'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_id` (string, required): Opaque 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 th…
- `user_country` (string): User'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…

Output parameters:

- `amenities` (array)
- `availability_status` (string): Per 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 d…
- `brand` (string|null)
- `chain` (string|null)
- `cluster_id` (string|null)
- `dedup_meta` (object|null)
- `description` (string|null): Free-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.
- `features` (array): Structured feature/facility tags (e.g. HouseFacilities, PropertyTypes). Populated alongside description when the endpoint path is active.
- `id` (string)
- `images` (array)
- `location` (object)
- `name` (string)
- `offers` (array)
- `ota_coverage` (array)
- `price` (object|null)
- `property_type` (string)
- `rating` (number)
- `rating_count` (integer|null)
- `reviews_aggregate` (object|null): rating_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…
- `reviews_meta` (object|null): Provenance 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 requeste…
- `reviews_sample` (array|null)
- `stars` (integer|null)
- `thumbnail_url` (string|null)
- `web_url` (string|null)

### `check_property_availability` (~1321 tokens)

Check live availability and per-operator quotes for a stay

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_status` — `available`, `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 (t…

Input parameters:

- `api_key` (string): Your 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 cli…
- `currency` (string): Currency 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 U…
- `dates` (object, required): Stay 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…
- `guests` (object, required): Guest composition. Adults is required; children and infants default to zero.
- `language` (string): User's UI language (2-letter lowercase). Drives the booking link language; falls back to 'en'.
- `property_id` (string, required): Opaque 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 th…
- `user_country` (string): User'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…

Output parameters:

- `amenities` (array)
- `availability_status` (string): Per 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 d…
- `brand` (string|null)
- `chain` (string|null)
- `cluster_id` (string|null)
- `dedup_meta` (object|null)
- `description` (string|null): Free-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.
- `features` (array): Structured feature/facility tags (e.g. HouseFacilities, PropertyTypes). Populated alongside description when the endpoint path is active.
- `id` (string)
- `images` (array)
- `location` (object)
- `name` (string)
- `offers` (array)
- `ota_coverage` (array)
- `price` (object|null)
- `property_type` (string)
- `rating` (number)
- `rating_count` (integer|null)
- `reviews_aggregate` (object|null): rating_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…
- `reviews_meta` (object|null): Provenance 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 requeste…
- `reviews_sample` (array|null)
- `stars` (integer|null)
- `thumbnail_url` (string|null)
- `web_url` (string|null)

### `resolve_destination` (~474 tokens)

Resolve destination name to id

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.

Input parameters:

- `api_key` (string): Your 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 cli…
- `country` (string): Country: ISO-3166 alpha-2 (preferred), alpha-3, or extended name in any supported language. Unrecognized values are silently ignored (fail-open).
- `language` (string): Render destination names + breadcrumbs in this language.
- `name` (string, required): Destination name in English or canonical local form (not a translation).
- `type` (string): Destination 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-acco…

Output parameters:

- `candidates` (array)
- `disambiguation_recommended` (boolean)
- `total_matches` (integer)
- `total_matches_capped_at` (integer|null)

### `discover_destinations_near` (~365 tokens)

Discover destinations near a point

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.

Input parameters:

- `api_key` (string): Your 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 cli…
- `language` (string)
- `lat` (number, required)
- `lon` (number, required)
- `radius_km` (number): Search radius in km from the point. Defaults to 5 km (city-center scope).
- `type` (string): Optional filter; same semantics as resolve_destination.

Output parameters:

- `candidates` (array)
- `total_matches` (integer)
- `total_matches_capped_at` (integer|null)

### `b2a_get_key` (~375 tokens)

Get an anonymous API key for Blue Pillow Hotels & Stays

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.

Input parameters:

- `agent` (string): Optional 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.
- `label` (string): Optional free-form label recorded on the key for observability (e.g. 'claude-desktop' or a user handle). Not a secret, not validated for uniqueness.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-bluepillow-hotels/mcp#diagnostics

## Score history

- 2026-08-03: 61
- 2026-08-02: 61
- 2026-08-01: 60
- 2026-07-31: 60
- 2026-07-30: 59
- 2026-07-29: 58
- 2026-07-28: 58
- 2026-07-27: 57
- 2026-07-26: 56

## Links

- Remote endpoint: https://mcp.b2a.bluepillow.com/
- Website: https://b2a.bluepillow.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-bluepillow-hotels/mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-bluepillow-hotels/mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/com-bluepillow-hotels/mcp
