MCP Server

Connect an AI assistant (Claude and other MCP clients) to publish and edit your menus without logging into the admin panel.

POST https://meniu.cc/mcp
Streamable HTTP (stateless JSON-RPC 2.0). A health check is available at https://meniu.cc/mcp/health.
Authorization: Bearer {api_key}
Use your REST API key (same one shown on the API page). Clients without a token field (claude.ai / Claude Desktop connectors) can sign in with the built-in OAuth flow instead.
claude mcp add --transport http meniu https://meniu.cc/mcp --header 'Authorization: Bearer {api_key}'
For claude.ai or Claude Desktop, add a custom connector with the URL https://meniu.cc/mcp — the sign-in flow starts automatically.

Publishing a menu

The data model is Store → Menu → Category → Item. A typical flow: list_stores to get a store_idcreate_menucreate_categorycreate_item (with price and an optional image_url). For richer pricing, add create_item_option (e.g. Size) then create_item_variant to price each combination, and create_item_extra for paid add-ons. Stores are created in the web app; everything else can be managed through the tools below.

Available tools 37

Tool REST call Description
account_info GET api/user Get the authenticated account profile: plan, plan limits (menus, categories, items), billing, language and timezone. Call this first to learn the remaining quotas before creating resources.
list_stores GET api/stores List the stores (restaurants/cafes) of the account, paginated. Each store is the top-level container that holds menus. Stores are created in the web app; use their store_id to build menus here.
get_store GET api/stores/{store_id} Get one store by its store_id, including its url, currency, settings and counters.
list_menus GET api/menus List menus, paginated. Pass store_id to list the menus of one store. A menu groups categories.
get_menu GET api/menus/{menu_id} Get one menu by its menu_id.
create_menu POST api/menus Create a menu inside a store. Requires store_id (see list_stores) and name. Optional url slug (random if omitted), description and image. Counts against the plan menus limit.
update_menu POST api/menus/{menu_id} Update a menu by its menu_id. Only provided fields change. Set is_enabled to publish/unpublish it.
delete_menu DELETE api/menus/{menu_id} Permanently delete a menu by its menu_id. Its categories, items and all item options/variants/extras are deleted too (cascade). This cannot be undone.
list_categories GET api/categories List categories, paginated. Pass menu_id (or store_id) to scope. A category groups items within a menu.
get_category GET api/categories/{category_id} Get one category by its category_id.
create_category POST api/categories Create a category inside a menu. Requires menu_id and name. Optional url slug and description. Counts against the plan categories limit.
update_category POST api/categories/{category_id} Update a category by its category_id. Only provided fields change.
delete_category DELETE api/categories/{category_id} Permanently delete a category by its category_id. Its items and their options/variants/extras are deleted too (cascade). This cannot be undone.
list_items GET api/items List items (products/dishes), paginated. Pass category_id (or menu_id / store_id) to scope. Each item has a base price and may have variants for combination pricing.
get_item GET api/items/{item_id} Get one item by its item_id, including price, image and whether variant pricing is enabled.
create_item POST api/items Create an item (product/dish) inside a category. Requires category_id and name. Set price (base price), optional description, quantity (stock, omit for unlimited) and an image via image_url or image_base64. Counts against the plan items limit.
update_item POST api/items/{item_id} Update an item by its item_id. Only provided fields change. Use this to edit the base price, name, description, stock, visibility or image. Set variants_is_enabled to switch combination pricing on/off.
set_item_image POST api/items/{item_id} Upload or replace the image of an item. Provide image_url (a public http(s) image URL, downloaded automatically) or image_base64, or image_remove:true to clear it. This is a convenience wrapper around update_item.
delete_item DELETE api/items/{item_id} Permanently delete an item by its item_id. Its options, variants and extras are deleted too (cascade). This cannot be undone.
Tool REST call Description
list_item_options GET api/item-options List option groups. Pass item_id to list the option groups of one item. An option group is a choice such as "Size" with a list of values.
create_item_option POST api/item-options Create an option group on an item, e.g. name "Size" with options ["Small","Medium","Large"]. The zero-based index of each value is used later by create_item_variant to price a combination.
update_item_option POST api/item-options/{item_option_id} Update an option group by its item_option_id. Provide name and/or a new options list. Reordering values changes their indices used by variants.
delete_item_option DELETE api/item-options/{item_option_id} Permanently delete an option group by its item_option_id. Variants that referenced it may need updating. This cannot be undone.
list_item_variants GET api/item-variants List variants (priced option combinations). Pass item_id to list one item variants. Each variant carries a price and the option selections it applies to.
create_item_variant POST api/item-variants Create a priced variant for an item. price is required. item_options selects one value per option group as { "<item_option_id>": <zero_based_index> }, e.g. {"12":2} means the Size group (id 12) value at index 2 ("Large"). Create the option groups first with create_item_option. Adding a variant automatically enables variant pricing on the item.
update_item_variant POST api/item-variants/{item_variant_id} Update a variant by its item_variant_id. Change its price and/or its item_options selection map. Only provided fields change.
delete_item_variant DELETE api/item-variants/{item_variant_id} Permanently delete a variant by its item_variant_id. This cannot be undone.
list_item_extras GET api/item-extras List extras (paid add-ons). Pass item_id to list the extras of one item. An extra is an optional add-on with its own price, e.g. "Extra cheese".
create_item_extra POST api/item-extras Create a paid add-on for an item, e.g. name "Extra cheese", price 0.50. Requires item_id and name.
update_item_extra POST api/item-extras/{item_extra_id} Update an add-on by its item_extra_id. Only provided fields change.
delete_item_extra DELETE api/item-extras/{item_extra_id} Permanently delete an add-on by its item_extra_id. This cannot be undone.
Tool REST call Description
list_domains GET api/domains List the custom domains connected to the account, used to serve stores on your own domain.
create_domain POST api/domains Connect a custom domain (host only, e.g. menu.example.com). It starts disabled until DNS verification. Counts against the plan domains limit.
delete_domain DELETE api/domains/{domain_id} Permanently delete a custom domain by its domain_id. This cannot be undone.
Tool REST call Description
list_payments GET api/payments List the account subscription/billing payments, paginated (read-only).
get_payment GET api/payments/{payment_id} Get one billing payment by its payment id (read-only).
list_logs GET api/logs List the account activity logs, paginated (read-only).