[分享创造] WorkBuddy × 麦当劳,程序员创意开发大赛(求 Star Orz ..

一、先说活动:WorkBuddy × 麦当劳,程序员创意开发大赛

WorkBuddy 联合麦当劳发起了 「麦当劳程序员创意开发大赛」。玩法很直接:参赛者基于麦当劳官方 MCP 能力,用 WorkBuddy 开发一个创意 Skill ,把点子变成能跑的东西。

麦当劳程序员创意开发大赛

奖励部分:

奖项 内容
前三名 巨无霸免费多次兑换券 + 10240 WorkBuddy 积分
前 100 名 程序员节实体徽章、汉堡回车键
专项奖励 使用 WorkBuddy 开发参赛,额外 +3000 积分

我觉得这个命题挺有意思的地方在于:麦当劳 MCP 把营养表、门店菜单、订单查询、优惠券、报价下单都开放成了原子接口,但这些接口单独拎出来都很"碎"。真正有意思的不是调一次接口,而是怎么把这些原子能力编排成一条用户愿意每天用的闭环。于是就有了下面这个项目。


二、我的参赛作品:热麦卡路里

麦当劳订单热量估算与餐段档位套餐推荐 · Agent Skill · 麦当劳程序员节创意开发大赛参赛作品
热麦卡路里 · 像素风封面

一句话:给它一个订单号,它告诉你这单多少热量、落在哪个档位、想轻一点该怎么换;说一个目标(减脂 / 控盐 / 省钱…),它按场景帮你配餐;确认金额后还能代你下单(支付仍由你自己完成)。

▲ 演示页首屏(模拟数据 · 纯代码 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
添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论