MCP Server

Mercantry Registry

org.mercantry/registry
Travel & Hospitality Public & reachable MCP 2025-11-25

What this MCP does

Searches restaurant merchants and reservation policies, places and manages asynchronous phone bookings, tracks status, and collects post-visit feedback.

cancel_booking
Cancel a booking
Cancel a booking in any non-terminal state, or a confirmed reservation (the registry notifies the merchant). Cancellation is mandatory when the human no longer wants the table — no-shows destroy merchant trust and are tracked per developer key.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['booking_id'], 'properties': {'reason': {'type': 'string'}, 'booking_id': {'type': 'string'}}, 'additionalProperties': False}
get_availability
Get availability (honest v1 behavior)
V1 does NOT hold live table availability — availability is checked on the phone call at booking time. This tool returns the merchant's reservation policy, structured hours, and holiday exceptions so you can pick a plausible time before calling place_booking.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['merchant_id'], 'properties': {'merchant_id': {'type': 'string'}}, 'additionalProperties': False}
get_booking_status
Get booking status
State machine position for a booking: pending → queued → in_progress → confirmed | failed | needs_input (plus cancelled). Includes structured details on confirmation (confirmed_time, confirmation_code, merchant_instructions), structured failure reason (no_answer | fully_booked | closed | policy_mismatch | merchant_declined | bad_data), or needs_input options awaiting your decision. include_events=true returns the full audit log.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['booking_id'], 'properties': {'booking_id': {'type': 'string'}, 'include_events': {'type': 'boolean'}}, 'additionalProperties': False}
get_merchant
Get merchant (full signal dump)
Every field the registry holds on one merchant: schema fields, structured hours, raw feedback history, platform-observed operational stats, and per-field provenance with timestamps. Maximal data, zero opinion — the registry never scores or ranks.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['merchant_id'], 'properties': {'merchant_id': {'type': 'string'}}, 'additionalProperties': False}
get_registry_meta
Get registry metadata
Evaluate the registry itself: per-city coverage (with each city's IANA timezone), merchant/bookable counts, verification and freshness stats, feedback corpus size, schema version, and the documented deterministic ordering rule. Honest by design — including how stale the data is.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
modify_booking
Modify a booking / resolve needs_input
Amend a booking before or after the call. For a booking in needs_input: pass accept_option_index to take one of the merchant's offered times (confirms immediately), or pass a new datetime/party_size to re-queue an amended request. Modifying an already-confirmed booking cancels it and books the new request (new booking_id returned).
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['booking_id'], 'properties': {'datetime': {'type': 'string', 'description': "New requested time, ISO-8601; naive means the merchant's local wall time"}, 'booking_id': {'type': 'string'}, 'party_size': {'type': 'integer', 'minimum': 1}, 'window_minutes': {'type': 'integer', 'maximum': 240, 'minimum': 0}, 'accept_option_index': {'type': 'integer', 'minimum': 0, 'description': 'Index into needs_input_options to accept'}}, 'additionalProperties': False}
place_booking
Place a booking (async)
Request a table reservation. Returns booking_id with state 'queued' immediately; fulfillment is asynchronous (a call is placed to the merchant). Poll get_booking_status or supply callback_url for webhooks. RETRY SAFETY: pass a unique client_reference_id (recommended: always); if this call times out or errors ambiguously, retry with the SAME client_reference_id and the registry returns the already-created booking instead of double-booking the restaurant. Never re-call place_booking after a timeout without one. If the merchant counter-offers a time within window_minutes and accept_within_window=true, it is auto-accepted (recommended). Otherwise the booking pauses in needs_input for you to resolve via modify_booking. Merchants on the human_call channel are fulfilled by a human operator during the operator window published in get_registry_meta — those bookings queue until worked (up to the channel SLA), so book ahead rather than for the next hour.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['merchant_id', 'party_size', 'datetime', 'reservation_name'], 'properties': {'contact': {'type': 'string', 'description': 'Optional phone/email for confirmation relay to the end human'}, 'datetime': {'type': 'string', 'description': "Requested time, ISO-8601. Naive ('2026-07-18T19:00') means the merchant's LOCAL wall time (see the merchant's timezone field); an explicit offset ('2026-07-18T19:00:00+09:00') is also accepted"}, 'party_size': {'type': 'integer', 'minimum': 1}, 'merchant_id': {'type': 'string'}, 'callback_url': {'type': 'string', 'format': 'uri', 'description': 'Webhook URL for booking state-change events'}, 'window_minutes': {'type': 'integer', 'maximum': 240, 'minimum': 0, 'description': 'Acceptable +/- window around datetime'}, 'sandbox_outcome': {'enum': ['confirmed', 'no_answer', 'counter_offer', 'fully_booked', 'merchant_declined', 'bad_data'], 'type': 'string', 'description': "TEST ONLY, sandbox merchants (sandbox: true): force the simulated call's result so you can exercise a specific branch on demand — confirmed, no_answer (retries then fails), counter_offer (pauses in needs_input), fully_booked, merchant_declined, bad_data. Rejected for real merchants; omit it in production"}, 'reservation_name': {'type': 'string', 'description': 'Name for the reservation'}, 'special_requests': {'type': 'string', 'maxLength': 280}, 'client_reference_id': {'type': 'string', 'maxLength': 128, 'minLength': 1, 'description': 'Your unique ID for this booking request (a UUID is ideal). Retrying with the same value returns the existing booking (idempotent_replay: true) instead of creating a duplicate; the same value with different parameters is rejected as client_reference_conflict'}, 'accept_within_window': {'type': 'boolean', 'description': 'Auto-accept merchant counter-offers inside the window (recommended: true)'}}, 'additionalProperties': False}
search_merchants
Search merchants
Filter-based search over the restaurant registry (coverage cities + timezones in get_registry_meta). NOT ranked: results come back in deterministic order (merchant_id ASC by default; distance ASC when lat/lng given and order_by="distance"). Returns compact records with pagination. Use get_merchant for the full signal dump on a specific merchant. All filters are optional and combinable.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'description': 'Latitude for geo-radius filter (requires lng and radius_km)'}, 'lng': {'type': 'number'}, 'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'offset': {'type': 'integer', 'minimum': 0}, 'open_at': {'type': 'string', 'description': "ISO-8601 datetime; only merchants open at this time. With an explicit offset ('2026-07-18T19:00:00+09:00' or trailing Z) the instant is evaluated in each merchant's own timezone; without one it means each merchant's local wall clock"}, 'sandbox': {'type': 'boolean', 'description': 'Filter by merchant kind. true = sandbox test merchants only (safe integration targets: they book end-to-end and return a SIMULATED confirmation, never dialing a real venue). false = real merchants only — use this for any booking a human will act on. Omitted = both. Every result carries `sandbox`; never present a sandbox confirmation to a user as a real reservation.'}, 'order_by': {'enum': ['merchant_id', 'distance'], 'type': 'string'}, 'radius_km': {'type': 'number', 'description': 'Radius in km around lat/lng'}, 'party_size': {'type': 'integer', 'minimum': 1, 'description': 'Only merchants that can seat this party size'}, 'cuisine_tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "Match ANY of these cuisines, e.g. ['japanese','korean']"}, 'neighborhood': {'type': 'string', 'description': "Exact neighborhood name, e.g. 'Mission'"}, 'bookable_only': {'type': 'boolean', 'description': 'Only merchants the registry can book right now (phone-verified, accepts reservations, not opted out)'}, 'attribute_tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "Match ALL of these attributes, e.g. ['outdoor_seating','vegetarian_friendly']"}, 'price_band_max': {'type': 'integer', 'maximum': 4, 'minimum': 1}, 'price_band_min': {'type': 'integer', 'maximum': 4, 'minimum': 1}}, 'additionalProperties': False}
submit_feedback
Submit post-visit feedback
Report how a confirmed reservation actually went. Accepted only against a confirmed booking_id, once per booking, within 14 days of confirmation. Structured fields first; optional free text ≤ 500 chars. This corpus is served raw to all agents via get_merchant — it is never editorialized or turned into a score.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['booking_id', 'reservation_honored'], 'properties': {'free_text': {'type': 'string', 'maxLength': 500}, 'booking_id': {'type': 'string'}, 'would_repeat': {'type': 'boolean'}, 'seated_on_time': {'type': 'boolean'}, 'matched_description': {'type': 'boolean', 'description': "Did the merchant match the registry's description?"}, 'reservation_honored': {'type': 'boolean', 'description': 'Did the merchant honor the reservation?'}}, 'additionalProperties': False}
Added
get_registry_meta
Sept. 17, 2026, 12:54 p.m.
Added
submit_feedback
Sept. 17, 2026, 12:54 p.m.
Added
cancel_booking
Sept. 17, 2026, 12:54 p.m.
Added
modify_booking
Sept. 17, 2026, 12:54 p.m.
Added
get_booking_status
Sept. 17, 2026, 12:54 p.m.
Added
place_booking
Sept. 17, 2026, 12:54 p.m.
Added
get_availability
Sept. 17, 2026, 12:54 p.m.
Added
get_merchant
Sept. 17, 2026, 12:54 p.m.
Added
search_merchants
Sept. 17, 2026, 12:54 p.m.