内容
# 加拿大餐食配送 — 人工智能驱动的加拿大餐食配送服务
**在加拿大通过人工智能代理订购UberEats和DoorDash餐食。** Canuckeats是一种模型上下文协议(MCP)服务,允许人工智能代理浏览菜单并在加拿大的89个城市下达真正的餐食配送订单 — 无需人工介入。
> **端点:** `https://mcp.canuckeats.com/mcp`
> **注册:** `POST https://mcp.canuckeats.com/register` — 免费,立即注册,无需电子邮件确认
> **协议:** [MCP 2024-11-05](https://modelcontextprotocol.io/specification/2025-11-05) — 可流式传输的HTTP
> **覆盖范围:** 17,000+ 家餐厅 · 89 个城市 · 加拿大境内 · UberEats + DoorDash
---
## 为什么选择Canuckeats作为代理?
希望使用人工智能助手处理餐食配送的加拿大居民面临着一个空白:UberEats和DoorDash不提供代理可访问的API。Canuckeats填补了这一空白。给定诸如 *"为我订购晚餐寿司"* 之类的任务,代理可以:
1. 在用户的城市中找到附近的开放餐厅
2. 浏览包含价格和修改选项的完整菜单
3. 在支付任何费用之前获取精确的成本明细
4. 在单个工具调用中下订单并确认支付
5. 跟踪配送状态并将预计到达时间(ETA)报告给用户
每个订单都通过真正的UberEats或DoorDash账户调度 — 相同的食物,相同的司机,相同的城市。
---
## 获取API密钥 — 即时自助注册
无需等待,无需审批队列。注册您的代理并在30秒内开始调用:
```http
POST https://mcp.canuckeats.com/register
Content-Type: application/json
{
"agent_name": "我的餐食代理",
"email": "you@yourproject.com",
"description": "为远程团队订购午餐的人工智能助手"
}
```
**响应:**
```json
{
"api_key": "您的API密钥仅显示一次",
"key_id": "uuid",
"scopes": ["catalog:read", "orders:write"],
"medusa_customer_id": "cus_...",
"mcp_endpoint": "https://mcp.canuckeats.com/mcp",
"docs": "https://github.com/canuckeats/MCP",
"message": "注册成功。请安全保存您的API密钥 — 它仅显示一次,无法再次检索。"
}
```
**密钥仅显示一次。** 立即保存。如果丢失,请使用不同的电子邮件重新注册 — 相同的电子邮件地址将被拒绝,因此请为每个密钥使用唯一的电子邮件地址。
**注册限制:** 每个IP地址每天最多5次注册。每个电子邮件地址一个密钥。不接受一次性电子邮件地址。
---
## 覆盖哪些城市?
所有主要的加拿大城市:**卡尔加里,埃德蒙顿,温哥华,多伦多,渥太华,蒙特利尔,温尼伯,汉密尔顿,伦敦,哈利法克斯,萨斯喀通,里贾纳,克洛内拉,维多利亚,阿博茨福德,巴里,布兰普顿,伯灵顿,伯纳比,科奎特拉姆** 和其他69个城市,覆盖 **阿尔伯塔省,不列颠哥伦比亚省,安大略省,曼尼托巴省,萨斯喀通省,新斯科舍省,新不伦瑞克省** 等其他省份。
使用 `list_cities` 获取当前完整的城市列表和餐厅数量。
---
## 8种工具 — 完整的订单生命周期
| 工具 | 认证 | 描述 |
|------|------|-------------|
| `list_cities` | API密钥 | 列出所有89个城市和餐厅数量 |
| `search_restaurants` | API密钥 | 按城市,美食,名称或价格范围搜索 |
| `get_restaurant` | API密钥 | 完整的餐厅详情 |
| `get_menu` | API密钥 | 完整的菜单,包含章节,价格和修改选项 |
| `validate_order` | API密钥 | 预览确切的总费用 — 无需支付,无需创建订单 |
| `create_order` | API密钥 | 创建订单 + Stripe PaymentIntent(尚未支付) |
| `confirm_payment` | API密钥 | 支付订单并调度到平台 |
| `get_order_status` | API密钥 | 实时状态,跟踪URL和ETA |
---
## 快速入门:60秒连接
### Python(使用 `mcp` SDK)
```python
import asyncio, json
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main():
async with streamablehttp_client(
"https://mcp.canuckeats.com/mcp",
headers={"Authorization": "Bearer YOUR_API_KEY"}
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
# 查找餐厅
result = await session.call_tool("search_restaurants", {
"city_slug": "vancouver-bc",
"query": "sushi",
"limit": 5
})
restaurants = json.loads(result.content[0].text)
print(f"在温哥华找到 {restaurants['total']} 家寿司餐厅")
asyncio.run(main())
```
### TypeScript / Node.js
```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
const client = new Client({ name: "my-agent", version: "1.0" }, { capabilities: {} })
await client.connect(new StreamableHTTPClientTransport(
new URL("https://mcp.canuckeats.com/mcp"),
{ requestInit: { headers: { Authorization: "Bearer YOUR_API_KEY" } } }
))
const result = await client.callTool({ name: "list_cities", arguments: {} })
const cities = JSON.parse(result.content[0].text)
console.log(`${cities.length} 个城市可用`)
```
### Claude 桌面集成
将以下内容添加到您的Claude桌面MCP配置(`claude_desktop_config.json`):
```json
{
"mcpServers": {
"canuckeats": {
"type": "streamable-http",
"url": "https://mcp.canuckeats.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
```
然后询问Claude: *"请为卡尔加里市400 4 Ave SW, Calgary AB T2P 0J4地址订购一个 pepperoni披萨。*
---
## 完整的订单流程
```
list_cities → 获取城市slug(例如 "calgary-ab")
↓
search_restaurants → 获取餐厅ID
↓
get_menu → 获取menu_item_id + 修改选项
↓
validate_order → 确认总费用(无需支付)
↓
create_order → 获取order_id + stripe_payment_intent_id
↓
confirm_payment → 支付pm_... 并调度
↓
get_order_status (poll) → 跟踪直到配送完成
```
请参阅 [docs/examples/order-flow.md](docs/examples/order-flow.md) 以获取带有真实请求/响应示例的叙述式演练。
---
## 速率限制
| 端点 | 限制 |
|----------|-------|
| `/register` | 每IP每24小时5次注册 |
| 所有工具(常规) | 每密钥每分钟60个请求 |
| `create_order`, `confirm_payment` | 每密钥每分钟10个请求 |
每个MCP响应都包含响应头 `X-RateLimit-Limit` 和 `X-RateLimit-Remaining`。
---
## 代理的关键事实
- **仅限加拿大地址。** 省份必须是两个字母的代码:`AB`, `BC`, `ON`, `QC`, `MB`, `SK`, `NS`, `NB`, `NL`, `PE`, `NT`, `YT`, `NU`.
- **付款方式:** `confirm_payment` 接受Stripe `pm_*` 支付方式ID。代理的操作员必须提供一个已经预先在Stripe设置的有效的Stripe支付方式。
- **订单调度是自动的。** 在 `confirm_payment` 成功后,订单将在2-5分钟内转发到UberEats或DoorDash。使用 `get_order_status` 跟踪。
- **配送平台自动选择**,根据哪个平台在该餐厅的目录中选择。
- **`source_id` 在菜单项上** 内部使用 — 您不需要直接引用它。只需在调用 `create_order` 时使用 `menu_item_id` (整数 `id` 字段)。
- **修改是可选的。** 如果菜单项有必填修改(例如饮料大小),省略它们可能会导致订单在平台层面失败。检查 `modifier_groups[].min_selections` 以了解哪些是必填的。
- **支持预定配送** 通过 `create_order` 上的ISO 8601字段 `scheduled_for`。省略此字段即可使用ASAP配送。
---
## 支持的配送平台
| 平台 | 覆盖范围 |
|----------|----------|
| **UberEats** | 所有89个城市 |
| **DoorDash** | 所有89个城市 |
订单被放置在具有请求餐厅的平台上。每个餐厅上的 `source` 字段(`"ubereats"` 或 `"doordash"`)告诉您将使用哪个平台。
---
## 加拿大城市 — 完整列表
阿尔伯塔省 · 不列颠哥伦比亚省 · 曼尼托巴省 · 新不伦瑞克省 · 纽芬兰省 · 新斯科舍省 · 安大略省 · 爱德华王子岛省 · 魁北克省 · 萨斯喀通省
使用 `list_cities` 获取实时列表。值得注意的城市包括:
**阿尔伯塔省:** 卡尔加里,埃德蒙顿,红鹿,莱斯布里奇,艾尔德里,梅迪辛哈特,格兰德普雷里,堡麦克默里
**不列颠哥伦比亚省:** 温哥华,萨里,伯纳比,列治文,克洛内拉,阿博茨福德,维多利亚,科奎特拉姆,兰利
**安大略省:** 多伦多,渥太华,汉密尔顿,伦敦,布兰普顿,米西萨uga,巴里,温莎,基奇纳,Ajax,奥罗拉
**魁北克省:** 蒙特利尔(部分地区)
**草原和大西洋:** 萨斯喀通,里贾纳,温尼伯,哈利法克斯,蒙克顿,弗雷德里克顿
---
## API 参考
- [完整的工具模式和TypeScript类型](docs/tools.md)
- [带有代码示例的快速入门指南](docs/quickstart.md)
- [端到端订单演练](docs/examples/order-flow.md)
- [机器可读的工具清单](tools.json)
---
## 支持
- **问题/疑问:** 在此仓库中打开一个GitHub问题
- **丢失API密钥:** 使用不同的电子邮件重新注册,或发送电子邮件至 hello@canuckeats.com
- **订单问题:** 发送电子邮件至 hello@canuckeats.com 并附上您的 `order_id`
- **网站:** [canuckeats.com](https://canuckeats.com)