_ registry / mcp streamable-http · checked 1h ago

Thmenu

https://mcp.thmenu.com

Registry code: 33fa0791462cbf26

api record

Restaurant menus, carts, reservations and owner drafts for AI agents (Thmenu MCP).

from a public catalogue that lists it, not from the operator

endpoint
https://mcp.thmenu.com
protocol
streamable-http ·2025-03-26
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is Thmenu live?
Yes — it answered the hub's last check (checked 1h ago). It answered 99% of checks over the last 30 days.
Is Thmenu free to use?
Partly — some of its tools are open, others need a key or payment.
What tools does Thmenu have?
27 tools: place_order, request_bill, join_loyalty, cancel_reservation, get_restaurant, get_restaurant_menu, waiter_call, get_cart, ….
Is Thmenu safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
99%

90 days 99.2%· all time 99.2%

latency
574ms

last good check

priced tools
0

of 27 tools

_ answered our checks, 90 days 388 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
_ what it is for
used for
  • search restaurants and menus
  • place a takeaway order
  • request a table reservation
  • check loyalty points
  • draft menu descriptions
takes → gives
text, data → data
tools
14 reads9 changes data1 moves money1 sends messages
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 27 tools
4 open5 auth-required 18 never probed 9 of 27 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • get_faq reads open 20h ago

    Return the FAQ entries from the public /faq page in the requested locale (31 locales; unknown locale falls back to en and the response says which locale was served). Useful for grounding answers to common product questions.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "locale": {
          "type": "string",
          "default": "en"
        }
      }
    }
    arguments 9 lines
  • get_pricing reads open 20h ago

    Return Thmenu's commercial model as structured facts: free forever, every feature included, no subscription and no trial; the only charge is a platform fee in basis points on payment volume processed through Thmenu (the payment processor's own fee is separate); cash or external payments carry no Thmenu fee. Generated from the code that charges it — safe to cache.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • search_restaurants reads open 23h ago

    Search the public directory (opt-in venues only) by location, opening status, cuisine, dietary options, declared attributes, ordering channel, declared price level and menu language — whether a guest can pay online through Thmenu and, right now, a free table or an open waitlist (the restaurant graph's channel states). Neutral ranking (AI-K6): distance in 0.5 km bands when `near` is given → availability (open now first; unknown hours before closed; a venue in holiday mode counts as closed) → profile freshness (owner-verified within 90 days first) → name. Payment to Thmenu never affects order. Cuisine, dietary, price level and other attributes are owner declarations, not verified facts; venues without a declaration are excluded only when an attribute or price filter is used, and venues without coordinates only when `near` is used. Returns slug, name, city, country, distance_km, is_open_now (serve-time, in the venue's own timezone; null when hours are unknown; false while the venue is in holiday mode), channels (order · reservation · pickup · delivery), declared attributes, freshness and the menu URL. Paginated.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "q": {
          "type": "string",
          "description": "Free text over name and description (min 2 chars)."
        },
        "city": {
          "type": "string"
        },
        "near": {
          "type": "object",
          "required": [
            "lat",
            "lng"
          ],
          "properties": {
            "lat": {
              "type": "number"
            },
            "lng": {
              "type": "number"
            }
          },
          "description": "Search centre. Venues without coordinates are excluded when set."
        },
        "page": {
          "type": "integer",
          "default": 1,
          "minimum": 1
        },
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 50,
          "minimum": 1
        },
        "channel": {
          "enum": [
            "order",
            "reservation",
            "pickup",
            "delivery"
          ],
          "type": "string",
          "description": "order = digital ordering at the table; reservation; pickup = takeaway; delivery = venue's own delivery."
        },
        "country": {
          "type": "string",
          "description": "ISO 3166-1 alpha-2"
        },
        "cuisine": {
          "type": "array",
          "items": {
            "enum": [
              "turkish",
              "kebab",
              "ottoman",
              "anatolian",
              "aegean",
              "black_sea",
              "mediterranean",
              "middle_eastern",
              "lebanese",
              "persian",
              "georgian",
              "greek",
              "balkan",
              "romanian",
              "polish",
              "eastern_european",
              "russian",
              "italian",
              "pizza",
              "pasta",
              "french",
              "spanish",
              "tapas",
              "portuguese",
              "german",
              "austrian",
              "british",
              "irish",
              "scandinavian",
              "dutch",
              "american",
              "burger",
              "steakhouse",
              "bbq",
              "tex_mex",
              "mexican",
              "latin_american",
              "brazilian",
              "peruvian",
              "caribbean",
              "japanese",
              "sushi",
              "ramen",
              "chinese",
              "korean",
              "thai",
              "vietnamese",
              "indian",
              "pakistani",
              "indonesian",
              "malaysian",
              "filipino",
              "african",
              "ethiopian",
              "moroccan",
              "seafood",
              "grill",
              "vegetarian",
              "vegan",
              "healthy",
              "cafe",
              "coffee",
              "tea_house",
              "bakery",
              "patisserie",
              "dessert",
              "ice_cream",
              "breakfast_brunch",
              "fast_food",
              "street_food",
              "fusion",
              "international",
              "fine_dining",
              "bistro",
              "pub",
              "bar",
              "wine_bar",
              "cocktail_bar",
              "juice_bar",
              "food_court"
            ],
            "type": "string"
          },
          "description": "All listed cuisines must be declared by the venue."
        },
        "dietary": {
          "type": "array",
          "items": {
            "enum": [
              "vegetarian_options",
              "vegan_options",
              "gluten_free_options",
              "lactose_free_options",
              "halal",
              "kosher"
            ],
            "type": "string"
          },
          "description": "Owner declaration, not a certification."
        },
        "open_now": {
          "type": "boolean",
          "default": false,
          "description": "Only venues open right now in their own timezone; venues with unknown hours are excluded when true."
        },
        "waitlist": {
          "type": "boolean",
          "default": false,
          "description": "Only venues whose waitlist is open now (WAITLIST_AVAILABLE): the reservations switch, which also opens the waitlist, and the venue open now — not in holiday mode."
        },
        "price_max": {
          "type": "integer",
          "maximum": 4,
          "minimum": 1,
          "description": "Owner-declared price level 1–4 (schema.org priceRange \"$\" … \"$$$$\"): venues at or below it. Venues that declared no level are excluded when set."
        },
        "radius_km": {
          "type": "number",
          "default": 10,
          "maximum": 100,
          "minimum": 0.5
        },
        "attributes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Any declared attribute token (meals, family, outdoor, accessibility, cuisine, dietary)."
        },
        "menu_language": {
          "enum": [
            "tr",
            "en",
            "de",
            "fr",
            "es",
            "it",
            "nl",
            "pt",
            "ru",
            "ar",
            "zh",
            "ja",
            "ko",
            "pl",
            "sv",
            "da",
            "fi",
            "no",
            "cs",
            "hu",
            "ro",
            "bg",
            "el",
            "hr",
            "sk",
            "sl",
            "lt",
            "lv",
            "he",
            "fa",
            "sw"
          ],
          "type": "string",
          "description": "The menu can be read in this language: it is the menu's source language, or at least 90 % of the guest menu's dish names are translated into it (the restaurant graph's rule)."
        },
        "table_available": {
          "type": "boolean",
          "default": false,
          "description": "Only venues open now with a table that staff marked ready on the live table board (TABLE_AVAILABLE). Venues not using the board are excluded: unknown is not \"available\"."
        },
        "payment_available": {
          "type": "boolean",
          "default": false,
          "description": "Only venues where a guest can pay online through Thmenu (PAYMENT_AVAILABLE): the venue's online-payment switch is on, online payment through Thmenu works in its country, and the payment provider has not reported the account unable to take payments."
        }
      }
    }
    arguments 233 lines
  • list_public_menus reads open 23h ago

    List restaurants that have opted into the public directory (directory_opt_in = 1 — the same flag the owner sets under "AI visibility"). Returns slug, name, city, country, and the menu URL. Paginated.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "page": {
          "type": "integer",
          "default": 1,
          "minimum": 1
        },
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 50,
          "minimum": 1
        }
      }
    }
    arguments 16 lines
  • reservation_summary reads auth-required 5h ago

    Reservation requests of your restaurant for the next 14 days grouped by day and status, with pending requests that still need an answer. Read-only; no guest contact details.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • apply_promo reads auth-required 5h ago

    Validate a promo code (eligibility preview only — does NOT reserve a slot). Returns valid=true with discount info when the code is currently redeemable; pass the same code as place_order.promo_code to actually apply + redeem it (the slot is consumed only when the order lands).

    mcp-tool

    {
      "type": "object",
      "required": [
        "agent_session_id",
        "code"
      ],
      "properties": {
        "code": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "agent_session_id": {
          "type": "string"
        }
      }
    }
    arguments 17 lines
  • menu_audit reads auth-required 5h ago

    List the active products of your restaurant that lack a usable description, an image, or an allergen declaration. Read-only; nothing is changed.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • sales_summary reads auth-required 23h ago

    Order counts by status, order total sums, top products by quantity and busiest hours for the last 7 and 30 days of your restaurant. Read-only.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • check_loyalty reads auth-required 1h ago

    Look up a loyalty member by member_id. Returns balance, tier, lifetime_points, and the most recent 10 transactions so the agent can ground its recommendation ("you have 320 points, enough for a free coffee").

    mcp-tool

    {
      "type": "object",
      "required": [
        "agent_session_id",
        "member_id"
      ],
      "properties": {
        "member_id": {
          "type": "string"
        },
        "agent_session_id": {
          "type": "string"
        }
      }
    }
    arguments 15 lines
  • place_order moves money unknown never probed

    Place an order against the agent_session_id from start_order_session. Atomically inserts the order + items, applies server-side canonical pricing + tax (do NOT trust the unit_price you compute — we re-read it from D1), decrements inventory and optionally redeems a promo code. The guest pays at the venue (payment_status 'unpaid'). At a venue that takes payment before preparing (pay_first: true) the order is held as 'awaiting' and payment_url is returned: give it to the guest — they pay on the restaurant's own checkout, exactly like a guest ordering from the table; the kitchen gets the order once it is paid, and an unpaid order expires. This tool never charges anything itself. Options (size, doneness, extras …): get_restaurant_menu lists each dish's option_groups; send the chosen option ids per line as modifier_option_ids — each option's price_delta is added to the dish price on the server. A group with required: true needs at least max(1, min_select) of its options and no group takes more than max_select. A line that breaks this is refused and nothing is ordered: modifier_required (a required group left empty), modifier_too_many, modifier_unknown_option (an id the dish does not offer), modifier_malformed (not a list of option ids); the error data names the product_id and group_id. Ask the guest, or leave that dish out. Returns order_id, total_cents (tax-inclusive), currency, promo_discount and, when pay_first, payment_url. Idempotency-Key header REQUIRED.

    mcp-tool

    {
      "type": "object",
      "required": [
        "agent_session_id",
        "items"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Optional order-level note (max 500 chars)."
        },
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "product_id",
              "quantity"
            ],
            "properties": {
              "quantity": {
                "type": "integer",
                "maximum": 999,
                "minimum": 1
              },
              "product_id": {
                "type": "string"
              },
              "modifier_option_ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 128,
                  "minLength": 1
                },
                "maxItems": 50,
                "description": "Chosen option ids for this line, from the dish's option_groups in get_restaurant_menu (all groups flat). Required groups must be filled; omit when the dish has no option the guest chose."
              }
            }
          },
          "maxItems": 100,
          "minItems": 1
        },
        "table_id": {
          "type": "string",
          "description": "Optional table id when ordering at a table."
        },
        "guest_name": {
          "type": "string",
          "description": "Optional guest name shown to staff with the order."
        },
        "order_type": {
          "enum": [
            "dine_in",
            "takeaway"
          ],
          "type": "string",
          "description": "Channel: 'dine_in' (default — at a table) or 'takeaway' (pickup; requires customer_name + customer_phone, ignores table_id, only when the restaurant has takeaway enabled — else channel_not_available). Delivery is not offered to agents."
        },
        "promo_code": {
          "type": "string",
          "maxLength": 64,
          "description": "Optional promo code to redeem at order time (validate first with apply_promo). The redemption slot is consumed only when this order lands."
        },
        "customer_name": {
          "type": "string",
          "maxLength": 80,
          "description": "Required for takeaway — who picks the order up."
        },
        "customer_phone": {
          "type": "string",
          "maxLength": 24,
          "description": "Required for takeaway — reachable phone (digits, +, spaces/dashes tolerated)."
        },
        "agent_session_id": {
          "type": "string"
        }
      }
    }
    arguments 79 lines
  • request_bill sends messages unknown never probed

    Ask the venue to bring the bill for a table. INSERTs a bill_requests row + fires the admin push notification. The split_type defaults to "full"; pass "personal" for German-style per-device splits.

    mcp-tool

    {
      "type": "object",
      "required": [
        "agent_session_id",
        "table_id"
      ],
      "properties": {
        "note": {
          "type": "string",
          "maxLength": 500
        },
        "table_id": {
          "type": "string"
        },
        "split_type": {
          "enum": [
            "full",
            "personal"
          ],
          "type": "string",
          "default": "full"
        },
        "agent_session_id": {
          "type": "string"
        }
      }
    }
    arguments 27 lines
  • join_loyalty changes data unknown never probed

    Loyalty sign-up for a guest. The guest must confirm their own e-mail, so joining happens on the restaurant's menu (My thmenu → Loyalty); this tool answers with that instruction and never reveals whether an e-mail or phone is already enrolled. Requires an active agent_session_id.

    mcp-tool

    {
      "type": "object",
      "required": [
        "agent_session_id"
      ],
      "properties": {
        "email": {
          "type": "string",
          "description": "Not used for a lookup; the guest confirms their e-mail on the menu."
        },
        "phone": {
          "type": "string",
          "description": "Not used for a lookup."
        },
        "display_name": {
          "type": "string",
          "description": "Not used."
        },
        "agent_session_id": {
          "type": "string",
          "description": "Active session id from start_order_session."
        }
      }
    }
    arguments 24 lines
  • cancel_reservation changes data unknown never probed

    Cancel a reservation using the 6-character confirmation code the GUEST received by email/SMS (the code is the authorisation; ask the guest for it — this tool never issues or reveals codes). Thin wrapper over the venue's own cancellation endpoint, which answers uniformly: `status` is "cancelled" or "noop" (unknown code · already cancelled · seated/completed · less than 30 minutes away — it does not say which). Only report a cancellation to the guest when `cancelled` is true. PUBLIC tool, no auth.

    mcp-tool

    {
      "type": "object",
      "required": [
        "confirmation_code"
      ],
      "properties": {
        "confirmation_code": {
          "type": "string",
          "maxLength": 12,
          "minLength": 6
        }
      }
    }
    arguments 13 lines
  • get_restaurant unknown 26h ago

    Fetch a public restaurant profile by slug: name, description, address/city/country, currency, timezone, phone, menu URL, opening hours (7 days, minutes from midnight; a close_minute above 1440 ends after midnight on the next day, e.g. 1560 = 02:00) with isOpenNow evaluated in the venue's own timezone (null when hours are unknown), owner-declared attributes (cuisine, dietary, …; null = not declared, never "no"), derived channels (order · reservation · pickup · delivery), policies derived from the venue's settings (ordering accepted / holiday mode / staff approval / payment timing / scheduled orders, takeaway & delivery ETA and fees, reservation party cap, table calls, tip cap), per-field owner verification timestamps, categories and product count, and `graph` — the canonical Restaurant Graph node's agent fields: verification state (UNCLAIMED · CLAIMED · SUSPENDED · HIDDEN; VERIFIED only when a human verified it), channel_states (each channel true/false/null with a reason — null means unknown, never "no"; TABLE_AVAILABLE only from tables staff confirmed ready), menu languages with coverage, and payment availability. Only restaurants opted into the public directory are visible.

    mcp-tool

    {
      "type": "object",
      "required": [
        "slug"
      ],
      "properties": {
        "slug": {
          "type": "string",
          "description": "Restaurant slug, e.g. lily-rose-bistro"
        }
      }
    }
    arguments 12 lines
  • get_restaurant_menu reads unknown 1h ago

    Fetch the full public menu for a restaurant — categories, products, prices, option groups, allergens, nutrition. Use this to build the cart you pass to place_order. PUBLIC tool, no auth required. Each product carries `option_groups` (id, name, required, min_select, max_select, options[{id, name, price_delta}]); pass the chosen option ids as items[].modifier_option_ids to place_order or to create_cart (the anonymous cart the guest confirms) — a required group must be filled or the order or cart is refused. `allergen_codes` are EU 1169/2011 Annex II keys (gluten, crustaceans, eggs, fish, peanuts, soy, milk, nuts, celery, mustard, sesame, sulphites, lupin, molluscs) given ONLY when the venue's allergen name matches the regulation list exactly; a venue-specific allergen appears in `allergens` without a code. Allergen lists come from the venue (or were AI-suggested and then saved by the venue where `allergen_disclosure.source` says so). `allergen_disclosure.as_of` is when the venue last edited the item record, not a verification date. Follow the top-level `disclosure.agent_instructions`; show `disclosure.text` to the guest in their language whenever an allergen or dietary question comes up; `dietary_flags` only ever warn (true) — null is unknown, never "free of".

    mcp-tool

    {
      "type": "object",
      "required": [
        "restaurant_id"
      ],
      "properties": {
        "locale": {
          "type": "string",
          "default": "en"
        },
        "restaurant_id": {
          "type": "string"
        }
      }
    }
    arguments 15 lines
  • waiter_call unknown never probed

    Flag a waiter to the table. INSERTs a waiter_calls row + fires the admin push notification. Pass an optional human-readable message (max 500 chars) the staff sees in the dashboard.

    mcp-tool

    {
      "type": "object",
      "required": [
        "agent_session_id",
        "table_id"
      ],
      "properties": {
        "message": {
          "type": "string",
          "maxLength": 500
        },
        "table_id": {
          "type": "string"
        },
        "agent_session_id": {
          "type": "string"
        }
      }
    }
    arguments 19 lines
  • get_cart reads unknown 26h ago

    Read an anonymous cart by cart_id: state (open · consumed · expired), the one-time confirmation link while open, lines re-priced from the live menu, and the order id once the guest has confirmed. PUBLIC tool, no auth.

    mcp-tool

    {
      "type": "object",
      "required": [
        "cart_id"
      ],
      "properties": {
        "cart_id": {
          "type": "string",
          "pattern": "^[a-f0-9]{32}$"
        }
      }
    }
    arguments 12 lines
  • request_reservation changes data unknown never probed

    Create an anonymous reservation REQUEST (date-time, party size, note) for a listed restaurant and get a one-time confirmation link. PUBLIC tool, no auth. Send the guest to confirm_url: they enter their name and email or phone there and submit the request themselves — never through this tool. The restaurant then confirms or declines; the guest receives the confirmation code by email/SMS. A reservation is a REQUEST that the restaurant confirms; no per-slot capacity cap is configured, so busy_count is informational only. Never tell the guest a table is guaranteed or "available" — say the request will be sent and the restaurant will confirm.

    mcp-tool

    {
      "type": "object",
      "required": [
        "restaurant",
        "reserved_at",
        "party_size"
      ],
      "properties": {
        "note": {
          "type": "string",
          "maxLength": 300,
          "description": "Occasion, seating preference, accessibility needs. Do not put the guest's name, phone or email here."
        },
        "party_size": {
          "type": "integer",
          "maximum": 50,
          "minimum": 1
        },
        "restaurant": {
          "type": "string"
        },
        "reserved_at": {
          "type": "string",
          "description": "ISO date-time; at least 30 minutes ahead, at most 90 days."
        }
      }
    }
    arguments 27 lines
  • draft_product_description changes data unknown never probed

    Propose a new description for one of your products. Nothing goes live: the text is saved as a DRAFT change set the owner reviews, previews and publishes (or discards) in the admin panel.

    mcp-tool

    {
      "type": "object",
      "required": [
        "product_id",
        "description"
      ],
      "properties": {
        "product_id": {
          "type": "string",
          "description": "Product id from menu_audit or get_restaurant_menu."
        },
        "description": {
          "type": "string",
          "maxLength": 2000,
          "description": "Proposed description in the menu language. Plain text, no links, no claims you cannot verify."
        }
      },
      "additionalProperties": false
    }
    arguments 19 lines
  • search_products reads unknown 1h ago

    Search products inside a single restaurant by keyword. Returns up to 20 matching products with name, description, price, allergen tags, and the deep-link URL. Restaurant must be in the public directory.

    mcp-tool

    {
      "type": "object",
      "required": [
        "slug",
        "query"
      ],
      "properties": {
        "slug": {
          "type": "string",
          "description": "Restaurant slug."
        },
        "limit": {
          "type": "integer",
          "default": 10,
          "maximum": 20,
          "minimum": 1
        },
        "query": {
          "type": "string",
          "description": "Free-text search across name + description."
        },
        "locale": {
          "type": "string",
          "default": "en"
        }
      }
    }
    arguments 27 lines
  • start_order_session changes data unknown never probed

    Open a 30-minute transactional window for an AI agent against a specific restaurant. Returns an agent_session_id you MUST pass to every downstream order tool (place_order, cancel_order, request_bill, waiter_call, apply_promo). Also returns the customer-facing confirmation URL — share it with the human so they can review the cart before checkout.

    mcp-tool

    {
      "type": "object",
      "required": [
        "restaurant_id"
      ],
      "properties": {
        "restaurant_id": {
          "type": "string",
          "description": "Canonical restaurant id from get_restaurant or search_products."
        }
      }
    }
    arguments 12 lines
  • cancel_order changes data unknown never probed

    Cancel an order placed via the same agent_session_id. Atomic — only succeeds while the order is still in "pending" or "confirmed" (the early KDS-accept state). Once the kitchen starts preparing, you must escalate to waiter_call. Idempotent: replays return the original outcome. Idempotency-Key header REQUIRED.

    mcp-tool

    {
      "type": "object",
      "required": [
        "agent_session_id",
        "order_id"
      ],
      "properties": {
        "order_id": {
          "type": "string"
        },
        "agent_session_id": {
          "type": "string"
        }
      }
    }
    arguments 15 lines
  • get_order_status reads unknown never probed

    Poll the current status of an order. Returns status, prepared_items_count, total_items_count, eta_minutes (if available), and an optional customer-facing message. Safe to call every 30 seconds; do NOT poll faster.

    mcp-tool

    {
      "type": "object",
      "required": [
        "agent_session_id",
        "order_id"
      ],
      "properties": {
        "order_id": {
          "type": "string"
        },
        "agent_session_id": {
          "type": "string"
        }
      }
    }
    arguments 15 lines
  • create_cart changes data unknown never probed

    Build an anonymous takeaway or delivery cart for a listed restaurant and get a one-time confirmation link for the guest. PUBLIC tool, no auth. Table orders are not supported here (they stay on the QR menu). Options (size, doneness, extras …): get_restaurant_menu lists each dish's option_groups; send the chosen option ids per line as items[].modifier_option_ids — the quote adds each option's price_delta and the confirmation page orders the same choice. A group with required: true needs at least max(1, min_select) of its options and no group takes more than max_select; a line that breaks this refuses the cart and nothing is created: modifier_required (a required group left empty), modifier_too_many, modifier_unknown_option (an id the dish does not offer), or invalid_input with detail.reason modifier_malformed (not a list of option ids); the error detail names the product_id and group_id. The same dish with different options goes on separate lines. Send the guest to confirm_url. Prices are re-read there from the live menu; name, phone, delivery address and payment are entered by the guest on that page — never through this tool. Nothing is ordered until the guest confirms. The link expires 30 minutes after creation and can be used once.

    mcp-tool

    {
      "type": "object",
      "required": [
        "restaurant",
        "order_type",
        "items"
      ],
      "properties": {
        "note": {
          "type": "string",
          "maxLength": 500,
          "description": "Order-level note for the kitchen. Do not put the guest's name, phone or address here."
        },
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "product_id",
              "quantity"
            ],
            "properties": {
              "note": {
                "type": "string",
                "maxLength": 200
              },
              "quantity": {
                "type": "integer",
                "maximum": 99,
                "minimum": 1
              },
              "product_id": {
                "type": "string"
              },
              "modifier_option_ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 128,
                  "minLength": 1
                },
                "maxItems": 50,
                "description": "Chosen option ids for this line, from the dish's option_groups in get_restaurant_menu (all groups flat). Required groups must be filled; omit when the guest chose no option."
              }
            }
          },
          "maxItems": 50,
          "minItems": 1
        },
        "order_type": {
          "enum": [
            "takeaway",
            "delivery"
          ],
          "type": "string"
        },
        "restaurant": {
          "type": "string",
          "description": "Restaurant slug (from search_restaurants / list_public_menus) or id."
        },
        "scheduled_for": {
          "type": "string",
          "description": "ISO date-time for a scheduled pickup/delivery (optional; the venue may refuse on the confirmation page)."
        }
      }
    }
    arguments 66 lines
  • draft_site_text changes data unknown never probed

    Propose the public website text of your restaurant — tagline, about paragraph, SEO title and SEO description — as a DRAFT change set. Only declared facts are allowed: no numbers, awards, links or markup; validation rejects anything else. The owner publishes from the admin panel.

    mcp-tool

    {
      "type": "object",
      "required": [
        "tagline",
        "about",
        "seo_title",
        "seo_description"
      ],
      "properties": {
        "about": {
          "type": "string",
          "maxLength": 700
        },
        "tagline": {
          "type": "string",
          "maxLength": 80
        },
        "seo_title": {
          "type": "string",
          "maxLength": 60
        },
        "seo_description": {
          "type": "string",
          "maxLength": 160
        }
      },
      "additionalProperties": false
    }
    arguments 28 lines
  • draft_translation changes data unknown never probed

    Propose a translation (name and/or description) of one product or category into one menu language. Nothing goes live: it is saved as a DRAFT change set the owner reviews and publishes in the admin panel; manual translations override machine translation once published.

    mcp-tool

    {
      "type": "object",
      "required": [
        "entity",
        "entity_id",
        "locale"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 2000,
          "description": "Translated name (optional). Keep brand names as they are."
        },
        "entity": {
          "enum": [
            "product",
            "category"
          ],
          "type": "string"
        },
        "locale": {
          "enum": [
            "tr",
            "en",
            "de",
            "fr",
            "es",
            "it",
            "nl",
            "pt",
            "ru",
            "ar",
            "zh",
            "ja",
            "ko",
            "pl",
            "sv",
            "da",
            "fi",
            "no",
            "cs",
            "hu",
            "ro",
            "bg",
            "el",
            "hr",
            "sk",
            "sl",
            "lt",
            "lv",
            "he",
            "fa",
            "sw"
          ],
          "type": "string",
          "description": "Target menu language (two letters), different from the menu source language."
        },
        "entity_id": {
          "type": "string",
          "description": "Product or category id from get_restaurant_menu / menu_audit."
        },
        "description": {
          "type": "string",
          "maxLength": 2000,
          "description": "Translated description (optional). Plain text, no links, same meaning as the source — never add ingredients or claims."
        }
      },
      "additionalProperties": false
    }
    arguments 69 lines
  • get_reservation_slots reads unknown 26h ago

    List bookable 30-minute reservation slots for the next 1–7 days (venue timezone) for a listed restaurant with a reservation module. busy_count is the number of existing requests at that slot and is informational. A reservation is a REQUEST that the restaurant confirms; no per-slot capacity cap is configured, so busy_count is informational only. Never tell the guest a table is guaranteed or "available" — say the request will be sent and the restaurant will confirm. PUBLIC tool, no auth.

    mcp-tool

    {
      "type": "object",
      "required": [
        "restaurant"
      ],
      "properties": {
        "days": {
          "type": "integer",
          "default": 2,
          "maximum": 7,
          "minimum": 1
        },
        "restaurant": {
          "type": "string"
        }
      }
    }
    arguments 17 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 33fa0791462cbf26.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/33fa0791462cbf26/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/33fa0791462cbf26/badge.svg)](https://brick.blue/agent/33fa0791462cbf26?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.