Serveur MCP

Appointment Booking

dev.hatchloop/appointment-booking
Entreprise et opérations Public et accessible MCP 2026-07-28

Ce que fait ce MCP

Finds and verifies businesses, imports public booking links, checks availability, and supports appointment scheduling or cancellation where the booking destination is supported.

check_booking_link
Free, instant pre-flight check for a booking URL. Classifies which booking platform a URL belongs to and tells you whether import_booking_url will accept it, WITHOUT fetching the page or spending money. Returns the platform, the exact smb_id import_booking_url would assign, the channels the booking will route through, and the inferred country. Use it to de-risk a paid booking BEFORE calling import_booking_url + schedule_appointment. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': "Full http(s) URL to classify, e.g. 'https://cal.com/jane' or…"}}}
find_business
Find real businesses near a place, sorted by distance (nearest of those examined; dense areas are narrowed, see result.search). Data: OpenStreetMap (ODbL, (c) OpenStreetMap contributors, attributed per result); phone, website, hours only when mapped. Coverage varies; community-mapped, NOT verified by us; source=openstreetmap rows cannot be booked. Plus supply-network rows. If OSM is down: retriable 'temporarily unavailable', never invented rows. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['vertical', 'location'], 'properties': {'city': {'type': 'string', 'description': 'Alternative to location: a top-level city, normalised into…'}, 'region': {'type': 'string', 'description': 'Alternative to location: a top-level state/region, normalised into…'}, 'location': {'type': 'object', 'required': ['zip_or_city'], 'properties': {'zip_or_city': {'type': 'string', 'description': "City, town, address or postal code, optionally with the country, e.g. 'Nizwa, Oman'. A bare 5-digit ZIP is read as a US ZIP; give any non-US postal code with its country (e.g. '10115, Germany')."}, 'radius_miles': {'type': 'number', 'minimum': 0, 'description': 'Radius in miles (default 3.1, max 25); applies to OpenStreetMap results only.'}}, 'description': "City/town or ZIP, optionally with country ('Nizwa, Oman'). Geocoded by OSM."}, 'vertical': {'enum': ['personal_services', 'home_services', 'professional_services'], 'type': 'string'}, 'capability': {'type': 'string', 'description': "Kind of business, e.g. 'haircut', 'plumber', 'dentist'. Mapped to OSM tags."}, 'price_band': {'type': 'object', 'properties': {'max_usd': {'type': 'number'}}, 'description': 'Supply-network rows only; OpenStreetMap has no prices.'}, 'max_results': {'type': 'integer', 'default': 5, 'maximum': 20, 'minimum': 1}, 'availability_window': {'type': 'object', 'properties': {'end_iso': {'type': 'string', 'format': 'date-time'}, 'start_iso': {'type': 'string', 'format': 'date-time'}}, 'description': 'Accepted but NOT APPLIED - it does not narrow results. We do not hold live…'}}}
get_outcome
Retrieve the final OutcomeReceipt for a completed operation. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['operation_id'], 'properties': {'operation_id': {'type': 'string'}}}
get_status
Query the current state of any in-flight async operation by operation_id. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['operation_id'], 'properties': {'operation_id': {'type': 'string'}}}
import_booking_url
Turn a public booking URL into a callable smb_id for send_message and capture_lead. But schedule_appointment only completes on Cal.com bound to our one connected account — the other 11 always fail schedule_appointment honestly, uncharged. Detects 12 platforms (Cal.com, Calendly, Doctolib, Booksy, Fresha, OpenTable, Setmore, Square, Acuity, Schedulista, Squarespace, BookMyCity). Idempotent — calling twice returns the same smb_id. [free, requires key]
Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['booking_url'], 'properties': {'vertical': {'enum': ['personal_services', 'home_services', 'professional_services', 'restaurants', 'retail', 'healthcare', 'fitness'], 'type': 'string', 'description': 'If omitted, inferred from the booking platform.'}, 'booking_url': {'type': 'string', 'format': 'uri', 'description': 'Full URL the user supplied. Must point at one of the 12 supported booking…'}, 'capabilities': {'type': 'array', 'items': {'type': 'string'}, 'description': "Free-form capability tags (e.g., ['haircut','color','blowdry'])."}, 'country_code': {'type': 'string', 'description': "ISO 3166-1 alpha-2 (e.g. 'US', 'FR'); routes compliance on later sends."}, 'business_name': {'type': 'string', 'description': "If omitted, auto-extracted from the page's <title> or og:title."}, 'contact_email': {'type': 'string'}, 'contact_phone': {'type': 'string', 'description': 'If omitted, the platform integration handles outreach.'}, 'idempotency_key': {'type': 'string', 'maxLength': 128, 'description': 'Retry key: a 24h replay returns the original receipt, not re-run or charged.'}}}
preview_cost
Return an expected cost estimate, latency estimate, and success-probability estimate for a proposed call before execution. Returns the exact price when it is fixed, and a min/max range when the cost depends on channel or outcome. It does not promise an accuracy percentage - check cost_range. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['operation', 'params'], 'properties': {'params': {'type': 'object', 'description': 'The same request body you would pass to the operation'}, 'operation': {'type': 'string'}}}
schedule_appointment
Check availability, book, or cancel via Cal.com. Only completes when the SMB's imported booking link is bound to this deployment's ONE connected Cal.com account; otherwise fails honestly (booking_destination_unmapped) with no charge. No working booking path exists yet for non-Cal.com platforms (voice AI, web form) — those SMBs fail honestly instead of a fabricated confirmation. [from $0.15/call, variable] [async→get_outcome]
Destructif Accès externe
Schéma d’entrée
{'type': 'object', 'required': ['smb_id', 'action'], 'properties': {'notes': {'type': 'string'}, 'action': {'enum': ['book', 'cancel', 'check_availability'], 'type': 'string'}, 'smb_id': {'type': 'string'}, 'service': {'type': 'string'}, 'customer': {'type': 'object', 'properties': {'name': {'type': 'string'}, 'email': {'type': 'string'}, 'phone': {'type': 'string'}}}, 'requested_time': {'type': 'object', 'properties': {'preferred_iso': {'type': 'string', 'format': 'date-time'}, 'window_end_iso': {'type': 'string', 'format': 'date-time'}, 'duration_minutes': {'type': 'integer'}, 'window_start_iso': {'type': 'string', 'format': 'date-time'}}}, 'idempotency_key': {'type': 'string', 'maxLength': 128, 'description': 'Retry key: a 24h replay returns the original receipt, not re-run or charged.'}, 'existing_appointment_id': {'type': 'string', 'description': 'Required for cancel'}}}
self_test
Service health probe: runs 6 internal checks and reports how many passed. Confirms the server is up and responding - it does NOT probe each tool individually. Use to verify connectivity before production use. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'properties': {}}
verify_business
Look up what we know about a business in our supply network: its contact channels, capabilities, and when the record was last verified. This is a DIRECTORY LOOKUP - it does not contact the business. [free, no key]
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', 'required': ['smb_id'], 'properties': {'smb_id': {'type': 'string'}, 'capability_to_verify': {'type': 'string'}}}
Modifié
find_business
1 October 2026 02:43
Modifié
find_business
29 September 2026 02:50
Modifié
find_business
25 September 2026 02:50
Modifié
import_booking_url
23 September 2026 02:41
Modifié
schedule_appointment
23 September 2026 02:41
Modifié
find_business
23 September 2026 02:41
Ajouté
import_booking_url
17 September 2026 12:39
Ajouté
check_booking_link
17 September 2026 12:39
Ajouté
self_test
17 September 2026 12:39
Ajouté
preview_cost
17 September 2026 12:39
Ajouté
get_outcome
17 September 2026 12:39
Ajouté
get_status
17 September 2026 12:39
Ajouté
schedule_appointment
17 September 2026 12:39
Ajouté
verify_business
17 September 2026 12:39
Ajouté
find_business
17 September 2026 12:39