麦当劳程序员创意开发大赛和WorkBuddy一起脑洞全开! 活动链接:https://builderx.csdn.net/activity-site/m-code/pages
一个程序员的午饭自救计划:从每天纠结 20 分钟,到 3 秒钟拿到一份"本命套餐"。
顺便记录一下,我是怎么用腾讯 WorkBuddy 从 0 到 1 把脑子里的点子变成能跑的东西的。
如果你觉得项目好用,请帮我点个 ⭐https://github.com/xcLeigh/mcd-fate-combo,十分感谢!
一、起因:一顿午饭引发的中年危机
先说个特别真实的场景。
中午 12:00,工位。我打开麦当劳 App,手指在菜单上划了七八遍:
- 巨无霸看着挺香,但今天被产品需求折磨了一上午,是不是该来点甜的安慰一下自己?
- 麦辣鸡腿堡也不错,可我刚修完一个 bug,火气还没消,再吃辣怕是要当场爆炸;
- 预算就 30 出头,1+1 随心配和满 30 减 5到底哪个更划算?我算了半天也没算明白。
最后——在纠结了整整 20 分钟之后,我随便点了一个。
吃完抹嘴的那一刻,我突然意识到一个残酷的事实:
我一个写了八年代码的人,每天都在用算法优化数据库索引、优化接口响应时间,
却搞不定自己中午吃什么。
这不是我的问题,这是全人类的问题。「今天吃什么」这个问题,本质上是一道
多目标组合优化问题:既要好吃、又要便宜、还想控热量、最好还带点情绪疗愈功能……
而组合数,是爆炸的。
于是我做了一个决定:既然解决不了,那就把它外包出去。
外包给谁?——腾讯 WorkBuddy。
二、先聊聊麦当劳 MCP:点餐这件小事,官方把接口开放出来了
动手之前,得先说说这次真正的主角——麦当劳 MCP。
简单说,麦当劳把这套点餐能力封装成了 MCP(Model Context Protocol)服务,
任何支持 MCP 的客户端都能直接调用。这意味着我不用去爬菜单、不用去猜价格,
官方接口直接把"事实"给我:
| 工具 | 作用 |
|---|---|
query-nearby-stores | 找到我附近的门店 |
query-meals | 拉这家店在售的餐品与现价 |
list-nutrition-foods | 每份餐品的热量、蛋白质、脂肪、钠 |
available-coupons | 当前可领取的优惠券 |
calculate-price | 用官方口径计算金额与应付总价 |
create-order | 直接在麦当劳账户里创建真实订单 |
接入方式也不复杂:去open.mcd.cn/mcp领一个免费的 Token(手机号登录 → 控制台 → 激活),
在配置里带上Authorization请求头就能用,目前一共开放了30 多个工具,
覆盖点餐、领券、积分、活动日历等场景。
对我来说,这件事最诱人的地方在于:它把"事实"这一层替我解决了。
菜单是真的、价格是官方的、热量是有出处的——剩下的活儿,
就只剩一个纯粹有意思的问题:怎么选。
三、脑洞:把"今天吃什么"变成一道有答案的题
我最开始想做的东西特别朴素——一个"今天吃什么"的转盘。
但转了两圈我就发现,随机推荐是个伪需求:
我纠结不是因为选项不够多,而是因为选项太多、且我不确定哪个更值。
我需要的是一个能替我做决定、还能说服我的东西。
于是我定了一个方向:「麦门本命套餐机」。
它的逻辑是这样的——你只需要告诉我四件事:
- 你的星座(玄学部分,负责仪式感)
- 你今天的心情(开心 / emo / 暴躁 / 平静 / 想暴富 / 好累)
- 你今天的代码状态(刚提 PR / 被 review 打回 / 改了一天 bug / 摸鱼划水 / 上线成功)
- 今天的预算(一个滑杆,¥12 ~ ¥60)
然后它给你一份只属于今天的套餐,附带:
- 主食 + 小食 + 饮品(预算够再来个甜点)的完整组合
- 这顿饭的总热量和蛋白质
- 券后价格,以及省了多少钱
- 一个0~99 的"本命指数"
- 一句带程序员梗的运势解读,加幸运数字、幸运代码和"BUG 驱逐符"
比如输入「狮子座 / 暴躁 / 改了一天 bug / ¥45」,它会给你:
麦辣鸡腿汉堡 + 蘸酱韩式甜辣酱鸡块 + 麦咖啡冰爽一夏
套餐价 ¥44.30(菜单自带优惠已省 ¥19.20)
893 kcal | 蛋白质 37 g | 本命指数 87
CPU 温度有点高,让辣椒和气泡把你重新 oom 过来。
_今天你改的 bug 比吃过的饭还多,咖啡因必须拉满 _☕
而且每一项价格都会再交给麦当劳官方的calculate-price接口核一遍——
算法算出来的 ¥44.30 和官方返回的 ¥44.30 分毫不差。
看到没?它不只是告诉你吃什么,还顺便替你把理由也编好了。
四、动手:一个晚上,从 0 到 1
4.1 第一件事:先想清楚"钱该由谁来算"
在腾讯 WorkBuddy里把需求说清楚之后,它没有急着写代码,而是先跟我确认了一个关键问题:
“你希望价格由谁算?大模型,还是代码?”
这一问直接点醒了我。
如果让大模型来"心算"价格——它一定会算错。大模型擅长的是表达,不是精确算术。
你让它算「巨无霸 25.5 元 + 中薯条 12.5 元,叠加满 30 减 5」,它可能会给你一个看起来很像那么回事、
但经不起核对的答案。
于是我们定下了这个项目最重要的一条架构原则:
取数交给 MCP,算钱交给确定性代码,表达交给 Agent。
翻成人话就是:
| 环节 | 交给谁 | 为什么 |
|---|---|---|
| 取数(菜单、营养、优惠券) | 麦当劳 MCP | 数据以官方为准,实时、可核验 |
| 算钱(组合、比价、叠券) | 确定性代码(纯标准库) | 价格必须可复现、可核验,绝不让大模型心算 |
| 表达(运势文案、卡片) | Agent / 模板 | 稳定、好读,每次都对 |
这条原则看着简单,但它后面救了我好几次。
4.2 让腾讯 WorkBuddy 生成骨架
原则定完,剩下的就交给腾讯 WorkBuddy了。我把技术选型也一并说清楚:
- 零第三方依赖——后端只用 Node 内置的
http/fs/path/url; - 前端原生 JS——不引框架,保证克隆下来就能跑。
然后,腾讯 WorkBuddy 一次性把骨架给我搭好了:
mcd-fate-combo/ ├─ server.js # 零依赖本地服务(静态资源 + /api/divine) ├─ lib/fate.js # 本命套餐核心算法(纯标准库) ├─ public/ # 原生前端 SPA ├─ data/mcd-menu.json # 麦当劳 MCP 数据快照 └─ mcp-config.example.json # MCP 配置示例(环境变量占位)整个过程我只描述需求,代码、目录、算法框架都是它生成的。
我要做的变成了"审核"和"提意见",而不是一行一行敲。
4.3 联调翻车:两轮教训,比写代码学到的还多
代码跑起来之后,我做了几组测试,然后翻车了——还翻了两次。
第一轮翻车:演示数据阶段的两个问题
我先用一份手工整理的菜单数据把流程跑通,结果发现:
- 那张「1+1 随心配」券太霸道了。我原本的算法是"任意两件按套餐价结算",
- 结果它把明显不该进随心配的组合也塞了进去,优惠到离谱,一看就是错的。
- 有的方案里居然没有喝的。预算紧张时,算法会只给你汉堡加小食——
- 一份"套餐"连水都没有,这像话吗?
我把这两个现象描述给腾讯 WorkBuddy,它很快定位到根因并给了修复:
给随心配券加适用餐品白名单、选品时为套餐结构预留预算额度。
第二轮翻车:接上真实 MCP 之后,问题更多了
这里必须坦白一件事:一开始那个"实时模式"其实是个桩——设了 Token 也不会真调接口,
只是把界面标签从「快照」改成「实时」。是腾讯 WorkBuddy自己先把这件事挑明的,
然后把它补成了真实现:
用 Node 内置模块实现 MCP 的 Streamable HTTP 客户端(JSON-RPC 2.0),
走完initialize → notifications/initialized → tools/list → tools/call完整握手。
实测tools/list返回了35 个工具,全部调用成功。但真实数据一进来,又炸出三个坑:
- 价格单位是"分"。
calculate-price返回price: 4430,实际是 ¥44.30。 - 不除以 100,价格直接错 100 倍。
- 菜单里混着大量套餐和组合。125 条原始数据里,混着"四件套"“随心配”"麦金卡"这类条目,
- 它们和单品一起参与组合会导致重复计价。加了一层排除规则后,收敛成54 个可单点的真实单品。
- 菜名和营养表对不上。菜单里叫「薯条」,营养表里叫「中薯条」,而且菜单只有一个"薯条",
- 营养表却分大/中/小。最后用**"精确 → 归一化 → 包含 → 最长公共子串"四级匹配解决,
- 实在匹配不到的,按同分类中位数估算并在页面上明确标注**。
第三轮:把选品从贪心重写成穷举
真实价格比我手工编的演示数据高不少,原来的贪心策略在预算紧张时会算出"汉堡 + 苹果片"这种奇怪组合。
腾讯 WorkBuddy的处理方式让我挺意外的——它没有继续打补丁,而是直接把选品逻辑重写了:
不再贪心,改成穷举 主食 × 小食 × 饮品(约 3600 种组合),在预算内取情绪匹配总分最高的一组;
得分先按固定顺序算好再缓存,保证同样输入永远得到同样输出。
重写之后效果立竿见影(同一预算 ¥55,同是狮子座):
| 心情 | 推荐 |
|---|---|
| 暴躁 | 麦辣鸡腿汉堡 + 韩式甜辣酱鸡块8块 + 麦咖啡美式 |
| 平静 | 双层深海鳕鱼堡 + 那么大鸡排 + 浓缩咖啡 |
| 想暴富 | 芝士安格斯厚牛堡 + 那么大鸡排 + 鲜萃咖啡 |
| 开心 | 巨无霸 + 韩式甜辣酱鸡块8块 + 鲜萃咖啡 |
每份都是完整的三件套,价格都对得上,情绪也真的影响了选择。
这也是我这次开发里最爽的一刻:
我没有自己去 debug,我只是把现象描述清楚,剩下的是腾讯 WorkBuddy 干的。
五、成品长什么样
说了这么多,直接上截图。
① 首页:报上你的星座、心情、代码状态和预算
左边是输入区——12 星座、6 种心情、5 种代码状态,一个预算滑杆, 还有一个附近门店下拉框:麦当劳 MCP 会定位出附近 5 家门店,随便切, 切到哪家,菜单和价格就换成那家的实时数据。 右上角的徽章会实时显示「麦当劳 MCP 已连接」。
② 结果页:一份完整的"本命套餐卡"
你会拿到:本命指数、套餐组合(用的是麦当劳官方商品图)、套餐价与立省金额、
总热量、蛋白质、三段"本命解读",以及幸运数字 / 幸运代码 / BUG 驱逐符。
注意中间那一栏绿色的核价信息——
算法选出的组合,会再交给麦当劳官方的**calculate-price**接口核一遍价,
页面把每个单项的官方价格都摊开给你看。数据从哪来、钱怎么算的,全部公开。
③ 换个心情,换一份套餐
算法是真的按心情在配的——暴躁给辣的,平静给清淡的,想暴富给牛肉的。
④ 就它了?直接下单
推荐到这一步还没完。套餐卡下面有一个绿色的「⚡ 一键下单」按钮——
选好堂食还是外带(这个选项来自calculate-price官方返回的takeWayList,不是我编的),
点下去,它会调用麦当劳 MCP 的create-order,在你的麦当劳账户里创建一张真实订单,
然后把订单号和支付链接直接递到你面前。
流程是这条链:
calculate-price → 官方金额 + 取餐方式 ↓ create-order → 真实订单(未支付) ↓ 订单号 + 支付链接 → 去麦当劳 App 或扫码付款,到店取餐下单前有一个二次确认面板,把门店、取餐方式、套餐、应付金额全部摆出来——
这是真金白银的操作,不能靠误触。
也就是说,这个页面把「纠结吃什么 → 决定吃什么 → 下单」整条链路走完了,
中间不需要打开第二个 App。
六、复盘:这次开发让我想明白的三件事
1. AI 写代码,重点不在"写得快",而在"分工对"。
这次最大的收获不是省了多少时间,而是想清楚了哪些事该交给谁。
取数交给 MCP、算钱交给确定性代码、表达交给 Agent——
边界划清楚了,AI 的能力才真正被释放出来。
2. 不要让大模型做它不擅长的事。
"让大模型算价格"这件事,看起来很方便,实际上是给自己埋雷。
大模型擅长表达,不擅长精确算术——这一点想通了,很多坑就自然避开了。
3. 好的作品,是"有用"和"有趣"同时在线。
一个纯粹的"套餐计算器"没人会想点第二次;
但加上"本命指数"“幸运代码”“BUG 驱逐符”,它就变成了一个你会想截图发朋友圈的东西。
工具类产品也可以有情绪价值——这是我这次最想验证的一件事,
而它真的成立。
七、想动手做一个?三步就够
如果你也想给自己做一个"本命套餐机",流程比想象中简单得多:
第一步:拿一个免费的 MCP Token
打开open.mcd.cn/mcp,手机号登录 → 控制台 → 激活,复制 Token 即可。
第二步:把需求讲给腾讯 WorkBuddy
不用先写需求文档,用大白话说清楚"我想做什么、给谁用、要解决什么问题"就够了。
我当时的原话就一句:
「帮我做一个和麦当劳相关、有趣又贴近生活的小作品。」
第三步:本地跑起来
零第三方依赖,连npm install都不用:
node server.js # → http://localhost:8788没配 Token 也能跑——项目里带了一份 MCP 数据快照,字段结构对齐官方返回;
配上 Token 就自动切换成实时数据。页面右上角的徽章会标明当前是「实时」还是「快照」模式。
最后
说回最开始那个问题。
现在我中午 12 点不再纠结了。我会打开自己写的这个页面,选一下今天的心情,
点一下按钮,然后照着结果去点单。
20 分钟的选择困难,变成了 3 秒钟的仪式感。
而这一切的起点,只是我在腾讯 WorkBuddy里敲下的第一句话:
「帮我做一个和麦当劳相关、有趣又贴近生活的小作品。」
如果你也有一个一直想做、却总觉得"没时间做"的小点子——
别再等了,把它讲给腾讯 WorkBuddy 听,一个晚上就能看到它跑起来。
毕竟,能把自己的脑洞变成能跑的东西,本身就是程序员最浪漫的事。
如果你觉得项目好用,请帮我点个 ⭐https://github.com/xcLeigh/mcd-fate-combo,十分感谢!
🍔 巨无巨「BUG」,祝各位 1024 快乐。