一、它解决什么问题
点一顿饭的真实决策成本不在"吃什么",而在这几件事:
- 当次菜单有哪些(每家店不同)
- 整单多少钱(主食 + 小食 + 饮料,不是单品相加)
- 券能不能用在这家店、这个时段
- 口味约束(不辣、去冰、有糖/无糖)会不会被"更优推荐"悄悄改掉
麦当劳官方 MCP 提供了这些数据,但它给的是接口,不是决策。接口之间的组合、约束的优先级、缺数据时怎么办,得自己定。
二、核心链路
用户一句话
→ query-nearby-stores 找到门店,让用户确认
→ query-meals 取这家店的当次菜单
→ calculate-price 逐份整单核价(不是估算)
→ list-nutrition-foods 补充已知钠/能量
→ 三个审阅角度(预算 / 营养 / 口味)收敛 → 最多三份方案
关键设计:只在一家店的当次数据里比较。不同门店的菜单和价格不能混,所以数据里每条 plan 都带 store_code,校验时强制一致:
if p.get("store_code") != data["store"]["code"]:
raise ValueError("不能混用不同门店的报价。")
三、三个真实的坑
坑 1:Token 只从环境变量读,不走连接器
WorkBuddy 里配好了 MCP 连接器,但 CLI 实跑时仍然报错:
本轮停止:请在本机设置 MCD_MCP_TOKEN 环境变量,不要公开 Token。
读源码才发现:命令行 live 模式只读 os.environ["MCD_MCP_TOKEN"],压根不走客户端的连接器配置。所以「装了技能」和「链路可用」是两件事。
正确做法是把 Token 只注入子进程环境,不打印、不落盘、不进命令行:
MCD_MCP_TOKEN="$(cat ~/.token)" python3 demo.py --live --store-code 1990xxx --expand \
--budget 35 --taste no-spicy --side fries --ice none
坑 2:独立查询入口不能相互混用
第一版写成 --live --search-stores,直接失败关闭:
本轮停止:独立查询入口不能相互混用,也不能与核价、快照保存或选择混用。
原因是 --search-stores 本身就是实时入口,只有逐份核价才需要 --live。程序宁可让你多打一个参数,也不猜你想干什么。
坑 3:缺参数就停,不拿示例数据顶替
$ python3 demo.py --list-meals
本轮停止:请先选门店:--search-stores --city 城市 --keyword 地点,
然后用 --store-code 编码;或显式指定已确认的 --plan 文件。
三条守卫都来自真实运行输出。它们的作用不是"友好提示",而是保证你看到的每个数字都来自这次真实调用。
四、真实核价长这样
某天实测,当次菜单 113 项,逐份核价后:
[9900xxxx-4810-3050] 麦香鱼中套餐 · 中薯条 · 可乐中杯(去冰):¥33.50
钠 721.0 mg · 能量 761.0 kcal 符合当前硬性条件
[9900xxxx-4810-3071] 麦香鱼中套餐 · 中薯条 · 无糖可口可乐中杯(去冰):¥33.50
钠 756.0 mg · 能量 614.0 kcal 符合当前硬性条件
[9900xxxx-4810-3050] 双层吉士汉堡中套餐 · 中薯条 · 可乐中杯(去冰):¥34.00
钠 1182.0 mg · 能量 865.0 kcal 符合当前硬性条件
预算、营养、口味三个角度最终收敛到同一份。说明这张表不是"挑一个最便宜的",而是在满足硬性条件的集合里做取舍。
五、怎么用
装 Skill 后,把这段话发给 AI 客户端(Token 换成自己的):
请装这个技能:github.com/polaris-smart/mcd-agent-gourmet
我的麦当劳 MCP Token 是:<贴你自己的 Token>,帮我接好官方 MCP 并设置 MCD_MCP_TOKEN,不要公开
帮我点一餐:35 元,不辣,要薯条,有糖可乐去冰,带走。
也可以先在浏览器里看免登录的历史数据体验:polaris-smart.github.io/mcd-agent-g…
六、边界
- 只查询与核价,不领券、不下单、不支付
- 历史快照不能当当前报价,
--live才是实时 - 辣度分级、玩具、更多份量尚未验证;过敏信息请以官方渠道为准
- 网页不收集 Token,不读设备定位
源码(Python 3.9+,零第三方依赖):github.com/polaris-sma…
如果这套思路对你有用,欢迎去仓库点个 Star:github.com/polaris-sma…
(本文同内容也发于腾讯云开发者社区)