内容
# 订餐 MCP
[](https://github.com/henkas/orderfood/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/@henkas/orderfood)
[](LICENSE)
一个 MCP 服务器,允许 AI 代理搜索餐厅并通过 11 个 MCP 工具在 **Uber Eats** 和 **Thuisbezorgd** 上订购外卖。
> **法律:** 欧盟指令 2009/24/EC 第 6 条明确允许出于互操作性的逆向工程。本项目仅用于个人使用和开源研究 — 非商业用途,与 Uber Eats 或 Just Eat Takeaway 无关。
---
## 适用人群
- **AI 高级用户**,他们希望告诉 Claude 或 Codex “在附近找一家寿司店,并将评分最高的选项添加到我的购物车中”,并且使其实际生效
- **开发者**,他们正在探索用于现实世界消费者 API 集成的 MCP 服务器设计
- **研究人员**,他们正在研究欧盟指令 2009/24/EC 第 6 条下的逆向工程 API 互操作性
## 不适用人群
- 寻找完全自动化的“无需手动下单”体验的人 — 在两个平台上,下单都需要浏览器支付步骤,暂时无法自动化(参见下面的平台支持)
- 大量或商业使用 — 该工具仅设计用于个人、单一账户使用
- 需要极度稳定的会话的用户 — Uber Eats cookie 在 24–48 小时后过期,需要手动刷新;Thuisbezorgd token 自动刷新,但 API 可能会在未通知的情况下更改
## 功能
| 工具 | 描述 |
|------|-------------|
| `search_restaurants` | 按位置、美食或查询查找餐厅 |
| `get_restaurant` | 获取完整的餐厅详情和菜单 |
| `get_cart` | 查看当前购物车 |
| `add_to_cart` | 将商品添加到购物车并附带选项 |
| `clear_cart` | 清空购物车 |
| `get_saved_addresses` | 列出已保存的配送地址 |
| `get_payment_methods` | 列出可用的支付方式 |
| `place_order` | 将当前购物车作为订单下单 |
| `track_order` | 获取实时订单状态 |
| `get_order_history` | 列出过去的订单 |
| `cancel_order` | 取消活跃的订单 |
| `ping_platform` | 检查平台的身份验证和连接性 |
所有工具都接受 `platform: "ubereats" | "thuisbezorgd"` 作为必填参数。
## 平台支持
| 功能 | Uber Eats | Thuisbezorgd | 备注 |
|---|---|---|---|
| 搜索餐厅 | ✅ | ✅ | |
| 获取餐厅 + 菜单 | ✅ | ✅ | TB 使用 SSR HTML 抓取 |
| 购物车管理 | ✅ | ✅ | |
| 已保存的地址 | — | ✅ | UE 实时解析地址 |
| 支付方式 | ✅ | ✅ | |
| 下单 | ⚠️ | ⚠️ | 被浏览器支付流程阻止(Apple Pay / iDeal / Adyen) |
| 跟踪订单 | ✅ | 🚧 | TB 跟踪端点尚未捕获 |
| 订单历史 | 🚧 | 🚧 | UE:端点返回 null — 正确的请求参数未知;TB:尚未捕获 |
| 取消订单 | 🚧 | 🚧 | 端点尚未捕获 |
| 健康检查 | ✅ | ✅ | `ping_platform` 工具验证身份验证和连接性 |
**图例:** ✅ 工作 · ⚠️ 被外部依赖阻止 · 🚧 存根(API 尚未捕获)· — 不适用
## 架构
pnpm 工作区 monorepo — TypeScript 5,严格,纯 ESM,Node.js 20+。
```
packages/
shared/ @orderfood/shared — 规范化类型 + PlatformClient 接口
ubereats-client/ @orderfood/ubereats-client — Uber Eats REST 客户端
thuisbezorgd-client/ @orderfood/thuisbezorgd-client — Thuisbezorgd REST 客户端
mcp-server/ @henkas/orderfood — MCP 服务器 + 设置 CLI
tools/
api-capture/ 用于捕获 API 流量的 mitmproxy 插件
docs/
api-reference/ 按平台记录的端点
```
## 先决条件
- Node.js 20+
- pnpm 9+
- Python 3.11+ *(仅用于 API 捕获工具)*
## 安装
```bash
git clone https://github.com/henkas/orderfood.git
cd orderfood
pnpm install
pnpm build
```
## 设置
```bash
npx @henkas/orderfood setup --platform ubereats
npx @henkas/orderfood setup --platform thuisbezorgd
```
凭证存储在 `~/.orderfood/`(AES-256-GCM)中加密。参见 [设置指南](docs/setup.md),了解完整的逐步说明,包括如何找到 Uber Eats cookie 以及 Thuisbezorgd OAuth 流的工作原理。
## 与 Claude Code 一起使用
```bash
claude mcp add orderfood -- npx @henkas/orderfood
```
或从源代码运行:
```bash
claude mcp add orderfood -- node /path/to/orderfood/packages/mcp-server/dist/index.js
```
## 与 Codex 一起使用
```bash
codex mcp add orderfood -- npx @henkas/orderfood
```
然后与 Claude 对话:
```
在 Thuisbezorgd 上查找阿姆斯特丹 Centraal 附近的意大利餐厅
```
```
将 [餐厅] 的玛格丽塔披萨添加到我的 Uber Eats 购物车中
```
```
我的 Thuisbezorgd 购物车里有什么?
```
```
显示我的 Uber Eats 支付方式
```
## 开发
```bash
pnpm install # 安装所有工作区包
pnpm typecheck # 类型检查所有包
pnpm test # 运行所有测试
pnpm build # 编译所有包
# 按包
pnpm --filter @orderfood/shared test
pnpm --filter @henkas/orderfood build
```
## API 捕获
平台客户端代码基于真实应用的 mitmproxy 捕获。要贡献新的端点发现:
1. `pip install mitmproxy`
2. 按照 `tools/api-capture/README.md` 安装设备上的证书
3. `mitmproxy -s tools/api-capture/capture.py`
4. 使用应用程序 — 捕获的调用保存在 `tools/api-capture/output/{platform}/`
5. 在 `docs/api-reference/{platform}.md` 中记录发现结果
## 文档
| | |
|---|---|
| [设置指南](docs/setup.md) | 安装、身份验证、连接到您的代理 |
| [Uber Eats API 参考](docs/api-reference/ubereats.md) | 已发现的端点和请求形状 |
| [Thuisbezorgd API 参考](docs/api-reference/thuisbezorgd.md) | 已发现的端点和请求形状 |
## 贡献
参见 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 安全
凭证在存储时加密(AES-256-GCM,HKDF-SHA256 密钥来自机器 ID)。参见 [SECURITY.md](SECURITY.md),了解漏洞报告流程。
## 许可证
MIT — 参见 [LICENSE](LICENSE)。