HemmaBo Host Booking Engine
Server Details
Host-owned vacation-rental direct booking via VRP. Signed offers, 0% commission. Not an OTA.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- HemmaBo-se/hemmabo-mcp-server
- GitHub Stars
- 2
- Server Listing
- HemmaBo
Available Tools
13 toolsget_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; fall back to hemmabo_booking_negotiate/hemmabo_booking_checkout only when this call returns no signed offer, for a configured non-VRP deployment, after explicit user confirmation. The parameters work as a set: pass the same domain, checkIn, checkOut and guests the guest used at search; checkIn must be strictly before checkOut, and the resulting night count — not the dates themselves — drives the signed price and the host capacity check, so changing either date re-prices the offer. Always pass language as the guest's actual conversation language so the rendered widget matches the guest; it never affects the signed price or availability, only formatting.
| 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 mark the tool read-only and idempotent, and the description reinforces this with concrete prohibitions: 'must not lock a quote, create a booking, collect guest details, or start checkout.' It also adds meaningful behavioral detail such as night count rather than dates driving the signed price, and language never affecting price or availability. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but densely informative and well front-loaded, with the core action stated first and usage guidance following. Minor redundancy exists in repeating the language guidance and the checkIn/checkOut ordering, but given the complexity and the need to disambiguate from many siblings, the length is justified.
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?
The description is complete for an agent to select and invoke the tool correctly: it specifies when to call it, how the parameters interrelate, what side effects are forbidden, and how it differs from fallback booking tools. An output schema exists, so omitting return-value details is acceptable.
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?
Although schema coverage is 100%, the description goes well beyond the schema by explaining that the parameters 'work as a set,' requiring the same domain and dates used at search, and by clarifying that the night count—not the dates—determines pricing. It also adds crucial guidance for the optional language parameter: always pass the guest's conversation language, since it only affects formatting.
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 opens with a specific verb-resource pair: 'Fetch, verify, and render a live host-domain signed VRP stay offer for exact dates and guest count.' It further sharpens the purpose by naming the JWS verification mechanism, which clearly separates this tool from the search and booking siblings.
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?
Usage context is explicit: call it after hemmabo_search_properties or verify_vacation_rental_node, and always before quoting a final price or booking link. It also states the fallback path to hemmabo_booking_negotiate/hemmabo_booking_checkout, with conditions including 'only when this call returns no signed offer' and explicit user confirmation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_booking_cancelADestructiveIdempotentInspect
Cancel a confirmed booking and process the Stripe refund per host cancellation policy. Use when the guest explicitly requests cancellation — if the guest wants new dates instead of ending the stay, use hemmabo_booking_reschedule instead. Do not use for pending/unpaid bookings — those expire automatically. To preview the applicable policy first, read cancellationPolicy from hemmabo_booking_status. Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token. Destructive and idempotent in effect: a repeat cancel is refused as already cancelled and never triggers a second refund. reservationId is the booking UUID from hemmabo_booking_checkout or hemmabo_booking_create — never a propertyId — and must be paired with the guestToken issued for that same booking. reason is optional free text shown to the host; when omitted the host sees 'Cancelled via MCP'.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Human-readable cancellation reason for the host (e.g. 'Travel plans changed', 'Flight cancelled'). Optional; omit when the guest did not give a reason. | |
| guestToken | Yes | 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. | |
| reservationId | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when isError=true. |
| refund | No | Refund payload returned by cancel-booking edge function, when present. |
| status | Yes | Final booking status after cancellation. |
| reservationId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructive and idempotent, but the description goes further: repeat cancels are refused and never trigger a second refund, Stripe refunds follow the host policy, Bearer auth is required, and the call is rate-limited per token. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: core action first, followed by exclusions, alternatives, prereqs, behavior, and parameter clarification. Every clause earns its place; the only minor cost is length, but that length is justified for a destructive financial tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, refund-triggering tool with auth constraints and token pairing, the description covers when to use it, prerequisites, behavioral idempotency, parameter provenance, and required credentials. The presence of an output schema means return-value documentation is not the description's burden; nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, yet the description adds meaningful guidance beyond the schema: reservationId must be a booking UUID from specific sibling tools and never a propertyId, guestToken must match the exact token issued at creation and is not substitutable by a Bearer token, and an omitted reason shows 'Cancelled via MCP' to the host.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair — 'Cancel a confirmed booking' — and adds the refund behavior. It also distinguishes itself from hemmabo_booking_reschedule by naming the condition that selects each tool, making sibling differentiation explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use ('guest explicitly requests cancellation'), when-not-to-use ('pending/unpaid bookings'), and a named alternative ('hemmabo_booking_reschedule'). It also provides a prerequisite step ('read cancellationPolicy from hemmabo_booking_status') and auth/rate-limit expectations, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_booking_checkoutAInspect
Create a fallback non-VRP booking and return a host-configured Stripe checkout URL. Use only after explicit user confirmation when no signed VRP direct_booking_url is available; when get_verified_stay_offer returns one, route the guest there instead. Use hemmabo_booking_create to record a pending booking without collecting payment yet.
Behavior: existing bookings are never modified — availability is checked and dates briefly locked first; conflicts fail before anything is created or charged. Success creates exactly one pending booking and one Stripe Checkout Session on the host's connected account, returning paymentUrl, reservationId, and a one-time guestToken (required for status/cancel/reschedule). Only the Stripe webhook confirms the booking; unpaid pending bookings expire automatically. Not idempotent — check hemmabo_booking_status before retrying.
Params: pass quoteId only for the exact propertyId/dates/guests locked by hemmabo_booking_negotiate (valid 15 min); omit to price fresh. channel selects which locked total is used; paymentMode changes only the handoff form, never the price.
Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token.
| Name | Required | Description | Default |
|---|---|---|---|
| guests | Yes | Total number of guests as integer >= 1 (e.g. 4). | |
| channel | No | Pricing channel selector. 'federation' (default for agent flows): direct host-source total. 'public': standard website rate without agent channel pricing. Omit to use federation. | |
| 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. | |
| quoteId | No | 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. | |
| 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. | |
| guestName | Yes | Primary guest full name as plain text (e.g. 'Anna Svensson'). Stored on the booking for host confirmation; use the name the guest provided. | |
| guestEmail | Yes | Primary guest email in RFC 5322 format (e.g. 'anna@example.com'). Used for booking confirmation and host contact; must be deliverable. | |
| guestPhone | No | Primary guest phone in E.164 format with country code (e.g. '+46701234567'). Optional; omit when unknown. Recommended for check-in coordination. | |
| 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. | |
| paymentMode | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mpp | No | Present when paymentMode='payment_intent'. |
| error | No | Present only when isError=true. |
| guests | No | |
| nights | No | |
| status | No | Booking status (typically 'pending' until payment succeeds). |
| checkIn | No | |
| checkOut | No | |
| currency | Yes | |
| createdAt | No | |
| guestToken | No | 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. |
| paymentUrl | No | Stripe Checkout redirect URL. |
| propertyId | No | |
| totalPrice | Yes | Final total charged (or to be charged), in minor currency units. |
| payment_modes | No | Supported payment modes. |
| reservationId | Yes | Booking UUID. Use for subsequent status/cancel/reschedule calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description richly complements the annotations (readOnlyHint=false, idempotentHint=false) with concrete behavior: 'existing bookings are never modified — availability is checked and dates briefly locked first; conflicts fail before anything is created or charged.' It also discloses lifecycle details (webhook confirmation, auto-expiry, one-time guestToken) and auth/rate-limit requirements, going well beyond what annotations alone convey. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured into a focused intro, behavior paragraph, and param notes. Every sentence carries information (auth, idempotency, fallback logic) without redundancy. It is moderately long but economically written, with the core purpose and usage up front. Slightly dense, but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 10-param mutation tool with output schema and annotations present, the description covers all necessary context: purpose, fallback routing, behavior (locking, conflict handling), return values (paymentUrl, reservationId, guestToken), confirmation mechanism (webhook), expiry, idempotency, auth, and rate limits. Nothing an agent needs to decide or invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents parameters. The description adds meaningful context for key params: quoteId (15-min validity, 'pass quoteId only for the exact propertyId/dates/guests locked'), channel (selects which locked total is used), paymentMode (changes only the handoff form, never price), and propertyId (guidance to pass exact UUID, never a name/URL). This enriches semantics beyond schema descriptions, though not every parameter gets extra treatment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Create a fallback non-VRP booking and return a host-configured Stripe checkout URL.' It explicitly contrasts with sibling tools, naming get_verified_stay_offer and hemmabo_booking_create as alternatives, making the purpose unambiguous and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use: 'Use only after explicit user confirmation when no signed VRP direct_booking_url is available' and directs to alternatives ('when get_verified_stay_offer returns one, route the guest there instead'). Also gives a retry caveat ('Not idempotent — check hemmabo_booking_status before retrying'), covering both selection and operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_booking_createAInspect
Create a pending direct booking without online payment for configured non-VRP fallback deployments. Use only after explicit user confirmation, with a propertyId from search, and only when no signed VRP direct_booking_url is available. For signed VRP offers, route to the signed host-domain URL instead. Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token. Writes exactly one pending booking awaiting the host's decision; availability is checked first — conflicts or a stale calendar fail the call before anything is written. Not idempotent — check hemmabo_booking_status before retrying on timeout. There is no price or quoteId parameter — the node prices the stay itself at creation (gap-night pricing applies automatically). The booking is identified by propertyId + the checkIn/checkOut range + guests; guestName and guestEmail are required for host confirmation, guestPhone is optional. Returns bookingId and a one-time guestToken for later status/cancel/reschedule.
| 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. | |
| 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. | |
| guestName | Yes | Primary guest full name as plain text (e.g. 'Anna Svensson'). Stored on the booking for host confirmation; use the name the guest provided. | |
| guestEmail | Yes | Primary guest email in RFC 5322 format (e.g. 'anna@example.com'). Used for booking confirmation and host contact; must be deliverable. | |
| guestPhone | No | Primary guest phone in E.164 format with country code (e.g. '+46701234567'). Optional; omit when unknown. Recommended for check-in coordination. | |
| 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. |
| guests | No | |
| nights | No | |
| status | Yes | Host-node booking status. 'completed' is a protocol compatibility output only, not a status this tool writes. |
| checkIn | No | |
| checkOut | No | |
| currency | No | |
| bookingId | Yes | Persistent booking UUID. Use for status/cancel/reschedule. |
| createdAt | No | |
| priceType | No | Pricing mode used (federation/gap_night/package_*). |
| guestToken | No | 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. |
| propertyId | No | |
| totalPrice | No | Final price written to the booking. |
| 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 availability or this booking; the host node is the source of truth. |
| packageApplied | No | |
| calendar_freshness | No | 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. |
| gapDiscountPercent | No | |
| federationDiscountPercent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that availability is checked first and conflicts fail before writing, that the call is not idempotent (matching idempotentHint=false), and that it requires Authorization and is rate-limited. It also notes exact write behavior and returns a one-time guestToken. This goes well beyond the annotations, providing deep operational context without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite length, every sentence adds essential information: purpose, usage conditions, auth, behavior, idempotency, pricing, required fields, and return values. It is logically ordered and front-loads the most critical scoping and usage constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all operational aspects an agent would need: when to use, auth/rate limits, availability pre-check, idempotency handling, pricing behavior, required/optional parameters, and return values. Given the tool's complexity and the existence of an output schema, nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented. The description adds value by clarifying there is no price or quoteId parameter, that the node prices the stay itself, and that guestName and guestEmail are required while guestPhone is optional. It also explains how the booking is identified, which is not explicit in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a pending direct booking without online payment for non-VRP fallback deployments. It distinguishes this from signed VRP offers by explicitly naming the alternative, making the purpose unmistakable and differentiated from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use only after user confirmation, with a propertyId from search, and only when no signed VRP direct_booking_url is available. It also tells the agent to route signed VRP offers to the host-domain URL instead, and advises checking status before retrying on timeout. This is clear when/when-not guidance with an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_booking_negotiateAInspect
PRICE LOCK, not negotiation: the host's price is fixed — this tool never bargains, discounts, or alters it; it only freezes the current host-source price for 15 minutes so it cannot change during checkout. It refuses to lock dates the property's calendar cannot deliver and returns alternative bookable windows instead. Use it only in the non-VRP fallback checkout flow, when no signed direct_booking_url is available and the user explicitly asks to lock a price. Never use this for search, availability, VRP offers, rendering a stay-offer widget, or verified-offer display — use get_verified_stay_offer instead. Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token. Not idempotent: each call writes a new snapshot; validUntil is fixed at creation and never extended — re-locking returns a new quoteId. The lock freezes both the public and the direct host-source total; hemmabo_booking_checkout's channel picks which one is redeemed. Redeem the quoteId only for the identical propertyId + checkIn/checkOut + guests, and only until validUntil — changing any of them requires a new quote. Night count and guest count together select the locked price tier.
| Name | Required | Description | Default |
|---|---|---|---|
| guests | Yes | Total number of guests as integer >= 1 (e.g. 4). Determines which price tier is applied. | |
| 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. |
| guests | No | |
| nights | No | |
| checkIn | No | |
| quoteId | Yes | Snapshot ID. Pass to hemmabo_booking_checkout to lock this price. |
| checkOut | No | |
| currency | No | |
| gapNight | No | |
| gapTotal | No | |
| breakdown | No | |
| propertyId | No | |
| validUntil | Yes | Quote expiry (ISO 8601). Typically 15 minutes after creation. |
| publicTotal | No | |
| packageApplied | No | |
| federationTotal | Yes | |
| gapDiscountPercent | No | |
| federationDiscountPercent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite sparse annotations, the description discloses auth requirements, rate limiting, non-idempotence, snapshot creation, fixed validUntil, refusal on unavailable calendar dates, and the dual public/direct total freeze. It also clarifies redemption constraints and downstream checkout behavior, going far beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, every sentence adds a distinct operational fact and there is no filler. The critical scoping correction is front-loaded, followed by usage conditions, side effects, and redemption constraints in logical order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent, auth-required, time-boxed quote tool, the description covers when to call it, when never to call it, prerequisites, side effects, expiry behavior, exact-match requirements, and downstream checkout interaction. Since an output schema exists, not explaining return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions already cover all four parameters, so the baseline is 3. The description adds value by explaining that the quote is bound to the exact propertyId/checkIn/checkOut/guests combination and that night count plus guest count jointly select the price tier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line 'PRICE LOCK, not negotiation' explicitly corrects the misleading tool name and defines the operation as freezing the host-source price for 15 minutes. It identifies the exact resource and distinguishes this tool from checkout and verified-offer siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use it only in the non-VRP fallback checkout flow, when no signed direct_booking_url is available and the user explicitly asks to lock a price' and gives a precise never-use list. It also names get_verified_stay_offer as the alternative for verified-offer display, leaving no judgment call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_booking_quoteARead-onlyIdempotentInspect
Get a detailed pricing quote for a specific property, dates, and guest count. Use this tool after confirming availability to show the user exact pricing before booking. Do NOT use before checking availability — the quote may be invalid if dates are unavailable. Returns the final host-source total for the booking flow, per-night breakdown, and package pricing context. All prices are integers in the property's local currency (e.g. SEK). The quote is the propertyId priced for the exact checkIn/checkOut range and guests; the night count and party size together select the price tier, so changing any of them re-quotes.
| 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. | |
| 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. |
| guests | No | |
| nights | No | Number of nights in the range. |
| checkIn | No | |
| checkOut | No | |
| currency | No | ISO 4217 currency code. |
| gapNight | No | True when the stay qualifies as a gap fill. |
| gapTotal | No | Gap-night adjusted total when applicable; otherwise null. |
| breakdown | No | Detailed pricing breakdown. |
| propertyId | No | |
| publicTotal | No | Website rate total in minor currency units. |
| packageApplied | No | Applied package, if any. |
| federationTotal | No | Legacy field: direct host-source total. Prefer directBookingTotal in user-facing copy. |
| directBookingTotal | No | Preferred user-facing field: direct host-source total. |
| gapDiscountPercent | No | Gap-night discount percentage when applied. |
| hostSourcePublicTotal | No | Preferred user-facing field: public host-source total. |
| federationDiscountPercent | No | Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison. |
| directBookingDiscountPercent | No | Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only and idempotent, and the description adds meaningful behavioral context: quotes are invalid without prior availability, prices are integers in local currency, and the price tier depends on the combination of night count and party size. It also discloses that changing any pricing input requires a re-quote, which is valuable beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, usage timing, return content, currency format, and re-quoting behavior. It front-loads the core purpose and keeps critical caveats early, without repeating schema details verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, fully described input schema, and presence of an output schema, the description is complete for an agent to select and invoke this tool correctly. It clarifies the booking-flow position, return highlights, currency convention, and the dependency on prior availability — nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by explaining that propertyId, checkIn/checkOut, and guests collectively determine the price tier and that changing any of them invalidates the quote. This goes beyond what the input schema states about each parameter individually.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Get'), a precise resource ('detailed pricing quote'), and the key inputs (property, dates, guest count). It also positions the tool within the booking flow as the step between availability confirmation and booking, distinguishing it from siblings like hemmabo_search_availability and hemmabo_booking_create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Use this tool after confirming availability') and a direct prohibition ('Do NOT use before checking availability'). It also explains the consequence of misuse ('the quote may be invalid'), which helps an agent decide the correct order of operations among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_booking_rescheduleADestructiveInspect
Reschedule a confirmed or pending booking to new dates with automatic repricing and Stripe charge/refund. Use when the guest wants to change dates on an existing booking — if the guest wants to end the stay entirely rather than move it, use hemmabo_booking_cancel instead. Do not use if cancelled or if a protocol compatibility client reports completed — check hemmabo_booking_status first. Requires Authorization: Bearer token (MCP_API_KEY or OAuth). Destructive write: the original dates are released back to the host calendar and the original price no longer applies — the booking keeps the same reservationId (updated in place, never recreated), and the price difference is charged or refunded via Stripe. Rate-limited per token. Identify the existing booking by reservationId, then give the new stay as newCheckIn/newCheckOut (newCheckIn strictly before newCheckOut); the new night count re-prices the stay exactly like a fresh quote.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Human-readable reschedule reason for host records (e.g. 'Flight delayed', 'Extended conference'). Optional; omit when not provided by the guest. | |
| guestToken | Yes | 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. | |
| newCheckIn | Yes | New arrival date in YYYY-MM-DD format (e.g. '2026-08-01'). Must be today or later. Must be strictly before newCheckOut. | |
| newCheckOut | Yes | New departure date in YYYY-MM-DD format (e.g. '2026-08-08'). Must be strictly after newCheckIn. | |
| reservationId | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when isError=true. |
| reason | No | |
| status | Yes | Booking status after reschedule. |
| pricing | No | |
| newDates | No | |
| previousDates | No | |
| reservationId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only declare destructiveHint=true and readOnlyHint=false, but the description goes much further. It discloses that original dates are released, the original price no longer applies, the booking is updated in place and never recreated, and the price difference is charged or refunded via Stripe. It also notes rate limiting and the need for a guest token even with a valid Bearer token. This is precisely the behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence earns its place: purpose, usage conditions, destructive consequences, authentication caveat, and parameter workflow are all covered. It is front-loaded with the core purpose and then deepens into operational detail. It could be slightly tighter, but the density is justifiable for a destructive write operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, destructive side effects, dual-auth requirements (Bearer + guestToken), and Stripe financial impact, the description covers all essential decision points: when to use, when to avoid, prerequisites, behavioral consequences, and parameter semantics. An output schema exists, so return-value documentation is not required. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema descriptions are already detailed, so the baseline is 3. The description adds meaning beyond the schema by explaining the re-pricing model ('the new night count re-prices the stay exactly like a fresh quote') and the relationship between reservationId and the new stay parameters. This elevates it slightly above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Reschedule a confirmed or pending booking to new dates with automatic repricing and Stripe charge/refund.' It clearly names the action, target resource, and side effects. It also distinguishes itself from the cancel sibling, so an agent can tell which tool to use without inspecting other definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool ('when the guest wants to change dates on an existing booking'), when not to use it ('if cancelled or if a protocol compatibility client reports completed'), and names the alternative (hemmabo_booking_cancel) for the different use case. It also instructs the agent to check hemmabo_booking_status first, which is clear operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_booking_statusARead-onlyIdempotentInspect
Retrieve current status and full details of an existing booking by reservationId. Use to confirm checkout/create succeeded or before cancel/reschedule. Do NOT use for property discovery, availability, or pricing — use hemmabo_search_properties, hemmabo_search_availability, or hemmabo_booking_quote for those. Requires Authorization: Bearer token (MCP_API_KEY or OAuth); rate-limited per token. Read-only against the database — never writes, so it is safe to poll after a checkout timeout — but returns guest PII (name, email). reservationId is the booking UUID returned by hemmabo_booking_checkout or hemmabo_booking_create — never a propertyId — and guestToken is the secret issued with that same booking: a mismatched pair reveals nothing, not even that the booking exists. Without a reservationId there is no booking to look up yet.
| Name | Required | Description | Default |
|---|---|---|---|
| guestToken | Yes | 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. | |
| reservationId | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when isError=true. |
| guests | No | Booked guest count. |
| status | Yes | Host-node booking status. 'completed' is a protocol compatibility output only, not the active lifecycle truth. |
| checkIn | No | Booked arrival date. |
| checkOut | No | Booked departure date. |
| currency | No | ISO 4217 currency code for the booking total. |
| createdAt | No | Booking creation timestamp. |
| guestName | No | Primary guest name stored on the booking. |
| updatedAt | No | Last update timestamp for the booking record. |
| guestEmail | No | Primary guest email stored on the booking. |
| propertyId | No | Property UUID associated with the booking. |
| totalPrice | No | Total amount in minor currency units. |
| propertyName | No | Display name of the booked property. |
| reservationId | Yes | Echoed booking or reservation UUID. |
| propertyDomain | No | Host-owned domain associated with the property. |
| cancellationPolicy | No | Host cancellation-policy details applicable to this booking. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint, idempotentHint, and destructiveHint, so the baseline is lower, but the description adds substantial context: read-only against the database, safe to poll after a checkout timeout, returns guest PII, requires Bearer token auth, and is rate-limited per token. It even explains the security behavior of a mismatched reservationId/guestToken pair. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite its length, every sentence earns its place. The definition is front-loaded with purpose, then usage, exclusions, auth, safety, and parameter semantics, with no redundant or filler content. The density is justified by the tool's security-sensitive nature and the need to distinguish it from many siblings.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the full operational picture: purpose, when to use, when not to use, alternatives, authentication, rate limits, read-only safety, PII exposure, parameter provenance, and failure semantics. Since an output schema exists, the absence of return-format details is not a gap. Nothing an agent needs for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, giving a baseline of 3, but the description adds meaning beyond the schema: reservationId is the booking UUID returned by hemmabo_booking_checkout or hemmabo_booking_create and 'never a propertyId,' while guestToken is 'the secret issued with that same booking.' It also states that a mismatched pair reveals nothing, which is critical security semantics not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence precisely states the verb, resource, and identifier: 'Retrieve current status and full details of an existing booking by reservationId.' It also explicitly distinguishes the tool from siblings by naming the tools not to use (hemmabo_search_properties, hemmabo_search_availability, hemmabo_booking_quote), leaving no ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete when-to-use guidance: 'Use to confirm checkout/create succeeded or before cancel/reschedule.' It also provides explicit exclusions and alternatives, saying 'Do NOT use for property discovery, availability, or pricing — use hemmabo_search_properties, hemmabo_search_availability, or hemmabo_booking_quote for those.' This leaves no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_host_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 already declare readOnly/idempotent/non-destructive, and the description amplifies this by listing concrete side effects it does NOT have (no account creation, domain purchase, Stripe config, Supabase writes, or booking-site provisioning) and states that no data is stored server-side. It also discloses the output substance: the URL, what the host gets, and 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?
Each sentence adds a distinct fact—purpose, audience exclusion, readiness-check routing, read-only side-effect exclusions, output components, and prefill semantics. The key action is front-loaded in the first sentence, and the longer parameter caveat is safely placed last.
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?
The tool has an output schema, so return-value detail is already structured, and the description covers audience, timing, alternatives, side-effect profile, and parameter semantics. An agent has everything needed to decide whether to invoke it and what to pass, with no missing prerequisites.
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?
Every parameter is already documented in the schema (100% coverage), and the description adds a crucial group-level semantic: all six are optional prefill that never changes the destination URL; blanks are omitted and nothing is stored. This tells the agent the parameters are cosmetic prefill, which is not inferable from individual schema descriptions.
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 names a specific operation—'Return a safe ... onboarding handoff URL'—with the audience ('host who wants their own booking website') and immediately contrasts with hemmabo_search_properties and hemmabo_host_readiness_check, so the tool is unambiguous against its siblings.
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 invocation conditions: use 'after explaining the fit or when the host asks to start'; if still evaluating, run hemmabo_host_readiness_check first because it returns the same URL in next_step; guests should use hemmabo_search_properties. This is as explicit as when/when-not guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_host_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?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description consistently reinforces the read-only nature ('Does not create an account, buy a domain, configure Stripe, store host data, or provision a website'). It adds behavioral detail beyond the annotations: the safe onboarding next step, the omission semantics of wants* booleans ('count unless explicitly false — omitting them never lowers the verdict'), and what happens with no inputs ('summary is generic'). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the verb, scope, and user audience, then proceeds to exclusions, return contents, and parameter semantics. It is longer than the typical ideal, but every clause earns its place—there is little redundancy and it packs meaningful routing and behavior detail. A bulleted or two-paragraph structure would improve scannability, but the density is justified.
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 has 11 optional parameters, no required inputs, an output schema, and strong annotations, the description covers all decision-relevant aspects: who should use it, what it returns, what it does NOT do, what input changes the result, what happens with no input, and which sibling to invoke next. The output schema covers return values, so no return-format detail is needed. Nothing an agent needs to call it 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 the baseline is 3, but the description adds valuable cross-parameter semantics above the schema: it groups all 11 params into 'five inputs that sharpen the fit verdict' vs 'only prefill the onboarding URL', explains that wants* booleans count unless explicitly false, and clarifies that omitting them never lowers the verdict. That is genuinely additive meaning, not schema repetition, though it doesn't enumerate every parameter by name.
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 begins with a crisp verb+object ('Read-only fit check') and names the exact target user (vacation-rental host) and product context (HemmaBo for their own booking website/booking engine). It explicitly contrasts with the guest-facing sibling hemmabo_search_properties, so an agent can disambiguate the tool without reading schemas. It also names the follow-up sibling (hemmabo_host_onboarding_link).
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?
The description states when to use ('when the user is a host or property owner'), when not to use ('not a guest booking a stay; guests should use hemmabo_search_properties instead'), and what the next tool is when the host is ready ('follow up with hemmabo_host_onboarding_link'). It also clarifies which inputs sharpen the verdict versus which only prefill the onboarding URL, giving an agent actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_search_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 same-month alternative date windows when unavailable; a stale inbound calendar sync blocks an available answer (fails closed with calendar_freshness) instead of guessing. Omit guests to check dates only; pass it to price the alternative windows and to gate capacity — counts above the property's maximum return available=false (guests_exceed_max) with no alternatives. Stays shorter than the host's effective minimum nights return available=false with reasonCode min_nights_violation — extend the stay rather than shifting dates. The verdict always matches the host node's own availability API.
| 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 | Nearby same-month date windows to offer when the requested dates are unavailable. |
| 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 declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description adds valuable context beyond those: anonymous access with no Bearer token, rate limiting, no holds or date reservations, fail-closed behavior on stale calendar sync, and alignment with the host node's availability API. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the core purpose in the first sentence and every subsequent sentence earning its place by covering usage, exclusions, behavior, failure modes, or parameter semantics. Despite its length, it avoids redundancy and reads as a coherent operational guide.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, return-value details need not be spelled out. The description covers when to use, when not to use, authentication, rate-limits, side-effect freedom, parameter-conditional behavior, failure modes, and reliability expectations. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with per-parameter descriptions, and the description adds meaning beyond the schema: omitting guests checks dates only, providing guests gates capacity and prices alternative windows, and min_nights_violation guidance distinguishes extending the stay from shifting dates. It also warns to pass the exact property UUID, not a name or URL.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Check whether a specific property is available for the requested dates.' It clearly differentiates from siblings by explicitly routing general browsing to hemmabo_search_properties and positioning availability checks before quote creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to use the tool: after the user selects a property from hemmabo_search_properties to confirm availability before a quote. It also gives an explicit exclusion: 'Do NOT use for general browsing — use hemmabo_search_properties instead,' leaving no ambiguity about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hemmabo_search_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?
Annotations declare readOnlyHint=true and idempotentHint=true, but the description adds significant behavioral nuance: 'Discovery only', 'never quote a final price', 'Capacity misses are excluded', and 'date-unavailable matches return separately in unavailableMatches with up to three alternative windows'. These details are not present in annotations and help set agent expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient—every sentence carries purpose, front-loaded with purpose and usage. Slightly verbose with overlapping statements ('Discovery only' and 'never quote a final price'), but it remains focused and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, exclusions, workflow, return content, and parameter interaction. With an output schema and read-only annotations already present, the description provides everything an agent needs to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description enriches semantics: it explains how params combine into a single filter, clarifies region vs country matching behavior ('region matches broadly... while country matches the country field alone'), and documents the effect of omitting both ('search spans every published property'). This goes well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Search available vacation rental properties by location and travel dates.' It also differentiates from siblings by defining the exact use case ('find or browse places to stay') and explicitly routing away when a propertyId or host domain already exists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('Use when the user wants to find or browse places to stay'), when-not-to-use ('Do NOT use when the user already has a propertyId or host domain'), and a workflow directive (call get_verified_stay_offer before final answer, never quote price from search alone). This gives an agent unambiguous decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_vacation_rental_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 mark the tool as readOnly, idempotent, and non-destructive; the description adds substantial behavioral detail: it reads the domain's .well-known/vacation-rental.json and JWKS, refuses IPs/ports/local/private hostnames, enforces canonical-domain identity (www vs apex), and explains that trust is tied to the exact domain passed. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose and constraints are front-loaded, and every sentence carries substantive guidance. Minor redundancy: the mechanism of reading .well-known and JWKS is stated twice, once in the second sentence and again in the final sentence, which prevents a perfect conciseness score.
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 single-parameter tool with an output schema and safety annotations, the description covers purpose, input constraints, usage context, trust semantics, and the required follow-up call to get_verified_stay_offer. Nothing needed to invoke it 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?
The schema has 100% coverage for the single domain parameter, so the baseline is 3, but the description extends meaning considerably: bare hostname only, public domains only, IPs/ports/local private hostnames refused, and canonical domain exact-match semantics with www/apex distinction. This goes well beyond the schema pattern and examples.
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?
Description states a specific verb ('Verify') and a specific resource ('vacation-rental host domain is a valid VRP node'), and explicitly excludes availability, pricing, booking, and payment, distinguishing it from sibling booking/search tools. It also names the successor tool (get_verified_stay_offer), clarifying its niche.
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 use: 'Use when a host domain arrives from outside search (user-typed or third-party)', and gives the alternative: domains from hemmabo_search_properties can go straight to get_verified_stay_offer. It also provides a clear negative directive: 'do NOT use it to answer those questions'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
- Changed
verify_vacation_rental_node1 field changed- 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."
1 tool update
- 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')."
13 tool updates
- First observed
get_verified_stay_offer - First observed
hemmabo_booking_cancel - First observed
hemmabo_booking_checkout - First observed
hemmabo_booking_create - First observed
hemmabo_booking_negotiate - First observed
hemmabo_booking_quote - First observed
hemmabo_booking_reschedule - First observed
hemmabo_booking_status - First observed
hemmabo_host_onboarding_link - First observed
hemmabo_host_readiness_check - First observed
hemmabo_search_availability - First observed
hemmabo_search_properties - First observed
verify_vacation_rental_node
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Vacation rental discovery, direct booking, and property protection for AI agents.
Read-only property facts, indicative availability, authorised booking links and guest-safe support.
Manage your Hostex vacation rentals—properties, reservations, availability, listings, and guest me…
ATA Travel: agent-first direct booking for accommodations, hotels, and vacation rentals.
Related MCP Servers
- 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
- -
- AlicenseNot gradedqualityDmaintenanceEnables management of vacation rental properties through the Hostex API, including reservations, guest communications, availability calendars, reviews, and channel listings.1MIT
- AlicenseNot gradedqualityCmaintenanceLuxury hotel intelligence and secure checkout handoff for AI travel agents.1Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Most tools are cleanly separated by lifecycle stage (search, availability, quote, lock, checkout, status, cancel, reschedule), but get_verified_stay_offer, hemmabo_booking_quote, and hemmabo_booking_negotiate all touch pricing and could be confused in a quick selection. The descriptions do a strong job of disambiguating them, so only one or two pairs are genuinely ambiguous.
The vast majority follow a consistent hemmabo_<domain>_<action> pattern with snake_case throughout. Minor deviations exist: hemmabo_booking_status is a noun rather than a verb, and get_verified_stay_offer / verify_vacation_rental_node break the hemmabo_ prefix convention.
13 tools is well within the ideal range for a booking engine. Each tool maps to a distinct step in the guest journey or host onboarding flow, and none feel redundant or purely decorative.
The tool surface covers the full guest lifecycle: discovery, availability, pricing, price locking, checkout, pending booking creation, status lookup, cancellation, and rescheduling. Host-side onboarding is also represented, and the VRP verification/offer tools complete the trust and signed-offer path without leaving obvious dead ends.