你的每一张券、每一分积分、每一次抽奖机会,都在倒计时。
而麦当劳 App 里,它们分散在五六个页面,没有任何一个界面把它们放在同一张时间轴上。
🌐 懒得装环境?在线看完整报告(无需 Token、无需 clone) :
https://ztword.github.io/mcd-expiry-ledger/report-sample.html
⭐ 项目地址:https://github.com/ztword/mcd-expiry-ledger

一、先说一个你可能没注意到的浪费
打开你的麦当劳 App,看看这几样东西:
| 你拥有的 | 什么时候消失 |
|---|---|
| 一堆「麦麦省」没领的券 | 券有有效期 |
| 账户里的积分 | 按周期清零 |
| 免费抽奖次数 | 按周期重置,过期作废 |
| 中过没领的奖品 | 领取窗口关闭 = 没中过 |
| 进行中的活动权益 | 活动结束立刻失效 |
这些时钟各自滴答,分散在五六个页面里。你永远是在它们过期之后,才想起来"哦,那张券我没用掉"。
麦当劳中国在 1024 程序员节开放了官方 MCP Server(33 个工具)。我拿到工具清单的第一个反应不是"能点什么",而是:这些工具里藏着一整个个人资产账户,却没有一个界面告诉你它们什么时候死。
于是做了这个项目:麦麦到期清单(mcd-expiry-ledger)------扫全账户 → 算出每项资产的死亡时间 → 按「再等就会损失多少」排序 → 给出一份照着做就行的清算计划。

二、赛前情报:我先把 149 个参赛项目分析了一遍
动手写代码之前,我做了一件更重要的事------把大赛仓库里已有的 149 个参赛 Issue 全部拉下来做了竞争分析。结论很直接:
| 方向 | 项目数 | 状态 |
|---|---|---|
| 省钱 / 凑单 / 精算 | 25+ | 🔴 血海 |
| 营养 / 减脂 / 健身 | 15+ | 🔴 血海 |
| 点餐助手(通用) | 20+ | 🔴 血海 |
| 人格测试 / Wrapped 盘点 | 15+ | 🔴 血海 |
| 多人拼单 / 团建 | 8+ | 🟠 拥挤 |
| 资产到期 / 清算 | 0 | 🟢 空白 |
同时我核对了官方 33 个 MCP 工具的使用情况,发现一批几乎无人调用的低频高价值工具:
query-lottery-info/query-my-prizes------ 抽奖次数按周期重置、过期作废;中了没领 = 没中available-coupons/auto-bind-coupons------ 还没领到手里的券,是纯白嫖资产mall-points-products/mall-order-list------ 积分商城与已兑记录order-list------ 历史订单(能反推出你的真实点餐节奏)query-nearby-stores------ 附近门店(门店券离开门店即失效)now-time-info------ 服务器时间(到期计算的正确性依赖它)
所以我没做第 26 个省钱助手,而是做了唯一一个「资产到期清算」项目。
三、它长什么样
一次扫描,输出三样东西:
1. 一张倒计时表 (按 价值 × 紧迫度权重 排序)
──────────────────────────────────────────────────────────────
待清算总额 ¥643.70
7天内将蒸发 ¥424.50
资产总数 20 项(其中 1 项已过期)
──────────────────────────────────────────────────────────────
# 资产 估值 紧迫度
1 🎟️ 3 张待领券 ¥ 25.00 立刻
2 🎰 免费抽奖 3 次 ¥ 117.00 本周
3 🎟️ 麦辣鸡腿堡买一送一 ¥ 21.50 72小时
4 🪙 可用积分 4820 ¥ 48.20 两周内
2. 一张可分享的 HTML 报告(单文件、无 CDN、内联 SVG 图表)
倒计时条 + 构成环图 + 清算计划 + 工具溯源,截图即传播。
3. 一份照着做的清算计划(含每步该调用哪个 MCP 工具)
计划最后还会追加策略型条目------比如:
🧠 你 43% 的单发生在「晚餐」------ 优先核销该时段的券
这句建议来自 order-list 的历史订单分析。一张早餐券对只吃晚餐的人一文不值,时段对上了才算省钱。
四、三个我觉得值得一提的技术点
1. 零依赖的 MCP Streamable HTTP 客户端
没有用任何 SDK,用标准库 urllib 手写了 JSON-RPC over HTTP 客户端,包含:
- SSE(
text/event-stream)响应解析 Mcp-Session-Id会话续传- 401 / 429 的语义化报错(官方限流 600 次/分钟)
为什么?评审和围观者 clone 下来就该直接能跑。 依赖安装是这个比赛里最沉默的劝退环节------pip install 都不要,Python 3.9+ 标准库直接跑。
2. now-time-info 时钟校准
到期判断跑在本地时钟上是个隐性 bug:一台比真实时间快 3 小时的机器,会把今晚 23:59 才过期的券标成"已过期 3 小时",整个排序全错。
所以每次扫描第一步是先问 MCP 服务器要时间,算出 clock_offset,所有 days_left 都基于校准后的时钟。报告里也会明确写出"本地时钟偏差 ±N 秒"。
3. 抽奖机会的期望值估值
怎么把"3 次免费抽奖"和"一张 21.5 元的券"放到同一张表上比大小?
用奖品池算期望值:Σ(奖品面值 × 中奖概率) × 剩余次数。这让抽奖这种"概率资产"第一次可以和其他资产排序。
五、30 秒看到效果(不需要 Token)
bash
git clone https://github.com/ztword/mcd-expiry-ledger.git
cd mcd-expiry-ledger
python -m mcd_expiry_ledger demo
demo 模式跑在内置沙箱上(虚构数据、离线运行),不申请 Token、不联网也能看到完整链路。
不想 clone?在线看报告 :
https://ztword.github.io/mcd-expiry-ledger/report-sample.html
有 Token 之后(open.mcd.cn/mcp 免费申请):
bash
export MCD_MCP_TOKEN=你的Token
python -m mcd_expiry_ledger scan # 完整扫描
python -m mcd_expiry_ledger scan --address "北京朝阳区建国路" # 附带门店匹配
python -m mcd_expiry_ledger scan --markdown report.md # 输出可粘贴的 Markdown
六、目前覆盖 12 个官方 MCP 工具
其中 9 个是大赛里多数项目没有覆盖的低频高价值工具:
query-my-coupons · query-store-coupons · available-coupons · auto-bind-coupons · query-my-account · query-lottery-info · query-my-prizes · mall-points-products · mall-order-list · campaign-calendar · order-list · query-nearby-stores · now-time-info
工程细节:15 个单元测试全绿;单工具失败自动降级不中断扫描;只读扫描,绝不静默调用任何产生真实消耗的写操作(领券/抽奖/兑换都只给建议,由你确认后执行)。
七、最后
这个项目从选题、竞争分析、架构到编码、文档,全程在 WorkBuddy 里完成------它承担的不是代码补全,而是"读 149 个 Issue 做竞争情报 → 找到空白方向 → 决定技术形态 → 写完全部代码"的完整链路。
比赛按 GitHub Star 排名,截数是 10 月 26 日。如果你也有一张忘了用的麦辣鸡腿堡券------
点个 Star,替它报仇。 ⭐
https://github.com/ztword/mcd-expiry-ledger
本文参与 1024 程序员节 · 麦当劳程序员创意开发大赛,参赛 Issue:M-China/mcd-developer-innovation-challenge#155
项目为个人参赛作品,仅调用麦当劳中国官方 MCP 接口,与麦当劳中国、腾讯 WorkBuddy 无隶属关系。