mcd-food-lab
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 12 files during light audit, no dangerous patterns found
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
麦当劳 MCP 的每元营养效率助手:营养 ÷ 价格
🍔 mcd-food-lab · 麦门食验室
麦当劳把营养数据给了所有人,但没给任何人「除以价格」。
而在售餐品里,能匹配到营养数据的只有约五分之一。
先看效果 · 六个场景 · 我们做对了什么 · 快速开始 · 设计原则
麦当劳程序员创意开发大赛参赛作品 · 全程使用 WorkBuddy 开发
🍟 打开在线演示 →
免安装、免 Token:亲手答反转题、切换六个场景看推荐卡怎么变、翻看真实点餐单。
每次打开随机换一份——12 套题库(种子固定、页内自洽)、六个默认场景、三单真实计价、四种主题,刷新就换。
2026-10-14 用真实 Token 在门店抓的快照(数据冻结在 assets/snapshot.json),不是实时查询 —— 页面由本仓库同一套 scripts 渲染
备选入口:WorkBuddy 资料库版(同一份页面,托管在本项目的开发工具上)
先看效果
下面三段输出全部来自 2026-10-14 门店「北京建外SOHO(A座)」的真实运行,未做美化、未替换数据。装成 Skill 后你只需说那句话,不用记命令、不用开终端。
① 你说「考考我」→ 麦门战力测试
Q1. 「巨无霸,老牌子,放心。」——老牌子也分含金量。
问题:巨无霸 和 那么大鸡排(椒盐风味),谁蛋白更多?
A. 那么大鸡排(椒盐风味) B. 一样多 C. 巨无霸
> ✗ 巨无霸 27g > 那么大鸡排(椒盐风味) 24g。总量这一局,巨无霸赢。
Q2. 同学聚会你负责订餐:预算紧张,又不能跌份。先算笔账——
巨无霸 和 那么大鸡排(椒盐风味),每 1 元蛋白谁高?
A. 那么大鸡排(椒盐风味) B. 一样多 C. 巨无霸
> ✗ 那么大鸡排(椒盐风味) 1.71 g/元 vs 巨无霸 1.06 g/元 —— 每元高 62%,还便宜 11.5 元。
这就是「每元效率」存在的意义。跌份和超支之间,隔着一次每元测算。
Q3. 《关于 2026 年度每元补钙效率评优的通知》:经四城七店实测,
评定「每 1 元补钙标兵」一款——是?
A. 培根安格斯厚牛堡 B. 纯牛奶(盒装) C. 双层吉士汉堡 D. 巨无霸
> ✓ 纯牛奶(盒装):每 1 元 = 22.00 毫克钙。总量高的不一定是冠军 —— 除以价格才知道。
你是「麦门学徒」,答对 1/3
答完出段位战报卡(麦门路人 → 麦门战神)——就是本页最上面那张,同一场会话。
🎮 亲手答一遍,看你的战报卡 →(演示页默认就在这一页)
题目、选项、揭示全部由当前门店实时数据生成,50 个梗壳随机套用(每场三种笑点人格);
换一家店,题面可能就不一样。答案不写在 README 里——要自己错一遍才记得住。
② 你说「今天练完了,能吃点什么」→ 六场景推荐
100 款在售餐品中,官方营养库覆盖 19 款(19%)
未覆盖:麦辣鸡腿汉堡三件套、三文鱼双虾至尊月堡、阳光橙麦炫酷 等 81 款
这些餐品官方营养库里查不到,不参与推荐 —— 不拿估算值凑数。
「今天在练」— 按蛋白质 ↑ 排序
餐品 价格 热量 蛋白质 钙 蛋白质/元 钠 脂肪
────────────────────────── ───────── ──────── ───────── ──────── ───────────── ──────── ────────
那么大鸡排(椒盐风味) 14.0元 385 24 13 1.71 996 21
双层吉士汉堡 23.0元 429 27 232 1.17 1017 22
双层深海鳕鱼堡 24.0元 485 28 147 1.17 917 21
麦辣鸡腿汉堡 22.5元 485 24 154 1.07 1208 24
薄皮焦香V翅 16.0元 192 17 15 1.06 594 11
每一档输出都配一张可分享卡片(顶部按钮切四套风格)—— 🍔 切换六个场景看卡片怎么变 →(点「② 六个场景」)
③ 你说「就它了,鸡排来一份加两盒牛奶」→ 定餐
点餐单:
1× 那么大鸡排(椒盐风味) ¥14.0
2× 纯牛奶 ¥21.0
合计 ¥35.0(calculate-price 实时计价)
这单燃料:38.0g 蛋白 · 每元 1.09g
[只读] 未真实下单。确认无误要下单时,对话里说「确认下单」。
点餐单卡(营养小票风)—— 🧾 看点餐单卡 →(点「③ 点餐单」)
确认后才真实下单(回传官方支付链接、订单号、取消方式);含糊表述永远只到点餐单;
支付链接只回给本人。执行细节见SKILL.md。
谁需要这个
在麦当劳吃饭、对自己的摄入有模糊顾虑,但不想查表格的人:
- 刚健身完,不知道该吃什么
- 带孩子出门,想点得明白点
- 在减脂,但不想成为营养专家
- 觉得 25 块买个汉堡不太值,但说不清值多少
共同点:想做选择,但不想算。 不是健身达人——他们的营养知识比这个工具全。
为什么是「每元」,不是「大卡」
营养表给你一堆绝对值,但选择发生在相对之间:391 和 513 大卡,对你意味着什么?
这个 391 大卡花 23 块买到,值吗?——营养表不回答这些问题。
「每元效率」给了参照系:预算。你掏出 25 块的时候,这个数字是确定的。
除下去的结果(实测,非示例):
| 餐品 | 蛋白质 | 价格 | 蛋白质/元 |
|---|---|---|---|
| 那么大鸡排(椒盐风味) | 24 g | ¥14.0 | 1.71 |
| 双层吉士汉堡 | 27 g | ¥23.0 | 1.17 |
| 巨无霸 | 27 g | ¥25.5 | 1.06 |
| 板烧鸡腿堡 | 23 g | ¥23.5 | 0.98 |
巨无霸不是麦当劳蛋白质性价比最高的汉堡。
14 元的那么大鸡排才是——每元高 61%,还便宜 11 块。
先问一句,再给答案
营养指标没有绝对最优,只有对你的目标最优。所以它先问「今天这顿想干什么?」
(问完就停,不摆选项——选项会限制表达)。它听懂的是你的说法,不是标签:
| 你可能会说 | 它理解成 | 排序依据 |
|---|---|---|
| 随便吃点 / 想吃点好的 | 解馋 | 热量/元↓,蛋白质 ≥0.4 |
| 今天想控制一下 | 管住嘴 | 脂肪/元↓,蛋白质 ≥0.5 |
| 招待朋友 / 同事聚餐 | 请客 | 价格↑(排面优先),蛋白质 ≥0.8 |
| 带小孩来 | 给小孩 | 钙/元↑,蛋白质 ≥0.5 |
| 刚练完 / 增肌期 | 今天在练 | 蛋白质/元 ↑(进阶层另列钠·脂肪) |
| 累死了 / 心情不好 | 犒劳自己 | 碳水/元 ↑(越高越好),蛋白质 ≥0.5 |
两个反直觉的设计:
- 请客不为性价比买单——按价格档位选「拿得出手」的(安格斯系霸榜),
守卫挡住撑不住场面的,每元效率降级为参考 - 疲惫时推低热量是反的——那会让你更没力气,所以「犒劳自己」按碳水/元 排
(碳水是最快的供能;热量/元↓是反向的指标,那是「管热量」用的)
六个场景冠军各不相同,而且这条被测试锁着。 六个场景推同一款,这一问就是装饰品——
所以我们不在文档里承诺,而是在 tests/test_fuel_index.py 里拿真实快照断言
「六个主指标互不相同 / 六个冠军互不相同 / 每个守卫都真的筛掉了东西」。
两个实测发现(也是为什么必须实时查)
我们在北上广深四城、七家门店重跑了同一套计算:
| 城市 | 门店 | 在售 | 匹配 | 可匹配比例 |
|---|---|---|---|---|
| 北京 | 建外 SOHO | 104 | 20 | 19% |
| 上海 | 吴江路 | 73 | 15 | 21% |
| 上海 | 静安锦沧文华 | 100 | 20 | 20% |
| 广州 | 天源路 | 116 | 22 | 19% |
| 广州 | 长兴路 | 119 | 22 | 18% |
| 深圳 | 福田高铁站 | 103 | 18 | 18% |
| 深圳 | 领展中心城 | 103 | 20 | 19% |
2026-10-15 前实测。这一轮跑在匹配器修复之前:把餐品名里末尾规格后缀(如「(椒盐风味)」)
当成品牌方括号一起剥掉的旧正则,会让同品牌不同口味的名字塌成同一个键 ——
所以上表各店匹配数可能各虚高 1 款。冻结在仓库里的那份快照
(assets/snapshot.json,建外 SOHO)重算后是 100 款在售 / 19 款匹配 = 19%。
① 匹配款数是结构性缺口,不是某家店数据不全。 门店规模差了近一倍(73 vs 119 款),
能匹配上的却都是 18~22 款这个量级 —— 涨的是菜单,不涨的是营养库。
2026-10-16 夜间复测了还能下单的两家广州店:在售涨到 124 / 126 款,
匹配仍是 21 款,比例被摊薄到 17%。比例会随门店规模浮动,绝对款数不会。
而且缺口不在"库里没数据"——官方营养库本身声明 160 行标准单品
(实际 160 行里只有 158 个唯一名字:小杯玉米杯、纯牛奶(盒装)各重复了一次),
问题出在这些条目与门店在售的 100 多款对不上。没对上的 81 款里恰好包含几乎全部甜品:
朱古力新地、麦旋风、香芋派都在菜单上、都能点,但匹配不到营养值。推荐里看不到它们,
不是我们拦着,是算不出它们的每元效率。我们把这件事放在第一屏:营养标注不完整的餐品,
恰恰最不该被推荐给在意营养的人。
② 同一个巨无霸,四城价格不同。 北上广 ¥25.5,深圳 ¥26.5——1 块差价让每元蛋白
从 1.06 掉到 1.02,排名掉一名。7 家门店里没有一家是巨无霸第一。
所以这个工具不预置任何「麦当劳营养表/价格表」,每次现查现算。
我们做对了什么别人没做的
| 常见做法 | 我们的做法 | 差别 |
|---|---|---|
| 给一份「健康推荐」榜单 | 先问场景再排序(六场景六套标准) | 同一个巨无霸,六个场景六个答案 |
| 只给营养,不给价格 | 所有指标除以价格 | 总量会骗人,每元不会 |
| 覆盖率不足就估算补齐 | 查不到就明说不参与,19% 也放第一屏 | 宁可少报,不可编造 |
| 推荐完就结束 | 推荐 → 卡片 → 点餐单 → 确认下单回支付链接 | 从「看」到「点」闭环 |
| 预置菜单/价格快照 | 每次实时查(四城差价实测) | 门店错了结论就是错的 |
| 结果是一张表格 | 值得晒的卡(四风格切换 + 段位战报 + 水印图章) | 传播是设计出来的 |
差异化内核:别处告诉你「吃什么健康」,我们告诉你「每一块钱买到多少营养」——
而且敢把没查到的 81% 放在第一屏。
三条底线
① 查不到就说查不到。 没有数据的餐品不猜、不估、不填,直接不进推荐,并告诉你少了什么。
② 异常值原样输出,只标注。 实测某牛堡标注 1003 大卡(同类 696~707),我们不知道
这个值是不是错的,所以只标一句「建议以实际包装为准」,不删也不改。
③ 一个数字都不编。 所有比值来自官方接口实测值,缺失值显示 —,
绝不当作 0 参与排序——那是撒谎。
快速开始
① 连麦当劳 MCP(一次) —— 复制配置合并进你的 MCP 设置:
{
"mcpServers": {
"mcd-mcp": {
"type": "streamablehttp",
"url": "https://mcp.mcd.cn",
"headers": { "Authorization": "Bearer 你的Token" }
}
}
}
Token:https://mcp.mcd.cn → 手机号登录 → 控制台激活。Skill 会自动从这个配置读 Token。
② 装成 Skill —— WorkBuddy 放到 ~/.workbuddy/skills/mcd-food-lab/,
Claude Code 放到 ~/.claude/skills/mcd-food-lab/。
③ 直接说话 —— 不用重启,不用敲命令。门店不用你查:说「我在国贸」它会自己定位;
没说位置它会反问一句(有意如此:实测同一巨无霸北上广 ¥25.5、深圳 ¥26.5,
门店不问清,答案就是错的)。
| 你想干什么 | 你只要说 |
|---|---|
| 想玩 | 「考考我」 |
| 不知道选哪款 | 「今天中午吃麦当劳,帮我挑一款」 |
| 有具体目标 | 「我刚练完,能吃点什么」「带小孩,点什么好」 |
| 直接问指标 | 「哪款蛋白质性价比最高」「哪款最补钙」 |
| 想点单 | 「就它了,鸡排来一份加两盒牛奶」 |
如果想自己跑(可选)
日常使用不需要。254 项测试纯本地跑,不需要 Token:
python -m unittest discover tests
# 生成可分享卡片(默认四套风格合成一张;--store 支持门店名或 code)
python scripts/run.py --store 建外SOHO --city 北京 --scene training --card out.html
# 战力测试 / 点餐单 / 确认下单 / 退单
python scripts/run.py --store 建外SOHO --quiz --card report.html
python scripts/run.py --store 建外SOHO --order "鸡排x1, 牛奶x2" --card order.html
python scripts/run.py --store 建外SOHO --order "鸡排x1" --order-confirm # 真实下单
python scripts/run.py --cancel 订单号
零第三方依赖,Python 3.10+,只用标准库。
怎么分享这张卡
卡片是完全自包含的 HTML(CSS/JS 全内联),三条路按场景选:
- 文件直传——微信/邮件发
.html,对方浏览器打开即看,切换器照常工作 - 手机截图——400px 手机宽度设计,截图即完整卡片
- 在线链接——传进 WorkBuddy 资料库发布即得公开链接(备选演示就是这么发的)
示例卡片就在 assets/(demo-quiz.html / demo-recommend.html / demo-order.html,
下载双击即可看,不需要任何环境)。
演示页 demo/index.html 是单个自包含 HTML(264KB,零外部依赖),
所以直接由 GitHub Actions 把 demo/ 目录发布成 Pages——
没有构建步骤,没有 CDN,副本就是仓库里那份(见 .github/workflows/pages.yml)。
隐私边界:卡片里只有公开菜单与营养数据;真实下单的支付链接是私人的,永不分享。
这个项目可能对你有用,如果……
- 🏋️ 你在健身或控卡——「今天在练」把蛋白质/元排给你,进阶列有钠和脂肪
- 👶 你要给孩子点餐——钙效率排序 + 蛋白守卫,冰淇淋和饮料进不来
- 🎮 你想玩一把——「考考我」三道反转题,答完出段位战报卡
- 🧑💻 你在写 MCP Skill——254 项测试、零依赖,10+ 条官方文档没写明的
接口契约都在MCP_INTEGRATION.md - 🍔 你也发现了那个反转——巨无霸蛋白更多,每元却更亏。欢迎来 issue 讨论
如果它对你有帮助,一个 star 就是最好的反馈。 ⭐
本项目为麦当劳程序员创意开发大赛参赛作品,非麦当劳官方产品。
技术实现
Skill 编排层(SKILL.md:问场景 → 定门店 → 调工具 → 算 → 呈现)
│
├─ list-nutrition-foods 全国固定营养库(160 项)
├─ query-meals 门店实时菜单 + 价格
├─ calculate-price 实时计价(点餐单)
└─ create-order 真实下单(写操作,用户明确二次确认才碰)
│
▼
scripts/mcd_client.py JSON-RPC + SSE 解析,纯适配层
scripts/fuel_index.py 纯函数:每元效率 + 场景推荐(零网络请求,可离线测试)
scripts/quiz.py 战力测试:实时数据出题 + 50 梗壳随机套用 + 段位
scripts/order.py 点餐单:计价 / 下单回执 / 退单
scripts/card.py 四套风格可分享卡片(推荐 / 战报 / 点餐单)
fuel_index.py 里没有一个网络调用——254 项测试不需要 Token 即可运行,
所有 fixture 都来自真实 MCP 响应。
接口上的怪癖(营养库返回的不是 JSON、没有 sugar 字段、名字匹配要两级)、
以及 10+ 条官方文档没写明的调用契约,全部记在MCP_INTEGRATION.md。其中一条值得单独说:
含糖量算不了。 官方只给
carbohydrate(碳水 ≠ 糖,淀粉也算碳水),
所以这个工具不显示「糖」,也不假装能算。
许可证
MIT。本项目为参赛作品,非麦当劳官方产品。数据以麦当劳官方渠道实时结果为准。
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi
