{"serverId":"mcp-registry/org.mercantry/registry","tools":[{"name":"cancel_booking","fixed":{"name":"cancel_booking","description":"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.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["booking_id"],"properties":{"reason":{"type":"string"},"booking_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"title":"Cancel a booking"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":139,"tokensAfter":139},{"name":"get_availability","fixed":{"name":"get_availability","description":"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.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["merchant_id"],"properties":{"merchant_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Get availability (honest v1 behavior)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":136,"tokensAfter":136},{"name":"get_booking_status","fixed":{"name":"get_booking_status","description":"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.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["booking_id"],"properties":{"booking_id":{"type":"string"},"include_events":{"type":"boolean"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Get booking status"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":195,"tokensAfter":195},{"name":"get_merchant","fixed":{"name":"get_merchant","description":"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.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["merchant_id"],"properties":{"merchant_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Get merchant (full signal dump)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":132,"tokensAfter":132},{"name":"get_registry_meta","fixed":{"name":"get_registry_meta","description":"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.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true},"title":"Get registry metadata"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":118,"tokensAfter":118},{"name":"modify_booking","fixed":{"name":"modify_booking","description":"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).","inputSchema":{"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},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Modify a booking / resolve needs_input"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":249,"tokensAfter":249},{"name":"place_booking","fixed":{"name":"place_booking","description":"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 timeou","inputSchema":{"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},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Place a booking (async)"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":679,"tokensAfter":679},{"name":"search_merchants","fixed":{"name":"search_merchants","description":"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.","inputSchema":{"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},"annotations":{"readOnlyHint":true},"title":"Search merchants"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":655,"tokensAfter":655},{"name":"submit_feedback","fixed":{"name":"submit_feedback","description":"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.","inputSchema":{"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},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Submit post-visit feedback"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":245,"tokensAfter":245}],"toolsChanged":9,"tokensSaved":0,"todo":[{"tool":"cancel_booking","params":["reason","booking_id"]},{"tool":"get_availability","params":["merchant_id"]},{"tool":"get_booking_status","params":["booking_id","include_events"]},{"tool":"get_merchant","params":["merchant_id"]},{"tool":"modify_booking","params":["booking_id","party_size","window_minutes"]},{"tool":"place_booking","params":["party_size","merchant_id","special_requests"]},{"tool":"search_merchants","params":["lng","limit","offset","order_by","price_band_max","price_band_min"]},{"tool":"submit_feedback","params":["free_text","booking_id","would_repeat","seated_on_time"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}