| name | swiggy |
| description | Order food on Swiggy in India via Swiggy's MCP server. Food delivery only. Address-aware: every search/cart/order action requires an addressId fetched from the user's saved Swiggy addresses. |
Swiggy Skill
Order food on Swiggy in India via Swiggy's MCP gateway. Currently only the
swiggy-food server is wired up. Instamart and Dineout require their own MCP
servers in config/mcporter.json and are not yet supported.
Installation
The skill CLI lives at skills/swiggy/swiggy-cli.js. Run it via:
node skills/swiggy/swiggy-cli.js food <command> [args]
Do NOT rely on a global swiggy binary — OpenClaw's shell executor may not
have npm globals on PATH. Always use the full node skills/swiggy/swiggy-cli.js
invocation.
One-time auth (interactive, opens a browser):
mcporter auth swiggy-food
CRITICAL: Address-first workflow
Almost every food tool requires an addressId — a real ID belonging to one
of the user's saved Swiggy delivery addresses. There is no free-form location
parameter. The workflow is:
- Call
node skills/swiggy/swiggy-cli.js food addresses to fetch the user's saved addresses.
- If the list is empty, tell the user to add a delivery address in the Swiggy
mobile app and stop. Do not invent an addressId.
- If there's exactly one address, use it.
- If there are multiple, present them numbered to the user and ask which to
use. Hold the chosen
addressId in conversation state and pass it to every
subsequent food command.
When to Use
- "Order biryani" →
food search → food menu → food dishes → food cart-add → preview → food order --confirm
- "What's open near me?" →
food search "<cuisine>"
- "Track my order" →
food track
- "Show my recent orders" →
food orders --address-id <id>
Available Commands
node skills/swiggy/swiggy-cli.js food addresses
node skills/swiggy/swiggy-cli.js food search "<query>" --address-id <id>
node skills/swiggy/swiggy-cli.js food menu <restaurant-id> --address-id <id> [--page <n>] [--page-size <n>]
node skills/swiggy/swiggy-cli.js food dishes "<query>" --address-id <id> [--restaurant <id>] [--veg]
node skills/swiggy/swiggy-cli.js food cart --address-id <id>
node skills/swiggy/swiggy-cli.js food cart-add --restaurant <id> --address-id <id> --item <menu-item-id> [--quantity <n>]
node skills/swiggy/swiggy-cli.js food cart-clear
node skills/swiggy/swiggy-cli.js food coupons --restaurant <id> --address-id <id> [--code <code>]
node skills/swiggy/swiggy-cli.js food apply-coupon --code <code> --address-id <id>
node skills/swiggy/swiggy-cli.js food order --address-id <id> --confirm [--payment <method>]
node skills/swiggy/swiggy-cli.js food orders --address-id <id> [--count <n>]
node skills/swiggy/swiggy-cli.js food order-details <orderId>
node skills/swiggy/swiggy-cli.js food track [<orderId>]
Item selection rules
food menu returns a compact view with hasVariants and hasAddons flags.
food dishes returns full item details including menu_item_id, variants,
and addons. Use dishes (not menu) to get the menu_item_id you need for
cart-add.
- ALWAYS run
food dishes before cart-add to get menu_item_id and check
hasVariants. NEVER ask the user for menu_item_id — always fetch it
yourself via food dishes.
- After running
food dishes, you MUST read hasVariants from the output
before attempting cart-add. Do not attempt cart-add without this check.
- If
cart-add fails, the most common cause is a stale cart containing items
from a different restaurant. Run food cart --address-id <id> to inspect it.
If it has items from a different restaurant, run food cart-clear and then
retry cart-add. Do NOT ask the user what to do — handle this automatically.
cart-add works for items where addons are entirely optional. The rules:
hasVariants: true → NEVER call cart-add — it will fail. Tell the
user immediately:
"This item comes in different sizes that I can't select for you yet. You
can add it directly in the Swiggy app, or I can suggest a simpler item."
Do not attempt cart-add, do not ask the user for a size — just say this.
hasVariants: false AND hasAddons: true → cart-add works as long
as all addon groups have minAddons: 0 (i.e. all optional). The item is
added without any addons. You do NOT need to check individual addon groups
before calling cart-add — just call it. If Swiggy rejects it, tell the
user to add it in the app.
hasVariants: false AND hasAddons: false → cart-add works normally.
CRITICAL: Safety Rules
NEVER auto-order
ALWAYS get explicit confirmation before placing orders.
-
Show a cart preview first (node skills/swiggy/swiggy-cli.js food cart --address-id <id>):
- All items with quantities and prices
- Subtotal, delivery, taxes, and
to_pay total
- Delivery address (full address from
get_addresses)
- Available payment methods (will be
["Cash"] only)
-
Read the preview to the user and ask for confirmation:
Ready to order:
- 1x Pepper Chicken (₹360)
Subtotal: ₹360 + ₹44 delivery + ₹59.25 tax
Total to pay: ₹463 (Cash on Delivery)
Deliver to: <full address from get_addresses>
Confirm order? (yes/no)
-
Only after the user clearly says yes:
- Run
node skills/swiggy/swiggy-cli.js food order --address-id <id> --confirm
- Optionally log to
memory/swiggy-orders.json
COD-only and ₹1000 cap
- Swiggy MCP currently supports Cash on Delivery only. The
availablePaymentMethods field in get_food_cart will reflect this — never assume any other payment method.
- Order placement is blocked for cart values ≥ ₹1000 (Swiggy MCP beta restriction). For larger orders, tell the user to use the Swiggy app instead — the MCP cart syncs to the app.
- Orders cannot be cancelled once placed via MCP. For cancellation, tell the user: "To cancel your order, please call Swiggy customer care at 080-67466729."
Address handling
- Never invent an
addressId. Always fetch from get_addresses.
- The address string in
get_addresses includes the full street, area, postal code, and the user's name and masked phone — read it back when confirming.
Workflow examples
Simple food order (single, no-variant item)
node skills/swiggy/swiggy-cli.js food addresses
node skills/swiggy/swiggy-cli.js food search "biryani" --address-id <your-address-id>
node skills/swiggy/swiggy-cli.js food menu 86358 --address-id <your-address-id>
node skills/swiggy/swiggy-cli.js food dishes "pepper chicken" --address-id <your-address-id> --restaurant 86358
node skills/swiggy/swiggy-cli.js food cart-add --restaurant 86358 --address-id <your-address-id> --item 24794114 --quantity 1
node skills/swiggy/swiggy-cli.js food cart --address-id <your-address-id>
node skills/swiggy/swiggy-cli.js food order --address-id <your-address-id> --confirm
Order tracking
node skills/swiggy/swiggy-cli.js food track
Browsing without committing
node skills/swiggy/swiggy-cli.js food search "pizza" --address-id <id>
node skills/swiggy/swiggy-cli.js food menu <restaurantId> --address-id <id> --page 1 --page-size 8
node skills/swiggy/swiggy-cli.js food dishes "margherita" --address-id <id> --restaurant <restaurantId>
Error handling
- Empty address list: Tell the user to add an address in the Swiggy app.
- No restaurants for query: Suggest a broader query or different cuisine.
hasVariants: true item requested via cart-add: Explain that variant items
need to drive update_food_cart directly via mcporter, or pick a simpler item.
- Cart total ≥ ₹1000 at order time: Explain the MCP beta cap and suggest the
Swiggy app for larger orders.
- Auth errors from mcporter: Run
mcporter auth swiggy-food (note the
Windows OAuth URL-truncation workaround if applicable).
Order logging
After a successful place_food_order, append to memory/swiggy-orders.json:
{
"timestamp": "2026-04-09T13:00:00+05:30",
"type": "food",
"restaurant": "Meghana Foods",
"items": [{ "name": "Pepper Chicken", "quantity": 1, "price": 360 }],
"total": "₹463",
"addressId": "<your-address-id>",
"orderId": "..."
}
Dependencies
mcporter v0.8.x on PATH (used by the CLI under the hood)
- Node.js runtime for the CLI wrapper
- An authenticated
swiggy-food server in config/mcporter.json
Known limitations
- COD only (no online payment)
- Orders cannot be cancelled via MCP
- Cart total must be < ₹1000 to place an order (beta restriction)
- Variant/addon items not supported by
cart-add (simple items only)
- Instamart and Dineout not yet wired up
- Don't open the Swiggy app while using MCP — session conflicts can occur
Remember: addressId from get_addresses first. Confirmation BEFORE ordering. Every. Single. Time.