麦当劳官方 MCP 实战:让 AI 一句话点餐,价格走当次真实核价

1 阅读3分钟

一、它解决什么问题

点一顿饭的真实决策成本不在"吃什么",而在这几件事:

  • 当次菜单有哪些(每家店不同)
  • 整单多少钱(主食 + 小食 + 饮料,不是单品相加)
  • 券能不能用在这家店、这个时段
  • 口味约束(不辣、去冰、有糖/无糖)会不会被"更优推荐"悄悄改掉

麦当劳官方 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…

(本文同内容也发于腾讯云开发者社区)