An open protocol that bridges hotel property management systems with AI tools — without modifying your existing infrastructure.
Three design principles that make hotel-AI integration reliable, auditable, and safe.
Any AI, One Adapter
One HBSP adapter connects to any MCP-compatible AI — Claude, GPT, Gemini, or any model your team prefers. Build once, run anywhere.
Canonical Data Model
A shared vocabulary for room types, channels, rate plans, and revenue metrics. One schema across all PMS vendors — no custom mapping per integration.
Human Approval Required
AI agents propose changes. Humans approve or reject them. No rate change, restriction, or allocation executes without an explicit sign-off.
A clear specification, typed schemas, and working examples. Implement your first tool in under an hour.
HBSP sits between your PMS and the AI layer. Your production system is never modified.
HBSP acts as a read-only bridge. Your PMS, database, and internal workflows remain untouched. No agent writes to production directly.
Start with the Distribution module. Add Reservations, Guest, Operations, and F&B incrementally. No all-or-nothing migration required.
Every tool call, proposal, and approval decision is logged. Minimum 90-day retention. Built to satisfy enterprise procurement requirements.
Reference and community adapters for the most widely deployed PMS platforms.
Adapter for the FNS hotel management system. Connects FNS property data to any HBSP-compatible AI agent without modifying the core system.
Adapter for the Erbon hotel management platform. Bridges Erbon property operations with AI agents via the HBSP standard.
Production dogfood adapter built by UNOZERO. Validates the HBSP specification against real hotel operations.
Chatbook — UNOZERO's hotel WhatsApp AI — runs on HBSP in production. Before asking any PMS vendor to adopt the protocol, we shipped it on real hotels.
// reservations.quoteStay // composes listRoomTypes · getAvailability · getRates · getRestrictions { "check_in" : "2025-06-14", "check_out" : "2025-06-16", "nights" : 2, "room_type" : "DLX_DBL", "bookable" : true, "nightly_breakdown": [ { "date": "2025-06-14", "rate": 189.00, "label": "weekday" }, { "date": "2025-06-15", "rate": 229.00, "label": "weekend +30" } ], "total" : 418.00, "currency" : "USD", "restrictions": { "min_stay" : 2, "lead_time_ok": true } }
The adapter is a service that calls Chatbook's existing REST API as a client. The core system is untouched. This is the compliance model for any PMS vendor.
The compliance model for any PMS vendor.
B2B path
Any llm agent calls HBSP server and returns availability and rate quotes to guests
B2C path
a user writes to the official communication channel (WhatsApp). The message is forwarded to the chatbook conversational assistant, which processes it and provides a response.
Two official SDKs. Strong types. Clear error codes. No boilerplate.
from hbsp import HBSPServer server = HBSPServer( "my-hotel", property_id="hotel_playa_001", timezone="America/Cancun", currency="MXN", ) # Register a read tool — no approval needed @server.tool("distribution.getRates", schema={...}) async def get_rates(date_range, room_types=None, channels=None): rates = await my_pms.query_rates(date_range, room_types, channels) return { "property_id": "hotel_playa_001", "currency": "MXN", "rates": rates, } server.run() # <1h from zero to compliant
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { HBSP_VERSION } from "@hbsp/sdk"; const server = new McpServer({ name: "my-hotel", version: HBSP_VERSION }); server.registerTool( "distribution.getRates", { inputSchema: { date_range: z.object({ start: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), end: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), }), room_types: z.array(z.string()).optional(), channels: z.array(z.string()).optional(), }, annotations: { readOnlyHint: true, destructiveHint: false }, }, async ({ date_range, room_types, channels }) => { const rates = await queryYourPMS(date_range, room_types, channels); return { content: [{ type: "text", text: JSON.stringify(rates) }] }; } );
Add one module at a time. No forced migrations.