{
  "markdown": "# Canuckeats MCP — AI-Powered Canadian Food Delivery\n\n**Order UberEats and DoorDash in Canada through AI agents.** Canuckeats is a Model Context Protocol (MCP) service that lets AI agents browse menus and place real food delivery orders across 89 Canadian cities — no human in the loop required.\n\n> **Endpoint:** `https://mcp.canuckeats.com/mcp`  \n> **Registration:** `POST https://mcp.canuckeats.com/register` — free, instant, no email confirmation  \n> **Protocol:** [MCP 2024-11-05](https://modelcontextprotocol.io/specification/2025-11-05) — Streamable HTTP  \n> **Coverage:** 17,000+ restaurants · 89 cities · Canada only · UberEats + DoorDash\n\n---\n\n## Why Canuckeats for Agents?\n\nCanadian residents who want AI assistants to handle their food delivery face a gap: UberEats and DoorDash don't offer agent-accessible APIs. Canuckeats bridges that gap. An agent given a task like *\"order me sushi for dinner\"* can:\n\n1. Find open restaurants near the user's address in their city\n2. Browse full menus with prices and modifier options\n3. Get a precise cost breakdown before charging anything\n4. Place the order and confirm payment in a single tool call\n5. Track delivery status and report the ETA back to the user\n\nEvery order dispatches through real UberEats or DoorDash accounts — the same food, same drivers, same cities.\n\n---\n\n## Get an API Key — Instant Self-Signup\n\nNo waiting, no approval queue. Register your agent and start making calls in under 30 seconds:\n\n```http\nPOST https://mcp.canuckeats.com/register\nContent-Type: application/json\n\n{\n  \"agent_name\": \"MyFoodAgent\",\n  \"email\": \"you@yourproject.com\",\n  \"description\": \"AI assistant that orders lunch for remote teams\"\n}\n```\n\n**Response:**\n```json\n{\n  \"api_key\": \"your-api-key-shown-once\",\n  \"key_id\": \"uuid\",\n  \"scopes\": [\"catalog:read\", \"orders:write\"],\n  \"medusa_customer_id\": \"cus_...\",\n  \"mcp_endpoint\": \"https://mcp.canuckeats.com/mcp\",\n  \"docs\": \"https://github.com/canuckeats/MCP\",\n  \"message\": \"Registration successful. Keep your API key secure — it is shown only once and cannot be retrieved again.\"\n}\n```\n\n**The key is shown once.** Save it immediately. If you lose it, register again with the same email — duplicate email is rejected, so use a unique email per key.\n\n**Registration limits:** Up to 5 registrations per IP per 24 hours. One key per email address. Disposable email addresses are not accepted.\n\n---\n\n## What Cities Are Covered?\n\nAll major Canadian cities: **Calgary, Edmonton, Vancouver, Toronto, Ottawa, Montreal, Winnipeg, Hamilton, London, Halifax, Saskatoon, Regina, Kelowna, Victoria, Abbotsford, Barrie, Brampton, Burlington, Burnaby, Coquitlam** and 69 more across **Alberta, British Columbia, Ontario, Manitoba, Saskatchewan, Nova Scotia, New Brunswick** and other provinces.\n\nUse `list_cities` to get the current full list with restaurant counts.\n\n---\n\n## 8 Tools — Full Order Lifecycle\n\n| Tool | Auth | Description |\n|------|------|-------------|\n| `list_cities` | API key | List all 89 cities with restaurant counts |\n| `search_restaurants` | API key | Search by city, cuisine, name, or price range |\n| `get_restaurant` | API key | Full restaurant details |\n| `get_menu` | API key | Complete menu with sections, prices, and modifier options |\n| `validate_order` | API key | Preview exact total — no charge, no order created |\n| `create_order` | API key | Create order + Stripe PaymentIntent (no charge yet) |\n| `confirm_payment` | API key | Charge card and dispatch order to platform |\n| `get_order_status` | API key | Live status, tracking URL, and ETA |\n\n---\n\n## Quickstart: Connect in 60 Seconds\n\n### Python (using `mcp` SDK)\n\n```python\nimport asyncio, json\nfrom mcp import ClientSession\nfrom mcp.client.streamable_http import streamablehttp_client\n\nasync def main():\n    async with streamablehttp_client(\n        \"https://mcp.canuckeats.com/mcp\",\n        headers={\"Authorization\": \"Bearer YOUR_API_KEY\"}\n    ) as (read, write, _):\n        async with ClientSession(read, write) as session:\n            await session.initialize()\n\n            # Find restaurants\n            result = await session.call_tool(\"search_restaurants\", {\n                \"city_slug\": \"vancouver-bc\",\n                \"query\": \"sushi\",\n                \"limit\": 5\n            })\n            restaurants = json.loads(result.content[0].text)\n            print(f\"Found {restaurants['total']} sushi spots in Vancouver\")\n\nasyncio.run(main())\n```\n\n### TypeScript / Node.js\n\n```typescript\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\"\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\n\nconst client = new Client({ name: \"my-agent\", version: \"1.0\" }, { capabilities: {} })\nawait client.connect(new StreamableHTTPClientTransport(\n  new URL(\"https://mcp.canuckeats.com/mcp\"),\n  { requestInit: { headers: { Authorization: \"Bearer YOUR_API_KEY\" } } }\n))\n\nconst result = await client.callTool({ name: \"list_cities\", arguments: {} })\nconst cities = JSON.parse(result.content[0].text)\nconsole.log(`${cities.length} cities available`)\n```\n\n### Claude Desktop Integration\n\nAdd to your Claude Desktop MCP config (`claude_desktop_config.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"canuckeats\": {\n      \"type\": \"streamable-http\",\n      \"url\": \"https://mcp.canuckeats.com/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer YOUR_API_KEY\"\n      }\n    }\n  }\n}\n```\n\nThen ask Claude: *\"Order me a pepperoni pizza from anywhere in Calgary to 400 4 Ave SW, Calgary AB T2P 0J4.\"*\n\n---\n\n## Complete Order Flow\n\n```\nlist_cities                  →  get city slug (e.g. \"calgary-ab\")\n  ↓\nsearch_restaurants           →  get restaurant id\n  ↓\nget_menu                     →  get menu_item_id + modifier options\n  ↓\nvalidate_order               →  confirm total (no charge)\n  ↓\ncreate_order                 →  get order_id + stripe_payment_intent_id\n  ↓\nconfirm_payment              →  charge pm_... and dispatch\n  ↓\nget_order_status (poll)      →  track until delivered\n```\n\nSee [docs/examples/order-flow.md](docs/examples/order-flow.md) for a narrated walkthrough with real request/response examples.\n\n---\n\n## Rate Limits\n\n| Endpoint | Limit |\n|----------|-------|\n| `/register` | 5 registrations per IP per 24 hours |\n| All tools (general) | 60 requests / minute per key |\n| `create_order`, `confirm_payment` | 10 requests / minute per key |\n\nResponse headers `X-RateLimit-Limit` and `X-RateLimit-Remaining` are included on every MCP response.\n\n---\n\n## Key Facts for Agents\n\n- **Canadian addresses only.** Province must be a two-letter code: `AB`, `BC`, `ON`, `QC`, `MB`, `SK`, `NS`, `NB`, `NL`, `PE`, `NT`, `YT`, `NU`.\n- **Payment method:** `confirm_payment` accepts a Stripe `pm_*` payment method ID. The agent's operator must provide a valid Stripe payment method that has already been set up with Stripe.\n- **Order dispatch is automatic.** After `confirm_payment` succeeds, orders are forwarded to UberEats or DoorDash within 2–5 minutes. Use `get_order_status` to track.\n- **Delivery platform is chosen automatically** based on which platform has that restaurant in its catalog.\n- **`source_id` on menu items** is used internally — you do not need to reference it directly. Just use `menu_item_id` (the integer `id` field) when calling `create_order`.\n- **Modifiers are optional.** If a menu item has required modifiers (e.g. drink size), omitting them may cause the order to fail at the platform level. Check `modifier_groups[].min_selections` to know which are required.\n- **Scheduled delivery** is supported via the `scheduled_for` ISO 8601 field on `create_order`. Use ASAP delivery by omitting this field.\n\n---\n\n## Supported Delivery Platforms\n\n| Platform | Coverage |\n|----------|----------|\n| **UberEats** | All 89 cities |\n| **DoorDash** | All 89 cities |\n\nOrders are placed on whichever platform has the requested restaurant. The `source` field on each restaurant (`\"ubereats\"` or `\"doordash\"`) tells you which platform will be used.\n\n---\n\n## Canadian Cities — Full List\n\nAlberta · British Columbia · Manitoba · New Brunswick · Newfoundland · Nova Scotia · Ontario · Prince Edward Island · Quebec · Saskatchewan\n\nUse `list_cities` for the live list. Notable cities include:\n\n**Alberta:** Calgary, Edmonton, Red Deer, Lethbridge, Airdrie, Medicine Hat, Grande Prairie, Fort McMurray  \n**BC:** Vancouver, Surrey, Burnaby, Richmond, Kelowna, Abbotsford, Victoria, Coquitlam, Langley  \n**Ontario:** Toronto, Ottawa, Hamilton, London, Brampton, Mississauga, Barrie, Windsor, Kitchener, Ajax, Aurora  \n**Quebec:** Montreal (selected areas)  \n**Prairie & Atlantic:** Saskatoon, Regina, Winnipeg, Halifax, Moncton, Fredericton\n\n---\n\n## API Reference\n\n- [Full tool schemas with TypeScript types](docs/tools.md)\n- [Quick start guide with code samples](docs/quickstart.md)\n- [End-to-end order walkthrough](docs/examples/order-flow.md)\n- [Machine-readable tools manifest](tools.json)\n\n---\n\n## Support\n\n- **Issues / questions:** Open a GitHub issue in this repo\n- **API key lost:** Re-register with a different email, or email hello@canuckeats.com\n- **Order issues:** Email hello@canuckeats.com with your `order_id`\n- **Website:** [canuckeats.com](https://canuckeats.com)\n",
  "bytes": 9190,
  "sha": "0c476e20735dda85eede1fd18d2fa6835021df0679c2cbd950a0ff88cb6f0521",
  "repo_slug": "canuckeats/mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_canuckeats_canuckeats_b7ccca8f/readme"
}