HemmaBo Host Booking Engine
Ce que fait ce MCP
Searches vacation rentals, verifies host offers, checks availability, quotes prices, and supports direct booking, cancellation, and rescheduling flows.
Outils
Schéma d’entrée
{'type': 'object', 'required': ['domain', 'checkIn', 'checkOut', 'guests'], 'properties': {'domain': {'type': 'string', 'pattern': '^(?!-)(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$', 'description': "Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs."}, 'guests': {'type': 'integer', 'minimum': 1, 'description': '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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', '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."}, 'checkOut': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', '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."}, 'language': {'type': 'string', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['domain', 'verified'], 'properties': {'error': {'type': 'string'}, 'fresh': {'type': 'boolean', 'description': 'True when the signed offer is still within its validity/freshness window.'}, 'domain': {'type': 'string', 'description': 'Echoed host domain that issued the signed offer.'}, 'guests': {'type': 'integer', 'description': 'Echoed requested guest count.'}, 'checkIn': {'type': 'string', 'description': 'Echoed requested arrival date.'}, 'checkOut': {'type': 'string', 'description': 'Echoed requested departure date.'}, 'verified': {'type': 'boolean', 'description': 'True only when the host-domain offer signature and payload checks pass.'}, 'signature': {'type': 'object', 'description': 'Ed25519/JWS verification details, including key id and verification status.', 'additionalProperties': True}, 'widget_media': {'type': 'object', 'description': 'Images and media hydrated from the verified host discovery document for the ChatGPT widget.', 'additionalProperties': True}, 'agent_citation': {'type': 'object', 'description': 'Citation permission and safe-to-quote status derived from the signed offer.', 'additionalProperties': True}, 'agent_guardrails': {'type': 'object', 'description': 'Rules the agent must follow when presenting or acting on this offer.', 'additionalProperties': True}, 'payload_matches_offer': {'type': 'boolean', 'description': 'True when the signed payload matches the structured offer returned to the agent.'}, 'official_offer_summary': {'type': 'object', 'description': 'Small signed-offer summary for agents to quote without inventing price, availability, discounts, savings, comparisons, or booking details.', 'additionalProperties': True}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['reservationId', 'guestToken'], 'properties': {'reason': {'type': 'string', 'description': "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': {'type': 'string', '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."}, 'reservationId': {'type': 'string', 'format': 'uuid', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['reservationId', 'status'], 'properties': {'error': {'type': 'string', 'description': 'Present only when isError=true.'}, 'refund': {'type': 'object', 'description': 'Refund payload returned by cancel-booking edge function, when present.', 'additionalProperties': True}, 'status': {'enum': ['cancelled'], 'type': 'string', 'description': 'Final booking status after cancellation.'}, 'reservationId': {'type': 'string', 'format': 'uuid'}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['propertyId', 'checkIn', 'checkOut', 'guests', 'guestName', 'guestEmail'], 'properties': {'guests': {'type': 'integer', 'minimum': 1, 'description': 'Total number of guests as integer >= 1 (e.g. 4).'}, 'channel': {'enum': ['public', 'federation'], 'type': 'string', 'description': "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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'description': "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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'description': "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': {'type': 'string', 'format': 'email', 'description': "Primary guest email in RFC 5322 format (e.g. 'anna@example.com'). Used for booking confirmation and host contact; must be deliverable."}, 'guestPhone': {'type': 'string', 'description': "Primary guest phone in E.164 format with country code (e.g. '+46701234567'). Optional; omit when unknown. Recommended for check-in coordination."}, 'propertyId': {'type': 'string', 'format': 'uuid', 'description': "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': {'enum': ['checkout_session', 'payment_intent'], 'type': 'string', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['reservationId', 'totalPrice', 'currency'], 'properties': {'mpp': {'type': 'object', 'description': "Present when paymentMode='payment_intent'.", 'additionalProperties': True}, 'error': {'type': 'string', 'description': 'Present only when isError=true.'}, 'guests': {'type': 'integer'}, 'nights': {'type': 'integer'}, 'status': {'type': 'string', 'description': "Booking status (typically 'pending' until payment succeeds)."}, 'checkIn': {'type': 'string'}, 'checkOut': {'type': 'string'}, 'currency': {'type': 'string'}, 'createdAt': {'type': 'string', 'format': 'date-time'}, 'guestToken': {'type': 'string', '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.'}, 'paymentUrl': {'type': 'string', 'format': 'uri', 'description': 'Stripe Checkout redirect URL.'}, 'propertyId': {'type': 'string', 'format': 'uuid'}, 'totalPrice': {'type': 'integer', 'description': 'Final total charged (or to be charged), in minor currency units.'}, 'payment_modes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Supported payment modes.'}, 'reservationId': {'type': 'string', 'format': 'uuid', 'description': 'Booking UUID. Use for subsequent status/cancel/reschedule calls.'}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['propertyId', 'checkIn', 'checkOut', 'guests', 'guestName', 'guestEmail'], 'properties': {'guests': {'type': 'integer', 'minimum': 1, 'description': '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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'description': "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': {'type': 'string', 'format': 'email', 'description': "Primary guest email in RFC 5322 format (e.g. 'anna@example.com'). Used for booking confirmation and host contact; must be deliverable."}, 'guestPhone': {'type': 'string', 'description': "Primary guest phone in E.164 format with country code (e.g. '+46701234567'). Optional; omit when unknown. Recommended for check-in coordination."}, 'propertyId': {'type': 'string', 'format': 'uuid', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['bookingId', 'status'], 'properties': {'error': {'type': 'string', 'description': 'Present only when isError=true.'}, 'guests': {'type': 'integer'}, 'nights': {'type': 'integer'}, 'status': {'enum': ['pending', 'confirmed', 'cancelled', 'completed'], 'type': 'string', 'description': "Host-node booking status. 'completed' is a protocol compatibility output only, not a status this tool writes."}, 'checkIn': {'type': 'string'}, 'checkOut': {'type': 'string'}, 'currency': {'type': 'string'}, 'bookingId': {'type': 'string', 'format': 'uuid', 'description': 'Persistent booking UUID. Use for status/cancel/reschedule.'}, 'createdAt': {'type': 'string', 'format': 'date-time'}, 'priceType': {'type': 'string', 'description': 'Pricing mode used (federation/gap_night/package_*).'}, 'guestToken': {'type': 'string', '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.'}, 'propertyId': {'type': 'string', 'format': 'uuid'}, 'totalPrice': {'type': 'integer', 'description': 'Final price written to the booking.'}, 'channel_mirror': {'type': 'object', '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.", 'additionalProperties': True}, 'packageApplied': {'type': 'string'}, 'calendar_freshness': {'type': 'object', '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.', 'additionalProperties': True}, 'gapDiscountPercent': {'type': 'integer'}, 'federationDiscountPercent': {'type': 'integer'}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['propertyId', 'checkIn', 'checkOut', 'guests'], 'properties': {'guests': {'type': 'integer', 'minimum': 1, 'description': 'Total number of guests as integer >= 1 (e.g. 4). Determines which price tier is applied.'}, 'checkIn': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'format': 'uuid', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['quoteId', 'validUntil', 'federationTotal'], 'properties': {'error': {'type': 'string', 'description': 'Present only when isError=true.'}, 'guests': {'type': 'integer'}, 'nights': {'type': 'integer'}, 'checkIn': {'type': 'string'}, 'quoteId': {'type': 'string', 'description': 'Snapshot ID. Pass to hemmabo_booking_checkout to lock this price.'}, 'checkOut': {'type': 'string'}, 'currency': {'type': 'string'}, 'gapNight': {'type': 'boolean'}, 'gapTotal': {'type': 'integer'}, 'breakdown': {'type': 'object', 'additionalProperties': True}, 'propertyId': {'type': 'string', 'format': 'uuid'}, 'validUntil': {'type': 'string', 'format': 'date-time', 'description': 'Quote expiry (ISO 8601). Typically 15 minutes after creation.'}, 'publicTotal': {'type': 'integer'}, 'packageApplied': {'type': 'string'}, 'federationTotal': {'type': 'integer'}, 'gapDiscountPercent': {'type': 'integer'}, 'federationDiscountPercent': {'type': 'integer'}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['propertyId', 'checkIn', 'checkOut', 'guests'], 'properties': {'guests': {'type': 'integer', 'minimum': 1, 'description': '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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'format': 'uuid', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'properties': {'error': {'type': 'string', 'description': 'Present only when isError=true.'}, 'guests': {'type': 'integer'}, 'nights': {'type': 'integer', 'description': 'Number of nights in the range.'}, 'checkIn': {'type': 'string'}, 'checkOut': {'type': 'string'}, 'currency': {'type': 'string', 'description': 'ISO 4217 currency code.'}, 'gapNight': {'type': 'boolean', 'description': 'True when the stay qualifies as a gap fill.'}, 'gapTotal': {'type': 'integer', 'description': 'Gap-night adjusted total when applicable; otherwise null.'}, 'breakdown': {'type': 'object', 'description': 'Detailed pricing breakdown.', 'additionalProperties': True}, 'propertyId': {'type': 'string', 'format': 'uuid'}, 'publicTotal': {'type': 'integer', 'description': 'Website rate total in minor currency units.'}, 'packageApplied': {'type': 'string', 'description': 'Applied package, if any.'}, 'federationTotal': {'type': 'integer', 'description': 'Legacy field: direct host-source total. Prefer directBookingTotal in user-facing copy.'}, 'directBookingTotal': {'type': 'integer', 'description': 'Preferred user-facing field: direct host-source total.'}, 'gapDiscountPercent': {'type': 'integer', 'description': 'Gap-night discount percentage when applied.'}, 'hostSourcePublicTotal': {'type': 'integer', 'description': 'Preferred user-facing field: public host-source total.'}, 'federationDiscountPercent': {'type': 'integer', 'description': 'Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison.'}, 'directBookingDiscountPercent': {'type': 'integer', 'description': 'Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison.'}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['reservationId', 'guestToken', 'newCheckIn', 'newCheckOut'], 'properties': {'reason': {'type': 'string', 'description': "Human-readable reschedule reason for host records (e.g. 'Flight delayed', 'Extended conference'). Optional; omit when not provided by the guest."}, 'guestToken': {'type': 'string', '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."}, 'newCheckIn': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "New arrival date in YYYY-MM-DD format (e.g. '2026-08-01'). Must be today or later. Must be strictly before newCheckOut."}, 'newCheckOut': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "New departure date in YYYY-MM-DD format (e.g. '2026-08-08'). Must be strictly after newCheckIn."}, 'reservationId': {'type': 'string', 'format': 'uuid', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['reservationId', 'status'], 'properties': {'error': {'type': 'string', 'description': 'Present only when isError=true.'}, 'reason': {'type': 'string'}, 'status': {'type': 'string', 'description': 'Booking status after reschedule.'}, 'pricing': {'type': 'object', 'properties': {'delta': {'type': 'integer'}, 'currency': {'type': 'string'}, 'newPrice': {'type': 'integer'}, 'stripeAction': {'type': 'object', 'additionalProperties': True}, 'previousPrice': {'type': 'integer'}}, 'additionalProperties': True}, 'newDates': {'type': 'object', 'properties': {'checkIn': {'type': 'string'}, 'checkOut': {'type': 'string'}}, 'additionalProperties': True}, 'previousDates': {'type': 'object', 'properties': {'checkIn': {'type': 'string'}, 'checkOut': {'type': 'string'}}, 'additionalProperties': True}, 'reservationId': {'type': 'string', 'format': 'uuid'}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['reservationId', 'guestToken'], 'properties': {'guestToken': {'type': 'string', '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."}, 'reservationId': {'type': 'string', 'format': 'uuid', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['reservationId', 'status'], 'properties': {'error': {'type': 'string', 'description': 'Present only when isError=true.'}, 'guests': {'type': 'integer', 'description': 'Booked guest count.'}, 'status': {'enum': ['pending', 'confirmed', 'cancelled', 'completed'], 'type': 'string', 'description': "Host-node booking status. 'completed' is a protocol compatibility output only, not the active lifecycle truth."}, 'checkIn': {'type': 'string', 'description': 'Booked arrival date.'}, 'checkOut': {'type': 'string', 'description': 'Booked departure date.'}, 'currency': {'type': 'string', 'description': 'ISO 4217 currency code for the booking total.'}, 'createdAt': {'type': 'string', 'format': 'date-time', 'description': 'Booking creation timestamp.'}, 'guestName': {'type': 'string', 'description': 'Primary guest name stored on the booking.'}, 'updatedAt': {'type': 'string', 'format': 'date-time', 'description': 'Last update timestamp for the booking record.'}, 'guestEmail': {'type': 'string', 'description': 'Primary guest email stored on the booking.'}, 'propertyId': {'type': 'string', 'format': 'uuid', 'description': 'Property UUID associated with the booking.'}, 'totalPrice': {'type': 'integer', 'description': 'Total amount in minor currency units.'}, 'propertyName': {'type': 'string', 'description': 'Display name of the booked property.'}, 'reservationId': {'type': 'string', 'format': 'uuid', 'description': 'Echoed booking or reservation UUID.'}, 'propertyDomain': {'type': 'string', 'description': 'Host-owned domain associated with the property.'}, 'cancellationPolicy': {'type': 'object', 'description': 'Host cancellation-policy details applicable to this booking.', 'additionalProperties': True}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'city': {'type': 'string', 'description': "City or municipality (e.g. 'Kävlinge', 'Florence'). Optional; used in onboarding URL prefill when provided."}, 'domain': {'type': 'string', 'pattern': '^(?!-)(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$', 'description': "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': {'type': 'string', 'description': "Region or area (e.g. 'Skåne', 'Toscana', 'Marrakech-Safi'). Optional; narrows onboarding handoff and proof examples."}, 'country': {'type': 'string', 'description': "Country where the property operates (e.g. 'Sweden', 'Italy', 'Morocco'). Optional; improves onboarding URL locale and fit assessment."}, 'language': {'type': 'string', 'description': "ISO 639-1 language hint for onboarding copy (e.g. 'sv', 'en', 'de', 'fr'). Optional; omit to default to English."}, 'propertyName': {'type': 'string', 'description': "Property or business display name (e.g. 'Villa Åkerlyckan'). Optional; carried into onboarding URL when provided."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['ok', 'product', 'capabilities', 'setup_items', 'next_step'], 'properties': {'ok': {'type': 'boolean'}, 'product': {'type': 'object', 'description': 'HemmaBo product, pricing, onboarding URL, and live proof URLs.', 'additionalProperties': True}, 'next_step': {'type': 'object', 'description': 'Safe handoff action for the host.', 'additionalProperties': True}, 'setup_items': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Inputs the host should prepare before onboarding.'}, 'capabilities': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Host-facing capabilities included in HemmaBo.'}, 'privacy_note': {'type': 'string', 'description': 'Clarifies that the call is read-only and does not store host data.'}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': [], 'properties': {'city': {'type': 'string', 'description': "City or municipality (e.g. 'Kävlinge', 'Florence'). Optional; used in onboarding URL prefill when provided."}, 'domain': {'type': 'string', 'pattern': '^(?!-)(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$', 'description': "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': {'type': 'string', 'description': "Region or area (e.g. 'Skåne', 'Toscana', 'Marrakech-Safi'). Optional; narrows onboarding handoff and proof examples."}, 'country': {'type': 'string', 'description': "Country where the property operates (e.g. 'Sweden', 'Italy', 'Morocco'). Optional; improves onboarding URL locale and fit assessment."}, 'hasOwnDomain': {'type': 'boolean', 'description': "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': {'type': 'string', 'description': "Property or business display name (e.g. 'Villa Åkerlyckan'). Optional; carried into onboarding URL when provided."}, 'propertyType': {'enum': ['villa', 'apartment', 'cabin', 'cottage', 'holiday_home', 'bnb', 'hotel', 'other'], 'type': 'string', 'description': "Property category enum. Optional; omit when unknown. 'villa'/'holiday_home' fit best; 'hotel' may indicate a poor HemmaBo fit for large chains."}, 'currentChannels': {'type': 'array', 'items': {'type': 'string', 'description': "Single distribution channel name (e.g. 'Airbnb', 'Booking.com', 'Vrbo', 'own website'). Up to 8 entries."}, 'maxItems': 8, 'description': 'Optional list of channels the host uses today. Omit when unknown. Helps assess migration fit from OTAs to their own booking website.'}, 'preferredLanguage': {'type': 'string', 'description': "ISO 639-1 language hint for onboarding copy (e.g. 'sv', 'en', 'de', 'fr'). Optional; omit to default to English."}, 'wantsAiAgentBooking': {'type': 'boolean', 'description': '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': {'type': 'boolean', 'description': '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).'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['ok', 'product', 'readiness', 'capabilities', 'setup_items', 'next_step', 'agent_instruction'], 'properties': {'ok': {'type': 'boolean', 'description': 'True when the fit check completed.'}, 'product': {'type': 'object', 'properties': {'name': {'type': 'string', 'description': "Product name ('HemmaBo')."}, 'price': {'type': 'object', 'properties': {'amount': {'type': 'integer', 'description': 'Monthly subscription price in major currency units (e.g. 39).'}, 'currency': {'type': 'string', 'description': "ISO 4217 currency code (e.g. 'USD')."}, 'interval': {'type': 'string', 'description': "Billing interval (e.g. 'month')."}, 'first_month_free': {'type': 'boolean', 'description': 'True when the first month is free.'}, 'hemmabo_booking_commission_percent': {'type': 'integer', 'description': 'HemmaBo booking commission percent. 0 — HemmaBo takes no booking commission.'}}, 'description': 'Subscription pricing for the host.', 'additionalProperties': True}, 'website': {'type': 'string', 'format': 'uri', 'description': 'HemmaBo marketing site URL.'}, 'category': {'type': 'string', 'description': "Product category, e.g. 'host-owned booking engine for vacation rentals'."}, 'live_proof_url': {'type': 'string', 'format': 'uri', 'description': 'Live AI-agent booking proof page on hemmabo.com.'}, 'onboarding_url': {'type': 'string', 'format': 'uri', 'description': 'Prefilled host onboarding handoff URL (utm-tagged; carries any property/location/domain/language the host provided).'}, 'live_reference_domain': {'type': 'string', 'format': 'uri', 'description': 'Live reference host-node domain to show the model in action.'}}, 'description': 'HemmaBo product summary, pricing, onboarding URL, and live proof URLs.', 'additionalProperties': True}, 'next_step': {'type': 'object', 'properties': {'url': {'type': 'string', 'format': 'uri', 'description': 'Onboarding handoff URL to open.'}, 'label': {'type': 'string', 'description': 'Human-readable label for the action.'}, 'action': {'enum': ['open_onboarding'], 'type': 'string', 'description': 'Recommended next action.'}}, 'description': 'Safe handoff action for the host.', 'additionalProperties': True}, 'readiness': {'type': 'object', 'properties': {'fit': {'enum': ['strong_fit', 'possible_fit', 'needs_more_host_context'], 'type': 'string', 'description': 'Overall fit verdict derived from the inputs the host provided.'}, 'not_a_fit_when': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Situations where HemmaBo is not the right tool.'}, 'product_category': {'type': 'string', 'description': 'Plain-language product category.'}, 'recommended_when': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Situations where HemmaBo is a good fit.'}}, 'description': "Fit verdict and boundaries for the host's described need.", 'additionalProperties': True}, 'setup_items': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Inputs the host should prepare before onboarding.'}, 'capabilities': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Host-facing capabilities included in HemmaBo.'}, 'agent_instruction': {'type': 'string', 'description': 'How an AI agent should describe HemmaBo without overclaiming.'}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['propertyId', 'checkIn', 'checkOut'], 'properties': {'guests': {'type': 'integer', 'minimum': 1, 'description': '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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'format': 'uuid', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['available'], 'properties': {'error': {'type': 'string', 'description': 'Present only when isError=true.'}, 'reason': {'type': 'string', 'description': 'Reason when available=false.'}, 'checkIn': {'type': 'string'}, 'checkOut': {'type': 'string'}, 'available': {'type': 'boolean', 'description': 'True if the property is bookable for the entire range.'}, 'propertyId': {'type': 'string', 'format': 'uuid'}, 'channel_mirror': {'type': 'object', '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.", 'additionalProperties': True}, 'alternativeDates': {'type': 'array', 'items': {'type': 'object', 'properties': {'checkIn': {'type': 'string'}, 'checkOut': {'type': 'string'}, 'currency': {'type': 'string'}, 'available': {'type': 'boolean'}, 'publicTotal': {'type': 'number'}, 'federationTotal': {'type': 'number'}, 'federationDiscountPercent': {'type': 'number'}}, 'additionalProperties': True}, 'description': "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': {'type': 'object', '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.', 'additionalProperties': True}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['guests', 'checkIn', 'checkOut'], 'properties': {'guests': {'type': 'integer', 'minimum': 1, 'description': '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': {'type': 'string', 'description': "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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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': {'type': 'string', 'description': "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': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "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."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'properties': {'error': {'type': 'string', 'description': 'Present only when isError=true.'}, 'guests': {'type': 'integer', 'description': 'Echoed guest count.'}, 'checkIn': {'type': 'string', 'description': 'Echoed check-in date (YYYY-MM-DD).'}, 'checkOut': {'type': 'string', 'description': 'Echoed check-out date (YYYY-MM-DD).'}, 'properties': {'type': 'array', 'items': {'type': 'object', 'required': ['propertyId', 'name', 'maxGuests', 'federationTotal'], 'properties': {'city': {'type': 'string', 'description': 'City or locality.'}, 'name': {'type': 'string', 'description': 'Property display name.'}, 'domain': {'type': 'string', 'description': 'Host-owned domain for this property.'}, 'nights': {'type': 'integer', 'description': 'Number of nights between check-in and check-out.'}, 'region': {'type': 'string', 'description': 'Region or area.'}, 'country': {'type': 'string', 'description': 'Country.'}, 'signals': {'type': 'object', '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, 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.", 'additionalProperties': True}, 'currency': {'type': 'string', 'description': "ISO 4217 currency code (e.g. 'SEK', 'EUR')."}, 'available': {'type': 'boolean', 'description': 'Always true in search results because unavailable properties are filtered out.'}, 'maxGuests': {'type': 'integer', 'description': 'Maximum guest capacity.'}, 'propertyId': {'type': 'string', 'format': 'uuid', 'description': 'Stable UUID. Pass to subsequent tools (availability, quote, checkout).'}, 'publicTotal': {'type': 'integer', 'description': 'Standard website total for the date range, in minor currency units.'}, 'propertyType': {'type': 'string', 'description': 'Property type classification.'}, 'packageApplied': {'type': 'string', 'description': 'Package applied (e.g. week or two_weeks), if any.'}, 'federationTotal': {'type': 'integer', '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.'}, 'directBookingTotal': {'type': 'integer', 'description': 'Preferred field for user-facing copy: direct host-source total, in minor currency units.'}, 'hostSourcePublicTotal': {'type': 'integer', 'description': 'Preferred field for user-facing copy: public host-source total for the date range, in minor currency units.'}, 'federationDiscountPercent': {'type': 'integer', 'description': 'Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison.'}, 'directBookingDiscountPercent': {'type': 'integer', 'description': 'Legacy internal field. Do not present this as a guest-facing discount, savings, or comparison.'}}, 'additionalProperties': True}, 'description': 'Available properties matching the search criteria, with live host-source pricing.'}}, 'additionalProperties': True}
Schéma d’entrée
{'type': 'object', 'required': ['domain'], 'properties': {'domain': {'type': 'string', 'pattern': '^(?!-)(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,63}$', 'description': "Host-owned domain without protocol or path (e.g. 'villaakerlyckan.se', 'myvilla.it'). Invalid: 'https://...', paths, ports, or booking URLs."}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['domain', 'verified'], 'properties': {'error': {'type': 'string', 'description': 'Present when verified=false or the node cannot be checked.'}, 'domain': {'type': 'string', 'description': 'Echoed canonical host domain that was checked.'}, 'signing': {'type': 'object', 'description': 'Summary of accepted signing algorithms, key ids, and signing-key checks.', 'additionalProperties': True}, 'jwks_url': {'type': 'string', 'format': 'uri', 'description': 'Host-domain JWKS URL containing the Ed25519 public keys used to verify signed offers.'}, 'protocol': {'type': 'string', 'description': "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': {'type': 'boolean', 'description': 'True only when discovery, JWKS, signing metadata, and verified-offer endpoint checks pass.'}, 'discovery_url': {'type': 'string', 'format': 'uri', 'description': 'The .well-known vacation-rental discovery URL read from the host domain.'}, 'protocol_version': {'type': 'string', 'description': 'VRP version declared by the host discovery document.'}, 'verified_stay_offer_url': {'type': 'string', 'format': 'uri', 'description': 'Host-domain endpoint template or URL used to request signed verified stay offers.'}}, 'additionalProperties': True}
Modifications récentes des outils
Serveurs MCP similaires
Itaim Bibi
Provides an Itaim Bibi neighborhood directory with local place search, menus, events, offers, services, bookings, reservations, t…
Tatuapé
Provides a Tatuapé neighborhood directory with local place search, menus, events, offers, services, bookings, reservations, ticke…
Agenda SP
Provides São Paulo cultural agenda and local directory features, including events, venues, restaurants, offers, bookings, reserva…
Vila Buarque
Provides a neighborhood directory for local places, restaurants, menus, events, offers, services, reservations, bookings, and pur…
Centro
Provides a Centro neighborhood directory with local place search, menus, events, offers, services, bookings, reservations, ticket…
Bela Vista
Provides a Bela Vista neighborhood directory with local place search, menus, events, offers, services, bookings, reservations, ti…
Jardins
Provides a Jardins neighborhood directory with local place search, menus, events, offers, services, bookings, reservations, ticke…
Aclimação
Provides a neighborhood directory for Aclimação with local places, restaurant menus, events, offers, services, bookings, reservat…