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
https://meniu.cc/mcp/health.
Authorization: Bearer {api_key}
claude mcp add --transport http meniu https://meniu.cc/mcp --header 'Authorization: Bearer {api_key}'
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_id →
create_menu → create_category → create_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). |