HemmaBo
HemmaBo MCP server lets AI agents discover host-owned vacation rentals, verify signed VRP stay offers, and manage direct booking workflows without OTA/marketplace intermediation.
Search published vacation-rental properties by location, dates, and guest count.
Check live availability for a specific property and date range.
Get detailed host-source pricing quotes, including per-night breakdown and package/gap-night context.
Create pending direct bookings (non-VRP fallback) without online payment.
Lock a host-source price for 15 minutes for fallback checkout.
Create a Stripe checkout session or payment intent for fallback non-VRP booking.
Check booking status, cancel a confirmed booking with refund, and reschedule dates with repricing.
Run a read-only host readiness check and return a safe onboarding handoff link for hosts.
Verify a host domain as a valid VRP node by reading its .well-known discovery document and JWKS.
Fetch, verify (Ed25519/JWS), and render a signed host-domain VRP stay offer, then route the guest to the signed direct booking URL.
Anonymous access is limited to read-only discovery helpers; booking, checkout, cancel, reschedule, and host handoff tools require Bearer/OAuth authentication.
Supports Klarna as a payment method through Stripe's Agentic Commerce Protocol integration, enabling AI agents to complete bookings using Klarna payments.
Enables payment processing for bookings through Stripe's Agentic Commerce Protocol (ACP), supporting SharedPaymentTokens, Klarna, Swish, and card payments without redirects or manual payment steps.
Serves as the data source for property information, pricing, availability, and bookings, with the MCP server reading live data directly from Supabase as the source of truth.
HemmaBo MCP Server
HemmaBo is vacation rental software for hosts. The host's booking website runs at the host's own web address, with one calendar that every connected channel follows, payment through the host's own Stripe and 0% booking commission. Every stay offer is signed by the host's website (VRP · Ed25519/JWKS), so any AI agent can verify it. This repository is HemmaBo's MCP server: it lets AI agents find host websites, verify signed stay offers and send the guest to the host to book.
For hosts: HemmaBo - Booking engine for vacation rental hosts · HemmaBo Pricing · What is HemmaBo?
Vacation rental software. A signed stay offer on the host's own domain. 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
Vacation rental software. A signed stay offer on the host's own domain. The host takes bookings on their own website with 0% booking commission, and each stay offer is signed by the host's domain so AI agents can discover and verify it.
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 operates each host node's signing key on the host's behalf (key_custody: platform); agents verify a signed offer against that host domain's JWKS.
AI agents discover host nodes via agent-traversal (/.well-known/agent-traversal.json).
HemmaBo + VRP, 6 runtime tools: 2 HemmaBo tools, 2 host onboarding tools, and 2 VRP verification tools.
Host-domain signed verified stay offers.
All six tools only read. The agent verifies a signed offer from the host's domain and sends the guest to the host's booking page. The agent never books, pays, cancels or changes a booking.
The Vacation Rental Protocol (VRP) — an open standard — 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, 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,
verify a signed host-domain offer and route the guest to the host's own booking URL, or
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, or flight search engine. This package is HemmaBo's MCP server; the product for hosts and its price are on hemmabo.com.
Related MCP server: stripe
Protocol Layers
HemmaBo MCP tools expose search, availability, and VRP verification flows for property data published by HemmaBo hosts.
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.
For VRP offers, the booking path is 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:
Official site: https://www.hemmabo.com
Live reference host: https://www.villaakerlyckan.se
VRP specification: https://vacationrentalprotocol.com
Canonical URLs: platform links use
https://www.hemmabo.com(with www); see ADR 0013.
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 claudeTools
Canonical tool names use snake_case. Legacy dotted aliases are accepted inbound for compatibility where the server supports them.
All six tools only read. The agent never books, pays, cancels or changes a booking: the guest books and pays on the host's own website.
Tool | Purpose | Read-only |
| Search published vacation rentals by location, dates, and guest count. | Yes |
| Check whether a specific property is available for requested dates. | Yes |
| Read-only fit check for vacation-rental hosts asking for their own booking website or booking engine. | Yes |
| Return a safe HemmaBo onboarding handoff URL. Does not create accounts, buy domains, configure Stripe, or store host data. | Yes |
| Verify a host-domain VRP discovery document and Ed25519 JWKS. | Yes |
| Fetch and verify a fresh host-domain signed VRP stay offer. | Yes |
Authentication
Anonymous calls are limited to read-only discovery helpers that return published property data and no guest PII.
Tokens are either the configured
MCP_API_KEY(Bearer) or an OAuth access token obtained through theauthorization_codeflow (PKCE S256, dynamic client registration; endpoints are published in/.well-known/oauth-authorization-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, prices, lower prices, price 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. Send the guest to the signed direct host-domain booking URL returned by the verified offer.
Setup
npm installCreate .env from .env.example:
cp .env.example .envRequired environment variables:
SUPABASE_URLSUPABASE_SERVICE_ROLE_KEY
Optional environment variables:
MCP_API_KEY- enables Bearer-token auth.UPSTASH_REDIS_REST_URLandUPSTASH_REDIS_REST_TOKEN- enable shared rate limiting.
HTTP Endpoints
Path | Method | Purpose |
| POST | MCP Streamable HTTP endpoint |
| GET | Transport information |
| GET | Health check |
| GET | MCP discovery metadata |
| GET | Server card metadata |
| GET | Server card compatibility alias |
| GET | Server card compatibility alias |
| POST | Dynamic client registration |
| POST | OAuth token endpoint |
| GET/POST | Authorization-code consent flow |
| any | Closed: answers 403 "Agents verify and send the guest to the host's booking page" ( |
Transports
Streamable HTTP: hosted
/mcpendpoint (remote-only).
Development
npm run build
npm testSecurity
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, trademarks, or any external production service. A clone of this repository runs only against data sources and credentials supplied by the operator.
Available Tools
6 toolsget_verified_stay_offerGet Verified Stay OfferARead-onlyIdempotentInspect
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. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs. | |
| guests | Yes | 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. | |
| checkIn | Yes | 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. | |
| checkOut | Yes | 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. | |
| language | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| fresh | No | True when the signed offer is still within its validity/freshness window. |
| domain | Yes | Echoed host domain that issued the signed offer. |
| guests | No | Echoed requested guest count. |
| checkIn | No | Echoed requested arrival date. |
| checkOut | No | Echoed requested departure date. |
| verified | Yes | True only when the host-domain offer signature and payload checks pass. |
| signature | No | Ed25519/JWS verification details, including key id and verification status. |
| widget_media | No | Images and media hydrated from the verified host discovery document for the ChatGPT widget. |
| agent_citation | No | Citation permission and safe-to-quote status derived from the signed offer. |
| agent_guardrails | No | Rules the agent must follow when presenting or acting on this offer. |
| payload_matches_offer | No | True when the signed payload matches the structured offer returned to the agent. |
| official_offer_summary | No | Small signed-offer summary for agents to quote without inventing price, availability, discounts, savings, comparisons, or booking details. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/destructive, but the description goes further by disclosing the cryptographic verification (Ed25519 JWS against domain JWKS), the set-semantics of the parameters, the re-pricing behavior when either date changes, and an explicit prohibition on side effects. This is unusually rich behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then sequencing, constraints, and parameter semantics in roughly priority order. Information density is high and most sentences earn their place, though the paragraph runs long for a tool description and could be split for scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param, cryptographically-verifying, open-world tool with an output schema already present, the description covers sequencing, prerequisites, side-effect constraints, set-semantics, and rendering caveats. Return values are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely new semantics: the parameters must be passed as a set matching the original search, night count (not the dates) drives price and capacity, and language never affects price/availability. It stops short of explaining every parameter's error modes, hence 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound verb+resource ('Fetch, verify, and render a live host-domain signed VRP stay offer') and names the exact inputs it operates on. It clearly distinguishes itself from hemmabo_search_properties and verify_vacation_rental_node by positioning itself as the downstream signing step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it: after hemmabo_search_properties returns a host domain, or after verify_vacation_rental_node confirms one from outside search, and 'always before quoting final price or a booking link'. It also gives a hard exclusion (must not lock a quote, create a booking, collect guest details, or start checkout) and routes booking to the signed direct_booking_url.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_host_onboarding_linkHost Onboarding LinkARead-onlyIdempotentInspect
Return a safe HemmaBo onboarding handoff URL for a vacation-rental host who wants their own booking website or booking engine. Not for guests — guests should use hemmabo_search_properties instead. Use after explaining the fit or when the host asks to start; if the host is still evaluating whether HemmaBo fits, run hemmabo_host_readiness_check first — it already returns the same prefilled URL in its next_step. This tool is read-only and does not create a HemmaBo account, buy a domain, configure Stripe, write to Supabase, or provision a booking site. It returns the URL, what the host gets, and what the host should prepare. All parameters are optional prefill: they never change where the host lands — the URL always opens the same onboarding page with the passed details filled in; blank values are simply left out, and nothing is stored server-side.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City or municipality (e.g. 'Kävlinge', 'Florence'). Optional; used in onboarding URL prefill when provided. | |
| domain | No | 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. | |
| region | No | Region or area (e.g. 'Skåne', 'Toscana', 'Marrakech-Safi'). Optional; narrows onboarding handoff and proof examples. | |
| country | No | Country where the property operates (e.g. 'Sweden', 'Italy', 'Morocco'). Optional; improves onboarding URL locale and fit assessment. | |
| language | No | ISO 639-1 language hint for onboarding copy (e.g. 'sv', 'en', 'de', 'fr'). Optional; omit to default to English. | |
| propertyName | No | Property or business display name (e.g. 'Villa Åkerlyckan'). Optional; carried into onboarding URL when provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| product | Yes | HemmaBo product, pricing, onboarding URL, and live proof URLs. |
| next_step | Yes | Safe handoff action for the host. |
| setup_items | Yes | Inputs the host should prepare before onboarding. |
| capabilities | Yes | Host-facing capabilities included in HemmaBo. |
| privacy_note | No | Clarifies that the call is read-only and does not store host data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, idempotentHint, destructiveHint=false, so safety is covered. The description adds substantial beyond-annotation context: it enumerates side effects that do NOT occur (no account creation, no domain purchase, no Stripe config, no Supabase writes, no site provisioning), states nothing is stored server-side, notes params never change the landing page, and describes what the tool returns (URL, what the host gets, what to prepare).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and audience, then exclusions, then behavior. Every clause carries information, but the description is long and the negative-enumeration sentence ('does not create... buy... configure... write... or provision') is somewhat list-heavy. Still, no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return-value explanation isn't required in prose; the description instead covers the key non-obvious facts (side-effect-free, prefill-only params, sibling handoff logic). With annotations and a full schema present, an agent has everything needed to select and call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each param already documents purpose and examples, so baseline is 3. The description adds a genuinely useful meta-semantic not in the schema: all params are optional prefill that never change the destination, blanks are omitted, and nothing is persisted server-side. It does not add per-field semantics beyond what the schema gives, so capped at 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (return) and resource (safe onboarding handoff URL) for a specific audience (vacation-rental host), and explicitly distinguishes from siblings by naming hemmabo_search_properties as the guest-facing alternative. An agent can tell this apart from the search tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit triggers ('after explaining the fit or when the host asks to start') and an explicit exclusion/alternative ('if the host is still evaluating... run hemmabo_host_readiness_check first'). Names both the when-to-use and when-to-use-something-else, with the reason (readiness_check already returns the same URL).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_host_readiness_checkHost Readiness CheckARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City or municipality (e.g. 'Kävlinge', 'Florence'). Optional; used in onboarding URL prefill when provided. | |
| domain | No | 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. | |
| region | No | Region or area (e.g. 'Skåne', 'Toscana', 'Marrakech-Safi'). Optional; narrows onboarding handoff and proof examples. | |
| country | No | Country where the property operates (e.g. 'Sweden', 'Italy', 'Morocco'). Optional; improves onboarding URL locale and fit assessment. | |
| hasOwnDomain | No | 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. | |
| propertyName | No | Property or business display name (e.g. 'Villa Åkerlyckan'). Optional; carried into onboarding URL when provided. | |
| propertyType | No | Property category enum. Optional; omit when unknown. 'villa'/'holiday_home' fit best; 'hotel' may indicate a poor HemmaBo fit for large chains. | |
| currentChannels | No | Optional list of channels the host uses today. Omit when unknown. Helps assess migration fit from OTAs to their own booking website. | |
| preferredLanguage | No | ISO 639-1 language hint for onboarding copy (e.g. 'sv', 'en', 'de', 'fr'). Optional; omit to default to English. | |
| wantsAiAgentBooking | No | 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. | |
| wantsDirectPayments | No | 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the fit check completed. |
| product | Yes | HemmaBo product summary, pricing, onboarding URL, and live proof URLs. |
| next_step | Yes | Safe handoff action for the host. |
| readiness | Yes | Fit verdict and boundaries for the host's described need. |
| setup_items | Yes | Inputs the host should prepare before onboarding. |
| capabilities | Yes | Host-facing capabilities included in HemmaBo. |
| agent_instruction | Yes | How an AI agent should describe HemmaBo without overclaiming. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark it read-only, idempotent, and non-destructive, and the description adds substantial behavioral context. It states what the tool does not do: create an account, buy a domain, configure Stripe, store host data, or provision a website, and it describes the returned fit verdict, setup inputs, and safe onboarding next step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and routing guidance, and most sentences carry useful operational detail. It is dense and the long final sentence could be structured more clearly, but it is not padded with filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the rich annotations, the fully described 11-parameter schema, and the presence of an output schema, the description is complete enough to call it correctly. It covers scope, exclusions, input effects, return behavior, and the follow-up tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic weighting by identifying which inputs sharpen the fit verdict and clarifying that omitting the wants* booleans never lowers it. It also explains that propertyName and preferredLanguage only prefill the onboarding URL. However, it says only five inputs sharpen the verdict while propertyType in the schema is described as affecting fit, creating a minor ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: a read-only fit check for vacation-rental hosts evaluating HemmaBo for their own booking website or booking engine. It explicitly separates hosts from guests and names the guest-oriented sibling tool, so an agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: use when the user is a host or property owner, not a guest booking a stay. It also names alternatives for both the guest path (hemmabo_search_properties) and the next host step (hemmabo_host_onboarding_link).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_search_availabilityCheck AvailabilityARead-onlyIdempotentInspect
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, when unavailable, the host node's own next available window (alternativeDates, at most one entry — the same window the node's /api/availability reports, never a platform-invented date); 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.
| Name | Required | Description | Default |
|---|---|---|---|
| guests | No | 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. | |
| checkIn | Yes | 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. | |
| checkOut | Yes | 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. | |
| propertyId | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when isError=true. |
| reason | No | Reason when available=false. |
| checkIn | No | |
| checkOut | No | |
| available | Yes | True if the property is bookable for the entire range. |
| propertyId | No | |
| channel_mirror | No | 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. |
| alternativeDates | No | The host node's own next available window (at most one) to offer when the requested dates are unavailable — identical to the node's /api/availability nextAvailable. Empty when the node offers none. |
| calendar_freshness | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, but the description adds substantial operational context: anonymous access, rate limiting, no hold or reservation side effects, fail-closed behavior on stale calendar sync, and exact false-return conditions such as guests_exceed_max and min_nights_violation. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then usage, then behavior, and most sentences carry necessary information. It is dense and somewhat long, with several packed clauses about edge cases, but little of it is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the rich input schema, and the presence of an output schema, the description is complete. It covers when to use it, when not to, access model, rate limits, side-effect safety, failure modes, and key result semantics without needing to explain the full return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds meaningful behavioral semantics for guests: omitting it checks dates only, providing it prices alternatives and gates capacity, and counts above the property maximum return available=false. It also clarifies the relationship between checkIn/checkOut and stay length and minimum-night violations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: checking whether a property is available for requested dates. It also explicitly distinguishes itself from the sibling hemmabo_search_properties by warning not to use it for general browsing. An agent can identify the exact operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing: use after the user has selected a property from hemmabo_search_properties and wants to confirm availability before getting a quote. It also states when not to use it and names the correct alternative for browsing. Additional guidance covers omitting guests, pricing alternatives, and capacity gating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_search_propertiesSearch PropertiesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| guests | Yes | 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. | |
| region | No | 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. | |
| checkIn | Yes | 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. | |
| country | No | 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. | |
| checkOut | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when isError=true. |
| guests | No | Echoed guest count. |
| checkIn | No | Echoed check-in date (YYYY-MM-DD). |
| checkOut | No | Echoed check-out date (YYYY-MM-DD). |
| properties | No | Available properties matching the search criteria, with live host-source pricing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds rich context beyond annotations: read-only is covered by annotations, but the description adds that search alone must never quote a final price or booking link, that date-unavailable matches return separately in unavailableMatches with up to three alternative windows, and that capacity misses are excluded. This is exactly the behavioral detail annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose first, then usage, then behavioral warnings, then parameter mechanics. Dense but every clause carries information. Slightly long but justified by the multi-part semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, routing to sibling, return fields (propertyId, host domain, availability, pricing, capacity), edge cases (capacity misses excluded, date-unavailable matches in unavailableMatches), and parameter interaction. An output schema exists but the description still appropriately summarizes returns. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description still adds value by specifying how region and country combine (region matches broadly against region/city/country; country matches country alone; omitting both spans all properties), and that checkIn is strictly before checkOut. This is useful cross-parameter logic not fully captured in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (vacation rental properties) with scope (by location and travel dates). Explicitly distinguishes from siblings by naming get_verified_stay_offer as the required follow-up and stating this is discovery only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Front-loads when to use ('find or browse places to stay') and when not ('already has a propertyId or host domain'). Also names the mandatory alternative workflow (call get_verified_stay_offer before final answer), leaving nothing ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_vacation_rental_nodeVerify Vacation Rental NodeARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when verified=false or the node cannot be checked. |
| domain | Yes | Echoed canonical host domain that was checked. |
| signing | No | Summary of accepted signing algorithms, key ids, and signing-key checks. |
| jwks_url | No | Host-domain JWKS URL containing the Ed25519 public keys used to verify signed offers. |
| protocol | No | 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. |
| verified | Yes | True only when discovery, JWKS, signing metadata, and verified-offer endpoint checks pass. |
| discovery_url | No | The .well-known vacation-rental discovery URL read from the host domain. |
| protocol_version | No | VRP version declared by the host discovery document. |
| verified_stay_offer_url | No | Host-domain endpoint template or URL used to request signed verified stay offers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial context beyond them: it reads the domain's own .well-known and JWKS, refuses IPs/ports/local/private hostnames, and explains the canonical-domain identity rule (www vs apex, declared canonical_domain mismatch causes failure). These are exactly the behavioral traits an agent needs and cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope before the usage rules, and nearly every sentence carries an operational constraint. The closing sentence restates the canonical-domain trust caveat already made earlier, which is mild redundancy rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only verification tool with an output schema, everything an agent needs is present: what it reads, the failure conditions (private hosts, canonical mismatch), and the exact next call. Return values are covered by the output schema, so no gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the single 'domain' parameter and its pattern. The description adds genuine meaning beyond the schema: bare hostname only, public domains only, and the subtle canonical-identity semantics (www and apex are distinct, pass the canonical domain exactly). It stops short of 5 because the schema pattern already constrains the format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Verify that a vacation-rental host domain is a valid VRP node') and immediately scopes what it reads (.well-known/vacation-rental.json and JWKS). It clearly distinguishes itself from get_verified_stay_offer and hemmabo_search_properties, so an agent can route between them without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when a host domain arrives from outside search — user-typed or third-party'), an explicit alternative for the other case (domains from hemmabo_search_properties go straight to get_verified_stay_offer), and negative guidance (do NOT use to answer availability/pricing/booking/payment). It also names the follow-up call 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.
9 tool updates
v5.0.0- Removed
hemmabo_booking_cancel - Removed
hemmabo_booking_checkout - Removed
hemmabo_booking_create - Removed
hemmabo_booking_negotiate - Removed
hemmabo_booking_quote - Removed
hemmabo_booking_reschedule - Removed
hemmabo_booking_status - Changed
hemmabo_search_availability1 field changed- changed
Output schema / properties / alternativeDates / descriptionPrevious value: -"Nearby same-month date windows to offer when the requested dates are unavailable."New value: +"The host node's own next available window (at most one) to offer when the requested dates are unavailable — identical to the node's /api/availability nextAvailable. Empty when the node offers none."
- Changed
hemmabo_search_properties2 fields changed- added
Output schema / properties / properties / items / properties / booking_urlAdded value: +{ + "description": "The host's own booking URL: https:// plus the host-owned domain. Null when the property has no domain.", + "format": "uri", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / properties / items / properties / propertyId / descriptionPrevious value: -"Stable UUID. Pass to subsequent tools (availability, quote, checkout)."New value: +"Stable UUID. Pass to subsequent tools (availability)."
3 tool updates
v4.0.9- Changed
get_verified_stay_offer1 field changed- changed
Input schema / properties / domain / descriptionPrevious 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."
- Changed
hemmabo_host_readiness_check2 fields changed- changed
Output schema / properties / product / properties / price / properties / amount / descriptionPrevious value: -"Monthly subscription price in major currency units (e.g. 399)."New value: +"Monthly subscription price in major currency units (e.g. 39)." - changed
Output schema / properties / product / properties / price / properties / currency / descriptionPrevious value: -"ISO 4217 currency code (e.g. 'SEK')."New value: +"ISO 4217 currency code (e.g. 'USD')."
- Changed
verify_vacation_rental_node2 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Output schema / properties / protocol / descriptionPrevious 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."
5 tool updates
v4.0.5- Changed
hemmabo_booking_cancel2 fields changed- added
Input schema / properties / guestTokenAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "reservationId" -]New value: +[ + "reservationId", + "guestToken" +]
- Changed
hemmabo_booking_checkout1 field changed- added
Output schema / properties / guestTokenAdded 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" +}
- Changed
hemmabo_booking_create1 field changed- added
Output schema / properties / guestTokenAdded 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" +}
- Changed
hemmabo_booking_reschedule2 fields changed- added
Input schema / properties / guestTokenAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "reservationId", - "newCheckIn", - "newCheckOut" -]New value: +[ + "reservationId", + "guestToken", + "newCheckIn", + "newCheckOut" +]
- Changed
hemmabo_booking_status2 fields changed- added
Input schema / properties / guestTokenAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "reservationId" -]New value: +[ + "reservationId", + "guestToken" +]
2 tool updates
v0.1.12- Changed
hemmabo_booking_create2 fields changed- added
Output schema / properties / calendar_freshnessAdded 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" +} - added
Output schema / properties / channel_mirrorAdded 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" +}
- Changed
hemmabo_search_availability2 fields changed- added
Output schema / properties / calendar_freshnessAdded 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" +} - added
Output schema / properties / channel_mirrorAdded 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" +}
5 tool updates
v0.1.11- Changed
get_verified_stay_offer1 field changed- changed
Input schema / properties / language / descriptionPrevious 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."
- Removed
hemmabo_compare_properties - Changed
hemmabo_host_readiness_check2 fields changed- changed
Input schema / properties / currentChannels / descriptionPrevious 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." - changed
Input schema / properties / wantsAiAgentBooking / descriptionPrevious 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."
- Changed
hemmabo_search_properties1 field changed- changed
Output schema / properties / properties / items / properties / signals / descriptionPrevious 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."
- Removed
hemmabo_search_similar
15 tool updates
v0.1.6- Changed
get_verified_stay_offer9 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / checkInAdded 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" +} - added
Input schema / properties / checkOutAdded 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" +} - removed
Input schema / properties / check_inRemoved 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" -} - removed
Input schema / properties / check_outRemoved 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" -} - removed
Input schema / properties / guests / maximumRemoved value: -9007199254740991 - changed
Input schema / requiredPrevious value: -[ - "domain", - "check_in", - "check_out", - "guests" -]New value: +[ + "domain", + "checkIn", + "checkOut", + "guests" +] - changed
Output 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" +}
- Changed
hemmabo_booking_cancel4 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / reservationId / patternRemoved 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)$" - changed
Output 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" +}
- Changed
hemmabo_booking_checkout6 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / guestEmail / patternRemoved value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - removed
Input schema / properties / guests / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / propertyId / patternRemoved 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)$" - changed
Output 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" +}
- Changed
hemmabo_booking_create6 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / guestEmail / patternRemoved value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - removed
Input schema / properties / guests / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / propertyId / patternRemoved 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)$" - changed
Output 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" +}
- Changed
hemmabo_booking_negotiate5 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / guests / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / propertyId / patternRemoved 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)$" - changed
Output 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" +}
- Changed
hemmabo_booking_quote5 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / guests / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / propertyId / patternRemoved 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)$" - changed
Output 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" +}
- Changed
hemmabo_booking_reschedule4 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / reservationId / patternRemoved 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)$" - changed
Output 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" +}
- Changed
hemmabo_booking_status4 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / reservationId / patternRemoved 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)$" - changed
Output 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" +}
- Changed
hemmabo_compare_properties5 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / guests / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / propertyIds / items / patternRemoved 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)$" - changed
Output 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" +}
- Changed
hemmabo_host_onboarding_link4 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / requiredAdded value: +[] - changed
Output 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" +}
- Changed
hemmabo_host_readiness_check4 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / requiredAdded value: +[] - changed
Output 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" +}
- Changed
hemmabo_search_availability5 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / guests / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / propertyId / patternRemoved 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)$" - changed
Output 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" +}
- Changed
hemmabo_search_properties4 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / guests / maximumRemoved value: -9007199254740991 - changed
Output 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" +}
- Changed
hemmabo_search_similar5 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / guests / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / propertyId / patternRemoved 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)$" - changed
Output 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" +}
- Changed
verify_vacation_rental_node3 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output 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" +}
15 tool updates
v0.1.5- Changed
get_verified_stay_offer5 fields changed- changed
Input schema / properties / check_in / descriptionPrevious 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." - changed
Input schema / properties / check_out / descriptionPrevious 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." - changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / guests / descriptionPrevious 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." - changed
Input schema / properties / language / descriptionPrevious 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."
- Changed
hemmabo_booking_cancel4 fields changed- changed
Input schema / properties / reason / descriptionPrevious 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." - changed
Input schema / properties / reservationId / descriptionPrevious 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." - added
Input schema / properties / reservationId / formatAdded value: +"uuid" - added
Input schema / properties / reservationId / patternAdded 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)$"
- Changed
hemmabo_booking_checkout9 fields changed- changed
Input schema / properties / channel / descriptionPrevious 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." - changed
Input schema / properties / checkIn / descriptionPrevious 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." - changed
Input schema / properties / checkOut / descriptionPrevious 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." - changed
Input schema / properties / guestEmail / descriptionPrevious 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." - changed
Input schema / properties / guestName / descriptionPrevious 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." - changed
Input schema / properties / guestPhone / descriptionPrevious 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." - changed
Input schema / properties / paymentMode / descriptionPrevious 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." - changed
Input schema / properties / propertyId / descriptionPrevious 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." - changed
Input schema / properties / quoteId / descriptionPrevious 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."
- Changed
hemmabo_booking_create7 fields changed- changed
Input schema / properties / checkIn / descriptionPrevious 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." - changed
Input schema / properties / checkOut / descriptionPrevious 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." - changed
Input schema / properties / guestEmail / descriptionPrevious 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." - changed
Input schema / properties / guestName / descriptionPrevious 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." - changed
Input schema / properties / guestPhone / descriptionPrevious 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." - changed
Input schema / properties / guests / descriptionPrevious 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." - changed
Input schema / properties / propertyId / descriptionPrevious 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."
- Changed
hemmabo_booking_negotiate3 fields changed- changed
Input schema / properties / checkIn / descriptionPrevious 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." - changed
Input schema / properties / checkOut / descriptionPrevious 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." - changed
Input schema / properties / propertyId / descriptionPrevious 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."
- Changed
hemmabo_booking_quote4 fields changed- changed
Input schema / properties / checkIn / descriptionPrevious 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." - changed
Input schema / properties / checkOut / descriptionPrevious 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." - changed
Input schema / properties / guests / descriptionPrevious 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." - changed
Input schema / properties / propertyId / descriptionPrevious 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."
- Changed
hemmabo_booking_reschedule6 fields changed- changed
Input schema / properties / newCheckIn / descriptionPrevious 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." - changed
Input schema / properties / newCheckOut / descriptionPrevious 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." - changed
Input schema / properties / reason / descriptionPrevious 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." - changed
Input schema / properties / reservationId / descriptionPrevious 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." - added
Input schema / properties / reservationId / formatAdded value: +"uuid" - added
Input schema / properties / reservationId / patternAdded 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)$"
- Changed
hemmabo_booking_status3 fields changed- changed
Input schema / properties / reservationId / descriptionPrevious 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." - added
Input schema / properties / reservationId / formatAdded value: +"uuid" - added
Input schema / properties / reservationId / patternAdded 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)$"
- Changed
hemmabo_compare_properties5 fields changed- changed
Input schema / properties / checkIn / descriptionPrevious 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." - changed
Input schema / properties / checkOut / descriptionPrevious 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." - changed
Input schema / properties / guests / descriptionPrevious 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." - changed
Input schema / properties / propertyIds / descriptionPrevious 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." - changed
Input schema / properties / propertyIds / items / descriptionPrevious 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."
- Changed
hemmabo_host_onboarding_link6 fields changed- changed
Input schema / properties / city / descriptionPrevious 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." - changed
Input schema / properties / country / descriptionPrevious 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." - changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / language / descriptionPrevious 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." - changed
Input schema / properties / propertyName / descriptionPrevious 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." - changed
Input schema / properties / region / descriptionPrevious 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."
- Changed
hemmabo_host_readiness_check12 fields changed- changed
Input schema / properties / city / descriptionPrevious 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." - changed
Input schema / properties / country / descriptionPrevious 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." - changed
Input schema / properties / currentChannels / descriptionPrevious 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." - added
Input schema / properties / currentChannels / items / descriptionAdded value: +"Single distribution channel name (e.g. 'Airbnb', 'Booking.com', 'Vrbo', 'own website'). Up to 8 entries." - changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / hasOwnDomain / descriptionPrevious 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." - changed
Input schema / properties / preferredLanguage / descriptionPrevious 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." - changed
Input schema / properties / propertyName / descriptionPrevious 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." - changed
Input schema / properties / propertyType / descriptionPrevious 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." - changed
Input schema / properties / region / descriptionPrevious 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." - changed
Input schema / properties / wantsAiAgentBooking / descriptionPrevious 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." - changed
Input schema / properties / wantsDirectPayments / descriptionPrevious 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)."
- Changed
hemmabo_search_availability4 fields changed- changed
Input schema / properties / checkIn / descriptionPrevious 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." - changed
Input schema / properties / checkOut / descriptionPrevious 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." - changed
Input schema / properties / guests / descriptionPrevious 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." - changed
Input schema / properties / propertyId / descriptionPrevious 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."
- Changed
hemmabo_search_properties5 fields changed- changed
Input schema / properties / checkIn / descriptionPrevious 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." - changed
Input schema / properties / checkOut / descriptionPrevious 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." - changed
Input schema / properties / country / descriptionPrevious 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." - changed
Input schema / properties / guests / descriptionPrevious 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." - changed
Input schema / properties / region / descriptionPrevious 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."
- Changed
hemmabo_search_similar5 fields changed- changed
Input schema / properties / checkIn / descriptionPrevious 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." - changed
Input schema / properties / checkOut / descriptionPrevious 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." - changed
Input schema / properties / guests / descriptionPrevious 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." - changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Input schema / properties / propertyId / descriptionPrevious 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."
- Changed
verify_vacation_rental_node1 field changed- changed
Input schema / properties / domain / descriptionPrevious 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."
12 tool updates
v0.1.4- Changed
get_verified_stay_offer5 fields changed- changed
Input schema / properties / check_in / descriptionPrevious 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." - changed
Input schema / properties / check_out / descriptionPrevious 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." - changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / guests / descriptionPrevious 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." - changed
Input schema / properties / language / descriptionPrevious 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."
- Changed
hemmabo_booking_cancel1 field changed- changed
Input schema / properties / reservationId / descriptionPrevious 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."
- Changed
hemmabo_booking_checkout4 fields changed- changed
Input schema / properties / channel / descriptionPrevious 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." - changed
Input schema / properties / paymentMode / descriptionPrevious 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." - changed
Input schema / properties / propertyId / descriptionPrevious 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." - changed
Input schema / properties / quoteId / descriptionPrevious 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."
- Changed
hemmabo_booking_create6 fields changed- changed
Input schema / properties / checkIn / descriptionPrevious 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." - changed
Input schema / properties / checkOut / descriptionPrevious 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." - changed
Input schema / properties / guestEmail / descriptionPrevious 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." - changed
Input schema / properties / guestName / descriptionPrevious value: -"Full name of primary guest (e.g. 'Anna Svensson')."New value: +"Primary guest name for host confirmation." - changed
Input schema / properties / guestPhone / descriptionPrevious 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." - changed
Input schema / properties / propertyId / descriptionPrevious 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."
- Changed
hemmabo_booking_negotiate1 field changed- changed
Input schema / properties / propertyId / descriptionPrevious 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."
- Changed
hemmabo_booking_quote1 field changed- changed
Input schema / properties / propertyId / descriptionPrevious 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."
- Changed
hemmabo_booking_status1 field changed- changed
Input schema / properties / reservationId / descriptionPrevious 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."
- Changed
hemmabo_compare_properties2 fields changed- changed
Input schema / properties / propertyIds / descriptionPrevious 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." - added
Input schema / properties / propertyIds / items / descriptionAdded value: +"Property UUID returned by hemmabo_search_properties."
- Added
hemmabo_host_onboarding_link - Added
hemmabo_host_readiness_check - Changed
hemmabo_search_properties1 field changed- changed
Input schema / properties / country / descriptionPrevious 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."
- Changed
verify_vacation_rental_node1 field changed- changed
Input schema / properties / domain / descriptionPrevious 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."
7 tool updates
v0.1.3- Changed
hemmabo_booking_cancel1 field changed- changed
Input schema / properties / reservationId / descriptionPrevious 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')."
- Changed
hemmabo_booking_checkout2 fields changed- changed
Input schema / properties / propertyId / descriptionPrevious 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')." - changed
Input schema / properties / quoteId / descriptionPrevious 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."
- Changed
hemmabo_booking_create1 field changed- changed
Input schema / properties / propertyId / descriptionPrevious 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')."
- Changed
hemmabo_booking_negotiate1 field changed- changed
Input schema / properties / propertyId / descriptionPrevious 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')."
- Changed
hemmabo_booking_quote1 field changed- changed
Input schema / properties / propertyId / descriptionPrevious 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')."
- Changed
hemmabo_booking_status1 field changed- changed
Input schema / properties / reservationId / descriptionPrevious 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')."
- Changed
hemmabo_search_availability1 field changed- changed
Input schema / properties / propertyId / descriptionPrevious 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')."
17 tool updates
v0.1.1- Removed
check_availability - Removed
create_booking - Removed
get_canonical_quote - Added
get_verified_stay_offer - Added
hemmabo_booking_cancel - Added
hemmabo_booking_checkout - Added
hemmabo_booking_create - Added
hemmabo_booking_negotiate - Added
hemmabo_booking_quote - Added
hemmabo_booking_reschedule - Added
hemmabo_booking_status - Added
hemmabo_compare_properties - Added
hemmabo_search_availability - Added
hemmabo_search_properties - Added
hemmabo_search_similar - Removed
search_properties - Added
verify_vacation_rental_node
4 tool updates
v0.1.0- First observed
check_availability - First observed
create_booking - First observed
get_canonical_quote - First observed
search_properties
TDQS
Scored across 6 tools
Most tools have distinct roles: guest discovery, availability confirmation, host fit check, onboarding handoff, node verification, and offer fetching. The main risk is hemmabo_search_properties vs hemmabo_search_availability, but the descriptions explicitly separate browsing from confirming a selected property. verify_vacation_rental_node vs get_verified_stay_offer are also well delineated by their 'trust check' vs 'fetch offer' framing.
Four tools use a hemmabo_ prefix (search_properties, search_availability, host_readiness_check, host_onboarding_link) while two do not (verify_vacation_rental_node, get_verified_stay_offer). The verb_noun shape is roughly consistent but the prefix scheme is split, which breaks predictability.
Six tools is well-scoped for a two-sided guest/host flow with a verification step. Each tool earns its place, and nothing appears redundant or padding.
The guest lifecycle (search → availability → verify domain → verified offer) and host lifecycle (readiness → onboarding) are covered, with booking deliberately routed to the host's signed direct_booking_url. The absence of any booking/checkout tool is intentional, but agents expecting an in-server booking step have no direct handle for it.
Maintenance
Related MCP Connectors
Book vacation rentals direct: search homes, check live availability, get a real total.
Find direct-booking vacation rentals, check availability, and get stay quotes.
41Vacation rental discovery, direct booking, and property protection for AI agents.
Find vacation rentals, explore photos and property details, and open direct host booking links.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceAn MCP server that provides tools for interacting with Supabase databases, storage, and edge functions.45MIT
- AlicenseNot gradedqualityCmaintenanceThe 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.21,341 npm1,865-
- AlicenseNot gradedqualityDmaintenanceEnables management of vacation rental properties through the Hostex API, including reservations, guest communications, availability calendars, reviews, and channel listings.1MIT
- AlicenseCqualityDmaintenanceThe only MCP server with AI guest risk scoring and extortion detection. Search properties, book instantly, protect hosts. 41 tools across 5 layers. Instant API key, 10 free credits.6MIT