[分享创造] WorkBuddy × 麦当劳,程序员创意开发大赛(求 Star Orz ..
一、先说活动:WorkBuddy × 麦当劳,程序员创意开发大赛
WorkBuddy 联合麦当劳发起了 「麦当劳程序员创意开发大赛」。玩法很直接:参赛者基于麦当劳官方 MCP 能力,用 WorkBuddy 开发一个创意 Skill ,把点子变成能跑的东西。

奖励部分:
| 奖项 | 内容 |
|---|---|
| 前三名 | 巨无霸免费多次兑换券 + 10240 WorkBuddy 积分 |
| 前 100 名 | 程序员节实体徽章、汉堡回车键 |
| 专项奖励 | 使用 WorkBuddy 开发参赛,额外 +3000 积分 |
我觉得这个命题挺有意思的地方在于:麦当劳 MCP 把营养表、门店菜单、订单查询、优惠券、报价下单都开放成了原子接口,但这些接口单独拎出来都很"碎"。真正有意思的不是调一次接口,而是怎么把这些原子能力编排成一条用户愿意每天用的闭环。于是就有了下面这个项目。
二、我的参赛作品:热麦卡路里
麦当劳订单热量估算与餐段档位套餐推荐 · Agent Skill · 麦当劳程序员节创意开发大赛参赛作品

一句话:给它一个订单号,它告诉你这单多少热量、落在哪个档位、想轻一点该怎么换;说一个目标(减脂 / 控盐 / 省钱…),它按场景帮你配餐;确认金额后还能代你下单(支付仍由你自己完成)。
- GitHub:https://github.com/orderye/mcd-calorie-skill
- 在线演示(手机可直接打开):https://orderye.github.io/mcd-calorie-skill/food.html
▲ 演示页首屏(模拟数据 · 纯代码 SVG 静态重绘,无 JS / 无外部资源)
三、它能干什么
底层能力全部来自麦当劳中国官方 MCP 服务 M-China/mcd-mcp-server;热量计算则是本地纯 Python 脚本完成的,不联网、无第三方依赖。
| 能力 | 你说 | 它做 | 依赖 |
|---|---|---|---|
| A. 订单热量估算 | 「这单多少热量?订单号 xxx 」 | 展开套餐 → 逐项匹配营养表 → 整单合计 + 档位结论 | query-order |
| B. 档位推荐 | 「想吃 300 大卡左右的早餐」 | 取该餐段实时菜单 → 枚举组合 → ±12% 筛选 → Top 3–4 | query-meals |
| C. 替换建议 | 「昨天那单偏高,今天来点轻的」 | 高于标准档则切标准档 → 输出更轻组合 + 少多少 kcal | query-meals |
| G. 目标场景推荐 | 「减脂吃什么」「想控盐」「今天还剩 600 卡」 | 13 个场景自动切换档位 / 排序 / 硬上限 / 关键词排除 | query-meals + mcd_goal.py |
| D. 一键导入历史订单 | 「导入我的历史订单分析热量」 | order-list 原始响应 → 自动脱敏落盘 → 逐单算热量 → 排行与汇总 | order-list + mcd_import.py |
| D2. 历史订单复盘 | 「我最近都吃了些什么」 | 已脱敏样本逐单算热量、按餐段比对、出排行(跳过脱敏) | mcd_import.py --no-deidentify |
| E. 安全下单 | 「就按推荐第 1 组帮我下单」 | 查券(只标注)→ 报价 → 确认闸门 → 创建订单 | calculate-price / create-order |
| F. 全量目录(离线兜底) | —(后台能力) | 多份菜单快照聚合为 catalog.json + 营养缺口清单 | query-meals 快照 |
| 数据自更新( v0.8 ) | —(随推荐自动生效) | 餐品 100% 取当次 query-meals 实时可售(上新/下架/调价即时生效);规格证据五级分级,仅 A 级补录别名表 | mcd_spec_evidence.py |
实际对话长这样
算一单
用户:这单多少热量?订单号 9900004064
WorkBuddy:
[订单估算] 订单 SAMPLE-20261009-01 · 餐段 午餐 · 档位 标准(目标 750 kcal )
✓ 板烧鸡腿堡 391 kcal |钠 1041mg
✓ 中薯条 289 kcal |钠 165mg
✓ 可乐中杯 147 kcal |钠 0mg
整单:827 kcal
结论:落在本餐段标准档范围内,合适
说个目标就行
用户:午餐想控盐,钠低一点
WorkBuddy:
[推荐 · 午餐 · 轻量 · 低钠控盐] 目标 500 kcal (区间 440–560 ,命中 34 组)
场景策略:整组钠不超上限,钠越低越靠前|生效约束:钠 ≤1000mg
1. 麦香鱼 + 苹果片 + 100% 苹果汁(盒装) 445 kcal |蛋白 16g |钠 556mg |≈¥41.0
2. 麦香鱼 + 苹果片 + 咖啡阿芙佳朵 496 kcal |蛋白 20g |钠 605mg |≈¥44.0
3. 麦香鱼 + 咖啡阿芙佳朵 464 kcal |蛋白 20g |钠 605mg |≈¥37.0
翻旧账
用户:导入我的历史订单分析热量
WorkBuddy:
[历史订单一键导入 · 热量分析报告] (原始响应已自动脱敏落盘)
下单时间 餐段 项数 热量 标准档 结论
2025-11-22 18:28 晚餐 8 2243 750 偏高 +1493
2025-10-11 13:26 午餐 5 1470 750 偏高 +720
2026-03-20 18:32 晚餐 5 987 750 偏高 +237
…
订单数 8 |平均 1085.6 kcal |超标准档 6 单|最重 2243 kcal
商品项 39 |热量未知 4 项( 10.3%)|歧义待选 0 项
四、口径设计:餐段 × 档位 × 目标场景
档位目标值( kcal ),筛选区间为目标值 ±12%:
| 餐段 | 轻量 | 标准 | 吃饱 | 兜底时段 |
|---|---|---|---|---|
| 早餐 | 300 | 450 | 600 | 05:00–10:30 |
| 午餐 | 500 | 750 | 1000 | 10:30–15:30 |
| 随便吃吃(下午茶) | 150 | 300 | 450 | 15:30–17:59 |
| 晚餐 | 500 | 750 | 1000 | 18:00–22:00 |
| 宵夜(单列档) | 300 | 450 | 600 | 22:00–23:59 、00:00–05:59 |
补充规则:宵夜单列,不并入晚餐;门店时段实测优先(各店营业餐段不同,query-meals 需传 reservationDate,接口并没有 daypart 字段);档位内无解时提示换档位,**绝不偷偷放宽 ±12%**;历史订单的餐段取订单自带时间,而不是当前时刻。
目标场景( G ):第三个维度
「目标场景」是叠在「餐段 × 档位」之上的第三层(mcd_goal.py 策略层)。每个场景 = 一套营养策略描述符,自动切换推荐档位 / 热量容差 / 硬上限 / 关键词排除 / 排序评分,用户不用自己算。场景键就是对话触发词(比如「减脂吃什么」→ cut)。
| # | 场景键 | 场景名 | 推荐档位 | 核心策略 | 场景入参 |
|---|---|---|---|---|---|
| 1 | cut | 减脂 | 轻量 | 蛋白密度优先 + 钠偏低 + 剔甜品、小食 ≤1 ( min_protein 15g ) | — |
| 2 | bulk | 增重 | 吃饱 | 蛋白与碳水双高 + 小食 ≤2 、允许甜品( min_protein 20g ) | — |
| 3 | post | 练后餐 | 标准 | 蛋白总量优先 + 必含主食回补碳水( min_protein 20g ) | — |
| 4 | cheat | 放纵餐 | 吃饱(容差 ±15%) | 热量上浮 + 允许甜品 + 性价比排序 | — |
| 5 | low-sodium | 低钠控盐 | 轻量 | 钠硬上限 ≤1000mg + 钠升序 | --sodium-max |
| 6 | high-protein | 高蛋白增肌 | 标准 | 蛋白密度优先 + 蛋白总量(日常版,min_protein 25g ) | — |
| 7 | low-carb | 低糖低碳水 | 轻量 | 碳水硬上限 ≤60g + 碳水升序 | --carb-max |
| 8 | low-fat | 低脂清淡 | 轻量 | 脂肪硬上限 ≤30g + 脂肪升序 | --fat-max |
| 9 | vegetarian | 素食 / 蛋奶素 | 轻量 | 排除肉类水产(蛋奶可食)关键词粗筛;无主食时拼小食达档 | — |
| 10 | kids | 儿童 / 小份量 | 轻量(×0.85 ) | 热量下浮 + 单组最多 2 件 | --max-items |
| 11 | daily-budget | 热量预算日控 | 按剩余预算 | 用满预算但不超;区间 [0.7B, B] | --budget |
| 12 | allergen | 过敏原规避 | 标准 | 按过敏原关键词排除(花生 / 坚果 / 乳制品 / 麸质 / 海鲜等,粗筛带告警) | --allergens |
| 13 | value | 性价比 / 省钱 | 标准 | 价格硬上限 + 价格升序 | --price-max |
评论
?
参与讨论