Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Thmenu

REMOTE · MCP.THMENU.COM

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

Available components

+1 this week 75 Trust /100

Last scanned (7 hours ago)

Scores higher than 64% of remote servers

Reachable. Last reached 5 Nov 2026.

Category E-commerce

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security60
Transport & Reachability100
Schema Quality & AI Usability70
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 4140 tokens (~153/item across 27 items; 27 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage83
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 49% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 27 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 27 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities40
  • Spec-recency check failed: implements MCP spec 2025-03-26; the latest is 2026-07-28. See how to fix → Fail
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 31 Oct 26 +1
    • Stability: 0.97 → pass security
  • 30 Oct 26 0
    • Tool “create_cart” rewrote its description, which is the text the model reads security
    • Tool “get_restaurant_menu” rewrote its description, which is the text the model reads security
    • Tool “place_order” rewrote its description, which is the text the model reads security
    • Tool “search_restaurants” rewrote its description, which is the text the model reads security
    • Schema quality: 136 → 153 ▼ functional
    • “search_restaurants” added an optional parameter “payment_available” cosmetic
  • 28 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

  • 26 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

  • 24 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

  • 22 Oct 26 0
    • Tool “place_order” rewrote its description, which is the text the model reads security
  • 21 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

  • 19 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://mcp.thmenu.com/

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=thmenu.com CN=WE1,O=Google Trust Services,C=US 13 Sept 2026 12 Dec 2026 ECDSA 256 ECDSA-SHA256 c3cec374953f1b5813e1e9bf2c82f21d
SANs: thmenu.com, *.thmenu.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of mcp.thmenu.com. — Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
thmenu.com. present 2371 13 Verified
mcp.thmenu.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.thmenu.com/ Verified 200
http (plaintext) http://mcp.thmenu.com/ HTTPS enforced 301 https://mcp.thmenu.com/
MCP tools · 27 exposed · ~4,140 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
apply_promo ~82

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).

NameTypeReqDescription
agent_session_idstringyes–
codestringyes–

No output schema declared.

No examples provided.

cancel_order ~93

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.

NameTypeReqDescription
agent_session_idstringyes–
order_idstringyes–

No output schema declared.

No examples provided.

cancel_reservation ~128

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.

NameTypeReqDescription
confirmation_codestringyes–

No output schema declared.

No examples provided.

check_loyalty ~71

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").

NameTypeReqDescription
agent_session_idstringyes–
member_idstringyes–

No output schema declared.

No examples provided.

create_cart ~360

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.

NameTypeReqDescription
itemsarrayyes–
notestring–Order-level note for the kitchen. Do not put the guest's name, phone or address here.
order_typestringyes–
restaurantstringyesRestaurant slug (from search_restaurants / list_public_menus) or id.
scheduled_forstring–ISO date-time for a scheduled pickup/delivery (optional; the venue may refuse on the confirmation page).

No output schema declared.

No examples provided.

draft_product_description ~95

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.

NameTypeReqDescription
descriptionstringyesProposed description in the menu language. Plain text, no links, no claims you cannot verify.
product_idstringyesProduct id from menu_audit or get_restaurant_menu.

No output schema declared.

No examples provided.

draft_site_text ~95

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.

NameTypeReqDescription
aboutstringyes–
seo_descriptionstringyes–
seo_titlestringyes–
taglinestringyes–

No output schema declared.

No examples provided.

draft_translation ~156

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.

NameTypeReqDescription
descriptionstring–Translated description (optional). Plain text, no links, same meaning as the source — never add ingredients or claims.
entitystringyes–
entity_idstringyesProduct or category id from get_restaurant_menu / menu_audit.
localestringyesTarget menu language (two letters), different from the menu source language.
namestring–Translated name (optional). Keep brand names as they are.

No output schema declared.

No examples provided.

get_cart ~64

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.

NameTypeReqDescription
cart_idstringyes–

No output schema declared.

No examples provided.

get_faq ~58

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.

NameTypeReqDescription
localestring––

No output schema declared.

No examples provided.

get_order_status ~71

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.

NameTypeReqDescription
agent_session_idstringyes–
order_idstringyes–

No output schema declared.

No examples provided.

get_pricing ~81

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_reservation_slots ~124

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.

NameTypeReqDescription
daysinteger––
restaurantstringyes–

No output schema declared.

No examples provided.

get_restaurant ~282

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.

NameTypeReqDescription
slugstringyesRestaurant slug, e.g. lily-rose-bistro

No output schema declared.

No examples provided.

get_restaurant_menu ~327

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".

NameTypeReqDescription
localestring––
restaurant_idstringyes–

No output schema declared.

No examples provided.

join_loyalty ~127

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.

NameTypeReqDescription
agent_session_idstringyesActive session id from start_order_session.
display_namestring–Not used.
emailstring–Not used for a lookup; the guest confirms their e-mail on the menu.
phonestring–Not used for a lookup.

No output schema declared.

No examples provided.

list_public_menus ~69

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.

NameTypeReqDescription
limitinteger––
pageinteger––

No output schema declared.

No examples provided.

menu_audit ~38

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

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

place_order ~530

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.

NameTypeReqDescription
agent_session_idstringyes–
customer_namestring–Required for takeaway — who picks the order up.
customer_phonestring–Required for takeaway — reachable phone (digits, +, spaces/dashes tolerated).
guest_namestring–Optional guest name shown to staff with the order.
itemsarrayyes–
notestring–Optional order-level note (max 500 chars).
order_typestring–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)…
promo_codestring–Optional promo code to redeem at order time (validate first with apply_promo). The redemption slot is consumed only when this order lands.
table_idstring–Optional table id when ordering at a table.

No output schema declared.

No examples provided.

request_bill ~83

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.

NameTypeReqDescription
agent_session_idstringyes–
notestring––
split_typestring––
table_idstringyes–

No output schema declared.

No examples provided.

request_reservation ~202

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.

NameTypeReqDescription
notestring–Occasion, seating preference, accessibility needs. Do not put the guest's name, phone or email here.
party_sizeintegeryes–
reserved_atstringyesISO date-time; at least 30 minutes ahead, at most 90 days.
restaurantstringyes–

No output schema declared.

No examples provided.

reservation_summary ~42

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

sales_summary ~40

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

search_products ~86

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.

NameTypeReqDescription
limitinteger––
localestring––
querystringyesFree-text search across name + description.
slugstringyesRestaurant slug.

No output schema declared.

No examples provided.

search_restaurants ~669

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.

NameTypeReqDescription
attributesarray–Any declared attribute token (meals, family, outdoor, accessibility, cuisine, dietary).
channelstring–order = digital ordering at the table; reservation; pickup = takeaway; delivery = venue's own delivery.
citystring––
countrystring–ISO 3166-1 alpha-2
cuisinearray–All listed cuisines must be declared by the venue.
dietaryarray–Owner declaration, not a certification.
limitinteger––
menu_languagestring–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).
nearobject–Search centre. Venues without coordinates are excluded when set.
open_nowboolean–Only venues open right now in their own timezone; venues with unknown hours are excluded when true.
pageinteger––
payment_availableboolean–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…
price_maxinteger–Owner-declared price level 1–4 (schema.org priceRange "$" … "$$$$"): venues at or below it. Venues that declared no level are excluded when set.
qstring–Free text over name and description (min 2 chars).
radius_kmnumber––
table_availableboolean–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".
waitlistboolean–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.

No output schema declared.

No examples provided.

start_order_session ~96

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.

NameTypeReqDescription
restaurant_idstringyesCanonical restaurant id from get_restaurant or search_products.

No output schema declared.

No examples provided.

waiter_call ~71

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.

NameTypeReqDescription
agent_session_idstringyes–
messagestring––
table_idstringyes–

No output schema declared.

No examples provided.

Install

How do I install the Thmenu MCP server?

Thmenu is a hosted endpoint at https://mcp.thmenu.com/, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.thmenu.com

# add to Claude Code
claude mcp add --transport http com-thmenu-thmenu 'https://mcp.thmenu.com/'
Common questions

What is the Thmenu MCP server?

Thmenu is an MCP server listed in the public MCP registry as com.thmenu/thmenu. Restaurant menus, carts, reservations and owner drafts for AI agents (Thmenu MCP). This page covers its hosted endpoint (https://mcp.thmenu.com/).

Is the Thmenu MCP server safe to use?

Thmenu scores 75 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Thmenu MCP server expose?

Thmenu exposes 27 tools: get_pricing, get_faq, get_restaurant, search_products, list_public_menus, and 22 more. Their descriptions and schemas cost roughly 4,140 tokens of context every time the server is loaded.

Does the Thmenu MCP server require authentication?

No. We connected to Thmenu without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Thmenu MCP server still maintained?

Thmenu is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.