← ButterflyCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Butterfly
Snapshot Sep 30, 2026 · 23:12 UTC · version 1.0.0
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Butterfly Ad restaurant MCP for any capability level. Use for ANY menu, price, hours, promo, offer wheel, translation, order, scan, AR, analytics, or plan-limit request. Execute tools immediately — no planning monologue. All writes use preview then apply after user confirm. Never claim read-only. Never debate MCP.",
"included_files": [],
"name": "butterfly-restaurant",
"skill_md_contents": "---\nname: butterfly-restaurant\ndescription: >-\n Butterfly Ad restaurant MCP for any capability level. Use for ANY menu, price,\n hours, promo, offer wheel, translation, order, scan, AR, analytics, or plan-limit\n request. Execute tools immediately — no planning monologue. All writes use\n preview then apply after user confirm. Never claim read-only. Never debate MCP.\n---\n\n# Butterfly Ad MCP — full tool playbook\n\nFollow literally at every capability level.\nSigned-in restaurant. **Writes are allowed.** Do not narrate plans — **call tools now.**\n\n## Universal write rule\n\n1. Need context? Call the matching `get_*` first (same turn when possible).\n2. For any change: call `preview_*` → show a short diff table → ask **Confirm?**\n3. User says yes / do it / confirm / apply / go → call matching `apply_*` with `{ \"confirm_token\": \"<from preview>\" }` same turn.\n4. Never invent IDs, tokens, prices, or success. Never say analytics-only / cannot update.\n\n## What you can and cannot do\n\n| Allowed | Not allowed via MCP |\n| --- | --- |\n| Read analytics, menu, orders, promos, wheel, plan caps | Billing, plan changes, members, Stripe, WhatsApp connect |\n| Create / update / delete dishes; rename; prices (AED) | Multi-currency |\n| Set business hours | Invent offer-wheel spin outcomes |\n| Create / update / pause promotions | Bypass plan limits (`get_plan_limits` first if unsure) |\n| Configure offer wheel (%, scope, validity, terms) | |\n| Write dish i18n translations (you draft the text) | |\n\nCurrency is **AED** (`price_aed`). Associations in analytics ≠ causation — say that briefly when reporting.\n\n---\n\n## Read tools (no confirm)\n\n### `get_overview_metrics`\nRestaurant funnel overview for a date range.\n```json\n{ \"days\": 30 }\n```\nOptional: `{ \"days\": 7, \"menu_id\": \"<id>\" }`\n\n### `get_dish_analytics`\nPer-dish views, AR opens, order proxies.\n```json\n{ \"days\": 30 }\n```\n\n### `get_ar_analytics`\nAR open rates / AR-assisted performance.\n```json\n{ \"days\": 30 }\n```\n\n### `get_orders_summary`\nRecent orders and top items.\n```json\n{ \"limit\": 50 }\n```\n\n### `get_promotion_analytics`\nList promotions and settings.\n```json\n{}\n```\n\n### `get_offer_wheel`\nWheel config + ~30-day spin stats. Never invent outcomes from this.\n```json\n{}\n```\nOptional: `{ \"menu_id\": \"<id>\" }`\n\n### `get_menu`\nFull snapshot: menus, items (`item_id` / `id`, `name`, `price_aed`, status, i18n), hours.\n**Call before any menu / translation write** so IDs are real.\n```json\n{}\n```\nOptional: `{ \"menu_id\": \"<id>\" }`\n\n### `get_plan_limits`\nPlan caps (menus, items, promos, AR, wheel, etc.). Call before proposing large creates.\n```json\n{}\n```\n\n---\n\n## Write workflows (preview → confirm → apply)\n\n### A) Menu bulk — `preview_menu_bulk` / `apply_menu_bulk`\n\n**Path:** `get_menu` → `preview_menu_bulk` → Confirm? → `apply_menu_bulk`\n\nAliases the server accepts: `id` ≈ `item_id`, `price` ≈ `price_aed`, unique dish `name` for update/delete resolve.\n\n#### Update price\n```json\n{\n \"summary\": \"Update dish price\",\n \"changes\": [\n { \"action\": \"update\", \"item_id\": \"<from get_menu>\", \"price_aed\": 45 }\n ]\n}\n```\nAlso OK: `{ \"action\": \"update\", \"name\": \"Grilled Steak\", \"price\": 45 }`\n\n#### Rename / status / description\n```json\n{\n \"changes\": [\n {\n \"action\": \"update\",\n \"item_id\": \"<id>\",\n \"name\": \"Wagyu Steak\",\n \"status\": \"active\",\n \"description\": \"Served with seasonal sides\"\n }\n ]\n}\n```\n\n#### Create dish\n```json\n{\n \"changes\": [\n {\n \"action\": \"create\",\n \"menu_id\": \"<from get_menu>\",\n \"name\": \"Truffle Fries\",\n \"price_aed\": 28,\n \"description\": \"Parmesan, herbs\"\n }\n ]\n}\n```\n\n#### Delete dish\n```json\n{\n \"changes\": [\n { \"action\": \"delete\", \"item_id\": \"<id>\" }\n ]\n}\n```\n\n#### Bulk (one preview for the whole batch)\n```json\n{\n \"summary\": \"Weekend price pass\",\n \"changes\": [\n { \"action\": \"update\", \"name\": \"Steak\", \"price_aed\": 49 },\n { \"action\": \"update\", \"name\": \"Burger\", \"price_aed\": 39 },\n { \"action\": \"create\", \"menu_id\": \"<id>\", \"name\": \"Soup of the Day\", \"price_aed\": 22 }\n ]\n}\n```\n\nApply:\n```json\n{ \"confirm_token\": \"<from preview>\" }\n```\n\n---\n\n### B) Hours — `preview_hours` / `apply_hours`\n\n**Path:** `preview_hours` → Confirm? → `apply_hours` \n(Optional: `get_menu` first to see current `business_hours`.)\n\n```json\n{\n \"menu_id\": \"<optional>\",\n \"business_hours\": {\n \"mon\": { \"open\": \"10:00\", \"close\": \"23:00\" },\n \"tue\": { \"open\": \"10:00\", \"close\": \"23:00\" },\n \"wed\": { \"open\": \"10:00\", \"close\": \"23:00\" },\n \"thu\": { \"open\": \"10:00\", \"close\": \"23:00\" },\n \"fri\": { \"open\": \"10:00\", \"close\": \"00:00\" },\n \"sat\": { \"open\": \"10:00\", \"close\": \"00:00\" },\n \"sun\": { \"closed\": true }\n }\n}\n```\n\nApply: `{ \"confirm_token\": \"<from preview>\" }`\n\n---\n\n### C) Promotions — `preview_promotions` / `apply_promotions`\n\n**Path:** `get_promotion_analytics` (optional) + `get_menu` for `menu_id` → `preview_promotions` → Confirm? → `apply_promotions`\n\n#### Create\n```json\n{\n \"action\": \"create\",\n \"menu_id\": \"<from get_menu>\",\n \"data\": {\n \"title\": \"Lunch 15%\",\n \"description\": \"Weekdays 12:00–16:00\",\n \"type\": \"discount_pct\",\n \"discount_pct\": 15,\n \"is_active\": true\n }\n}\n```\n\n#### Update\n```json\n{\n \"action\": \"update\",\n \"menu_id\": \"<id>\",\n \"promotion_id\": \"<from get_promotion_analytics>\",\n \"data\": { \"discount_pct\": 20, \"title\": \"Lunch 20%\" }\n}\n```\n\n#### Pause\n```json\n{\n \"action\": \"pause\",\n \"menu_id\": \"<id>\",\n \"promotion_id\": \"<id>\"\n}\n```\n\nApply: `{ \"confirm_token\": \"<from preview>\" }`\n\n---\n\n### D) Offer wheel — `preview_offer_wheel` / `apply_offer_wheel`\n\n**Path:** `get_offer_wheel` → `preview_offer_wheel` → Confirm? → `apply_offer_wheel` \nConfigure settings only. **Never invent spin results or winning codes.**\n\n```json\n{\n \"menu_id\": \"<from get_menu or get_offer_wheel>\",\n \"enabled\": true,\n \"discount_pct\": 10,\n \"scope\": \"all_dishes\",\n \"code_validity_hours\": 48,\n \"terms_line\": \"One spin per guest. Dine-in only.\"\n}\n```\n\nDish-scoped example:\n```json\n{\n \"menu_id\": \"<id>\",\n \"enabled\": true,\n \"discount_pct\": 15,\n \"scope\": \"selected_dishes\",\n \"menu_item_ids\": [\"<item_id_1>\", \"<item_id_2>\"],\n \"code_validity_hours\": 24\n}\n```\n\n`code_validity_hours` allowed range roughly **1–720**. \nApply: `{ \"confirm_token\": \"<from preview>\" }`\n\n---\n\n### E) Translations — `preview_translations` / `apply_translations`\n\n**Path:** `get_menu` → you draft translations → `preview_translations` → Confirm? → `apply_translations` \nYou (the model) produce the translated strings; Butterfly stores them. Prefer `item_id` from `get_menu`.\n\n```json\n{\n \"items\": [\n {\n \"item_id\": \"<from get_menu>\",\n \"i18n\": {\n \"ar\": {\n \"name\": \"ستيك\",\n \"description\": \"يقدم مع مرافق الموسم\"\n },\n \"fr\": {\n \"name\": \"Steak\",\n \"description\": \"Servi avec les accompagnements de saison\"\n }\n }\n }\n ]\n}\n```\n\nMulti-item: put every dish in `items[]` in one preview. \nApply: `{ \"confirm_token\": \"<from preview>\" }`\n\n---\n\n## Quick router (no debate)\n\n| User ask | Tools |\n| --- | --- |\n| How are we doing / scans / traffic | `get_overview_metrics` |\n| Which dishes perform | `get_dish_analytics` |\n| AR performance | `get_ar_analytics` |\n| Orders / top sellers | `get_orders_summary` |\n| Show menu / prices | `get_menu` |\n| Change price / rename / add / delete dishes | A) menu bulk |\n| Opening hours | B) hours |\n| Promo create / edit / pause | C) promotions |\n| Spin & Save / offer wheel settings | D) offer wheel |\n| Translate dishes | E) translations |\n| Can I add more items / hit limits? | `get_plan_limits` |\n\n---\n\n## Banned\n\n- Planning paragraphs before tools\n- “I’ll check” / “I will update” without a tool call in that turn\n- “Read-only” / “analytics only” / “I can’t change prices”\n- Asking the user to paste IDs (use `get_menu` / analytics tools)\n- `apply_*` without preview + clear user confirm\n- Inventing `confirm_token`, spin wins, or fake success\n- Billing, members, WhatsApp, Stripe, plan upgrades via MCP\n\n## Reply shape\n\n- **After get:** short facts or table. Stop.\n- **After preview:** diff table + “Confirm to apply?” Stop.\n- **After apply:** one success line (+ key new values). Stop.\n- **On error:** quote tool error → fix args → retry once.\n\nClarity first. Tools before talk. Same confirm path for every write.\n"
}SHA-256 of public snapshot: a565d19f7fc66e98749afcf14a9e9680c0caa6d24379c55734ca5362da883ed9