CS

conan9/super-mcd-benefits-radar

开发工具
31 stars 0 forks 质量 70 趋势 27NOASSERTION

AI-powered McDonald's benefits radar built with MCP and WorkBuddy.

概览

:把散落在麦当劳中国 MCP 四个工具里的**汇总成一份 **的「权益体检报告」,直接回答那个最容易吃亏的问题—— 纯只读、不编造、零第三方依赖。装上就能用,跑一次约 4 次 API 调用。 麦当劳 App 里「我的优惠券」「麦麦省」「积分」「活动」分散在四处,每张券的到期日各不相同。 真实痛点**。 1. :只读调用 4 个官方 MCP 工具(我的券 / 积分账户 / 可领取券 / 活动日历); 2. :用本项目自己的代码计算剩余天数、分级排序、跨源去重; 3. :产出一份 8 节结构的 Markdown 报告,,缺什么就写什么。 * ——需要有人替他排优先级; * ; * ——本项目对"只读能做成什么"给出了一个完整样板。 前往 https://open.mcd.cn/mcp → 右上角【登录】(手机号验证)→【控制台】→【激活】→ 复制 Token。 左侧边栏【专家 · 技能 · 连接器】→【连接器】→ 右上角【自定义连接器】→【配置 MCP】, 填入 mcp-config.example.json 的内容 (): :把本目录复制到用户级技能目录,目录名必须保持为 super-mcd-benefits-radar: * Python (仅用标准库:json / urllib / datetime / unittest) * 不需要 pip install 任何东西

README

超麦权益雷达 · Super McBenefits Radar

一句话:把散落在麦当劳中国 MCP 四个工具里的优惠券、积分、活动汇总成一份 按到期紧急程度排序的「权益体检报告」,直接回答那个最容易吃亏的问题——

「我有哪些券和积分快过期了,这几天该怎么用?」

纯只读、不编造、零第三方依赖。装上就能用,跑一次约 4 次 API 调用。

项 值
中文名 超麦权益雷达
英文名 Super McBenefits Radar
Skill 标识 super-mcd-benefits-radar(= 仓库名 / 目录名 / SKILL.md 的 name)
类型 WorkBuddy Skill(Python 标准库,无第三方依赖)
运行环境 Python 3.10+,无需 pip install
许可 MIT

⚠️ 本项目是「麦当劳程序员节创意开发大赛」的独立参赛作品,由参赛者独立开发, 不代表麦当劳官方产品,也未获得麦当劳品牌背书。 项目输出仅供参考;餐品信息、价格、规则与供应状态以麦当劳官方渠道的实时结果为准。


30 秒看懂它做什么

麦当劳 App 里「我的优惠券」「麦麦省」「积分」「活动」分散在四处,每张券的到期日各不相同。 真实痛点不是"没有券",而是"券太多、到期日不齐,看不出轻重"。

超麦权益雷达做三件事:

  1. 取数:只读调用 4 个官方 MCP 工具(我的券 / 积分账户 / 可领取券 / 活动日历);
  2. 算:用本项目自己的代码计算剩余天数、分级排序、跨源去重;
  3. 交付:产出一份 8 节结构的 Markdown 报告,P0/P1 置顶,缺什么就写什么。

一句话总结它的设计取舍:

它不替用户花钱,只替用户记事。


它解决什么问题

痛点 后果 本项目的应对
券太多、到期日不齐,靠翻列表看不出轻重 券放着过期 按剩余天数分 7 档,P0/P1 单独置顶
已有的券和"可领取的券"混在一起 重复提醒、白忙一场 跨数据源去重,已持有的可领取券单独标注
积分"即将过期"藏在小字里 积分静默清零 单列积分板块并升级至 P1
活动截止日不明显 错过限时活动 活动日历按日历日定位(今日 / 未来 / 往期),并如实声明"官方不提供有效期"
看到空白不知道是"没有"还是"没读到" 做出错误判断 解析失败必报警,绝不把"读不懂"伪装成"没有数据"

目标用户

  • 每周会去 1–2 次麦当劳、手上攒着多张券的普通会员——需要有人替他排优先级;
  • 积分余额较高、担心过期的用户;
  • 想验证麦当劳 MCP 能力边界的开发者——本项目对"只读能做成什么"给出了一个完整样板。

核心特性

特性 说明
🔒 纯只读 不下单、不消费积分、不自动领券。写入类工具在代码层被白名单拦下(默认拒绝),不是文档约定
🧾 不编造 金额、有效期、折扣一律来自 MCP 返回值;取不到写 [字段缺失],格式本身不含写 未提供,绝不推测填充
🚨 解析失败必报警 响应有内容但解析不出来时,报告写"收到数据,但解析失败",禁止说成"本月没有活动"
⚖️ "缺失"与"未提供"分开 [字段缺失] = 取不到;未提供 = 官方格式本身不含该字段。两者都不等于 0
💴 实付价不当优惠额 官方原文 ¥9.9 (用券价格) 是用券后实付,不是"省 9.9 元"。用 benefit_kind 区分,绝不换算
🕗 北京时间基准 到期判定固定用 UTC+8,避免跨时区/凌晨把"今天到期"算成"明天到期"
🔐 隐私字段不落库 accountId 只记录"存在过",取值不进数据结构、报告与日志;签名 URL 导出时掩码
🗓️ 标准库排序 紧急度计算与排序纯用 Python datetime,零第三方依赖
🎭 三种模式隔离 mock 合成样例(必须显式指定)/ replay 离线回放官方格式 / real 实时联网,报告首行显式标注
🚫 绝不自动回退 mock 默认真实模式。没有 Token 或取数失败时直接报错退出,绝不悄悄换成合成样例
🔎 采集先校验 回放前用 scripts/verify_capture.py 检查采集目录:缺件、读不懂、疑似被转述,一律拦下
🛡️ Token 零外流 只从环境变量读取;异常、日志、报告统一脱敏;仓库内附全仓凭据扫描测试
♻️ 单点失败降级 任一工具失败不影响整份报告,失败原因如实写入报告
✅ 337 项测试 覆盖边界值、排序确定性、脱敏回归、只读门禁、默认模式不得回退 mock、采集校验、状态分类、三种真实格式解析、端到端回放

安装教程

1. 申请 MCP Token

前往 → 右上角【登录】(手机号验证)→【控制台】→【激活】→ 复制 Token。

MCP 服务免费。每个 Token 限 600 次请求/分钟。

2. 在 WorkBuddy 中配置 MCP 连接器

左侧边栏【专家 · 技能 · 连接器】→【连接器】→ 右上角【自定义连接器】→【配置 MCP】, 填入 mcp-config.example.json 的内容 (务必把 YOUR_MCP_TOKEN 换成你的真实 Token):

{
  "mcpServers": {
    "mcd-mcp": {
      "type": "streamablehttp",
      "url": "https://mcp.mcd.cn",
      "headers": { "Authorization": "Bearer YOUR_MCP_TOKEN" }
    }
  }
}

保存后回到【自定义连接器】,把 mcd-mcp 打开【启用】。

🔐 该文件只含占位符。填好 Token 的文件不要提交到任何仓库——.gitignore 已覆盖常见路径。

3. 安装本 Skill

方式 A(推荐):把本目录复制到用户级技能目录,目录名必须保持为 super-mcd-benefits-radar:

cp -r super-mcd-benefits-radar ~/.workbuddy/skills/

方式 B:完全不用装 Skill,直接跑命令行:

cd super-mcd-benefits-radar
python scripts/run_radar.py --mode mock   --out report.md   # 离线看效果(合成数据)
python scripts/run_radar.py --mode replay --replay-dir fixtures --out report.md  # 离线看官方格式

4. 环境要求

  • Python 3.10+(仅用标准库:json / urllib / datetime / unittest)
  • 不需要 pip install 任何东西

使用示例

三种模式产出的报告结构完全一致,只有首行的模式横幅不同。 建议顺序:先离线看效果 → 再回放官方格式 → 最后联网取自己的权益。

🚫 模式默认值为 real,且不存在「没有 Token 就自动换成 mock」的行为。 合成样例只能由用户显式指定(--mode mock 或 MCD_MODE=mock),且报告首行与终端 都会标注"合成样例、非真实权益"。宁可报错,也不静默给出一份看起来正常的假报告。

1. 离线体验(合成样例,不需要 Token)

需要显式指定 --mode mock:

$ python scripts/run_radar.py --mode mock --out report.md
[mock] 券 6 张 | P0=1 P1=1 P2=1 P3=0 P4=1 UNKNOWN=1 EXPIRED=1 | 可领取 2 | 活动 4 | 取数失败 0 | 解析失败 0
报告已写入:report.md

报告首行标注 [mock],终端(stderr)也会打印"不是你账户的真实权益",不会和真实数据混淆。

2. 回放官方响应格式(不需要 Token)

官方四个工具的返回没有一个是纯 JSON。fixtures/ 里存着结构逐行对标真实响应、 取值全部合成的样例;replay 模式把它们喂进完全相同的解析、排序、渲染链路:

$ python scripts/run_radar.py --mode replay --replay-dir fixtures --today 2026-10-09 --out report.md
[replay] 券 14 张 | P0=2 P1=3 P2=4 P3=5 P4=0 UNKNOWN=0 EXPIRED=0 | 可领取 9 | 活动 30 | 取数失败 0 | 解析失败 0

为什么样例要"结构真实、取值合成"?见 fixtures/README.md。

3. 联网取自己的权益(需要 Token)

$ export MCD_MCP_TOKEN=你的Token        # 注意:不要写进任何文件
$ python scripts/run_radar.py --mode real --out report.md
[real] 券 14 张 | P0=2 P1=3 ... | 可领取 9 | 活动 30 | 取数失败 0 | 解析失败 0

⚠️ --mode real 的适用条件(如实声明)

该模式的实现是:Python 进程直接用 urllib 连接 https://mcp.mcd.cn, Token 取自环境变量 MCD_MCP_TOKEN。

在 WorkBuddy 里使用时,这条路径通常走不通——连接器由 WorkBuddy 托管, Token 保存在客户端凭据库,不会导出到子进程环境变量。 也就是说:--mode real 只在"你手上有一个可直接使用的 Token、且愿意放进环境变量"的 场景下可用;它在 WorkBuddy 会话内没有被验证过。

4. 在 WorkBuddy 中直接用(推荐路径)

安装 Skill 后,直接说:

“帮我看看我的麦当劳优惠券哪些快过期了” “生成一份权益体检报告” “我的积分有多少,会不会过期?”

此时取数由 WorkBuddy 原生 MCP 调度完成(连接器已托管 Token), 但判断必须由本项目的代码产出,不能由大模型直接总结工具返回。正确姿势:

  1. 让 WorkBuddy 只读调用四个工具;
  2. 把四个工具的返回逐字写入一个回放目录(例如 fixtures-dump/,文件名为 query_my_coupons.md / query_my_account.txt / available_coupons.md / campaign_calendar.md);
  3. 校验采集目录:python scripts/verify_capture.py --dir fixtures-dump/(退出码非 0 就不要往下走);
  4. 运行 python scripts/run_radar.py --mode replay --replay-dir fixtures-dump --out report.md。

这样报告里的分级、排序、字段缺失标记 100% 出自本项目的代码,可复现、可审计。

📌 凡是"哪个券更急""哪个字段缺了"这类判断,都必须由代码算出来。 ⛔ 连接器不可用时,不得改用 --mode mock 顶替,也不得凭记忆编造权益条目。 第 3 步的校验器就是为此设的门槛:它拒绝被摘要/转述过的载荷,而不是将错就错。

5. 先验证连通性

$ python scripts/verify_mcp.py
[PASS] 端点可达性与鉴权保护      status: 403  guarded: True
[PASS] 只读白名单包含全部官方查询工具
[PASS] mock 工具清单 == 官方清单
[SKIP] 真实服务器工具清单 vs 官方清单   已跳过(未加 --real 或未配置 MCD_MCP_TOKEN)

报告长什么样

固定 8 节:元信息 / 立即行动 / 本周内 / 可计划与待确认 / 积分账户 / 活动日历 / 待领取 / 数据完整性与免责声明。

## 2. 立即行动(P0 / P1)

1. **P0** — 【合成样例】现制甜品任选(券面权益 ¥9.9 (用券价格),编号 MC-MY-0001) —— 今天到期
2. **P1** — 积分账户 —— 500 积分即将过期(12 天后过期)

## 4. 可计划与待确认(P3 / P4 / UNKNOWN)

### 信息不足 · 无法排序(UNKNOWN)

| 级别 | 名称 | 剩余时间 | 券面权益 | 使用条件 | 适用渠道 | 编号 |
|:---:|---|---|---|---|---|---|
| UNKNOWN | 【样例】新品尝鲜券 | [字段缺失] | 3 元 | [字段缺失] | 到店取餐 | MC-MY-0005 |

表格列名含义:「券面权益」是官方文案描述的权益本身(买一送一 / 满减 / 实付价), 不是换算后的优惠额;「编号」是解析生成的定位编号(MC-MY- / MC-AVAIL- / MD- 前缀),不是官方 ID。

紧急度分级

设 剩余天数 = 到期日 − 今天:

等级 条件 行动建议
P0 == 0 今天到期,立即使用
P1 1 – 3 尽快安排(积分"即将过期" > 0 也升到 P1)
P2 4 – 7 本周内排一次
P3 8 – 30 可计划
P4 > 30 时间充裕
UNKNOWN 无有效到期日 信息不足,请自行确认,不假定永久有效
EXPIRED 已过期 仅归档

同级排序键:(等级序, 剩余天数升序, 优惠值降序, 名称升序),同输入必得同输出(有测试保证)。


技术架构

super-mcd-benefits-radar/
├── SKILL.md                      # Skill 入口(WorkBuddy 加载)
├── README.md                     # 本文件
├── CONTEST_DECLARATION.md        # 参赛声明(官方原文,字节级未改动)
├── MCP_INTEGRATION.md            # MCP 集成说明(用了哪些 Server / Tool / 调用流程 / 业务价值)
├── mcp-config.example.json       # 脱敏配置示例(仅占位符)
├── workbuddy.md                  # WorkBuddy 开发对话记录(脱敏)
├── LICENSE
├── run_tests.py                  # 一条命令跑全部测试
├── scripts/
│   ├── mcd_client.py             # MCP 客户端:只读白名单 / 三模式 / 脱敏
│   ├── normalize.py              # 统一数据结构 + 四态分类 + JSON/Markdown 双解析
│   ├── radar.py                  # 紧急度评分排序(纯 stdlib datetime)
│   ├── report.py                 # 报告渲染(8 节契约)
│   ├── run_radar.py              # 一键 CLI(mock / replay / real)
│   ├── verify_capture.py         # 采集目录校验(完整性 / 可解析性 / 逐字性)
│   ├── verify_mcp.py             # 连通性与工具清单验证
│   └── dump_schema.py            # 由代码生成数据字典
├── references/
│   ├── mcp-tools.md              # 官方工具清单 + 实测格式
│   ├── data-schema.md            # 数据字典(由代码生成,不会与实现漂移)
│   ├── safety.md                 # 只读、隐私与"绝不自动回退 mock"的设计
│   ├── live-verification.md      # 真实调用的格式结论与缺陷修复(脱敏摘要)
│   └── privacy-and-publication.md# 隐私边界与公开发布范围
├── fixtures/                     # 数据样例(全部合成,见 fixtures/README.md)
├── examples/                     # 样例报告(由本项目代码生成)
└── tests/                        # 337 项测试

数据处理链路

MCP 原始返回(dict / 纯 JSON / 说明文本包裹 JSON / Markdown)
    │  ⓪ classify_state() —— 先分清"空 / 读不懂 / 失败",再谈解析
    ▼
    ├── 调用失败 ──────────────────────────► FAILED        → "取数失败 + 原因"
    ├── 成功 + 解析出记录 ─────────────────► PARSED        → 正常展示
    ├── 成功 + 有内容 + 零记录 ────────────► UNRECOGNIZED  → "收到数据,但解析失败"
    └── 成功 + 确实为空 ───────────────────► EMPTY         → 才可以说"没有"
    │  ① coerce_payload() → observe_format() → find_records()
    │     零记录且该工具注册了文本解析器 → 回退 _TEXT_PARSERS
    ▼
    │  ② COUPON_ALIASES / CAMPAIGN_ALIASES / POINTS_ALIASES 逐个别名试取
    │     必需字段集按来源分流("我的券" ≠ "可领取券")
    ▼
    │  ③ 取不到 → None + 记入 missing(绝不填默认值)
    ▼
    │  ④ days_left = (valid_to − today_beijing()).days   ← 纯 stdlib datetime
    │     活动按来源分流:JSON → 有效期紧急度;Markdown → 日历语义
    ▼
    │  ⑤ 排序 (等级序, 剩余天数升序, 优惠值降序, 名称升序)
    ▼
Markdown 报告(8 节固定结构 + 数据完整性声明)

四个工具、三种真实格式(本项目最大的技术发现)

官方只公开工具用途描述,不公开响应字段级 schema。实测四个工具的返回格式互不相同, 且没有一个是纯 JSON:

工具 实测格式 解析难点 解析结果
query-my-coupons Markdown ## 券名 分块 + - **字段**: 值;字段种类随券类型变化 14/14
query-my-account 说明性文本 + 内嵌 JSON JSON 外裹字段说明,需靠括号配平定位 1/1
available-coupons Markdown 换行处有行尾 \ 续行符,需先拼接 9/9
campaign-calendar Markdown #### 日期 分组(今日 / 往期回顾 / 无标签未来日) 30/30

格式判定由 normalize.observe_format() 程序完成,不是人工声称; 判定结果直接印在报告第 1 节的数据源状态表里。

这套"实测"不是一次性目测:结论、被推翻的假设与全部修复过程记录在 references/live-verification.md, 并由 tests/ 中的格式测试与端到端回放测试离线锁定。

为什么"解析失败"必须独立成一个状态

只记录"解析出几条"的做法有个致命盲区:解析器读不懂与接口确实返回空 在报告里长得一模一样,都显示"没有数据"。用户看到"本月没有活动"会认为确实没有, 而真相是程序没读懂——这是静默的假阴性,比报错更危险,因为无从察觉。

因此状态被显式拆成四种,并且只有 EMPTY 才允许下"没有数据"的结论。 该约束由 tests/test_payload_state.py 的专项用例锁定,防止回归。


真实 MCP 接入说明

使用的 Server 与 Tool

项 值
服务方 麦当劳中国(官方远程托管)
接入地址 https://mcp.mcd.cn
传输协议 Streamable HTTP
鉴权 请求头 Authorization: Bearer
Token 申请
官方文档
收费 免费(600 请求/分钟/Token)

调用 4 个只读工具:query-my-coupons、query-my-account、available-coupons、 campaign-calendar(辅助:now-time-info)。

官方清单中还有约 30 个工具(点餐、下单、积分兑换、抽奖、派对预约等)。 本项目一个都不用——它们被 READ_ONLY_TOOLS 白名单默认拒绝。 拦截机制是白名单而非黑名单:官方将来新增任何写入类工具都会被自动拦下。

两种接入方式

方式 Token 在哪 本项目如何取数 适用场景
A. WorkBuddy 连接器(推荐) WorkBuddy 凭据库(进程外) WorkBuddy 原生调度四个只读工具 → 写入回放目录 → --mode replay 在 WorkBuddy 会话中使用
B. 环境变量 进程环境 MCD_MCP_TOKEN --mode real 由 Python 直接联网 本地命令行 / CI

方式 A 下端到端链路与方式 B 完全相同(同一套解析、排序、渲染代码), 差别只在"谁发起 HTTP 请求"。

数据边界与可复现性(请务必阅读)

  1. 仓库内 fixtures/ 是合成样例,不是真实响应。 真实响应含账户数据(券清单、积分余额),未随公开仓库分发。 样例与真实响应逐行结构同构,因此解析器面对的是真实格式,测试仍然有意义。 判定依据是行内可见的 【合成样例】 前缀,不会与真实数据混淆。
  2. 模型转写限制(如实声明):在 WorkBuddy 会话中,MCP 工具的返回需经模型上下文 才能落到本机文件,因此落盘内容属于模型转写; 任何校验都无法证明它与服务端原文字节级一致。本项目不对"逐字一致"做任何声明。 要拿到字节级原文,请使用方式 B(进程内直连)并由程序自行落盘。
  3. 格式结论是单次快照。 官方字段名随券类型与活动配置浮动;本项目对已出现过的字段 做了映射,对未出现过的字段只保留为"未映射"并在报告第 8 节列出。 拿到新 Token 后建议再跑一次 --dump-raw raw/ 收敛别名表。

测试

$ python run_tests.py
OK
------------------------------------------------------------
共 337 项 | 失败 0 | 错误 0 | 跳过 1

$ python run_tests.py redaction -v     # 只看脱敏相关
$ python run_tests.py radar            # 只看紧急度分级

测试计数说明

阶段 实跑 失败 错误 跳过 说明
开发早期 322 0 0 0 见 workbuddy.md 开发记录(历史如实保留,不改写)
本轮安全同步后 337 0 0 0 或 1 检出目录名等于 super-mcd-benefits-radar 时为 0;在发布工作目录下为 1

跳过的是哪一项? tests/test_skill_manifest.py::test_name_matches_directory_when_run_in_place—— 它只在本目录名恰好等于 Skill ID 时执行。这是打包/安装环节的约束,不是代码缺陷。

跳过不计入通过。 实际通过数 = 实跑数 − 跳过数;请以对应目录下的实际测试输出为准, 不要把跳过的用例当作已通过。

覆盖重点:

测试文件 关注点
test_skill_manifest.py SKILL.md frontmatter 合法性与声明完整性
test_submission_ready.py 必需文件齐全、官方声明哈希未变、仓库无凭据、文档与代码一致
test_client_guardrails.py 写入类工具被拦截、白名单未扩大、mock 不联网、默认模式为 real 且绝无回退
test_verify_capture.py 采集目录校验:缺件/空文件/被转述载荷被拦下,连字符文件名可识别,校验过程不联网
test_redaction.py Token 不外流(含一个真实回归用例)
test_normalize.py 日期/数字解析边界、缺失字段登记、去重
test_payload_state.py 解析失败 vs 真空 vs 取数失败三态区分,禁止假阴性
test_coupon_markdown.py query-my-coupons 官方 Markdown:多券、字段不定、[字段缺失] vs 未提供、同名券保留、实付价不当优惠额
test_available_coupons.py available-coupons 官方 Markdown:行尾续行、状态剔除、编号命名空间
test_account_payload.py query-my-account 内嵌 JSON 提取、Mouth 拼写、字段缺失、accountId 不落库
test_campaign_markdown.py 活动 Markdown 解析、双格式兼容、日历语义、不丢活动
test_replay_pipeline.py 四个格式样例走完整解析→排序→渲染链路,端到端断言
test_radar.py 分级边界值、排序确定性、UNKNOWN 不被误判
test_report.py 输出契约、端到端 CLI、报告中零 Token

隐私与安全

  • Token 只从环境变量 MCD_MCP_TOKEN 读取,不落盘、不回显、不进 URL; mcp-config.example.json 只含占位符。
  • 账号标识不落库。 query-my-account 返回里的 accountId 在归一化时即被丢弃取值—— 只记录"这个字段存在过",取值不进数据结构、不进报告、不进日志、也不进 --dump-raw 导出。
  • 报告不写入任何账号标识;--dump-raw 的导出经过结构保留式掩码 (键名保留、取值替换)。带签名的 CDN 图片 URL 视为有时效凭据,一并掩码。
  • 只读保证由 READ_ONLY_TOOLS 白名单实现,默认拒绝。
  • 仓库内含全仓凭据扫描测试(Token / sk_live_ / 长十六进制 / 手机号),防止误提交。

完整的隐私边界与公开发布范围见 references/privacy-and-publication.md。

如需代领券或下单

本 Skill 明确不做。请打开麦当劳 App 自行操作——报告会把"该领什么、该优先用什么"排好序给你。


已知限制(如实说明)

  1. 格式结论是 2026-10-09 的单次快照。 四个工具的格式已实测确认,字段映射覆盖了 已出现过的字段;对新出现的字段,别名表在补充验证之前仍属假设。
  2. CLI --mode real 在 WorkBuddy 会话内不可用(连接器 Token 不进子进程环境变量)。 WorkBuddy 场景请走"原生调度 + replay 回放"路径。
  3. 活动日历只有归档日期,没有有效期。 官方不提供起止时间,因此无法判断 “这个活动还剩几天”。需要具体售卖期时请查活动详情页。
  4. 同一活动可能跨多日重复出现,本项目不去重。 这是官方日历本身的组织方式, 去重反而会掩盖"今天仍有"的事实。
  5. 积分过期规则只呈现不推断。 报告只给出"即将过期积分"数值与日期, 不推断麦当劳的积分计息/过期规则。
  6. 不做预测。 不预测下周会有什么券、不预测价格变动。
  7. 单账号。 一次只处理当前 Token 对应账号的权益。
  8. accountId 等隐私字段仅记录"存在过",因此项目无法据此做多账号区分。

参赛信息

项 内容
赛事 麦当劳程序员节创意开发大赛
官方仓库
MCP 文档
必需文件 README.md、CONTEST_DECLARATION.md(官方原文,未改动)、MCP_INTEGRATION.md、mcp-config.example.json、源代码
WorkBuddy 专项 已附 workbuddy.md(脱敏开发对话记录)
真实验证 四个只读工具均于 2026-10-09 完成真实调用,格式结论见 references/live-verification.md
自动化测试 337 项,失败 0 / 错误 0(跳过数随检出目录名,见上文「测试计数说明」)
Git 历史 公开仓库使用干净的初始提交,不继承任何开发期历史

免责声明

本项目为独立参赛作品,由参赛者独立开发,非麦当劳官方产品,也未获得麦当劳品牌背书。 项目对所有只读 MCP 返回的展示仅供参考,不构成任何形式的建议; 餐品信息、价格、券面规则及供应状态以麦当劳官方渠道的实时结果为准。 本项目未执行任何下单、领券或积分消费操作。

对"麦当劳"“麦麦省”"麦乐送"等名称的使用仅限描述性指代, 不构成对麦当劳及其关联方商标的任何授权,亦不暗示官方背书。 麦当劳 MCP 服务的使用须遵守麦当劳中国的《使用条款》及《麦当劳 MCP 服务规则》。

许可

MIT。

在 GitHub 查看完整 README

安装

This server does not publish a one-line install command.

Open the repository installation guide 新手?先看 mcpskill.org 教程 →

配置

{ "mcpServers": { "mcd-mcp": { "type": "streamablehttp", "url": "https://mcp.mcd.cn", "headers": { "Authorization": "Bearer YOUR_MCP_TOKEN" } } } }