OpenBooking is the open-source framework that connects restaurants, salons, clinics and every other bookable thing to ChatGPT, Claude and any AI agent. You build one integration, and it works with every agent protocol.
Speaks MCP today. UCP and A2A are in progress.
More and more people say "book me a table" to an AI assistant instead of opening an app. Agents make mistakes that people don't, and booking is where those mistakes cost real money.
Agents time out and try again. Without idempotency, one request turns into two tables and two no-shows.
An eager agent confirms a deposit before the user has seen the price. That's a chargeback waiting to happen.
Cancellation windows, deposits, party limits. If the API doesn't spell them out, agents guess, and they guess wrong.
You connect OpenBooking to your inventory once. It handles the protocols and the safeguards, so every agent gets the same reliable behavior.
The reliability rules live in the framework, not in your code, so every protocol gets them for free.
A slot is reserved while the user decides, and released automatically when time runs out. Every response states exactly when that is.
// hold_slot → { "status": "held", "expires_at": "2026-10-02T19:10:00+02:00", "expires_in_seconds": 600 }
Every change takes an idempotency key. Same key, same result, nothing runs twice, even when calls arrive at the same moment.
// retry after a timeout → same booking hold_slot({ slot_id, idempotency_key: "7f3c…" }) // → booking_id "bk_91a2…" (replayed)
confirm_booking requires user_confirmed: true. Price,
deposit and cancellation terms are shown before confirmation, never after.
{ "code": "user_confirmation_required",
"suggested_next_action": "Show the user the
price, deposit and cancellation policy…" }
Every failure says what happened and what to try next, so agents recover on their own instead of giving up.
{ "code": "slot_unavailable",
"suggested_next_action": "Call search_availability
again and offer the closest alternatives." }
Add OpenBooking once, and all your customers become bookable by agents.
Restaurants, salons, clinics and studios. Connect the system you already use, no code required.
Courts, meeting rooms, tours, equipment, consultants. If it has a calendar, it can be booked by an agent.
Implement a handful of methods against your inventory, and OpenBooking does the rest.
BookingProviderSearch, hold, confirm, cancel, written against your own data.
/mcp.
import { type BookingProvider } from '@openbooking/core'; export class MySalon implements BookingProvider { info = { name: 'Studio Nord' }; async listVenues() { /* … */ } async searchAvailability(query) { // free slots with price, deposit and policy } async createHold({ slot_id, expires_at }) { // reserve atomically until expires_at } async confirmHold({ booking_id, customer }) { /* … */ } async getBooking(id) { /* … */ } async cancelBooking({ booking_id, fee }) { /* … */ } }
import { createOpenBookingApp, listen } from '@openbooking/server'; import { MySalon } from './provider'; const { app } = createOpenBookingApp({ provider: new MySalon(), baseUrl: 'https://book.studionord.no', }); await listen(app, { port: 3000 }); // → /mcp MCP tools for agents // → /.well-known/ucp UCP discovery // → /.well-known/agent-card.json A2A Agent Card
# Run the demo restaurant locally git clone __GITHUB_URL__ cd openbooking pnpm install pnpm dev # Then connect any MCP client to http://localhost:3000/mcp # and ask: "Book a table for 2 this Friday around 19:00"
OpenBooking follows the specs exactly where they exist. Where they don't yet cover bookings, we extend them openly and document every difference.
| Protocol | Status | What you get |
|---|---|---|
| MCP Model Context Protocol |
● Supported | Five tools: search, hold, confirm, get and cancel. Works over HTTP and stdio. |
| UCP Universal Commerce Protocol |
● Draft | A discovery profile and booking sessions, extended to support time slots. |
| A2A Agent2Agent |
● Coming | An Agent Card for discovery. Full task handling is on the roadmap. |
The framework is open source and always will be. Pro is for teams that want us to run it for them.