穷鬼麦饱饱 · 20 元吃饱麦当劳
一句话定位
> 在 ¥20 预算硬约束内,用实时菜单数据求解总热量最高的麦当劳套餐组合,
> 让每一分钱都换成最实在的饱腹感。
这个 Skill 解决什么问题
麦当劳菜单是套餐嵌套单品的复杂结构:
- 同一个汉堡,既能单点,也能出现在「超值套餐」里;
- 套餐里的薯条和可乐,也能作为单品单独买;
- 门店价格实时变化,不同门店、不同时段折扣不同;
- 用户想要的不是「最便宜」,而是「同样的 20 块,吃完最不饿」。
人脑很难枚举这些组合。本 Skill 把这些工作交给一个分支限界求解器,
并用麦当劳 MCP 的实时数据保证结果真实可下单。
核心指标
热量密度 = 千卡 / 元(kcal/元)
这是穷鬼套餐的真正目标函数。举例:
| 商品 | 价格 | 热量 | 热量密度 |
|---|---|---|---|
| 汉堡包 | ¥9.00 | 248 kcal | 27.6 kcal/元 |
| 香芋派 | ¥8.00 | 232 kcal | 29.0 kcal/元 |
| 巨无霸 | ¥22.00 | 513 kcal | 23.3 kcal/元 |
| 可乐中杯 | ¥9.50 | 147 kcal | 15.5 kcal/元 |
结论:小食、派、冰淇淋的热量性价比经常高于正价汉堡;
可乐等含糖饮料则是「花钱买热量」的低效选项(无糖可乐更是纯花钱)。
工作流程
严格按以下五步执行,不要跳步、不要凭记忆编造价格。
第 1 步:确认用户条件
先问清楚(若用户已说明则跳过):
- 预算——默认 ¥20,用户可自定(如「25 块」)。
- 就餐方式——到店自取 / 麦乐送 / 得来速 / 团餐。
- 门店——在哪家店吃(影响价格与可选商品)。
- 口味禁忌——不吃辣、不吃牛肉、忌乳制品等。
> 若用户只想先看方案、没有指定门店,可用 query-nearby-stores 搜索
> 用户所在城市的门店,或请用户提供门店名。
第 2 步:拉取实时数据(必须真实调用 MCP)
按顺序调用,不要跳过任何一步:
1. mcd-mcp / query-nearby-stores → 拿到 storeCode(及 beCode)
2. mcd-mcp / query-meals → 拿到该店完整菜单与实时价格
3. mcd-mcp / list-nutrition-foods → 拿到全量营养表(含千卡)
参数传递规则(极易出错,务必对照):
| 就餐方式 | beType | orderType | beCode |
|---|---|---|---|
| 到店自取 | 1 | 1 | 不传 |
| 得来速 | 5 | 1 | 必传(来自 query-nearby-stores) |
| 麦乐送 | 2 | 2 | 必传(来自 delivery-query-stores) |
| 团餐 | 6 | 2 | 必传(来自 delivery-query-stores) |
> query-meals 报「门店可能已关闭或不在营业时间」时,换一家门店或
> 改用餐时段重试,不要伪造数据继续往下算。
第 3 步:调用求解器
把 MCP 返回的原始数据落盘,再交给求解器:
# 1) 保存 MCP 原始返回
# meals.json <- query-meals 的完整 JSON
# nutrition.txt <- list-nutrition-foods 的 data 字段原文
# 2) 运行求解
python skills/qionggui-mai-baobao/scripts/qionggui_solver.py \
--meals meals.json \
--nutrition nutrition.txt \
--budget 20 \
--top-k 3 \
--format markdown
支持的开关:
| 参数 | 说明 | 默认 |
|---|---|---|
--budget |
预算上限(元) | 20 |
--top-k |
返回几个候选方案 | 3 |
--max-per-item |
每种商品最多买几份 | 1 |
--format |
markdown / json / csv |
markdown |
--out |
写文件路径,留空则打印 | 空 |
第 4 步:用 calculate-price 复核价格
求解器算的是菜单挂牌价。真实结账价可能因优惠券、会员卡更低。
mcd-mcp / calculate-price
items: 求解器给出的商品清单(productCode + quantity)
couponId / couponCode: 用户有券时传入
若有券可用,把券后价格回填给用户,并说明省了多少钱。
第 5 步:输出结论
用「先结论、后展开」的顺序呈现:
- 一句话结论:花多少钱、吃多少千卡、性价比多少 kcal/元。
- 商品清单表:商品、数量、单价、热量小计。
- 为什么这么搭(1–3 条):点出热量密度最高的关键商品。
- 备选方案:给 2 个不同风格的方案(如「最扛饿」「有肉有饮料」)。
- 下单提示:用户确认后可引导调用
create-order。
输出模板
## 穷鬼麦饱饱 · 你的 ¥20 最优解
**¥20.00 吃下 542 kcal,热量效率 27.10 kcal/元** —— 这是本店 20 元档的顶配。
| 商品 | 数量 | 单价 | 热量 |
| --- | ---: | ---: | ---: |
| 吉士汉堡包 | ×1 | ¥11.00 | 294 kcal |
| 汉堡包 | ×1 | ¥9.00 | 248 kcal |
| **合计** | | **¥20.00** | **542 kcal** |
**为什么这么搭**
- 吉士汉堡包热量密度 26.7 kcal/元,同价位里最扛饿;
- 不配可乐——中可 ¥9.5 只换 147 kcal,同样的钱买汉堡包能换 248 kcal。
**备选方案**
- 想有甜点:香芋派 + 小薯条 + 圆筒冰淇淋,¥20.00 / 535 kcal
- 想省着点:吉士汉堡包 + 香芋派,¥19.00 / 526 kcal
> 要下单的话说一声,我帮你加到购物车。
排障
| 现象 | 原因 | 处理 |
|---|---|---|
| 求解器报「未匹配到营养数据」 | 商品名与营养表命名不一致 | 检查 references/nutrition-mapping.md,补充别名映射 |
| 求解结果热量明显偏低 | 营养表缺失该商品 | 补全 nutrition.txt 后重跑 |
query-meals 返回空菜单 |
门店歇业 / 时段不对 | 换门店或换时段重试 |
| 输出出现「套餐 + 套餐内单品」 | 互斥关系未建立 | 检查 _combo_child_names 能否解析出子项名 |
合规与边界
- 本 Skill 只做信息聚合与组合计算,价格为菜单挂牌价,以门店实际结账为准。
- 不构成营养或医疗建议。所有输出均提示「热量数据仅供参考」。
- 不鼓励暴饮暴食。方案默认
max-per-item=1,即每种商品最多一份。 - Token 安全:严禁在代码、文档、输出中写入真实 MCP Token,
配置文件一律使用环境变量占位符(见mcp-config.example.json)。
参考文档
references/algorithm.md—— 求解算法详解(为什么用分支限界、如何防伪最优解)references/nutrition-mapping.md—— 菜单名 ↔ 营养表名 对照表references/mcp-tools.md—— 用到的 MCP 工具与参数速查