把你的麦当劳订单,变成一张能晒出去的「人格收藏卡」。 全程只读:只拉数据,不下一单、不花一分、不领一张券。
一个基于麦当劳中国官方 MCP 的 Skill(WorkBuddy / 兼容 SKILL.md 规范的 Agent 均可加载)。
它把你真实的麦当劳订单当作一次行为侧写:读取订单、积分、奖品、券包四类数据,算出 66 维行为特征,在 20 种主格人格里判定你的主格(另有 1 种兜底人格与 1 个隐藏彩蛋),再渲染成一张 1024×3367 的收藏卡式长图。
每条结论都能回溯到订单里的真实字段——不许编。卡片上写的「10 单里有 5 单在早上 10:30 前下单」,就是真的有 5 单。
| 族 | 人格 |
|---|---|
| 时间 | M01 麦满分信徒 · M02 正午踩点侠 · M03 下午茶主理人 · M04 深夜食堂主理人 · M05 失踪人口 |
| 品类 | M06 冰咖续命徒 · M07 薯条原教旨主义者 · M08 快乐水信徒 · M09 无糖自律党 · M10 甜品第二个胃 · M11 牛堡重量级 |
| 行为 | M12 九块九战术大师 · M13 券包仓鼠 · M14 麦乐送钉子户 · M15 得来速车窗党 · M16 门店钉子户 |
| 资产 | M17 限定收割机 · M18 积分守财奴 · M19 单点孤狼 · M20 老三样复刻党 |
| 兜底 | M00 见习麦友(有效订单 < 3 单时降级) |
| 彩蛋 | MX 过期冤种(积分过期率 ≥ 50% 且过期 ≥ 1000 分时,进底部彩蛋区,不占主格) |
同族互斥:四族各只留最高分;最高分不足 25 分降级 M00;与主格跨族且 ≥ 40 分的次高最多 2 个,作为隐藏副格。
| 主格卡 | 兜底卡 |
|---|---|
![]() |
![]() |
| 品类卡 | 彩蛋卡 |
|---|---|
![]() |
![]() |
演示视频(58 秒,1080p):docs/demo.mp4
- 普通麦门用户:想看看自己的点单习惯到底有多离谱,或者想要一张能发朋友圈/小红书的年度报告式卡片
- 内容创作者:需要一个低成本、强互动的社群话题(卡片底部自带「@ 一个你觉得一定是 XX 的朋友」)
- 开发者:想参考一套「只读 MCP 调用 + 数据脱敏 + 长图渲染」的完整链路,以及 25 份可离线复现的 mock 数据
到 open.mcd.cn/mcp 用手机号登录,在控制台点击「激活」申请 Token。 官方使用指南:M-China/mcd-mcp-server。
本项目只需要 Token 对应的只读查询权限,不涉及下单、领券、抽奖等写操作。
复制配置示例,把 Token 放进环境变量,不要写进文件:
cp mcp-config.example.json ~/.workbuddy/mcp.json
export MCD_MCP_TOKEN="你的 Token"内容见 mcp-config.example.json,只有 ${MCD_MCP_TOKEN} 占位符。
git clone https://github.com/xiaobaiTech/mcd-personality.git ~/.workbuddy/skills/mcd-personality依赖:
| 依赖 | 用途 | 是否必须 |
|---|---|---|
| Python 3.9+ | 全部脚本 | 必须 |
| Pillow | 图片处理与长图裁剪 | 必须 |
| Chrome / Chromium / Edge | 长图截图(shot.py) |
出图必须,只看 HTML 可不要 |
在 WorkBuddy 对话里直接说:
测测我的麦当劳人格
Agent 会自动拉数据、判定人格、出卡,并把 report.png 交给你。
Agent 侧的调用顺序(详见 MCP_INTEGRATION.md):
order-list → query-order(逐单) → query-my-account → query-my-prizes → query-my-coupons → query-lottery-info(可选)
原始返回存进 raw/ 后,一条命令跑完:
bash scripts/run.sh raw/ out/
# 产出 out/{raw.json, features.json, result.json, report.html, report.png}仓库自带 mock 数据生成器,可复现全部 22 个人格条目(20 主格 + 兜底 + 彩蛋)+ 3 个边界场景:
# 1) 造 25 份「MCP 原始返回」快照
python3 scripts/make_fixtures.py --out /tmp/fixtures
# 2) 全部跑一遍,产出验证表 + 卡片画廊
python3 scripts/verify_all.py /tmp/fixtures /tmp/verify-out预期结果:25/25 全部命中期望人格。改了人格库之后重跑一遍,就能一次看出哪张卡坏了。
MCP 只读接口 → raw/*.json → fetch.py 规整脱敏 → analyze.py 66 维特征
→ judge.py 判定人格+生成文案 → render.py 单文件 HTML → shot.py 长图 PNG
- 判定:每个条件算「超标比」,同组取最大(OR)、跨组加权平均(AND),
gate条件不达标直接出局 - 文案:3 条理由全部由真实字段套模板生成,缺数据就少一条,不补齐
- 渲染:HTML 单文件自包含(图片、字体全部 base64 内嵌),断网也能打开
| 项 | 做法 |
|---|---|
| 接口权限 | 只用 6 个只读接口,硬约束禁止调用 create-order / cancel-order / draw-lottery / auto-bind-coupons 等写操作 |
| 门店信息 | 门店名/编码/地址不落盘不渲染,只保留城市;门店去重用 storeCode 的 md5 前 8 位 |
| 凭证 | 仓库内不含任何真实 Token / 密钥 / 账号,配置仅用环境变量占位符 |
| 数据出境 | 全部处理在本机完成,不上传任何第三方 |
| 样本不足 | 有效订单 < 3 单直接判 M00,不硬凑结论 |
- MCP 的
order-list只返回最近若干单,样本太少的账号会落到 M00 兜底卡 - 部分券全额抵扣的单,
realTotalAmount会返回 0 或 1,客单价统计会剔除这些单 query-my-coupons返回的是 Markdown 而非 JSON,靠正则解析;解析失败记 0,不阻塞出卡- 奖品名是节气测试名(立春/白露等),只取数量与类型,不做语义判断
mcd-personality/
├── SKILL.md # Skill 定义与使用流程(Agent 读这个)
├── README.md # 本文件
├── MCP_INTEGRATION.md # MCP 调用说明
├── CONTEST_DECLARATION.md # 参赛声明(官方原样文件)
├── mcp-config.example.json # 脱敏 MCP 配置示例
├── workbuddy.md # WorkBuddy 开发上下文
├── scripts/ # fetch / analyze / judge / render / shot / mock
├── references/ # 人格库、数据契约、生图提示词
├── templates/report.html # 报告卡模板
├── assets/personas/ # 22 张人格插画
└── docs/ # 预览图与演示视频
代码 MIT License 授权。人格插画为本项目原创生成素材,随项目一同以 MIT 授权。
本项目是麦当劳程序员创意开发大赛的参赛作品,由参赛者独立开发,非麦当劳官方产品。 项目输出仅供参考,餐品信息、价格及供应状态以麦当劳官方渠道的实时结果为准。




