MCP-Server

AgentBookable

com.agentbookable/mcp
Business & Betrieb Öffentlich und erreichbar MCP 2025-11-25

Was dieses MCP kann

Finds local service providers, checks live appointment availability, and books appointments after explicit user consent.

create_booking
Create a REAL appointment. CONSEQUENCEFUL: only after the user has explicitly chosen a slot and authorized the booking in their own words. Flow: (1) check the service's bookingRequirements and collect any required customer details (e.g. phone); (2) create a mandate via the create_mandate tool with the user's exact instruction; (3) call this tool with the mandateRef. The mandate is single-use and expires in 15 minutes. On SLOT_NO_LONGER_AVAILABLE offer the returned alternatives — never rebook unilaterally.
Destruktiv Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['businessId', 'serviceId', 'customer', 'mandateRef'], 'properties': {'slot': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string'}, 'start': {'type': 'string'}, 'staffId': {'type': 'string'}}, 'additionalProperties': False}, 'slotId': {'type': 'string', 'description': 'Slot id from get_availability (preferred)'}, 'draftId': {'type': 'string', 'description': 'Booking draft the user consented to (from prepare_booking). When given, the request must match the draft exactly or booking fails with CONSENT_DRAFT_MISMATCH.'}, 'customer': {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string'}, 'email': {'type': 'string'}, 'phone': {'type': 'string', 'description': "Required when the service's bookingRequirements.phone is 'required'"}, 'timezone': {'type': 'string'}}, 'additionalProperties': False}, 'serviceId': {'type': 'string'}, 'businessId': {'type': 'string'}, 'mandateRef': {'type': 'string', 'description': "From create_mandate (or create_mandate_for_draft) — records the user's authorization"}, 'idempotencyKey': {'type': 'string', 'description': 'Stable key; safe retries return the original booking'}}, 'additionalProperties': False}
create_mandate
Legacy: record the user's authorization WITHOUT a booking draft. Prefer the draft flow: prepare_booking → show proposal → user agrees → create_mandate_for_draft → create_booking with draftId. The draft flow binds consent to the exact appointment the user saw.
Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['actorRef', 'action', 'businessId', 'instruction'], 'properties': {'action': {'enum': ['create_booking', 'reschedule_booking', 'cancel_booking'], 'type': 'string'}, 'actorRef': {'type': 'string', 'description': 'Your agent/session identifier, recorded in the audit trail'}, 'serviceId': {'type': 'string'}, 'businessId': {'type': 'string', 'description': 'Bind the mandate to this business'}, 'instruction': {'type': 'string', 'description': "The user's exact words — never fabricate or paraphrase"}}, 'additionalProperties': False}
create_mandate_for_draft
After the user explicitly agrees to the exact proposal in the draft (an affirmative reply such as 'yes, book it' — the user having already seen business, service, date and time), assert consent here to get a single-use mandate bound to that draft. consentObtained must be true; this assertion is audited. If anything consequential changes (different time, service or business), prepare a NEW draft and get fresh consent.
Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['actorRef', 'draftId', 'consent'], 'properties': {'consent': {'type': 'object', 'required': ['consentObtained', 'draftId'], 'properties': {'draftId': {'type': 'string'}, 'consentedBy': {'type': 'string', 'description': "Who consented, e.g. 'the customer'"}, 'instruction': {'type': 'string', 'description': "The user's exact consenting words, for the audit trail"}, 'consentMethod': {'type': 'string', 'description': "How, e.g. 'chat reply: yes, book it' or 'spoken yes'"}, 'consentObtained': {'type': 'boolean', 'const': True}}, 'additionalProperties': False}, 'draftId': {'type': 'string', 'description': 'The draft the user consented to (from prepare_booking)'}, 'actorRef': {'type': 'string', 'description': 'Your agent/session identifier, recorded in the audit trail'}}, 'additionalProperties': False}
find_businesses
Search the AgentBookable registry for businesses that accept AI bookings. Search by free text, category, city, service name or geo radius. ALWAYS start here — the results include capability flags and _links telling you the exact next endpoints.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'city': {'type': 'string', 'description': "e.g. 'Civray'"}, 'query': {'type': 'string', 'description': "Free text on name/category/description/services, e.g. 'hairdresser'"}, 'service': {'type': 'string', 'description': "Service name, e.g. 'Haircut'"}, 'category': {'type': 'string'}, 'latitude': {'type': 'number'}, 'radiusKm': {'type': 'number'}, 'longitude': {'type': 'number'}}, 'additionalProperties': False}
get_availability
Find LIVE availability for a service. Always call this immediately before create_booking — slots are temporary (~60s) and revalidated at booking. Pass an ISO-8601 window; use a slot id from the result when booking.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['businessId', 'serviceId', 'from', 'to'], 'properties': {'to': {'type': 'string', 'description': 'ISO-8601 window end'}, 'from': {'type': 'string', 'description': 'ISO-8601 window start, e.g. 2026-09-01T00:00:00Z'}, 'serviceId': {'type': 'string'}, 'businessId': {'type': 'string'}}, 'additionalProperties': False}
get_booking
Retrieve a booking by its AgentBookable id (bb_bkg_*). Requires the mandateRef issued for that booking (from create_booking / create_mandate). Provider identity is never returned.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['bookingId', 'mandateRef'], 'properties': {'bookingId': {'type': 'string'}, 'mandateRef': {'type': 'string', 'description': 'Mandate ref returned when the booking was authorized/created'}}, 'additionalProperties': False}
get_business
Get one business's record by id (ab_bus_*) or slug. Includes capabilities (availability/booking/reschedule/cancellation/payment) — NEVER promise an action whose flag is false — plus _links to the service list, availability endpoint and booking flow, and per-service bookingRequirements (e.g. whether customer phone is required).
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['businessId'], 'properties': {'businessId': {'type': 'string', 'description': "ab_bus_* id or public slug, e.g. 'agentbookable-demo'"}}, 'additionalProperties': False}
list_services
List the services a business has opened to AI booking. Each service has a durationMinutes and bookingRequirements telling you what customer details to collect (name/email/phone) BEFORE booking.
Nur Lesen Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['businessId'], 'properties': {'businessId': {'type': 'string', 'description': 'ab_bus_* id or slug'}}, 'additionalProperties': False}
prepare_booking
Prepare a booking draft: the concrete proposal (business, service, time, customer) to show the user. Validates live availability and customer requirements — if requirements are missing you get MISSING_CUSTOMER_REQUIREMENT: ask the user for those details first, then call again. Show the returned draft to the user as the final proposal (business, service, duration, date/time), then obtain explicit affirmative consent. The draft expires after 30 minutes; consent binds to this exact proposal.
Externer Zugriff
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['businessId', 'serviceId', 'customer', 'actorRef'], 'properties': {'slot': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string'}, 'start': {'type': 'string'}, 'staffId': {'type': 'string'}}, 'additionalProperties': False}, 'slotId': {'type': 'string', 'description': 'Slot id from get_availability (preferred)'}, 'actorRef': {'type': 'string', 'description': 'Your agent/session identifier for the audit trail'}, 'customer': {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string'}, 'email': {'type': 'string'}, 'phone': {'type': 'string'}, 'timezone': {'type': 'string'}}, 'additionalProperties': False}, 'serviceId': {'type': 'string'}, 'businessId': {'type': 'string'}}, 'additionalProperties': False}
Hinzugefügt
create_mandate
17. September 2026 12:33
Hinzugefügt
get_booking
17. September 2026 12:33
Hinzugefügt
create_mandate_for_draft
17. September 2026 12:33
Hinzugefügt
prepare_booking
17. September 2026 12:33
Hinzugefügt
create_booking
17. September 2026 12:33
Hinzugefügt
get_availability
17. September 2026 12:33
Hinzugefügt
list_services
17. September 2026 12:33
Hinzugefügt
get_business
17. September 2026 12:33
Hinzugefügt
find_businesses
17. September 2026 12:33