mcd-omni-assistant
Health Uyari
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Gecti
- Code scan — Scanned 3 files during light audit, no dangerous patterns found
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
麦当劳 MCP 全能助手 | 全覆盖 35 个工具 · 7 大工作流 · 14 条防错铁律 | 领券 / 点餐 / 外送 / 派对预约 / 积分到期止损,附零依赖 CLI 通道
🍟 麦麦全能助手 · McOmni
一句话,搞定吃麦全流程
领券 → 选店 → 配餐 → 比价 → 下单 → 派对预约 → 积分止损
基于麦当劳中国官方 MCP Server(mcd-mcp @ https://mcp.mcd.cn)构建的全能助手 Skill。
关于徽章:图片来自 shields.io,个别网络环境下可能加载较慢。README 的全部信息在正文中都有文字说明,徽章缺失不影响阅读。
目录
🧩 它解决什么问题
麦当劳把 35 个能力开放给了 AI。但在真实账号上跑一遍就会知道:能调用 ≠ 会用。
flowchart TD
U["👤 用户:想点个麦当劳"] --> Q{"🍽️ 怎么取餐?"}
Q -->|"到店自取"| S1["query-nearby-stores<br/>→ storeCode"]
Q -->|"麦乐送"| S2["delivery-query-stores<br/>→ storeCode + beCode"]
Q -->|"得来速"| S3["query-nearby-stores<br/>→ storeCode + beCode"]
S1 --> M["query-meals<br/>→ productCode"]
S2 --> M
S3 --> M
M --> P["calculate-price<br/>→ takeWayCode"]
P --> C["create-order<br/>→ orderId"]
style Q fill:#FAEEDA,stroke:#854F0B,stroke-width:0.5px,color:#633806
style P fill:#E6F1FB,stroke:#185FA5,stroke-width:0.5px,color:#042C53
style C fill:#EAF3DE,stroke:#3B6D11,stroke-width:0.5px,color:#173404
每一环都必须来自上一环的返回值;中间任何一环猜错,订单就下不出去。
同时还要管住三件事:
| # | 要管住的事 | 不遵守的后果 |
|---|---|---|
| ① | beType / orderType 的组合 |
取餐方式错乱 |
| ② | 有副作用的操作(下单 / 领券 / 抽奖)不能误触发 | 真花钱、真扣分 |
| ③ | 花积分类的取舍不能替用户拍板 | 僭越了用户的决定权 |
McOmni 的价值不在"能调用工具",而在知道什么时候不该调用——它把踩过的坑固化成硬约束,让 AI 在你的真实账号上安全地跑完整个流程。
🎯 能力总览
35 / 35 工具全覆盖,不只是检索类接口。
| 分组 | 数量 | 代表能力 |
|---|---|---|
| 🎫 活动与优惠 | 4 | 当月活动日历、可领券、一键领券、我的券 |
| 🏪 到店点餐 | 7 | 门店查询、菜单、详情、算价、下单、取消、订单详情 |
| 🛵 麦乐送外送 | 3 | 地址管理、可配送门店 |
| 🎁 积分与商城 | 7 | 积分账户、抽奖、奖品、商城兑换、商城订单 |
| 🥗 营养数据 | 2 | 160+ 条餐品营养(能量 / 蛋白 / 脂肪 / 碳水 / 钠 / 钙) |
| 🎉 派对与活动预约 | 5 | 城市 → 门店 → 日期 → 场次 → 下单 |
| 🏢 企业团餐 | 3 | 团餐门店、助餐服务、促销规则 |
| 🧩 其他 | 4 | 服务器时间、历史订单、满意度奖券、门店级用券 |
三种取餐方式全部支持:到店自取 / 麦乐送外送 / 得来速车道取餐。
🚀 快速开始
第 1 步 · 拿 Token
访问 https://open.mcd.cn/mcp,手机号登录 → 控制台 → 激活,一键复制 Token。
第 2 步 · 让助手能用上它
方式 A:作为 WorkBuddy Skill(推荐)
cp -r . ~/.workbuddy/skills/mcdonalds
然后在「连接器 → 自定义连接器」中填入配置(参考 mcp-config.example.json),把 ${MCD_MCP_TOKEN} 换成你自己的 Token。
方式 B:只用命令行通道(不需要任何 AI 客户端)
export MCD_MCP_TOKEN=<你的Token>
python scripts/mcd_cli.py list 优惠
# 找门店(searchType=2 按位置搜,city 与 keyword 必须同时传)
python scripts/mcd_cli.py call query-nearby-stores \
'{"beType":1,"searchType":2,"city":"北京市","keyword":"鼓楼南街"}'
Token 解析顺序(任选其一即可):
| 顺序 | 来源 |
|---|---|
| 1 | 环境变量 MCD_MCP_TOKEN |
| 2 | 环境变量 MCD_MCP_CONFIG 指向的 JSON 文件 |
| 3 | ~/.workbuddy/mcp.json |
| 4 | 项目根目录 / 当前目录下的 mcp.json |
第 3 步 · 用起来
# 看有什么券,然后一键领掉
python scripts/mcd_cli.py call available-coupons
python scripts/mcd_cli.py call auto-bind-coupons
# 积分快过期了?先 dry-run 看方案,再决定花不花
python scripts/points_expiry_draw.py
🧭 七大核心工作流
| # | 工作流 | 工具链 |
|---|---|---|
| 0 | 入口 · 确认取餐方式 | 先问「到店自取 / 麦乐送 / 得来速」,再决定后续全部参数 |
| 1 | 🎫 领券 | available-coupons → auto-bind-coupons → query-my-coupons |
| 2 | 🏪 点餐(到店 / 得来速) | query-nearby-stores → query-meals → query-meal-detail → calculate-price → create-order |
| 3 | 🛵 外送(麦乐送) | delivery-query-addresses → delivery-query-stores → query-meals → calculate-price → create-order |
| 4 | 🧸 周边玩具雷达 | campaign-calendar + mall-points-products(2>8) + query-meals 组合拼出 |
| 5 | 🎰 积分抽奖 / 到期止损 | query-my-account → query-lottery-info → draw-lottery → query-my-prizes |
| 6 | 🥗 热量计算 | list-nutrition-foods / query-meal-detail |
| 7 | 💰 优惠计算器 | query-store-coupons → calculate-price(用券 / 不用券 两组对比) |
⚠️ 工作流 4 需要特别说明:MCP 没有原生"玩具"接口,这是组合能力。若接口未返回玩具字段,助手会如实说明「本期接口未返回玩具信息」,不会编造款式。
🛡️ 为什么它靠谱
14 条防错铁律(节选)
| # | 规则 | 不遵守的后果 |
|---|---|---|
| 1 | beType 决定一切(1 自取 / 2 麦乐送 / 5 得来速 / 6 团餐) |
取餐方式错乱 |
| 2 | orderType:到店类 = 1,外送类 = 2 |
下单到错误渠道 |
| 3 | 到店自取不传 beCode;得来速 / 外送必传 |
直接报错 |
| 4 | 菜单编码取 data.categories[].meals[].code |
会误取外层状态码 200 |
| 5 | 到店下单必传 takeWayCode,只能来自 calculate-price |
下单失败 |
| 6 | searchType=2 必须 city + keyword 同时传 |
报 600058 |
| 7 | 绝不臆造编码,一切 code 来自上游返回 | 下单到不存在的商品 |
| 8 | 下单前必须算价并让用户确认 | 花冤枉钱 |
| 9 | 抽奖两段式:先看 drawDecision 再执行 |
误消耗积分 |
| 10 | 判定成败看 success 字段,而非是否报错 |
把失败当成功 |
完整 14 条见 SKILL.md。
三条设计原则
① 绝不臆造编码 一切 code 必须来自上游工具的返回值
② 副作用必二次确认 下单前必算价;抽奖前必展示消耗明细
③ 消耗性取舍交用户 不替用户决定花多少积分、要不要溢出
💡 积分到期止损:一个具体例子
麦当劳积分会过期。实测扣减顺序是 先扣将过期积分,不足才从其他积分扣,所以:
「是否溢出」 = 总消耗 > 「本月将过期积分」 (超出 1 分也算溢出)
python scripts/points_expiry_draw.py # 默认 dry-run,列出两套方案的代价
python scripts/points_expiry_draw.py --yes # 只花将过期积分
python scripts/points_expiry_draw.py --yes --allow-overflow # 用户明确同意后才可溢出
flowchart LR
A["读取将过期积分"] --> B["算可抽次数 N"]
B --> C{"会溢出吗?"}
C -->|"不会"| D["直接执行"]
C -->|"会"| E["拒绝执行<br/>退出码 2"]
E --> F["需显式加 --allow-overflow"]
style C fill:#FAEEDA,stroke:#854F0B,stroke-width:0.5px,color:#633806
style D fill:#EAF3DE,stroke:#3B6D11,stroke-width:0.5px,color:#173404
style E fill:#FCEBEB,stroke:#A32D2D,stroke-width:0.5px,color:#791F1F
把决定权留给你,而不是"帮你想开一点"。
📂 项目结构
.
├── SKILL.md # 主文件:14 条铁律 + 7 大工作流 + 触发对照表
├── README.md
├── MCP_INTEGRATION.md # 实际使用的 Server / Tool / 调用流程 / 业务价值
├── CONTEST_DECLARATION.md # 参赛声明(官方原文件,未改动)
├── mcp-config.example.json # 脱敏配置示例(仅环境变量占位符)
├── LICENSE
├── scripts/
│ ├── mcd_cli.py # 零依赖 MCP 命令行通道(list / desc / call / raw)
│ └── points_expiry_draw.py # 积分到期止损(dry-run / --yes / --allow-overflow)
└── references/
├── tools.md # 35 个工具完整参数手册
└── workflows.md # 字段级示例与 items 数组构造
🔧 排障速查
| 现象 | 原因与处理 |
|---|---|
| 工具不在可用列表里 | MCP 未信任。到「连接器管理」信任 mcd-mcp;或改用 scripts/mcd_cli.py |
401 / 无工具返回 |
Token 失效,到 https://open.mcd.cn/mcp 重新激活 |
502 / 连接失败 |
多为系统代理拦截;mcd_cli.py 已默认绕过代理 |
报 600050 |
该 beType 无收藏餐厅 → 改用 searchType=2 + city + keyword |
报 600058 |
searchType=2 时 city 或 keyword 为空 |
| 「操作太频繁」 | 抽奖频控,稍后再试,不要重试轰炸 |
| 菜单查不到某商品 | 促销品用 query-meals 全量兜底,query-meal-detail 可能取不到 |
🔐 安全与边界
- Token 即身份:本项目不保存、不打印你的 Token。仓库中只保留
mcp-config.example.json占位符示例,不包含任何真实凭证。 - 有副作用的操作需明确确认:下单、领券、抽奖、兑换均需用户确认后才执行。
- 本项目非麦当劳官方产品。餐品信息、价格与供应状态以麦当劳官方渠道的实时结果为准;项目输出仅供参考。
🏆 参与的活动
本项目为「麦当劳程序员创意开发大赛(M-CODE 1024)」参赛作品,由参赛者独立开发。
开发过程使用 腾讯 WorkBuddy,完整对话上下文见 workbuddy.md。
如果这个项目对你有帮助,欢迎点一个 Star ⭐
📄 License
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi