麦当劳开了 MCP 在办比赛,我做了个群里请客抽奖的

0 阅读3分钟

麦当劳中国这个月开放了 MCP 接口,35 个工具,查菜单、算价、建地址、下外卖单都有,顺带办了个 1024 程序员节的开发者比赛,作品按 GitHub star 排名,10 月 25 号截止。

我翻了一圈已有的参赛项目,八成是优惠券计算器,怎么把 47 块的套餐买到 21 块。有用,但都是「我自己吃」。我做了个群里用的:「麦从天降」,一个人请客,全群抽一个人吃。

麦从天降

它干什么

我在 Claude Code 里说一句「群里抽一个人请吃巨无霸,满 10 人开」。它去 MCP 查一下我附近门店的价格,跟我确认金额,给我一条链接。

链接丢进群,群友点开填个昵称就算报名。不用登录,不用装东西。

到点开奖,中的人在页面上填收货地址,我这台电脑上的 CLI 用我自己的麦当劳账号下单,我在 App 里付款,外卖送到他家。

参与的人一分钱不花。页面上没有任何付款入口。

活动页

一元购这条线

最开始的想法不是这样的。最开始是「30 个人每人出 1 块,抽一个人吃」,每个人花得少,图个乐。写到一半停下来查了一下:参与者出钱、结果随机、奖品比投入值钱,这就是 2017 年被整治过的一元购。比赛规则里也写了不能宣扬赌博。

所以改成纯请客:一个人出钱,其他人免费。页面上一个「付款」「出钱」「红包」的字都没有,给 agent 读的 SKILL.md 里也写了一条:用户要是想改成大家凑钱,别帮他改。

开奖怎么让人信

群里抽奖最怕的是「你是不是内定了」。做了个 commit-reveal:

  • 发起的时候,我的 CLI 先把种子的哈希发到活动页上,种子本身只在我电脑里。
  • 名单锁定的时候,服务端生成一个 nonce,谁都改不了。
  • 开奖的时候公开种子,winner = sha256(seed:nonce:名单哈希) 取前 16 位 hex 转整数,对人数取模。
  • 页面上有个「验算」按钮,用浏览器自带的 WebCrypto 把这几步重新算一遍。

我改不了结果,服务端也改不了,想串通得两边一起。

下单那步的几个坑

agent 驱动下单最怕的是重复下单。CLI 里做了几件事:

  • 核价用官方 calculate-price,返回的总价包含配送费和打包费(真实接口录下来看到的,6 块配送 1 块 9 打包)。
  • 发起时定一个上限,中奖人附近门店的价格不超过上限才自动下,超了停下来问我。
  • 下单前写一个「已尝试下单」的标记,再跑一次 watch 不会再下一单,想重下要显式加 --reorder。
  • 付款是我自己在 App 里付的,CLI 只轮询订单状态。

真实付款这步到现在没完整跑过,create-order 和 query-order 的返回字段是照文档写的,代码里有标注。

代码

TypeScript,npm workspaces 三个包:core 是抽奖算法和文案,worker 是 Cloudflare Worker 加 D1 的页面和接口,cli 是发起人这边的命令加 SKILL.md。145 个测试。想自己部署一份的话 docs/self-host.md 里有步骤,免费额度够用。

演示活动一直开着,填个昵称就能看到自己在名单里,不会真的开奖:lucky-drop.defiabell.workers.dev/d/38m4bwpfz…

仓库:github.com/Defiabell/m…

比赛按 star 排名,截止 10 月 25 号。觉得这个东西有点意思的话,点一个。