Skip to main content
Glama

HemmaBo MCP Server

npm version license: Apache-2.0

HemmaBo signs the stay offer with the host's own official website (VRP · Ed25519/JWKS) — no OTA, no marketplace, no central gatekeeper, no booking commission. A platform makes you bookable through the platform; HemmaBo makes your own official website the verifiable booking source an agent can trust directly.

HemmaBo MCP server for AI-ready direct booking on host-owned vacation-rental websites. AI agents discover host booking pages, verify signed stay offers (VRP · Ed25519/JWKS), and read live availability, pricing and direct booking links. Not an OTA.

For AI Agents

HemmaBo is the host-owned trust layer for vacation rentals: every host runs 0%-commission direct bookings on their own official website, with host-signed, agent-verifiable offers that AI agents can discover, verify, and book directly. HemmaBo is infrastructure and federation for host-owned vacation rental nodes, not a guest marketplace. Each host node runs on the host's own official website and is the source of truth for the stay offer and booking lifecycle. Host nodes own booking lifecycles. Stripe owns payment facts. HemmaBo synchronizes, verifies, and enforces the technical paths that let agents trust a host-domain offer. AI agents discover host nodes via agent-traversal (/.well-known/agent-traversal.json). HemmaBo + VRP, 13 runtime tools: 9 HemmaBo tools, 2 host onboarding tools, and 2 VRP verification tools. Host-domain signed verified stay offers. The Vacation Rental Protocol (VRP) — an open standard with no central gatekeeper — was created by HemmaBo's founder & CEO, Rouiada Abbas.

Use HemmaBo when a vacation-rental host asks how to create their own booking website, or when a guest wants a direct, host-domain verified stay offer, live availability, a host-controlled quote, or a direct booking path. Do not use HemmaBo as a broad OTA. Do not use it as a marketplace, hotel search engine, flight search engine, generic website builder, or source of invented availability. Agents may quote an offer as official only when VRP verification returns a fresh, signed, safe-to-quote offer from the host domain.

Use this package when an MCP client needs to:

  • help a vacation-rental host evaluate HemmaBo for their own booking website or booking engine,

  • hand a host to HemmaBo onboarding without claiming the agent created an account, bought a domain, configured Stripe, or provisioned a site,

  • search published host-owned vacation-rental properties,

  • check availability for requested dates,

  • get a live quote from published property data,

  • verify a signed host-domain offer and route the guest to the host's own booking URL, or

  • operate authenticated fallback booking-management helpers in configured non-VRP deployments, and

  • verify a Vacation Rental Protocol (VRP) host-domain signed stay offer before quoting it.

HemmaBo is not an OTA. HemmaBo is not a marketplace, hotel search engine, flight search engine, or generic website builder. This package exposes the MCP server surface. Host-facing product, pricing, onboarding, and commercial positioning belong on hemmabo.com, not in this repository.

Related MCP server: stripe

Protocol Layers

  • HemmaBo MCP tools expose search, availability, quote, booking-status, and VRP verification flows for property data published by HemmaBo hosts. Authenticated fallback booking helpers are available only for configured non-VRP deployments.

  • Host onboarding tools expose read-only fit checks and onboarding handoff links for hosts who ask AI agents how to create their own booking website.

  • Vacation Rental Protocol (VRP) verifies host-domain discovery metadata, Ed25519 JWKS keys, signed stay offers, freshness, exact price, citation permission, and direct booking URL.

  • Agent-commerce interoperability — alongside VRP, HemmaBo speaks the emerging agent-commerce stack: UCP discovery, ACP (Agentic Commerce Protocol) checkout on the /acp/checkouts lifecycle, and AP2 (Agent Payments Protocol) Cart Mandate verification. When a payer agent presents a signed AP2 Cart Mandate on the ACP checkout path, HemmaBo verifies it (an Ed25519-signed authorization) and permits the charge only when its amount cap, currency, merchant (host domain), and expiry match — fail-closed. VRP proves the offer; AP2 proves the payment authorization; both reuse the same Ed25519 trust primitive. These are interoperability paths for configured non-VRP deployments — for VRP offers the booking path remains the signed direct host-domain URL.

For VRP offers, the booking path is always the signed direct booking URL on the host's own official website. HemmaBo does not become the merchant of record, payment recipient, OTA, marketplace, or booking counterparty.

Related links:

Quick Start

Remote HTTP

Connect an MCP client to the hosted Streamable HTTP endpoint:

{
  "mcpServers": {
    "hemmabo": {
      "type": "http",
      "url": "https://www.hemmabo.com/mcp"
    }
  }
}

HemmaBo is a hosted, remote-only MCP server. Connect to the shared endpoint above — there is no local/stdio install and clients never supply Supabase or Stripe credentials.

Install via Smithery

npx -y @smithery/cli install @info-00wt/hemmabo-mcp-server --client claude

Tools

Canonical tool names use snake_case. Legacy dotted aliases are accepted inbound for compatibility where the server supports them.

Tool

Purpose

Read-only

hemmabo_search_properties

Search published vacation rentals by location, dates, and guest count.

Yes

hemmabo_search_availability

Check whether a specific property is available for requested dates.

Yes

hemmabo_booking_quote

Get a live quote and per-night breakdown for a specific property and stay request.

Yes

hemmabo_booking_create

Fallback non-VRP helper: create a pending host-review booking when no signed VRP direct booking URL is available.

No

hemmabo_booking_negotiate

Fallback non-VRP helper: create a short-lived quote snapshot only after explicit user confirmation.

No

hemmabo_booking_checkout

Fallback non-VRP helper: create a host-configured Stripe checkout URL. Do not use for signed VRP offers.

No

hemmabo_booking_cancel

Authenticated booking-management helper: cancel an existing booking according to host policy.

No

hemmabo_booking_status

Get booking details by reservation ID. Requires auth because booking data may include PII.

Yes

hemmabo_booking_reschedule

Authenticated booking-management helper: reschedule an existing booking according to host policy.

No

hemmabo_host_readiness_check

Read-only fit check for vacation-rental hosts asking for their own booking website or booking engine.

Yes

hemmabo_host_onboarding_link

Return a safe HemmaBo onboarding handoff URL. Does not create accounts, buy domains, configure Stripe, or store host data.

Yes

verify_vacation_rental_node

Verify a host-domain VRP discovery document and Ed25519 JWKS.

Yes

get_verified_stay_offer

Fetch and verify a fresh host-domain signed VRP stay offer.

Yes

Authentication

The server uses a public-read, signed-write model.

  • Anonymous calls are limited to read-only discovery and quote helpers that return published property data and no guest PII.

  • Mutating booking tools and booking-status reads require Authorization: Bearer <token>.

  • Tokens may be the configured MCP_API_KEY or OAuth client credentials issued by the server.

  • Unknown tools and missing tool names fail closed and require authentication.

Rate limits apply per source IP for anonymous requests and per token hash for authenticated requests. Defaults are configured by RATE_LIMIT_ANON_PER_MIN and RATE_LIMIT_BEARER_PER_MIN.

Pricing and Availability

Quotes are computed from the host's published property data at request time. Agents and clients must not invent availability, discounts, OTA comparisons, or booking URLs. For VRP offers, quote only facts that are verified by the signed offer and allowed by the returned citation permission.

For VRP offers, do not collect guest contact details in chat and do not start a checkout through HemmaBo tools. Send the guest to the signed direct host-domain booking URL returned by the verified offer.

Setup

npm install

Create .env from .env.example:

cp .env.example .env

Required environment variables:

  • SUPABASE_URL

  • SUPABASE_SERVICE_ROLE_KEY

Optional environment variables:

  • STRIPE_SECRET_KEY - enables fallback non-VRP checkout, cancellation, refund, and reschedule helpers for the host/operator's own Stripe account. VRP offers should route to the signed host-domain booking URL instead.

  • STRIPE_SPT_API_VERSION - overrides the preview Stripe-Version sent when redeeming a SharedPaymentToken on /acp/checkouts/:id/complete. Defaults to the version pinned in src/stripe.ts; set it only to follow a Stripe-side preview roll without a deploy.

  • MCP_API_KEY - enables Bearer-token auth for protected tools.

  • UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN - enable shared rate limiting.

HTTP Endpoints

Path

Method

Purpose

/mcp

POST

MCP Streamable HTTP endpoint

/mcp

GET

Transport information

/health

GET

Health check

/.well-known/mcp.json

GET

MCP discovery metadata

/.well-known/mcp/server-card.json

GET

Server card metadata

/.well-known/mcp-server-card

GET

Server card compatibility alias

/.well-known/mcp-server-card.json

GET

Server card compatibility alias

/oauth/register

POST

Dynamic client registration

/oauth/token

POST

OAuth token endpoint

/oauth/authorize

GET/POST

Authorization-code consent flow

/acp/checkouts

POST/GET/PUT

Agentic Commerce Protocol checkout lifecycle. Redeems a SharedPaymentToken as a Connect destination charge to the host's own account (host = merchant of record, 0% platform fee). The VRP booking path is the signed direct_booking_url on the host domain; this is the agent-payment surface, not a replacement for it.

/acp/checkouts/:id/complete

POST

Complete with a SharedPaymentToken (spt_...) or PaymentMethod (pm_...). An spt_ must be minted against the host's own Stripe profile, advertised per checkout as payment_provider.network_business_profile (ADR 0018); a node without one refuses spt_ in live mode, and a token bound to another profile answers 402 spt_binding_mismatch with the expected profile.

/acp/checkouts/:id/cancel

POST

Cancel; refunds a settled charge, cancels an unsettled intent

Transports

  • Streamable HTTP: hosted /mcp endpoint (remote-only).

Development

npm run build
npm test

Security

To report a security vulnerability, email info@hemmabo.se (subject starting with SECURITY:) — please do not open a public issue. See SECURITY.md for the responsible-disclosure policy.

License

Apache-2.0 - see LICENSE and NOTICE.

The Apache-2.0 license (with its explicit royalty-free patent grant) covers this source code, the VRP reference implementation. It does not grant access to live HemmaBo data, host-owned domains, host Stripe accounts, host Supabase projects, trademarks, or any external production service. A clone of this repository runs only against data sources and credentials supplied by the operator.

Available Tools

13 tools
get_verified_stay_offerA
Read-onlyIdempotent
Inspect

Fetch, verify, and render a live host-domain signed VRP stay offer for exact dates and guest count. Verifies Ed25519 JWS against domain JWKS. Call after hemmabo_search_properties returns a host domain, or after verify_vacation_rental_node confirms a domain from outside search, always before quoting final price or a booking link. Read-only: must not lock a quote, create a booking, collect guest details, or start checkout. Route booking only to the signed direct_booking_url; fall back to hemmabo_booking_negotiate/hemmabo_booking_checkout only when this call returns no signed offer, for a configured non-VRP deployment, after explicit user confirmation. The parameters work as a set: pass the same domain, checkIn, checkOut and guests the guest used at search; checkIn must be strictly before checkOut, and the resulting night count — not the dates themselves — drives the signed price and the host capacity check, so changing either date re-prices the offer. Always pass language as the guest's actual conversation language so the rendered widget matches the guest; it never affects the signed price or availability, only formatting.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesHost-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs.
guestsYesTotal guest count as positive integer (e.g. 2, 4). Used by the host node for capacity validation and guest-tier pricing on the signed offer.
checkInYesRequested arrival date in YYYY-MM-DD format (e.g. '2026-11-14'). Must be strictly before checkOut. Use the same dates the guest requested in search.
checkOutYesRequested departure date in YYYY-MM-DD format (e.g. '2026-11-17'). Must be strictly after checkIn. Guest does not stay the departure night.
languageNoThe guest's conversation language, as a BCP-47 tag (e.g. 'en', 'sv', 'de', 'sv-SE') — ALWAYS pass this, matching the language the guest is chatting in, so the rendered widget's labels, dates and currency formatting match the guest instead of falling back to the rendering client's own locale (which can silently disagree with the conversation). Never changes the signed price value or availability — only how it is displayed.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
freshNoTrue when the signed offer is still within its validity/freshness window.
domainYesEchoed host domain that issued the signed offer.
guestsNoEchoed requested guest count.
checkInNoEchoed requested arrival date.
checkOutNoEchoed requested departure date.
verifiedYesTrue only when the host-domain offer signature and payload checks pass.
signatureNoEd25519/JWS verification details, including key id and verification status.
widget_mediaNoImages and media hydrated from the verified host discovery document for the ChatGPT widget.
agent_citationNoCitation permission and safe-to-quote status derived from the signed offer.
agent_guardrailsNoRules the agent must follow when presenting or acting on this offer.
payload_matches_offerNoTrue when the signed payload matches the structured offer returned to the agent.
official_offer_summaryNoSmall signed-offer summary for agents to quote without inventing price, availability, discounts, savings, comparisons, or booking details.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description spells out concrete side-effect prohibitions: must not lock a quote, create a booking, collect guest details, or start checkout. It also discloses verification behavior (Ed25519 JWS against domain JWKS) and the proper booking path via direct_booking_url, adding meaningful behavioral context beyond the annotations.

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

Conciseness4/5

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

The description is dense but front-loaded, starting with purpose and then covering invocation, constraints, parameter-set behavior, and language semantics. It is somewhat long, with minor redundancy against the schema descriptions, but every section earns its place for a tool with this complexity and safety boundary.

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 output schema exists, the description does not need to explain return values. It covers when to call, what not to do, how to route bookings, what verification happens, and how parameters interact. No critical selection or invocation information is missing.

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?

Although schema coverage is 100%, the description adds cross-parameter semantics: the parameters must be used as a set matching the guest's search parameters, night count rather than dates drives pricing and capacity checks, and changing either date re-prices the offer. It also clarifies that language is formatting-only and must reflect the guest's actual conversation language, which is not fully inferable from the schema alone.

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 opening sentence identifies a concrete verb-resource pair: 'Fetch, verify, and render a live host-domain signed VRP stay offer for exact dates and guest count.' It distinguishes itself from search, verification, and booking siblings by naming them and positioning this tool as the step before quoting or booking.

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 gives explicit call timing: after hemmabo_search_properties returns a host domain or verify_vacation_rental_node confirms a domain, and always before quoting final price or a booking link. It also names fallback tools and the condition for using them (no signed offer, configured non-VRP deployment, explicit user confirmation), which is exceptionally clear routing guidance.

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

hemmabo_booking_cancelA
DestructiveIdempotent
Inspect

Cancel a confirmed booking and process the Stripe refund per host cancellation policy. Use when the guest explicitly requests cancellation — if the guest wants new dates instead of ending the stay, use hemmabo_booking_reschedule instead. Do not use for pending/unpaid bookings — those expire automatically. To preview the applicable policy first, read cancellationPolicy from hemmabo_booking_status. Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token. Destructive and idempotent in effect: a repeat cancel is refused as already cancelled and never triggers a second refund. reservationId is the booking UUID from hemmabo_booking_checkout or hemmabo_booking_create — never a propertyId — and must be paired with the guestToken issued for that same booking. reason is optional free text shown to the host; when omitted the host sees 'Cancelled via MCP'.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoHuman-readable cancellation reason for the host (e.g. 'Travel plans changed', 'Flight cancelled'). Optional; omit when the guest did not give a reason.
guestTokenYesPer-booking secret returned by hemmabo_booking_create / hemmabo_booking_checkout (the booking's guest_token, a UUID). Required to view or modify this specific booking — a valid Bearer token alone is NOT sufficient, because it authenticates the caller but grants no authority over any particular booking. Present the exact guestToken you received when the booking was created; without the matching value the call is refused. Never a propertyId or reservationId.
reservationIdYesBooking or reservation UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '7c9e6679-7425-40de-944b-e07fc1f90ae7'). Required to look up, cancel, or reschedule the same booking record.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent only when isError=true.
refundNoRefund payload returned by cancel-booking edge function, when present.
statusYesFinal booking status after cancellation.
reservationIdYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already signal destructive and idempotent, but the description goes further: repeat cancels are refused and never trigger a second refund, Stripe refunds follow the host policy, Bearer auth is required, and the call is rate-limited per token. No contradiction with annotations exists.

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 dense but well-organized: core action first, followed by exclusions, alternatives, prereqs, behavior, and parameter clarification. Every clause earns its place; the only minor cost is length, but that length is justified for a destructive financial tool.

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 destructive, refund-triggering tool with auth constraints and token pairing, the description covers when to use it, prerequisites, behavioral idempotency, parameter provenance, and required credentials. The presence of an output schema means return-value documentation is not the description's burden; nothing needed for correct invocation is missing.

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 coverage is 100%, so the baseline is 3, yet the description adds meaningful guidance beyond the schema: reservationId must be a booking UUID from specific sibling tools and never a propertyId, guestToken must match the exact token issued at creation and is not substitutable by a Bearer token, and an omitted reason shows 'Cancelled via MCP' to the host.

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 uses a specific verb-resource pair — 'Cancel a confirmed booking' — and adds the refund behavior. It also distinguishes itself from hemmabo_booking_reschedule by naming the condition that selects each tool, making sibling differentiation 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?

It gives explicit when-to-use ('guest explicitly requests cancellation'), when-not-to-use ('pending/unpaid bookings'), and a named alternative ('hemmabo_booking_reschedule'). It also provides a prerequisite step ('read cancellationPolicy from hemmabo_booking_status') and auth/rate-limit expectations, leaving nothing to inference.

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

hemmabo_booking_checkoutAInspect

Create a fallback non-VRP booking and return a host-configured Stripe checkout URL. Use only after explicit user confirmation when no signed VRP direct_booking_url is available; when get_verified_stay_offer returns one, route the guest there instead. Use hemmabo_booking_create to record a pending booking without collecting payment yet.

Behavior: existing bookings are never modified — availability is checked and dates briefly locked first; conflicts fail before anything is created or charged. Success creates exactly one pending booking and one Stripe Checkout Session on the host's connected account, returning paymentUrl, reservationId, and a one-time guestToken (required for status/cancel/reschedule). Only the Stripe webhook confirms the booking; unpaid pending bookings expire automatically. Not idempotent — check hemmabo_booking_status before retrying.

Params: pass quoteId only for the exact propertyId/dates/guests locked by hemmabo_booking_negotiate (valid 15 min); omit to price fresh. channel selects which locked total is used; paymentMode changes only the handoff form, never the price.

Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestsYesTotal number of guests as integer >= 1 (e.g. 4).
channelNoPricing channel selector. 'federation' (default for agent flows): direct host-source total. 'public': standard website rate without agent channel pricing. Omit to use federation.
checkInYesArrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability.
quoteIdNoQuote ID string from hemmabo_booking_negotiate (e.g. 'q_abc123'). Optional — omit to calculate a fresh host-source price at checkout. Provide when the guest locked a price within the 15-minute quote window.
checkOutYesDeparture date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night.
guestNameYesPrimary guest full name as plain text (e.g. 'Anna Svensson'). Stored on the booking for host confirmation; use the name the guest provided.
guestEmailYesPrimary guest email in RFC 5322 format (e.g. 'anna@example.com'). Used for booking confirmation and host contact; must be deliverable.
guestPhoneNoPrimary guest phone in E.164 format with country code (e.g. '+46701234567'). Optional; omit when unknown. Recommended for check-in coordination.
propertyIdYesStable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL.
paymentModeNoStripe payment flow. 'checkout_session' (default): returns a browser redirect URL. 'payment_intent': returns client_secret for embedded/agentic payment integrations. Omit to use checkout_session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
mppNoPresent when paymentMode='payment_intent'.
errorNoPresent only when isError=true.
guestsNo
nightsNo
statusNoBooking status (typically 'pending' until payment succeeds).
checkInNo
checkOutNo
currencyYes
createdAtNo
guestTokenNoPer-booking secret (guest_token) for this booking. Present it back as guestToken on hemmabo_booking_status / hemmabo_booking_cancel / hemmabo_booking_reschedule to view or modify this booking; a Bearer token alone is not sufficient. Store it securely and do not show it to the guest.
paymentUrlNoStripe Checkout redirect URL.
propertyIdNo
totalPriceYesFinal total charged (or to be charged), in minor currency units.
payment_modesNoSupported payment modes.
reservationIdYesBooking UUID. Use for subsequent status/cancel/reschedule calls.

TDQS

A4.8/5.0
Behavior5/5

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

The description richly complements the annotations (readOnlyHint=false, idempotentHint=false) with concrete behavior: 'existing bookings are never modified — availability is checked and dates briefly locked first; conflicts fail before anything is created or charged.' It also discloses lifecycle details (webhook confirmation, auto-expiry, one-time guestToken) and auth/rate-limit requirements, going well beyond what annotations alone convey. No contradiction found.

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 structured into a focused intro, behavior paragraph, and param notes. Every sentence carries information (auth, idempotency, fallback logic) without redundancy. It is moderately long but economically written, with the core purpose and usage up front. Slightly dense, but not padded.

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 complex 10-param mutation tool with output schema and annotations present, the description covers all necessary context: purpose, fallback routing, behavior (locking, conflict handling), return values (paymentUrl, reservationId, guestToken), confirmation mechanism (webhook), expiry, idempotency, auth, and rate limits. Nothing an agent needs to decide or invoke correctly is missing.

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 coverage is 100%, so the schema already documents parameters. The description adds meaningful context for key params: quoteId (15-min validity, 'pass quoteId only for the exact propertyId/dates/guests locked'), channel (selects which locked total is used), paymentMode (changes only the handoff form, never price), and propertyId (guidance to pass exact UUID, never a name/URL). This enriches semantics beyond schema descriptions, though not every parameter gets extra treatment.

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 opens with a specific verb+resource: 'Create a fallback non-VRP booking and return a host-configured Stripe checkout URL.' It explicitly contrasts with sibling tools, naming get_verified_stay_offer and hemmabo_booking_create as alternatives, making the purpose unambiguous and distinct.

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: 'Use only after explicit user confirmation when no signed VRP direct_booking_url is available' and directs to alternatives ('when get_verified_stay_offer returns one, route the guest there instead'). Also gives a retry caveat ('Not idempotent — check hemmabo_booking_status before retrying'), covering both selection and operational guidance.

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

hemmabo_booking_createAInspect

Create a pending direct booking without online payment for configured non-VRP fallback deployments. Use only after explicit user confirmation, with a propertyId from search, and only when no signed VRP direct_booking_url is available. For signed VRP offers, route to the signed host-domain URL instead. Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token. Writes exactly one pending booking awaiting the host's decision; availability is checked first — conflicts or a stale calendar fail the call before anything is written. Not idempotent — check hemmabo_booking_status before retrying on timeout. There is no price or quoteId parameter — the node prices the stay itself at creation (gap-night pricing applies automatically). The booking is identified by propertyId + the checkIn/checkOut range + guests; guestName and guestEmail are required for host confirmation, guestPhone is optional. Returns bookingId and a one-time guestToken for later status/cancel/reschedule.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestsYesTotal guest count as a positive integer (e.g. 2, 4, 6). Used for capacity filtering and staircase pricing tiers. Properties with maxGuests below this value are excluded from search results.
checkInYesArrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability.
checkOutYesDeparture date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night.
guestNameYesPrimary guest full name as plain text (e.g. 'Anna Svensson'). Stored on the booking for host confirmation; use the name the guest provided.
guestEmailYesPrimary guest email in RFC 5322 format (e.g. 'anna@example.com'). Used for booking confirmation and host contact; must be deliverable.
guestPhoneNoPrimary guest phone in E.164 format with country code (e.g. '+46701234567'). Optional; omit when unknown. Recommended for check-in coordination.
propertyIdYesStable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent only when isError=true.
guestsNo
nightsNo
statusYesHost-node booking status. 'completed' is a protocol compatibility output only, not a status this tool writes.
checkInNo
checkOutNo
currencyNo
bookingIdYesPersistent booking UUID. Use for status/cancel/reschedule.
createdAtNo
priceTypeNoPricing mode used (federation/gap_night/package_*).
guestTokenNoPer-booking secret (guest_token) for this booking. Present it back as guestToken on hemmabo_booking_status / hemmabo_booking_cancel / hemmabo_booking_reschedule to view or modify this booking; a Bearer token alone is not sufficient. Store it securely and do not show it to the guest.
propertyIdNo
totalPriceNoFinal price written to the booking.
channel_mirrorNoOutbound channel-manager mirror heartbeat for the host's mapped external channel (status: current|stale|partial|error|not_connected). Informational only — it never affects availability or this booking; the host node is the source of truth.
packageAppliedNo
calendar_freshnessNoIncoming OTA calendar-sync freshness at booking time. The same object is embedded in the error payload when a stale calendar blocks the call — declared here so agents can treat it as a first-class field in both outcomes.
gapDiscountPercentNo
federationDiscountPercentNo

TDQS

A4.9/5.0
Behavior5/5

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

Discloses that availability is checked first and conflicts fail before writing, that the call is not idempotent (matching idempotentHint=false), and that it requires Authorization and is rate-limited. It also notes exact write behavior and returns a one-time guestToken. This goes well beyond the annotations, providing deep operational context without contradicting them.

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?

Despite length, every sentence adds essential information: purpose, usage conditions, auth, behavior, idempotency, pricing, required fields, and return values. It is logically ordered and front-loads the most critical scoping and usage constraints.

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?

The description covers all operational aspects an agent would need: when to use, auth/rate limits, availability pre-check, idempotency handling, pricing behavior, required/optional parameters, and return values. Given the tool's complexity and the existence of an output schema, nothing critical is missing.

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 coverage is 100%, so parameters are already documented. The description adds value by clarifying there is no price or quoteId parameter, that the node prices the stay itself, and that guestName and guestEmail are required while guestPhone is optional. It also explains how the booking is identified, which is not explicit in the 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 creates a pending direct booking without online payment for non-VRP fallback deployments. It distinguishes this from signed VRP offers by explicitly naming the alternative, making the purpose unmistakable and differentiated from sibling tools.

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 says to use only after user confirmation, with a propertyId from search, and only when no signed VRP direct_booking_url is available. It also tells the agent to route signed VRP offers to the host-domain URL instead, and advises checking status before retrying on timeout. This is clear when/when-not guidance with an alternative.

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

hemmabo_booking_negotiateAInspect

PRICE LOCK, not negotiation: the host's price is fixed — this tool never bargains, discounts, or alters it; it only freezes the current host-source price for 15 minutes so it cannot change during checkout. It refuses to lock dates the property's calendar cannot deliver and returns alternative bookable windows instead. Use it only in the non-VRP fallback checkout flow, when no signed direct_booking_url is available and the user explicitly asks to lock a price. Never use this for search, availability, VRP offers, rendering a stay-offer widget, or verified-offer display — use get_verified_stay_offer instead. Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token. Not idempotent: each call writes a new snapshot; validUntil is fixed at creation and never extended — re-locking returns a new quoteId. The lock freezes both the public and the direct host-source total; hemmabo_booking_checkout's channel picks which one is redeemed. Redeem the quoteId only for the identical propertyId + checkIn/checkOut + guests, and only until validUntil — changing any of them requires a new quote. Night count and guest count together select the locked price tier.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestsYesTotal number of guests as integer >= 1 (e.g. 4). Determines which price tier is applied.
checkInYesArrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability.
checkOutYesDeparture date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night.
propertyIdYesStable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent only when isError=true.
guestsNo
nightsNo
checkInNo
quoteIdYesSnapshot ID. Pass to hemmabo_booking_checkout to lock this price.
checkOutNo
currencyNo
gapNightNo
gapTotalNo
breakdownNo
propertyIdNo
validUntilYesQuote expiry (ISO 8601). Typically 15 minutes after creation.
publicTotalNo
packageAppliedNo
federationTotalYes
gapDiscountPercentNo
federationDiscountPercentNo

TDQS

A4.9/5.0
Behavior5/5

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

Despite sparse annotations, the description discloses auth requirements, rate limiting, non-idempotence, snapshot creation, fixed validUntil, refusal on unavailable calendar dates, and the dual public/direct total freeze. It also clarifies redemption constraints and downstream checkout behavior, going far beyond what annotations provide.

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?

Although long, every sentence adds a distinct operational fact and there is no filler. The critical scoping correction is front-loaded, followed by usage conditions, side effects, and redemption constraints in logical order.

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 non-idempotent, auth-required, time-boxed quote tool, the description covers when to call it, when never to call it, prerequisites, side effects, expiry behavior, exact-match requirements, and downstream checkout interaction. Since an output schema exists, not explaining return values is acceptable.

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 descriptions already cover all four parameters, so the baseline is 3. The description adds value by explaining that the quote is bound to the exact propertyId/checkIn/checkOut/guests combination and that night count plus guest count jointly select the price tier.

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 opening line 'PRICE LOCK, not negotiation' explicitly corrects the misleading tool name and defines the operation as freezing the host-source price for 15 minutes. It identifies the exact resource and distinguishes this tool from checkout and verified-offer siblings.

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 explicitly says 'Use it only in the non-VRP fallback checkout flow, when no signed direct_booking_url is available and the user explicitly asks to lock a price' and gives a precise never-use list. It also names get_verified_stay_offer as the alternative for verified-offer display, leaving no judgment call.

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

hemmabo_booking_quoteA
Read-onlyIdempotent
Inspect

Get a detailed pricing quote for a specific property, dates, and guest count. Use this tool after confirming availability to show the user exact pricing before booking. Do NOT use before checking availability — the quote may be invalid if dates are unavailable. Returns the final host-source total for the booking flow, per-night breakdown, and package pricing context. All prices are integers in the property's local currency (e.g. SEK). The quote is the propertyId priced for the exact checkIn/checkOut range and guests; the night count and party size together select the price tier, so changing any of them re-quotes.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestsYesTotal guest count as a positive integer (e.g. 2, 4, 6). Used for capacity filtering and staircase pricing tiers. Properties with maxGuests below this value are excluded from search results.
checkInYesArrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability.
checkOutYesDeparture date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night.
propertyIdYesStable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent only when isError=true.
guestsNo
nightsNoNumber of nights in the range.
checkInNo
checkOutNo
currencyNoISO 4217 currency code.
gapNightNoTrue when the stay qualifies as a gap fill.
gapTotalNoGap-night adjusted total when applicable; otherwise null.
breakdownNoDetailed pricing breakdown.
propertyIdNo
publicTotalNoWebsite rate total in minor currency units.
packageAppliedNoApplied package, if any.
federationTotalNoLegacy field: direct host-source total. Prefer directBookingTotal in user-facing copy.
directBookingTotalNoPreferred user-facing field: direct host-source total.
gapDiscountPercentNoGap-night discount percentage when applied.
hostSourcePublicTotalNoPreferred user-facing field: public host-source total.
federationDiscountPercentNoLegacy internal field. Do not present this as a guest-facing discount, savings, or comparison.
directBookingDiscountPercentNoLegacy internal field. Do not present this as a guest-facing discount, savings, or comparison.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare the tool read-only and idempotent, and the description adds meaningful behavioral context: quotes are invalid without prior availability, prices are integers in local currency, and the price tier depends on the combination of night count and party size. It also discloses that changing any pricing input requires a re-quote, which is valuable beyond the structured metadata.

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 dense but every sentence earns its place: purpose, usage timing, return content, currency format, and re-quoting behavior. It front-loads the core purpose and keeps critical caveats early, without repeating schema details verbatim.

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 rich annotations, fully described input schema, and presence of an output schema, the description is complete for an agent to select and invoke this tool correctly. It clarifies the booking-flow position, return highlights, currency convention, and the dependency on prior availability — nothing essential is missing.

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 coverage is 100%, so the baseline is 3. The description adds extra meaning by explaining that propertyId, checkIn/checkOut, and guests collectively determine the price tier and that changing any of them invalidates the quote. This goes beyond what the input schema states about each parameter individually.

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 a specific verb ('Get'), a precise resource ('detailed pricing quote'), and the key inputs (property, dates, guest count). It also positions the tool within the booking flow as the step between availability confirmation and booking, distinguishing it from siblings like hemmabo_search_availability and hemmabo_booking_create.

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 gives explicit when-to-use guidance ('Use this tool after confirming availability') and a direct prohibition ('Do NOT use before checking availability'). It also explains the consequence of misuse ('the quote may be invalid'), which helps an agent decide the correct order of operations among the sibling tools.

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

hemmabo_booking_rescheduleA
Destructive
Inspect

Reschedule a confirmed or pending booking to new dates with automatic repricing and Stripe charge/refund. Use when the guest wants to change dates on an existing booking — if the guest wants to end the stay entirely rather than move it, use hemmabo_booking_cancel instead. Do not use if cancelled or if a protocol compatibility client reports completed — check hemmabo_booking_status first. Requires Authorization: Bearer token (MCP_API_KEY or OAuth). Destructive write: the original dates are released back to the host calendar and the original price no longer applies — the booking keeps the same reservationId (updated in place, never recreated), and the price difference is charged or refunded via Stripe. Rate-limited per token. Identify the existing booking by reservationId, then give the new stay as newCheckIn/newCheckOut (newCheckIn strictly before newCheckOut); the new night count re-prices the stay exactly like a fresh quote.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoHuman-readable reschedule reason for host records (e.g. 'Flight delayed', 'Extended conference'). Optional; omit when not provided by the guest.
guestTokenYesPer-booking secret returned by hemmabo_booking_create / hemmabo_booking_checkout (the booking's guest_token, a UUID). Required to view or modify this specific booking — a valid Bearer token alone is NOT sufficient, because it authenticates the caller but grants no authority over any particular booking. Present the exact guestToken you received when the booking was created; without the matching value the call is refused. Never a propertyId or reservationId.
newCheckInYesNew arrival date in YYYY-MM-DD format (e.g. '2026-08-01'). Must be today or later. Must be strictly before newCheckOut.
newCheckOutYesNew departure date in YYYY-MM-DD format (e.g. '2026-08-08'). Must be strictly after newCheckIn.
reservationIdYesBooking or reservation UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '7c9e6679-7425-40de-944b-e07fc1f90ae7'). Required to look up, cancel, or reschedule the same booking record.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent only when isError=true.
reasonNo
statusYesBooking status after reschedule.
pricingNo
newDatesNo
previousDatesNo
reservationIdYes

TDQS

A4.8/5.0
Behavior5/5

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

The annotations only declare destructiveHint=true and readOnlyHint=false, but the description goes much further. It discloses that original dates are released, the original price no longer applies, the booking is updated in place and never recreated, and the price difference is charged or refunded via Stripe. It also notes rate limiting and the need for a guest token even with a valid Bearer token. This is precisely the behavioral context an agent needs.

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 long, but every sentence earns its place: purpose, usage conditions, destructive consequences, authentication caveat, and parameter workflow are all covered. It is front-loaded with the core purpose and then deepens into operational detail. It could be slightly tighter, but the density is justifiable for a destructive write operation.

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 tool with 5 parameters, destructive side effects, dual-auth requirements (Bearer + guestToken), and Stripe financial impact, the description covers all essential decision points: when to use, when to avoid, prerequisites, behavioral consequences, and parameter semantics. An output schema exists, so return-value documentation is not required. Nothing critical is missing.

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 coverage is 100%, and the schema descriptions are already detailed, so the baseline is 3. The description adds meaning beyond the schema by explaining the re-pricing model ('the new night count re-prices the stay exactly like a fresh quote') and the relationship between reservationId and the new stay parameters. This elevates it slightly 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 opens with a specific verb+resource: 'Reschedule a confirmed or pending booking to new dates with automatic repricing and Stripe charge/refund.' It clearly names the action, target resource, and side effects. It also distinguishes itself from the cancel sibling, so an agent can tell which tool to use without inspecting other definitions.

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 the tool ('when the guest wants to change dates on an existing booking'), when not to use it ('if cancelled or if a protocol compatibility client reports completed'), and names the alternative (hemmabo_booking_cancel) for the different use case. It also instructs the agent to check hemmabo_booking_status first, which is clear operational guidance.

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

hemmabo_booking_statusA
Read-onlyIdempotent
Inspect

Retrieve current status and full details of an existing booking by reservationId. Use to confirm checkout/create succeeded or before cancel/reschedule. Do NOT use for property discovery, availability, or pricing — use hemmabo_search_properties, hemmabo_search_availability, or hemmabo_booking_quote for those. Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token. Read-only against the database — never writes, so it is safe to poll after a checkout timeout — but returns guest PII (name, email). reservationId is the booking UUID returned by hemmabo_booking_checkout or hemmabo_booking_create — never a propertyId — and guestToken is the secret issued with that same booking: a mismatched pair reveals nothing, not even that the booking exists. Without a reservationId there is no booking to look up yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestTokenYesPer-booking secret returned by hemmabo_booking_create / hemmabo_booking_checkout (the booking's guest_token, a UUID). Required to view or modify this specific booking — a valid Bearer token alone is NOT sufficient, because it authenticates the caller but grants no authority over any particular booking. Present the exact guestToken you received when the booking was created; without the matching value the call is refused. Never a propertyId or reservationId.
reservationIdYesBooking or reservation UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '7c9e6679-7425-40de-944b-e07fc1f90ae7'). Required to look up, cancel, or reschedule the same booking record.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent only when isError=true.
guestsNoBooked guest count.
statusYesHost-node booking status. 'completed' is a protocol compatibility output only, not the active lifecycle truth.
checkInNoBooked arrival date.
checkOutNoBooked departure date.
currencyNoISO 4217 currency code for the booking total.
createdAtNoBooking creation timestamp.
guestNameNoPrimary guest name stored on the booking.
updatedAtNoLast update timestamp for the booking record.
guestEmailNoPrimary guest email stored on the booking.
propertyIdNoProperty UUID associated with the booking.
totalPriceNoTotal amount in minor currency units.
propertyNameNoDisplay name of the booked property.
reservationIdYesEchoed booking or reservation UUID.
propertyDomainNoHost-owned domain associated with the property.
cancellationPolicyNoHost cancellation-policy details applicable to this booking.

TDQS

A5/5.0
Behavior5/5

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

Annotations already carry readOnlyHint, idempotentHint, and destructiveHint, so the baseline is lower, but the description adds substantial context: read-only against the database, safe to poll after a checkout timeout, returns guest PII, requires Bearer token auth, and is rate-limited per token. It even explains the security behavior of a mismatched reservationId/guestToken pair. No contradiction with annotations.

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

Conciseness5/5

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

Despite its length, every sentence earns its place. The definition is front-loaded with purpose, then usage, exclusions, auth, safety, and parameter semantics, with no redundant or filler content. The density is justified by the tool's security-sensitive nature and the need to distinguish it from many siblings.

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?

The description covers the full operational picture: purpose, when to use, when not to use, alternatives, authentication, rate limits, read-only safety, PII exposure, parameter provenance, and failure semantics. Since an output schema exists, the absence of return-format details is not a gap. Nothing an agent needs for correct invocation is missing.

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 coverage is 100%, giving a baseline of 3, but the description adds meaning beyond the schema: reservationId is the booking UUID returned by hemmabo_booking_checkout or hemmabo_booking_create and 'never a propertyId,' while guestToken is 'the secret issued with that same booking.' It also states that a mismatched pair reveals nothing, which is critical security semantics not present in the 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 opening sentence precisely states the verb, resource, and identifier: 'Retrieve current status and full details of an existing booking by reservationId.' It also explicitly distinguishes the tool from siblings by naming the tools not to use (hemmabo_search_properties, hemmabo_search_availability, hemmabo_booking_quote), leaving no ambiguity about scope.

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 gives concrete when-to-use guidance: 'Use to confirm checkout/create succeeded or before cancel/reschedule.' It also provides explicit exclusions and alternatives, saying 'Do NOT use for property discovery, availability, or pricing — use hemmabo_search_properties, hemmabo_search_availability, or hemmabo_booking_quote for those.' This leaves no inference required.

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

hemmabo_host_readiness_checkA
Read-onlyIdempotent
Inspect

Read-only fit check for a vacation-rental host evaluating HemmaBo for their own booking website or booking engine. Use when the user is a host or property owner, not a guest booking a stay; guests should use hemmabo_search_properties instead. Returns a fit verdict, what the host gets, the setup inputs to prepare, and a safe onboarding next step. Does not create an account, buy a domain, configure Stripe, store host data, or provision a website. When the host is ready to start, follow up with hemmabo_host_onboarding_link. Only five inputs sharpen the fit verdict: a domain (hasOwnDomain or domain), currentChannels, one location signal (city/region/country), and the wants* booleans, which count unless explicitly false — omitting them never lowers the verdict; propertyName and preferredLanguage only prefill the onboarding URL, and with no inputs the summary is generic.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity or municipality (e.g. 'Kävlinge', 'Florence'). Optional; used in onboarding URL prefill when provided.
domainNoHost-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Optional; omit when the host has not chosen a domain yet. Invalid: 'https://...', paths, ports, or booking URLs.
regionNoRegion or area (e.g. 'Skåne', 'Toscana', 'Marrakech-Safi'). Optional; narrows onboarding handoff and proof examples.
countryNoCountry where the property operates (e.g. 'Sweden', 'Italy', 'Morocco'). Optional; improves onboarding URL locale and fit assessment.
hasOwnDomainNoTrue if the host already owns a domain or explicitly wants one (e.g. true for 'I have villaakerlyckan.se'). False or omit when still undecided.
propertyNameNoProperty or business display name (e.g. 'Villa Åkerlyckan'). Optional; carried into onboarding URL when provided.
propertyTypeNoProperty category enum. Optional; omit when unknown. 'villa'/'holiday_home' fit best; 'hotel' may indicate a poor HemmaBo fit for large chains.
currentChannelsNoOptional list of channels the host uses today. Omit when unknown. Helps assess migration fit from OTAs to their own booking website.
preferredLanguageNoISO 639-1 language hint for onboarding copy (e.g. 'sv', 'en', 'de', 'fr'). Optional; omit to default to English.
wantsAiAgentBookingNoTrue if the host wants AI agents (ChatGPT, Claude, Cursor) to discover and book via their own official website. False or omit when they only want a guest website.
wantsDirectPaymentsNoTrue if the host wants Stripe Connect payouts direct to their account. False or omit when they expect HemmaBo to be merchant of record (not supported).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesTrue when the fit check completed.
productYesHemmaBo product summary, pricing, onboarding URL, and live proof URLs.
next_stepYesSafe handoff action for the host.
readinessYesFit verdict and boundaries for the host's described need.
setup_itemsYesInputs the host should prepare before onboarding.
capabilitiesYesHost-facing capabilities included in HemmaBo.
agent_instructionYesHow an AI agent should describe HemmaBo without overclaiming.

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive, and the description reinforces and expands on this by listing what it does not do: create an account, buy a domain, configure Stripe, store host data, or provision a website. It also explains the effect of omitting inputs, which is valuable behavioral context beyond the annotations.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: purpose, usage boundary, behavioral exclusions, follow-up routing, and parameter impact are all covered without fluff. Key scoping information is front-loaded before parameter details.

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 tool with 11 optional parameters, no required inputs, and a rich schema, the description is remarkably complete. It covers the target user, the boundary against siblings, the non-effects, and the meaningful input semantics, while the output schema handles return-value details.

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?

Although the schema already documents all 11 parameters, the description adds crucial decision-making guidance: only five inputs sharpen the fit verdict, omission of wants* booleans never lowers the verdict, and propertyName/preferredLanguage only prefill the onboarding URL. This goes well beyond the baseline schema descriptions and helps the agent select and prioritize parameters correctly.

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 a specific purpose: a read-only fit check for vacation-rental hosts evaluating HemmaBo for their own booking website or booking engine. It distinguishes this tool from guest-oriented search by explicitly naming which sibling to use instead.

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 gives explicit when-to-use guidance: use for hosts or property owners, not guests, and points guests to hemmabo_search_properties. It also provides a follow-up action, hemmabo_host_onboarding_link, when the host is ready to start.

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

hemmabo_search_availabilityA
Read-onlyIdempotent
Inspect

Check whether a specific property is available for the requested dates. Use this tool after the user has selected a property from hemmabo_search_properties and wants to confirm availability before getting a quote. Do NOT use for general browsing — use hemmabo_search_properties instead. Read-only, open to anonymous callers (no Bearer token), and rate-limited: checking availability never places a hold or reserves dates. Returns available=true/false with conflict details and same-month alternative date windows when unavailable; a stale inbound calendar sync blocks an available answer (fails closed with calendar_freshness) instead of guessing. Omit guests to check dates only; pass it to price the alternative windows and to gate capacity — counts above the property's maximum return available=false (guests_exceed_max) with no alternatives. Stays shorter than the host's effective minimum nights return available=false with reasonCode min_nights_violation — extend the stay rather than shifting dates. The verdict always matches the host node's own availability API.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestsNoOptional guest count (e.g. 4). Omit when only checking date availability without pricing. When provided, alternative date windows in the response include live host-source totals for that guest count.
checkInYesArrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability.
checkOutYesDeparture date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night.
propertyIdYesStable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent only when isError=true.
reasonNoReason when available=false.
checkInNo
checkOutNo
availableYesTrue if the property is bookable for the entire range.
propertyIdNo
channel_mirrorNoOutbound channel-manager mirror heartbeat for the host's mapped external channel (status: current|stale|partial|error|not_connected). Informational only — it never affects `available`; the host node is the source of truth for these dates.
alternativeDatesNoNearby same-month date windows to offer when the requested dates are unavailable.
calendar_freshnessNoIncoming OTA calendar-sync freshness at answer time. The same object is embedded in the error payload when a stale calendar blocks the call — declared here so agents can treat it as a first-class field in both outcomes.

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description adds valuable context beyond those: anonymous access with no Bearer token, rate limiting, no holds or date reservations, fail-closed behavior on stale calendar sync, and alignment with the host node's availability API. No contradiction with annotations.

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

Conciseness5/5

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

The description is dense but front-loaded with the core purpose in the first sentence and every subsequent sentence earning its place by covering usage, exclusions, behavior, failure modes, or parameter semantics. Despite its length, it avoids redundancy and reads as a coherent operational guide.

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 that an output schema exists, return-value details need not be spelled out. The description covers when to use, when not to use, authentication, rate-limits, side-effect freedom, parameter-conditional behavior, failure modes, and reliability expectations. Nothing essential for correct invocation is missing.

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 coverage is 100% with per-parameter descriptions, and the description adds meaning beyond the schema: omitting guests checks dates only, providing guests gates capacity and prices alternative windows, and min_nights_violation guidance distinguishes extending the stay from shifting dates. It also warns to pass the exact property UUID, not a name or URL.

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 opens with a specific verb and resource: 'Check whether a specific property is available for the requested dates.' It clearly differentiates from siblings by explicitly routing general browsing to hemmabo_search_properties and positioning availability checks before quote creation.

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 states exactly when to use the tool: after the user selects a property from hemmabo_search_properties to confirm availability before a quote. It also gives an explicit exclusion: 'Do NOT use for general browsing — use hemmabo_search_properties instead,' leaving no ambiguity about alternatives.

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

hemmabo_search_propertiesA
Read-onlyIdempotent
Inspect

Search available vacation rental properties by location and travel dates. Use when the user wants to find or browse places to stay. Discovery only — call get_verified_stay_offer with the host domain and same dates before the final answer so the client can render the verified stay offer widget; never quote a final price or booking link from search alone. Do NOT use when the user already has a propertyId or host domain. Returns propertyId, host domain, live availability, host-source pricing, and capacity. Parameters combine as one filter with guests and the checkIn/checkOut range (checkIn strictly before checkOut): region matches broadly against region, city, and country names, while country matches the country field alone — omit both and the search spans every published property. Capacity misses are excluded; date-unavailable matches return separately in unavailableMatches with up to three alternative windows.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestsYesTotal guest count as a positive integer (e.g. 2, 4, 6). Used for capacity filtering and staircase pricing tiers. Properties with maxGuests below this value are excluded from search results.
regionNoRegion, area, or destination to search within (e.g. 'Skåne', 'Kävlinge', 'Toscana', 'Bavaria'). Partial case-insensitive match. Provide at least one of region or country; omit only when country alone is sufficient.
checkInYesArrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability.
countryNoCountry name to filter by (e.g. 'Sweden', 'Italy', 'Morocco'). Partial case-insensitive match. Provide at least one of region or country; omit when region already narrows the destination.
checkOutYesDeparture date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent only when isError=true.
guestsNoEchoed guest count.
checkInNoEchoed check-in date (YYYY-MM-DD).
checkOutNoEchoed check-out date (YYYY-MM-DD).
propertiesNoAvailable properties matching the search criteria, with live host-source pricing.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and idempotentHint=true, but the description adds significant behavioral nuance: 'Discovery only', 'never quote a final price', 'Capacity misses are excluded', and 'date-unavailable matches return separately in unavailableMatches with up to three alternative windows'. These details are not present in annotations and help set agent expectations.

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 dense but efficient—every sentence carries purpose, front-loaded with purpose and usage. Slightly verbose with overlapping statements ('Discovery only' and 'never quote a final price'), but it remains focused and scannable.

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?

Covers purpose, usage, exclusions, workflow, return content, and parameter interaction. With an output schema and read-only annotations already present, the description provides everything an agent needs to select and invoke this tool correctly.

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

Parameters5/5

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

Schema coverage is 100%, but the description enriches semantics: it explains how params combine into a single filter, clarifies region vs country matching behavior ('region matches broadly... while country matches the country field alone'), and documents the effect of omitting both ('search spans every published property'). This goes well beyond 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?

States a specific verb and resource: 'Search available vacation rental properties by location and travel dates.' It also differentiates from siblings by defining the exact use case ('find or browse places to stay') and explicitly routing away when a propertyId or host domain already exists.

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 ('Use when the user wants to find or browse places to stay'), when-not-to-use ('Do NOT use when the user already has a propertyId or host domain'), and a workflow directive (call get_verified_stay_offer before final answer, never quote price from search alone). This gives an agent unambiguous decision criteria.

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

verify_vacation_rental_nodeA
Read-onlyIdempotent
Inspect

Verify that a vacation-rental host domain is a valid Vacation Rental Protocol (VRP) node before trusting it. Reads the domain's .well-known/vacation-rental.json and JWKS. Read-only trust check: no availability, pricing, booking, or payment — do NOT use it to answer those questions. Use when a host domain arrives from outside search (user-typed or third-party); domains returned by hemmabo_search_properties can go straight to get_verified_stay_offer. On success, call get_verified_stay_offer with the same domain and stay dates. The single input is the host domain as a bare hostname (no scheme or path); public domains only — IPs, ports, and local/private hostnames are refused. Pass the node's canonical domain exactly — www and apex are distinct identities, and verification fails when the domain's declared canonical_domain differs from the one you passed. Verification reads that domain's own .well-known and JWKS, so the result is only as trustworthy as the exact domain you pass.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesHost-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when verified=false or the node cannot be checked.
domainYesEchoed canonical host domain that was checked.
signingNoSummary of accepted signing algorithms, key ids, and signing-key checks.
jwks_urlNoHost-domain JWKS URL containing the Ed25519 public keys used to verify signed offers.
protocolNoProtocol identifier discovered on the host domain. A valid node declares exactly 'vacation-rental-protocol' in its .well-known/vacation-rental.json protocol field, and that is the value returned here.
verifiedYesTrue only when discovery, JWKS, signing metadata, and verified-offer endpoint checks pass.
discovery_urlNoThe .well-known vacation-rental discovery URL read from the host domain.
protocol_versionNoVRP version declared by the host discovery document.
verified_stay_offer_urlNoHost-domain endpoint template or URL used to request signed verified stay offers.

TDQS

A5/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower, yet the description still adds real behavioral context: reads .well-known/vacation-rental.json and JWKS, refuses IPs/ports/local/private hostnames, treats www and apex as distinct identities, fails when canonical_domain mismatches, and warns that results are only as trustworthy as the exact domain passed. No contradiction with annotations.

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

Conciseness5/5

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

The description is long but every sentence earns its place — purpose, mechanism, exclusions, when-to-use, follow-up action, input constraints, edge cases, and trust caveat. It is front-loaded with the core purpose and the critical do-not-use warning.

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?

With one parameter, high schema coverage, an output schema, and safety annotations, the description fills every remaining gap an agent needs: input format, eligibility constraints, failure-prone identity nuances, chaining guidance, and a trust-reliability caveat. Nothing essential is missing.

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?

Even though schema coverage is 100%, the description adds meaning the schema lacks: public-domain-only restriction, explicit refusal of IPs/ports/local hostnames, the www-vs-apex identity distinction, and the canonical_domain matching requirement with its failure mode. This goes well beyond the schema's bare-hostname constraint.

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?

States a specific verb ('Verify'), a precise resource (vacation-rental host domain as a VRP node), and the intent ('before trusting it'). It differentiates from siblings by explicitly excluding availability, pricing, booking, and payment, and by naming the separate flow for hemmabo_search_properties results leading to get_verified_stay_offer.

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?

Gives an explicit when-to-use trigger ('host domain arrives from outside search — user-typed or third-party'), an explicit when-not-to-use ('do NOT use it to answer those questions'), and names the alternative path (search results go straight to get_verified_stay_offer). It even chains the follow-up action on success.

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.

  1. 3 tool updatesv4.0.9
    • Changedget_verified_stay_offer1 field changed
      • changedInput schema / properties / domain / description
        Previous value: -"Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Optional; omit when the host has not chosen a domain yet. Invalid: 'https://...', paths, ports, or booking URLs."New value: +"Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs."
    • Changedhemmabo_host_readiness_check2 fields changed
      • changedOutput schema / properties / product / properties / price / properties / amount / description
        Previous value: -"Monthly subscription price in major currency units (e.g. 399)."New value: +"Monthly subscription price in major currency units (e.g. 39)."
      • changedOutput schema / properties / product / properties / price / properties / currency / description
        Previous value: -"ISO 4217 currency code (e.g. 'SEK')."New value: +"ISO 4217 currency code (e.g. 'USD')."
    • Changedverify_vacation_rental_node2 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Optional; omit when the host has not chosen a domain yet. Invalid: 'https://...', paths, ports, or booking URLs."New value: +"Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs."
      • changedOutput schema / properties / protocol / description
        Previous value: -"Protocol identifier discovered on the host domain, typically 'vrp'."New value: +"Protocol identifier discovered on the host domain. A valid node declares exactly 'vacation-rental-protocol' in its .well-known/vacation-rental.json protocol field, and that is the value returned here."
  2. 5 tool updatesv4.0.5
    • Changedhemmabo_booking_cancel2 fields changed
      • addedInput schema / properties / guestToken
        Added value: +{
        +  "description": "Per-booking secret returned by hemmabo_booking_create / hemmabo_booking_checkout (the booking's guest_token, a UUID). Required to view or modify this specific booking — a valid Bearer token alone is NOT sufficient, because it authenticates the caller but grants no authority over any particular booking. Present the exact guestToken you received when the booking was created; without the matching value the call is refused. Never a propertyId or reservationId.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "reservationId"
        -]New value: +[
        +  "reservationId",
        +  "guestToken"
        +]
    • Changedhemmabo_booking_checkout1 field changed
      • addedOutput schema / properties / guestToken
        Added value: +{
        +  "description": "Per-booking secret (guest_token) for this booking. Present it back as guestToken on hemmabo_booking_status / hemmabo_booking_cancel / hemmabo_booking_reschedule to view or modify this booking; a Bearer token alone is not sufficient. Store it securely and do not show it to the guest.",
        +  "type": "string"
        +}
    • Changedhemmabo_booking_create1 field changed
      • addedOutput schema / properties / guestToken
        Added value: +{
        +  "description": "Per-booking secret (guest_token) for this booking. Present it back as guestToken on hemmabo_booking_status / hemmabo_booking_cancel / hemmabo_booking_reschedule to view or modify this booking; a Bearer token alone is not sufficient. Store it securely and do not show it to the guest.",
        +  "type": "string"
        +}
    • Changedhemmabo_booking_reschedule2 fields changed
      • addedInput schema / properties / guestToken
        Added value: +{
        +  "description": "Per-booking secret returned by hemmabo_booking_create / hemmabo_booking_checkout (the booking's guest_token, a UUID). Required to view or modify this specific booking — a valid Bearer token alone is NOT sufficient, because it authenticates the caller but grants no authority over any particular booking. Present the exact guestToken you received when the booking was created; without the matching value the call is refused. Never a propertyId or reservationId.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "reservationId",
        -  "newCheckIn",
        -  "newCheckOut"
        -]New value: +[
        +  "reservationId",
        +  "guestToken",
        +  "newCheckIn",
        +  "newCheckOut"
        +]
    • Changedhemmabo_booking_status2 fields changed
      • addedInput schema / properties / guestToken
        Added value: +{
        +  "description": "Per-booking secret returned by hemmabo_booking_create / hemmabo_booking_checkout (the booking's guest_token, a UUID). Required to view or modify this specific booking — a valid Bearer token alone is NOT sufficient, because it authenticates the caller but grants no authority over any particular booking. Present the exact guestToken you received when the booking was created; without the matching value the call is refused. Never a propertyId or reservationId.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "reservationId"
        -]New value: +[
        +  "reservationId",
        +  "guestToken"
        +]
  3. 2 tool updatesv0.1.12
    • Changedhemmabo_booking_create2 fields changed
      • addedOutput schema / properties / calendar_freshness
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Incoming OTA calendar-sync freshness at booking time. The same object is embedded in the error payload when a stale calendar blocks the call — declared here so agents can treat it as a first-class field in both outcomes.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / channel_mirror
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Outbound channel-manager mirror heartbeat for the host's mapped external channel (status: current|stale|partial|error|not_connected). Informational only — it never affects availability or this booking; the host node is the source of truth.",
        +  "type": "object"
        +}
    • Changedhemmabo_search_availability2 fields changed
      • addedOutput schema / properties / calendar_freshness
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Incoming OTA calendar-sync freshness at answer time. The same object is embedded in the error payload when a stale calendar blocks the call — declared here so agents can treat it as a first-class field in both outcomes.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / channel_mirror
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Outbound channel-manager mirror heartbeat for the host's mapped external channel (status: current|stale|partial|error|not_connected). Informational only — it never affects `available`; the host node is the source of truth for these dates.",
        +  "type": "object"
        +}
  4. 5 tool updatesv0.1.11
    • Changedget_verified_stay_offer1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Optional BCP-47 language tag for labels and formatting (e.g. 'en', 'sv', 'de', 'sv-SE'). Omit to use host default; does not change price or availability."New value: +"The guest's conversation language, as a BCP-47 tag (e.g. 'en', 'sv', 'de', 'sv-SE') — ALWAYS pass this, matching the language the guest is chatting in, so the rendered widget's labels, dates and currency formatting match the guest instead of falling back to the rendering client's own locale (which can silently disagree with the conversation). Never changes the signed price value or availability — only how it is displayed."
    • Removedhemmabo_compare_properties
    • Changedhemmabo_host_readiness_check2 fields changed
      • changedInput schema / properties / currentChannels / description
        Previous value: -"Optional list of channels the host uses today. Omit when unknown. Helps assess migration fit from OTAs to own-domain booking."New value: +"Optional list of channels the host uses today. Omit when unknown. Helps assess migration fit from OTAs to their own booking website."
      • changedInput schema / properties / wantsAiAgentBooking / description
        Previous value: -"True if the host wants AI agents (ChatGPT, Claude, Cursor) to discover and book via their own domain. False or omit when they only want a guest website."New value: +"True if the host wants AI agents (ChatGPT, Claude, Cursor) to discover and book via their own official website. False or omit when they only want a guest website."
    • Changedhemmabo_search_properties1 field changed
      • changedOutput schema / properties / properties / items / properties / signals / description
        Previous value: -"Optional. Host-declared canonical discovery flags for matching requests like dog-friendly, hot tub, crib, or hen party. Grouped: amenities / policies / suitability / setting (arrays of canonical English keys, e.g. 'allows_dogs', 'has_hot_tub', 'crib_available', 'bachelorette_party_friendly') plus bestForOccasions / targetAudience. Canonical keys — render them in the user's language. Match signals, not verified guarantees: the signed verified-stay-offer and the property page are authoritative; absence of a flag means 'not detected', not 'no'."New value: +"Optional. Host-declared canonical discovery flags for matching requests like dog-friendly, hot tub, crib, or hen party. Grouped: amenities / policies / suitability / setting (arrays of canonical English keys, e.g. 'allows_dogs', 'has_hot_tub', 'crib_available', 'bachelorette_party_friendly') plus bestForOccasions / targetAudience, plus policies_negated: the host's EXPLICIT NOs from the claims ledger (e.g. 'pets_cats' there means cats are not allowed — relay as a clear, friendly no). Canonical keys — render them in the user's language. Match signals, not verified guarantees: the signed verified-stay-offer and the property page are authoritative; absence of a flag from both the affirmed groups and policies_negated means UNKNOWN, not 'no' — recommend asking the host."
    • Removedhemmabo_search_similar
  5. 15 tool updatesv0.1.6
    • Changedget_verified_stay_offer9 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / checkIn
        Added value: +{
        +  "description": "Requested arrival date in YYYY-MM-DD format (e.g. '2026-11-14'). Must be strictly before checkOut. Use the same dates the guest requested in search.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / checkOut
        Added value: +{
        +  "description": "Requested departure date in YYYY-MM-DD format (e.g. '2026-11-17'). Must be strictly after checkIn. Guest does not stay the departure night.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • removedInput schema / properties / check_in
        Removed value: -{
        -  "description": "Requested arrival date in YYYY-MM-DD format (e.g. '2026-11-14'). Must be strictly before check_out. Use the same dates the guest requested in search.",
        -  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        -  "type": "string"
        -}
      • removedInput schema / properties / check_out
        Removed value: -{
        -  "description": "Requested departure date in YYYY-MM-DD format (e.g. '2026-11-17'). Must be strictly after check_in. Guest does not stay the departure night.",
        -  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        -  "type": "string"
        -}
      • removedInput schema / properties / guests / maximum
        Removed value: -9007199254740991
      • changedInput schema / required
        Previous value: -[
        -  "domain",
        -  "check_in",
        -  "check_out",
        -  "guests"
        -]New value: +[
        +  "domain",
        +  "checkIn",
        +  "checkOut",
        +  "guests"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "agent_citation": {
        +      "additionalProperties": true,
        +      "description": "Citation permission and safe-to-quote status derived from the signed offer.",
        +      "type": "object"
        +    },
        +    "agent_guardrails": {
        +      "additionalProperties": true,
        +      "description": "Rules the agent must follow when presenting or acting on this offer.",
        +      "type": "object"
        +    },
        +    "checkIn": {
        +      "description": "Echoed requested arrival date.",
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "description": "Echoed requested departure date.",
        +      "type": "string"
        +    },
        +    "domain": {
        +      "description": "Echoed host domain that issued the signed offer.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "type": "string"
        +    },
        +    "fresh": {
        +      "description": "True when the signed offer is still within its validity/freshness window.",
        +      "type": "boolean"
        +    },
        +    "guests": {
        +      "description": "Echoed requested guest count.",
        +      "type": "integer"
        +    },
        +    "official_offer_summary": {
        +      "additionalProperties": true,
        +      "description": "Small signed-offer summary for agents to quote without inventing price, availability, discounts, savings, comparisons, or booking details.",
        +      "type": "object"
        +    },
        +    "payload_matches_offer": {
        +      "description": "True when the signed payload matches the structured offer returned to the agent.",
        +      "type": "boolean"
        +    },
        +    "signature": {
        +      "additionalProperties": true,
        +      "description": "Ed25519/JWS verification details, including key id and verification status.",
        +      "type": "object"
        +    },
        +    "verified": {
        +      "description": "True only when the host-domain offer signature and payload checks pass.",
        +      "type": "boolean"
        +    },
        +    "widget_media": {
        +      "additionalProperties": true,
        +      "description": "Images and media hydrated from the verified host discovery document for the ChatGPT widget.",
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "domain",
        +    "verified"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_booking_cancel4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / reservationId / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "refund": {
        +      "additionalProperties": true,
        +      "description": "Refund payload returned by cancel-booking edge function, when present.",
        +      "type": "object"
        +    },
        +    "reservationId": {
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Final booking status after cancellation.",
        +      "enum": [
        +        "cancelled"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "reservationId",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_booking_checkout6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / guestEmail / pattern
        Removed value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      • removedInput schema / properties / guests / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / propertyId / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "checkIn": {
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    "currency": {
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "guests": {
        +      "type": "integer"
        +    },
        +    "mpp": {
        +      "additionalProperties": true,
        +      "description": "Present when paymentMode='payment_intent'.",
        +      "type": "object"
        +    },
        +    "nights": {
        +      "type": "integer"
        +    },
        +    "paymentUrl": {
        +      "description": "Stripe Checkout redirect URL.",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "payment_modes": {
        +      "description": "Supported payment modes.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "propertyId": {
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "reservationId": {
        +      "description": "Booking UUID. Use for subsequent status/cancel/reschedule calls.",
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Booking status (typically 'pending' until payment succeeds).",
        +      "type": "string"
        +    },
        +    "totalPrice": {
        +      "description": "Final total charged (or to be charged), in minor currency units.",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "reservationId",
        +    "totalPrice",
        +    "currency"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_booking_create6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / guestEmail / pattern
        Removed value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      • removedInput schema / properties / guests / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / propertyId / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "bookingId": {
        +      "description": "Persistent booking UUID. Use for status/cancel/reschedule.",
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "checkIn": {
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    "currency": {
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "federationDiscountPercent": {
        +      "type": "integer"
        +    },
        +    "gapDiscountPercent": {
        +      "type": "integer"
        +    },
        +    "guests": {
        +      "type": "integer"
        +    },
        +    "nights": {
        +      "type": "integer"
        +    },
        +    "packageApplied": {
        +      "type": "string"
        +    },
        +    "priceType": {
        +      "description": "Pricing mode used (federation/gap_night/package_*).",
        +      "type": "string"
        +    },
        +    "propertyId": {
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Host-node booking status. 'completed' is a protocol compatibility output only, not a status this tool writes.",
        +      "enum": [
        +        "pending",
        +        "confirmed",
        +        "cancelled",
        +        "completed"
        +      ],
        +      "type": "string"
        +    },
        +    "totalPrice": {
        +      "description": "Final price written to the booking.",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "bookingId",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_booking_negotiate5 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / guests / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / propertyId / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "breakdown": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "checkIn": {
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "type": "string"
        +    },
        +    "currency": {
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "federationDiscountPercent": {
        +      "type": "integer"
        +    },
        +    "federationTotal": {
        +      "type": "integer"
        +    },
        +    "gapDiscountPercent": {
        +      "type": "integer"
        +    },
        +    "gapNight": {
        +      "type": "boolean"
        +    },
        +    "gapTotal": {
        +      "type": "integer"
        +    },
        +    "guests": {
        +      "type": "integer"
        +    },
        +    "nights": {
        +      "type": "integer"
        +    },
        +    "packageApplied": {
        +      "type": "string"
        +    },
        +    "propertyId": {
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "publicTotal": {
        +      "type": "integer"
        +    },
        +    "quoteId": {
        +      "description": "Snapshot ID. Pass to hemmabo_booking_checkout to lock this price.",
        +      "type": "string"
        +    },
        +    "validUntil": {
        +      "description": "Quote expiry (ISO 8601). Typically 15 minutes after creation.",
        +      "format": "date-time",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "quoteId",
        +    "validUntil",
        +    "federationTotal"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_booking_quote5 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / guests / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / propertyId / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "breakdown": {
        +      "additionalProperties": true,
        +      "description": "Detailed pricing breakdown.",
        +      "type": "object"
        +    },
        +    "checkIn": {
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "type": "string"
        +    },
        +    "currency": {
        +      "description": "ISO 4217 currency code.",
        +      "type": "string"
        +    },
        +    "directBookingDiscountPercent": {
        +      "description": "Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison.",
        +      "type": "integer"
        +    },
        +    "directBookingTotal": {
        +      "description": "Preferred user-facing field: direct host-source total.",
        +      "type": "integer"
        +    },
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "federationDiscountPercent": {
        +      "description": "Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison.",
        +      "type": "integer"
        +    },
        +    "federationTotal": {
        +      "description": "Legacy field: direct host-source total. Prefer directBookingTotal in user-facing copy.",
        +      "type": "integer"
        +    },
        +    "gapDiscountPercent": {
        +      "description": "Gap-night discount percentage when applied.",
        +      "type": "integer"
        +    },
        +    "gapNight": {
        +      "description": "True when the stay qualifies as a gap fill.",
        +      "type": "boolean"
        +    },
        +    "gapTotal": {
        +      "description": "Gap-night adjusted total when applicable; otherwise null.",
        +      "type": "integer"
        +    },
        +    "guests": {
        +      "type": "integer"
        +    },
        +    "hostSourcePublicTotal": {
        +      "description": "Preferred user-facing field: public host-source total.",
        +      "type": "integer"
        +    },
        +    "nights": {
        +      "description": "Number of nights in the range.",
        +      "type": "integer"
        +    },
        +    "packageApplied": {
        +      "description": "Applied package, if any.",
        +      "type": "string"
        +    },
        +    "propertyId": {
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "publicTotal": {
        +      "description": "Website rate total in minor currency units.",
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedhemmabo_booking_reschedule4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / reservationId / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "newDates": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "checkIn": {
        +          "type": "string"
        +        },
        +        "checkOut": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "previousDates": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "checkIn": {
        +          "type": "string"
        +        },
        +        "checkOut": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "pricing": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "currency": {
        +          "type": "string"
        +        },
        +        "delta": {
        +          "type": "integer"
        +        },
        +        "newPrice": {
        +          "type": "integer"
        +        },
        +        "previousPrice": {
        +          "type": "integer"
        +        },
        +        "stripeAction": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "reason": {
        +      "type": "string"
        +    },
        +    "reservationId": {
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Booking status after reschedule.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "reservationId",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_booking_status4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / reservationId / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "cancellationPolicy": {
        +      "additionalProperties": true,
        +      "description": "Host cancellation-policy details applicable to this booking.",
        +      "type": "object"
        +    },
        +    "checkIn": {
        +      "description": "Booked arrival date.",
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "description": "Booked departure date.",
        +      "type": "string"
        +    },
        +    "createdAt": {
        +      "description": "Booking creation timestamp.",
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    "currency": {
        +      "description": "ISO 4217 currency code for the booking total.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "guestEmail": {
        +      "description": "Primary guest email stored on the booking.",
        +      "type": "string"
        +    },
        +    "guestName": {
        +      "description": "Primary guest name stored on the booking.",
        +      "type": "string"
        +    },
        +    "guests": {
        +      "description": "Booked guest count.",
        +      "type": "integer"
        +    },
        +    "propertyDomain": {
        +      "description": "Host-owned domain associated with the property.",
        +      "type": "string"
        +    },
        +    "propertyId": {
        +      "description": "Property UUID associated with the booking.",
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "propertyName": {
        +      "description": "Display name of the booked property.",
        +      "type": "string"
        +    },
        +    "reservationId": {
        +      "description": "Echoed booking or reservation UUID.",
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Host-node booking status. 'completed' is a protocol compatibility output only, not the active lifecycle truth.",
        +      "enum": [
        +        "pending",
        +        "confirmed",
        +        "cancelled",
        +        "completed"
        +      ],
        +      "type": "string"
        +    },
        +    "totalPrice": {
        +      "description": "Total amount in minor currency units.",
        +      "type": "integer"
        +    },
        +    "updatedAt": {
        +      "description": "Last update timestamp for the booking record.",
        +      "format": "date-time",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "reservationId",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_compare_properties5 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / guests / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / propertyIds / items / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "checkIn": {
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "type": "string"
        +    },
        +    "comparison": {
        +      "description": "One entry per requested propertyId, sorted by direct host-source total (cheapest first), unavailable last.",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "available": {
        +            "type": "boolean"
        +          },
        +          "city": {
        +            "type": "string"
        +          },
        +          "country": {
        +            "type": "string"
        +          },
        +          "currency": {
        +            "type": "string"
        +          },
        +          "domain": {
        +            "type": "string"
        +          },
        +          "error": {
        +            "description": "Error detail for this property when present.",
        +            "type": "string"
        +          },
        +          "federationDiscountPercent": {
        +            "type": "integer"
        +          },
        +          "federationTotal": {
        +            "description": "Legacy field: direct host-source total. Absent if unavailable.",
        +            "type": "integer"
        +          },
        +          "gapTotal": {
        +            "type": "integer"
        +          },
        +          "maxGuests": {
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "nights": {
        +            "type": "integer"
        +          },
        +          "packageApplied": {
        +            "type": "string"
        +          },
        +          "propertyId": {
        +            "format": "uuid",
        +            "type": "string"
        +          },
        +          "propertyType": {
        +            "type": "string"
        +          },
        +          "publicTotal": {
        +            "description": "Standard website total. Absent if unavailable.",
        +            "type": "integer"
        +          },
        +          "reason": {
        +            "description": "Availability reason object when unavailable.",
        +            "type": "object"
        +          },
        +          "region": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "propertyId",
        +          "available"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "count": {
        +      "description": "Number of compared properties returned.",
        +      "type": "integer"
        +    },
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "guests": {
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedhemmabo_host_onboarding_link4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / required
        Added value: +[]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "capabilities": {
        +      "description": "Host-facing capabilities included in HemmaBo.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "next_step": {
        +      "additionalProperties": true,
        +      "description": "Safe handoff action for the host.",
        +      "type": "object"
        +    },
        +    "ok": {
        +      "type": "boolean"
        +    },
        +    "privacy_note": {
        +      "description": "Clarifies that the call is read-only and does not store host data.",
        +      "type": "string"
        +    },
        +    "product": {
        +      "additionalProperties": true,
        +      "description": "HemmaBo product, pricing, onboarding URL, and live proof URLs.",
        +      "type": "object"
        +    },
        +    "setup_items": {
        +      "description": "Inputs the host should prepare before onboarding.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "product",
        +    "capabilities",
        +    "setup_items",
        +    "next_step"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_host_readiness_check4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / required
        Added value: +[]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "agent_instruction": {
        +      "description": "How an AI agent should describe HemmaBo without overclaiming.",
        +      "type": "string"
        +    },
        +    "capabilities": {
        +      "description": "Host-facing capabilities included in HemmaBo.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "next_step": {
        +      "additionalProperties": true,
        +      "description": "Safe handoff action for the host.",
        +      "properties": {
        +        "action": {
        +          "description": "Recommended next action.",
        +          "enum": [
        +            "open_onboarding"
        +          ],
        +          "type": "string"
        +        },
        +        "label": {
        +          "description": "Human-readable label for the action.",
        +          "type": "string"
        +        },
        +        "url": {
        +          "description": "Onboarding handoff URL to open.",
        +          "format": "uri",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "ok": {
        +      "description": "True when the fit check completed.",
        +      "type": "boolean"
        +    },
        +    "product": {
        +      "additionalProperties": true,
        +      "description": "HemmaBo product summary, pricing, onboarding URL, and live proof URLs.",
        +      "properties": {
        +        "category": {
        +          "description": "Product category, e.g. 'host-owned booking engine for vacation rentals'.",
        +          "type": "string"
        +        },
        +        "live_proof_url": {
        +          "description": "Live AI-agent booking proof page on hemmabo.com.",
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        "live_reference_domain": {
        +          "description": "Live reference host-node domain to show the model in action.",
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "Product name ('HemmaBo').",
        +          "type": "string"
        +        },
        +        "onboarding_url": {
        +          "description": "Prefilled host onboarding handoff URL (utm-tagged; carries any property/location/domain/language the host provided).",
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        "price": {
        +          "additionalProperties": true,
        +          "description": "Subscription pricing for the host.",
        +          "properties": {
        +            "amount": {
        +              "description": "Monthly subscription price in major currency units (e.g. 399).",
        +              "type": "integer"
        +            },
        +            "currency": {
        +              "description": "ISO 4217 currency code (e.g. 'SEK').",
        +              "type": "string"
        +            },
        +            "first_month_free": {
        +              "description": "True when the first month is free.",
        +              "type": "boolean"
        +            },
        +            "hemmabo_booking_commission_percent": {
        +              "description": "HemmaBo booking commission percent. 0 — HemmaBo takes no booking commission.",
        +              "type": "integer"
        +            },
        +            "interval": {
        +              "description": "Billing interval (e.g. 'month').",
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "website": {
        +          "description": "HemmaBo marketing site URL.",
        +          "format": "uri",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "readiness": {
        +      "additionalProperties": true,
        +      "description": "Fit verdict and boundaries for the host's described need.",
        +      "properties": {
        +        "fit": {
        +          "description": "Overall fit verdict derived from the inputs the host provided.",
        +          "enum": [
        +            "strong_fit",
        +            "possible_fit",
        +            "needs_more_host_context"
        +          ],
        +          "type": "string"
        +        },
        +        "not_a_fit_when": {
        +          "description": "Situations where HemmaBo is not the right tool.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "product_category": {
        +          "description": "Plain-language product category.",
        +          "type": "string"
        +        },
        +        "recommended_when": {
        +          "description": "Situations where HemmaBo is a good fit.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "setup_items": {
        +      "description": "Inputs the host should prepare before onboarding.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "product",
        +    "readiness",
        +    "capabilities",
        +    "setup_items",
        +    "next_step",
        +    "agent_instruction"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_search_availability5 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / guests / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / propertyId / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "alternativeDates": {
        +      "description": "Nearby same-month date windows to offer when the requested dates are unavailable.",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "available": {
        +            "type": "boolean"
        +          },
        +          "checkIn": {
        +            "type": "string"
        +          },
        +          "checkOut": {
        +            "type": "string"
        +          },
        +          "currency": {
        +            "type": "string"
        +          },
        +          "federationDiscountPercent": {
        +            "type": "number"
        +          },
        +          "federationTotal": {
        +            "type": "number"
        +          },
        +          "publicTotal": {
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "available": {
        +      "description": "True if the property is bookable for the entire range.",
        +      "type": "boolean"
        +    },
        +    "checkIn": {
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "propertyId": {
        +      "format": "uuid",
        +      "type": "string"
        +    },
        +    "reason": {
        +      "description": "Reason when available=false.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "available"
        +  ],
        +  "type": "object"
        +}
    • Changedhemmabo_search_properties4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / guests / maximum
        Removed value: -9007199254740991
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "checkIn": {
        +      "description": "Echoed check-in date (YYYY-MM-DD).",
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "description": "Echoed check-out date (YYYY-MM-DD).",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "guests": {
        +      "description": "Echoed guest count.",
        +      "type": "integer"
        +    },
        +    "properties": {
        +      "description": "Available properties matching the search criteria, with live host-source pricing.",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "available": {
        +            "description": "Always true in search results because unavailable properties are filtered out.",
        +            "type": "boolean"
        +          },
        +          "city": {
        +            "description": "City or locality.",
        +            "type": "string"
        +          },
        +          "country": {
        +            "description": "Country.",
        +            "type": "string"
        +          },
        +          "currency": {
        +            "description": "ISO 4217 currency code (e.g. 'SEK', 'EUR').",
        +            "type": "string"
        +          },
        +          "directBookingDiscountPercent": {
        +            "description": "Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison.",
        +            "type": "integer"
        +          },
        +          "directBookingTotal": {
        +            "description": "Preferred field for user-facing copy: direct host-source total, in minor currency units.",
        +            "type": "integer"
        +          },
        +          "domain": {
        +            "description": "Host-owned domain for this property.",
        +            "type": "string"
        +          },
        +          "federationDiscountPercent": {
        +            "description": "Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison.",
        +            "type": "integer"
        +          },
        +          "federationTotal": {
        +            "description": "Legacy field: direct host-source total, in minor currency units. Do not label this as a HemmaBo platform, federation, OTA, marketplace, comparison, discount, or savings price in user-facing copy.",
        +            "type": "integer"
        +          },
        +          "hostSourcePublicTotal": {
        +            "description": "Preferred field for user-facing copy: public host-source total for the date range, in minor currency units.",
        +            "type": "integer"
        +          },
        +          "maxGuests": {
        +            "description": "Maximum guest capacity.",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "description": "Property display name.",
        +            "type": "string"
        +          },
        +          "nights": {
        +            "description": "Number of nights between check-in and check-out.",
        +            "type": "integer"
        +          },
        +          "packageApplied": {
        +            "description": "Package applied (e.g. week or two_weeks), if any.",
        +            "type": "string"
        +          },
        +          "propertyId": {
        +            "description": "Stable UUID. Pass to subsequent tools (availability, quote, checkout).",
        +            "format": "uuid",
        +            "type": "string"
        +          },
        +          "propertyType": {
        +            "description": "Property type classification.",
        +            "type": "string"
        +          },
        +          "publicTotal": {
        +            "description": "Standard website total for the date range, in minor currency units.",
        +            "type": "integer"
        +          },
        +          "region": {
        +            "description": "Region or area.",
        +            "type": "string"
        +          },
        +          "signals": {
        +            "additionalProperties": true,
        +            "description": "Optional. Host-declared canonical discovery flags for matching requests like dog-friendly, hot tub, crib, or hen party. Grouped: amenities / policies / suitability / setting (arrays of canonical English keys, e.g. 'allows_dogs', 'has_hot_tub', 'crib_available', 'bachelorette_party_friendly') plus bestForOccasions / targetAudience. Canonical keys — render them in the user's language. Match signals, not verified guarantees: the signed verified-stay-offer and the property page are authoritative; absence of a flag means 'not detected', not 'no'.",
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "propertyId",
        +          "name",
        +          "maxGuests",
        +          "federationTotal"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedhemmabo_search_similar5 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / guests / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / propertyId / pattern
        Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "checkIn": {
        +      "type": "string"
        +    },
        +    "checkOut": {
        +      "type": "string"
        +    },
        +    "count": {
        +      "description": "Number of similar properties returned.",
        +      "type": "integer"
        +    },
        +    "error": {
        +      "description": "Present only when isError=true.",
        +      "type": "string"
        +    },
        +    "guests": {
        +      "description": "Effective guest count used for matching and pricing.",
        +      "type": "integer"
        +    },
        +    "similarProperties": {
        +      "description": "Similar available properties (same region, same type, same/larger capacity), sorted by direct host-source total.",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "available": {
        +            "type": "boolean"
        +          },
        +          "city": {
        +            "type": "string"
        +          },
        +          "country": {
        +            "type": "string"
        +          },
        +          "currency": {
        +            "type": "string"
        +          },
        +          "domain": {
        +            "type": "string"
        +          },
        +          "federationDiscountPercent": {
        +            "type": "integer"
        +          },
        +          "federationTotal": {
        +            "type": "integer"
        +          },
        +          "maxGuests": {
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "nights": {
        +            "type": "integer"
        +          },
        +          "packageApplied": {
        +            "type": "string"
        +          },
        +          "propertyId": {
        +            "format": "uuid",
        +            "type": "string"
        +          },
        +          "propertyType": {
        +            "type": "string"
        +          },
        +          "publicTotal": {
        +            "type": "integer"
        +          },
        +          "region": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "propertyId",
        +          "federationTotal"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "sourcePropertyId": {
        +      "description": "The property similar listings were found for.",
        +      "format": "uuid",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedverify_vacation_rental_node3 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "discovery_url": {
        +      "description": "The .well-known vacation-rental discovery URL read from the host domain.",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "domain": {
        +      "description": "Echoed canonical host domain that was checked.",
        +      "type": "string"
        +    },
        +    "error": {
        +      "description": "Present when verified=false or the node cannot be checked.",
        +      "type": "string"
        +    },
        +    "jwks_url": {
        +      "description": "Host-domain JWKS URL containing the Ed25519 public keys used to verify signed offers.",
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "protocol": {
        +      "description": "Protocol identifier discovered on the host domain, typically 'vrp'.",
        +      "type": "string"
        +    },
        +    "protocol_version": {
        +      "description": "VRP version declared by the host discovery document.",
        +      "type": "string"
        +    },
        +    "signing": {
        +      "additionalProperties": true,
        +      "description": "Summary of accepted signing algorithms, key ids, and signing-key checks.",
        +      "type": "object"
        +    },
        +    "verified": {
        +      "description": "True only when discovery, JWKS, signing metadata, and verified-offer endpoint checks pass.",
        +      "type": "boolean"
        +    },
        +    "verified_stay_offer_url": {
        +      "description": "Host-domain endpoint template or URL used to request signed verified stay offers.",
        +      "format": "uri",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "domain",
        +    "verified"
        +  ],
        +  "type": "object"
        +}
  6. 15 tool updatesv0.1.5
    • Changedget_verified_stay_offer5 fields changed
      • changedInput schema / properties / check_in / description
        Previous value: -"Requested arrival date in YYYY-MM-DD format, e.g. 2026-11-14. Must be before check_out."New value: +"Requested arrival date in YYYY-MM-DD format (e.g. '2026-11-14'). Must be strictly before check_out. Use the same dates the guest requested in search."
      • changedInput schema / properties / check_out / description
        Previous value: -"Requested departure date in YYYY-MM-DD format, e.g. 2026-11-15. Must be after check_in."New value: +"Requested departure date in YYYY-MM-DD format (e.g. '2026-11-17'). Must be strictly after check_in. Guest does not stay the departure night."
      • changedInput schema / properties / domain / description
        Previous value: -"Canonical public host-owned vacation-rental domain returned by search or verify_vacation_rental_node, e.g. villaakerlyckan.se. Provide only the domain, not a URL or path."New value: +"Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Optional; omit when the host has not chosen a domain yet. Invalid: 'https://...', paths, ports, or booking URLs."
      • changedInput schema / properties / guests / description
        Previous value: -"Total guest count for the stay as an integer >= 1. The host node uses this for capacity checks and guest-based pricing."New value: +"Total guest count as positive integer (e.g. 2, 4). Used by the host node for capacity validation and guest-tier pricing on the signed offer."
      • changedInput schema / properties / language / description
        Previous value: -"Optional BCP-47/RFC 5646 language hint for labels and formatting, e.g. en, sv, de, or sv-SE."New value: +"Optional BCP-47 language tag for labels and formatting (e.g. 'en', 'sv', 'de', 'sv-SE'). Omit to use host default; does not change price or availability."
    • Changedhemmabo_booking_cancel4 fields changed
      • changedInput schema / properties / reason / description
        Previous value: -"Cancellation reason for host notification (e.g. 'Travel plans changed'). Optional but recommended."New value: +"Human-readable cancellation reason for the host (e.g. 'Travel plans changed', 'Flight cancelled'). Optional; omit when the guest did not give a reason."
      • changedInput schema / properties / reservationId / description
        Previous value: -"Booking or reservation UUID returned by hemmabo_booking_checkout or hemmabo_booking_create. Use this exact id for status, cancellation, or rescheduling."New value: +"Booking or reservation UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '7c9e6679-7425-40de-944b-e07fc1f90ae7'). Required to look up, cancel, or reschedule the same booking record."
      • addedInput schema / properties / reservationId / format
        Added value: +"uuid"
      • addedInput schema / properties / reservationId / pattern
        Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    • Changedhemmabo_booking_checkout9 fields changed
      • changedInput schema / properties / channel / description
        Previous value: -"'federation' is the compatibility name for direct host-source pricing. 'public': uses standard website rate."New value: +"Pricing channel selector. 'federation' (default for agent flows): direct host-source total. 'public': standard website rate without agent channel pricing. Omit to use federation."
      • changedInput schema / properties / checkIn / description
        Previous value: -"Arrival date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-15'). Must be today or later."New value: +"Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
      • changedInput schema / properties / checkOut / description
        Previous value: -"Departure date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-22'). Must be after checkIn."New value: +"Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
      • changedInput schema / properties / guestEmail / description
        Previous value: -"Email for booking confirmation (e.g. 'anna@example.com'). Must be a valid email address."New value: +"Primary guest email in RFC 5322 format (e.g. 'anna@example.com'). Used for booking confirmation and host contact; must be deliverable."
      • changedInput schema / properties / guestName / description
        Previous value: -"Full name of primary guest (e.g. 'Anna Svensson')."New value: +"Primary guest full name as plain text (e.g. 'Anna Svensson'). Stored on the booking for host confirmation; use the name the guest provided."
      • changedInput schema / properties / guestPhone / description
        Previous value: -"Phone with country code (e.g. '+46701234567'). Optional but recommended."New value: +"Primary guest phone in E.164 format with country code (e.g. '+46701234567'). Optional; omit when unknown. Recommended for check-in coordination."
      • changedInput schema / properties / paymentMode / description
        Previous value: -"'checkout_session' (default): returns a host-configured Stripe redirect URL. 'payment_intent': returns client_secret for configured fallback non-VRP payment integrations."New value: +"Stripe payment flow. 'checkout_session' (default): returns a browser redirect URL. 'payment_intent': returns client_secret for embedded/agentic payment integrations. Omit to use checkout_session."
      • changedInput schema / properties / propertyId / description
        Previous value: -"Stable property UUID returned by hemmabo_search_properties. Use the exact UUID, not the property name, domain, or booking URL."New value: +"Stable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL."
      • changedInput schema / properties / quoteId / description
        Previous value: -"Quote ID from hemmabo_booking_negotiate to lock the price. Optional - if omitted, a fresh direct host-source price is calculated at checkout time."New value: +"Quote ID string from hemmabo_booking_negotiate (e.g. 'q_abc123'). Optional — omit to calculate a fresh host-source price at checkout. Provide when the guest locked a price within the 15-minute quote window."
    • Changedhemmabo_booking_create7 fields changed
      • changedInput schema / properties / checkIn / description
        Previous value: -"Booking arrival date in YYYY-MM-DD format."New value: +"Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
      • changedInput schema / properties / checkOut / description
        Previous value: -"Booking departure date in YYYY-MM-DD format; must be after checkIn."New value: +"Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
      • changedInput schema / properties / guestEmail / description
        Previous value: -"Primary guest email for confirmation and host contact."New value: +"Primary guest email in RFC 5322 format (e.g. 'anna@example.com'). Used for booking confirmation and host contact; must be deliverable."
      • changedInput schema / properties / guestName / description
        Previous value: -"Primary guest name for host confirmation."New value: +"Primary guest full name as plain text (e.g. 'Anna Svensson'). Stored on the booking for host confirmation; use the name the guest provided."
      • changedInput schema / properties / guestPhone / description
        Previous value: -"Primary guest phone with country code; optional but recommended."New value: +"Primary guest phone in E.164 format with country code (e.g. '+46701234567'). Optional; omit when unknown. Recommended for check-in coordination."
      • changedInput schema / properties / guests / description
        Previous value: -"Total number of guests as integer >= 1 (e.g. 4)."New value: +"Total guest count as a positive integer (e.g. 2, 4, 6). Used for capacity filtering and staircase pricing tiers. Properties with maxGuests below this value are excluded from search results."
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID returned by hemmabo_search_properties for this fallback non-VRP booking. Use the exact UUID, not a property name, domain, or booking URL."New value: +"Stable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL."
    • Changedhemmabo_booking_negotiate3 fields changed
      • changedInput schema / properties / checkIn / description
        Previous value: -"Arrival date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-15'). Must be today or later."New value: +"Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
      • changedInput schema / properties / checkOut / description
        Previous value: -"Departure date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-22'). Must be after checkIn."New value: +"Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
      • changedInput schema / properties / propertyId / description
        Previous value: -"Stable property UUID returned by hemmabo_search_properties. Use the exact UUID, not the property name, domain, or booking URL."New value: +"Stable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL."
    • Changedhemmabo_booking_quote4 fields changed
      • changedInput schema / properties / checkIn / description
        Previous value: -"Arrival date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-15'). Must be today or later."New value: +"Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
      • changedInput schema / properties / checkOut / description
        Previous value: -"Departure date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-22'). Must be after checkIn."New value: +"Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
      • changedInput schema / properties / guests / description
        Previous value: -"Total number of guests as integer >= 1 (e.g. 4). Determines which price tier is applied (staircase pricing by guest count)."New value: +"Total guest count as a positive integer (e.g. 2, 4, 6). Used for capacity filtering and staircase pricing tiers. Properties with maxGuests below this value are excluded from search results."
      • changedInput schema / properties / propertyId / description
        Previous value: -"Stable property UUID returned by hemmabo_search_properties. Use the exact UUID, not the property name, domain, or booking URL."New value: +"Stable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL."
    • Changedhemmabo_booking_reschedule6 fields changed
      • changedInput schema / properties / newCheckIn / description
        Previous value: -"New arrival date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-20'). Must be today or later."New value: +"New arrival date in YYYY-MM-DD format (e.g. '2026-08-01'). Must be today or later. Must be strictly before newCheckOut."
      • changedInput schema / properties / newCheckOut / description
        Previous value: -"New departure date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-27'). Must be after newCheckIn."New value: +"New departure date in YYYY-MM-DD format (e.g. '2026-08-08'). Must be strictly after newCheckIn."
      • changedInput schema / properties / reason / description
        Previous value: -"Reason for rescheduling (e.g. 'Flight delayed'). Optional but recommended for host records."New value: +"Human-readable reschedule reason for host records (e.g. 'Flight delayed', 'Extended conference'). Optional; omit when not provided by the guest."
      • changedInput schema / properties / reservationId / description
        Previous value: -"Booking UUID to reschedule (e.g. '550e8400-e29b-41d4-a716-446655440000'). Must be in 'confirmed' or 'pending' status."New value: +"Booking or reservation UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '7c9e6679-7425-40de-944b-e07fc1f90ae7'). Required to look up, cancel, or reschedule the same booking record."
      • addedInput schema / properties / reservationId / format
        Added value: +"uuid"
      • addedInput schema / properties / reservationId / pattern
        Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    • Changedhemmabo_booking_status3 fields changed
      • changedInput schema / properties / reservationId / description
        Previous value: -"Booking or reservation UUID returned by checkout/create. Required to look up the exact booking."New value: +"Booking or reservation UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '7c9e6679-7425-40de-944b-e07fc1f90ae7'). Required to look up, cancel, or reschedule the same booking record."
      • addedInput schema / properties / reservationId / format
        Added value: +"uuid"
      • addedInput schema / properties / reservationId / pattern
        Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    • Changedhemmabo_compare_properties5 fields changed
      • changedInput schema / properties / checkIn / description
        Previous value: -"Arrival date in ISO 8601 format (YYYY-MM-DD). Must be today or later."New value: +"Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
      • changedInput schema / properties / checkOut / description
        Previous value: -"Departure date in ISO 8601 format (YYYY-MM-DD). Must be after checkIn."New value: +"Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
      • changedInput schema / properties / guests / description
        Previous value: -"Total number of guests as integer >= 1."New value: +"Total guest count as a positive integer (e.g. 2, 4, 6). Used for capacity filtering and staircase pricing tiers. Properties with maxGuests below this value are excluded from search results."
      • changedInput schema / properties / propertyIds / description
        Previous value: -"Array of 2 to 10 property UUIDs returned by hemmabo_search_properties. Use UUIDs only; do not pass domains, names, or booking URLs."New value: +"Ordered list of 2–10 property UUIDs to compare on the same dates. All IDs must come from hemmabo_search_properties; do not pass host domains, names, or booking URLs."
      • changedInput schema / properties / propertyIds / items / description
        Previous value: -"Property UUID returned by hemmabo_search_properties."New value: +"Single property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Repeat one entry per property to compare."
    • Changedhemmabo_host_onboarding_link6 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"Optional city or municipality where the property is located."New value: +"City or municipality (e.g. 'Kävlinge', 'Florence'). Optional; used in onboarding URL prefill when provided."
      • changedInput schema / properties / country / description
        Previous value: -"Optional country where the property is located."New value: +"Country where the property operates (e.g. 'Sweden', 'Italy', 'Morocco'). Optional; improves onboarding URL locale and fit assessment."
      • changedInput schema / properties / domain / description
        Previous value: -"Optional existing or intended host-owned domain, without https:// or path."New value: +"Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Optional; omit when the host has not chosen a domain yet. Invalid: 'https://...', paths, ports, or booking URLs."
      • changedInput schema / properties / language / description
        Previous value: -"Optional language hint for onboarding, e.g. sv, en, de."New value: +"ISO 639-1 language hint for onboarding copy (e.g. 'sv', 'en', 'de', 'fr'). Optional; omit to default to English."
      • changedInput schema / properties / propertyName / description
        Previous value: -"Optional property or business name to carry into the onboarding URL."New value: +"Property or business display name (e.g. 'Villa Åkerlyckan'). Optional; carried into onboarding URL when provided."
      • changedInput schema / properties / region / description
        Previous value: -"Optional region or area where the property is located."New value: +"Region or area (e.g. 'Skåne', 'Toscana', 'Marrakech-Safi'). Optional; narrows onboarding handoff and proof examples."
    • Changedhemmabo_host_readiness_check12 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"Optional city or municipality where the property is located."New value: +"City or municipality (e.g. 'Kävlinge', 'Florence'). Optional; used in onboarding URL prefill when provided."
      • changedInput schema / properties / country / description
        Previous value: -"Optional country where the property is located."New value: +"Country where the property operates (e.g. 'Sweden', 'Italy', 'Morocco'). Optional; improves onboarding URL locale and fit assessment."
      • changedInput schema / properties / currentChannels / description
        Previous value: -"Optional existing places the host uses today, e.g. Airbnb, Booking.com, Vrbo, manual calendar, own website, PMS."New value: +"Optional list of channels the host uses today. Omit when unknown. Helps assess migration fit from OTAs to own-domain booking."
      • addedInput schema / properties / currentChannels / items / description
        Added value: +"Single distribution channel name (e.g. 'Airbnb', 'Booking.com', 'Vrbo', 'own website'). Up to 8 entries."
      • changedInput schema / properties / domain / description
        Previous value: -"Optional existing or intended host-owned domain, without https:// or path."New value: +"Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Optional; omit when the host has not chosen a domain yet. Invalid: 'https://...', paths, ports, or booking URLs."
      • changedInput schema / properties / hasOwnDomain / description
        Previous value: -"Whether the host already has or wants to use an own domain."New value: +"True if the host already owns a domain or explicitly wants one (e.g. true for 'I have villaakerlyckan.se'). False or omit when still undecided."
      • changedInput schema / properties / preferredLanguage / description
        Previous value: -"Optional language hint for onboarding, e.g. sv, en, de."New value: +"ISO 639-1 language hint for onboarding copy (e.g. 'sv', 'en', 'de', 'fr'). Optional; omit to default to English."
      • changedInput schema / properties / propertyName / description
        Previous value: -"Optional property or business name the host gave, e.g. Villa Akerlyckan."New value: +"Property or business display name (e.g. 'Villa Åkerlyckan'). Optional; carried into onboarding URL when provided."
      • changedInput schema / properties / propertyType / description
        Previous value: -"Optional property category. HemmaBo is optimized for vacation-rental hosts and independent properties."New value: +"Property category enum. Optional; omit when unknown. 'villa'/'holiday_home' fit best; 'hotel' may indicate a poor HemmaBo fit for large chains."
      • changedInput schema / properties / region / description
        Previous value: -"Optional region or area where the property is located."New value: +"Region or area (e.g. 'Skåne', 'Toscana', 'Marrakech-Safi'). Optional; narrows onboarding handoff and proof examples."
      • changedInput schema / properties / wantsAiAgentBooking / description
        Previous value: -"Whether the host wants AI agents to discover, verify, and route bookings to the host-owned domain."New value: +"True if the host wants AI agents (ChatGPT, Claude, Cursor) to discover and book via their own domain. False or omit when they only want a guest website."
      • changedInput schema / properties / wantsDirectPayments / description
        Previous value: -"Whether the host wants Stripe payments direct to the host rather than HemmaBo as merchant of record."New value: +"True if the host wants Stripe Connect payouts direct to their account. False or omit when they expect HemmaBo to be merchant of record (not supported)."
    • Changedhemmabo_search_availability4 fields changed
      • changedInput schema / properties / checkIn / description
        Previous value: -"Arrival date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-15'). Must be today or later."New value: +"Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
      • changedInput schema / properties / checkOut / description
        Previous value: -"Departure date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-22'). Must be after checkIn."New value: +"Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
      • changedInput schema / properties / guests / description
        Previous value: -"Optional guest count. When provided, alternative date windows include live pricing."New value: +"Optional guest count (e.g. 4). Omit when only checking date availability without pricing. When provided, alternative date windows in the response include live host-source totals for that guest count."
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID returned by hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Stable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL."
    • Changedhemmabo_search_properties5 fields changed
      • changedInput schema / properties / checkIn / description
        Previous value: -"Arrival date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-15'). Must be today or later."New value: +"Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
      • changedInput schema / properties / checkOut / description
        Previous value: -"Departure date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-22'). Must be after checkIn."New value: +"Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
      • changedInput schema / properties / country / description
        Previous value: -"Country name to filter by (e.g. 'Sweden', 'Italy'). Partial match. At least one of region or country should be provided; omit only when the user has given a specific region."New value: +"Country name to filter by (e.g. 'Sweden', 'Italy', 'Morocco'). Partial case-insensitive match. Provide at least one of region or country; omit when region already narrows the destination."
      • changedInput schema / properties / guests / description
        Previous value: -"Total number of guests as integer >= 1 (e.g. 4). Determines price tier and filters out properties with insufficient capacity."New value: +"Total guest count as a positive integer (e.g. 2, 4, 6). Used for capacity filtering and staircase pricing tiers. Properties with maxGuests below this value are excluded from search results."
      • changedInput schema / properties / region / description
        Previous value: -"Region, area, or destination name to search within. Partial match (e.g. 'Skane', 'Toscana', 'Bavaria'). At least one of region or country should be provided."New value: +"Region, area, or destination to search within (e.g. 'Skåne', 'Kävlinge', 'Toscana', 'Bavaria'). Partial case-insensitive match. Provide at least one of region or country; omit only when country alone is sufficient."
    • Changedhemmabo_search_similar5 fields changed
      • changedInput schema / properties / checkIn / description
        Previous value: -"Arrival date in ISO 8601 format (YYYY-MM-DD). Must be today or later."New value: +"Arrival date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-15'). Must be today or later in the property's timezone. Must be strictly before checkOut; together they define the stay length used for pricing and availability."
      • changedInput schema / properties / checkOut / description
        Previous value: -"Departure date in ISO 8601 format (YYYY-MM-DD). Must be after checkIn."New value: +"Departure date in ISO 8601 calendar format YYYY-MM-DD (e.g. '2026-07-22'). Must be strictly after checkIn on the same calendar. The guest does not stay the departure night."
      • changedInput schema / properties / guests / description
        Previous value: -"Number of guests. Defaults to source property's max_guests."New value: +"Optional guest count (e.g. 4). Omit to use the source property's maxGuests for matching and pricing. When provided, filters alternatives that cannot accommodate this count."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results. Default 5, max 20."New value: +"Maximum number of similar properties to return (integer 1–20). Omit to use server default 5. Increase when the guest wants more alternatives."
      • changedInput schema / properties / propertyId / description
        Previous value: -"UUID of the source property to find alternatives for."New value: +"Stable property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000'). Pass the exact UUID string — never a property name, host domain, or booking URL."
    • Changedverify_vacation_rental_node1 field changed
      • changedInput schema / properties / domain / description
        Previous value: -"Canonical public host-owned vacation-rental domain to verify, e.g. villaakerlyckan.se. Provide only the domain: no https:// prefix, path, query string, port, or booking URL."New value: +"Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Optional; omit when the host has not chosen a domain yet. Invalid: 'https://...', paths, ports, or booking URLs."
  7. 12 tool updatesv0.1.4
    • Changedget_verified_stay_offer5 fields changed
      • changedInput schema / properties / check_in / description
        Previous value: -"Arrival date in YYYY-MM-DD format."New value: +"Requested arrival date in YYYY-MM-DD format, e.g. 2026-11-14. Must be before check_out."
      • changedInput schema / properties / check_out / description
        Previous value: -"Departure date in YYYY-MM-DD format. Must be after check_in."New value: +"Requested departure date in YYYY-MM-DD format, e.g. 2026-11-15. Must be after check_in."
      • changedInput schema / properties / domain / description
        Previous value: -"Host-owned vacation rental domain, e.g. villaakerlyckan.se."New value: +"Canonical public host-owned vacation-rental domain returned by search or verify_vacation_rental_node, e.g. villaakerlyckan.se. Provide only the domain, not a URL or path."
      • changedInput schema / properties / guests / description
        Previous value: -"Total number of guests as integer >= 1."New value: +"Total guest count for the stay as an integer >= 1. The host node uses this for capacity checks and guest-based pricing."
      • changedInput schema / properties / language / description
        Previous value: -"Optional preferred response language, e.g. en or sv."New value: +"Optional BCP-47/RFC 5646 language hint for labels and formatting, e.g. en, sv, de, or sv-SE."
    • Changedhemmabo_booking_cancel1 field changed
      • changedInput schema / properties / reservationId / description
        Previous value: -"Booking UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Booking or reservation UUID returned by hemmabo_booking_checkout or hemmabo_booking_create. Use this exact id for status, cancellation, or rescheduling."
    • Changedhemmabo_booking_checkout4 fields changed
      • changedInput schema / properties / channel / description
        Previous value: -"'federation' (default): applies direct booking discount. 'public': uses standard website rate."New value: +"'federation' is the compatibility name for direct host-source pricing. 'public': uses standard website rate."
      • changedInput schema / properties / paymentMode / description
        Previous value: -"'checkout_session' (default): returns Stripe redirect URL. 'payment_intent': returns client_secret for programmatic payment (AI agent MPP flow)."New value: +"'checkout_session' (default): returns a host-configured Stripe redirect URL. 'payment_intent': returns client_secret for configured fallback non-VRP payment integrations."
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Stable property UUID returned by hemmabo_search_properties. Use the exact UUID, not the property name, domain, or booking URL."
      • changedInput schema / properties / quoteId / description
        Previous value: -"Quote ID from hemmabo_booking_negotiate to lock the price. Optional — if omitted, a fresh federation price is calculated at checkout time."New value: +"Quote ID from hemmabo_booking_negotiate to lock the price. Optional - if omitted, a fresh direct host-source price is calculated at checkout time."
    • Changedhemmabo_booking_create6 fields changed
      • changedInput schema / properties / checkIn / description
        Previous value: -"Arrival date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-15'). Must be today or later."New value: +"Booking arrival date in YYYY-MM-DD format."
      • changedInput schema / properties / checkOut / description
        Previous value: -"Departure date in ISO 8601 format (YYYY-MM-DD, e.g. '2026-07-22'). Must be after checkIn."New value: +"Booking departure date in YYYY-MM-DD format; must be after checkIn."
      • changedInput schema / properties / guestEmail / description
        Previous value: -"Email for booking confirmation (e.g. 'anna@example.com'). Must be a valid email address."New value: +"Primary guest email for confirmation and host contact."
      • changedInput schema / properties / guestName / description
        Previous value: -"Full name of primary guest (e.g. 'Anna Svensson')."New value: +"Primary guest name for host confirmation."
      • changedInput schema / properties / guestPhone / description
        Previous value: -"Phone with country code (e.g. '+46701234567'). Optional but recommended for check-in coordination."New value: +"Primary guest phone with country code; optional but recommended."
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Property UUID returned by hemmabo_search_properties for this fallback non-VRP booking. Use the exact UUID, not a property name, domain, or booking URL."
    • Changedhemmabo_booking_negotiate1 field changed
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Stable property UUID returned by hemmabo_search_properties. Use the exact UUID, not the property name, domain, or booking URL."
    • Changedhemmabo_booking_quote1 field changed
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Stable property UUID returned by hemmabo_search_properties. Use the exact UUID, not the property name, domain, or booking URL."
    • Changedhemmabo_booking_status1 field changed
      • changedInput schema / properties / reservationId / description
        Previous value: -"Booking UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Booking or reservation UUID returned by checkout/create. Required to look up the exact booking."
    • Changedhemmabo_compare_properties2 fields changed
      • changedInput schema / properties / propertyIds / description
        Previous value: -"Array of 2 to 10 property UUIDs to compare side by side."New value: +"Array of 2 to 10 property UUIDs returned by hemmabo_search_properties. Use UUIDs only; do not pass domains, names, or booking URLs."
      • addedInput schema / properties / propertyIds / items / description
        Added value: +"Property UUID returned by hemmabo_search_properties."
    • Addedhemmabo_host_onboarding_link
    • Addedhemmabo_host_readiness_check
    • Changedhemmabo_search_properties1 field changed
      • changedInput schema / properties / country / description
        Previous value: -"Country name to filter by (e.g. 'Sweden', 'Italy'). Partial match. At least one of region or country should be provided."New value: +"Country name to filter by (e.g. 'Sweden', 'Italy'). Partial match. At least one of region or country should be provided; omit only when the user has given a specific region."
    • Changedverify_vacation_rental_node1 field changed
      • changedInput schema / properties / domain / description
        Previous value: -"Host-owned vacation rental domain to verify, e.g. villaakerlyckan.se. Do not include a path."New value: +"Canonical public host-owned vacation-rental domain to verify, e.g. villaakerlyckan.se. Provide only the domain: no https:// prefix, path, query string, port, or booking URL."
  8. 7 tool updatesv0.1.3
    • Changedhemmabo_booking_cancel1 field changed
      • changedInput schema / properties / reservationId / description
        Previous value: -"Booking UUID from booking.checkout or booking.create (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Booking UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '550e8400-e29b-41d4-a716-446655440000')."
    • Changedhemmabo_booking_checkout2 fields changed
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID from search.properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."
      • changedInput schema / properties / quoteId / description
        Previous value: -"Quote ID from booking.negotiate to lock the price. Optional — if omitted, a fresh federation price is calculated at checkout time."New value: +"Quote ID from hemmabo_booking_negotiate to lock the price. Optional — if omitted, a fresh federation price is calculated at checkout time."
    • Changedhemmabo_booking_create1 field changed
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID from search.properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."
    • Changedhemmabo_booking_negotiate1 field changed
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID from search.properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."
    • Changedhemmabo_booking_quote1 field changed
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID from search.properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Property UUID from hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."
    • Changedhemmabo_booking_status1 field changed
      • changedInput schema / properties / reservationId / description
        Previous value: -"Booking UUID from booking.checkout or booking.create (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Booking UUID from hemmabo_booking_checkout or hemmabo_booking_create (e.g. '550e8400-e29b-41d4-a716-446655440000')."
    • Changedhemmabo_search_availability1 field changed
      • changedInput schema / properties / propertyId / description
        Previous value: -"Property UUID returned by search.properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."New value: +"Property UUID returned by hemmabo_search_properties (e.g. '550e8400-e29b-41d4-a716-446655440000')."
  9. 17 tool updatesv0.1.1
    • Removedcheck_availability
    • Removedcreate_booking
    • Removedget_canonical_quote
    • Addedget_verified_stay_offer
    • Addedhemmabo_booking_cancel
    • Addedhemmabo_booking_checkout
    • Addedhemmabo_booking_create
    • Addedhemmabo_booking_negotiate
    • Addedhemmabo_booking_quote
    • Addedhemmabo_booking_reschedule
    • Addedhemmabo_booking_status
    • Addedhemmabo_compare_properties
    • Addedhemmabo_search_availability
    • Addedhemmabo_search_properties
    • Addedhemmabo_search_similar
    • Removedsearch_properties
    • Addedverify_vacation_rental_node
  10. 4 tool updatesv0.1.0
    • First observedcheck_availability
    • First observedcreate_booking
    • First observedget_canonical_quote
    • First observedsearch_properties

TDQS

A4.6/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have clear boundaries: search vs. availability vs. offer vs. quote are distinct stages, and booking lifecycle tools (create/status/cancel/reschedule) are well-separated. The main ambiguity is between hemmabo_booking_checkout and hemmabo_booking_create, which both create pending bookings in the fallback flow, though checkout adds Stripe payment while create does not.

Naming Consistency4/5

The hemmabo_ prefix is consistent, and most tools follow verb_noun patterns (search_properties, booking_cancel, host_onboarding_link). Minor deviations: get_verified_stay_offer and verify_vacation_rental_node use different verb styles, and hemmabo_booking_negotiate is misleadingly named since it locks a price rather than negotiating.

Tool Count4/5

13 tools is within the well-scoped range and each tool covers a distinct stage of the guest/host journey. Slightly heavy due to the fallback booking flow requiring three tools (negotiate, create, checkout) that overlap in purpose, but the count is reasonable for the domain.

Completeness4/5

The guest booking lifecycle is well covered: search, availability, quote, offer, create/checkout, status, cancel, reschedule. Host-side coverage is thinner (readiness check and onboarding link only, no host management tools), and there is no explicit tool for updating a booking's guest details, but core workflows are complete.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    The Stripe Model Context Protocol server allows you to integrate with Stripe APIs through function calling. This protocol supports various tools to interact with different Stripe services.
    13,246 npm
    1,827
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables management of vacation rental properties through the Hostex API, including reservations, guest communications, availability calendars, reviews, and channel listings.
    1
    MIT