Dual-agent ordering-decision arena with a McDonald's China MCP client; labeled scenario-data demo; live calls and schema mapping await token verification.
翻譯準備中
其他TypeScript · JavaScriptGitHub @DorianChn自行安裝營運者未確認
試用過了嗎? 點一下就好,不需要登入。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
安裝型專案無需部署網域也可驗證。個人儲存庫可透過 GitHub 登入驗證,組織儲存庫可使用上方的儲存庫驗證檔案。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗基于麦当劳中国 MCP 接入方案的双 Agent 点餐决策竞技平台——两种算法策略在同一任务卡与数据集上对决,独立裁判透明评分。公开演示使用明确标注的场景数据;官方 MCP 实时联调与返回 schema 校验尚未完成。
以下截图来自生产构建 + 真实 Chrome 的 16 步链路实测(2026-10-15,控制台 0 错误 / 0 警告,证据见 docs/screenshots/stage07/),非设计稿:
| 首页(深色) | 竞技场(回放中) | 结果页(五维对比) |
|---|---|---|
| 挑战设置 | 结果页(浅色) | 移动端 |
动态演示:20 帧真实会话采集帧见
docs/screenshots/gif-frames/(采集器tools/e2e/capture-demo-frames.mjs可一键重采)。本环境不生成视频,GIF 合成命令见「演示 GIF」。
一张任务卡(预算 × 人数 × 场景 × 约束)+ 两名风格迥异的点餐 Agent + 一位只认规则的裁判:
calculate-price 结果时才按官方核价标记,否则明确标注 NOT_VERIFIED;出现致命违规的方案直接失去获胜资格,无效方案不能凭低价取胜;每局产出可复现的 experimentId。两名 Agent 的算法实质不同(贪心 vs 束搜索),基准测试实测差异:平均候选数 1 vs 134、平均工具调用 1 vs 4.75 次;模拟数据下 α 更便宜、β 营养与用券更优。两者均为算法型 Agent(未配置大模型,已明确标注),不得把固定输出冒充 AI 推理。
默认演示模式使用仓内场景数据,并明确标注为模拟数据。项目已实现麦当劳 MCP 客户端与只读工具调用链,但尚未取得 Token,因此没有真实菜单、价格或营养数据的联调证据;未经成功联调与校验的数据不会标为官方数据。
skill/mc-arena/INSTALL.md)。| 模式 | 数据来源 | 需要 Token | 界面标识 | 用途 |
|---|---|---|---|---|
| 演示模式(默认) | 仓内场景数据集 scenario://stage03-fixtures | ❌ 不需要 | 黄色「模拟数据」徽标 | 克隆即可完整走通全链路,适合体验、教学、CI |
| 官方数据模式(待联调) | MCP Server 实时采集;原始快照的字段映射尚未完成 | ✅ 需要 | 仅在数据成功校验后显示官方来源 | 目标是使用官方菜单 / 价格 / 优惠 / 营养数据 |
dataOrigin: mock,绝不冒充官方数据;git clone https://github.com/DorianChn/McArena.git
cd McArena
npm ci
npm run dev
# 前端 http://localhost:5173 | API http://localhost:8787
当前版本尚未完成真实 Token 联调、官方响应 schema 校验及快照字段映射,不能据此运行官方菜单上的完整比赛。取得 Token 后可按 MCP_INTEGRATION.md 采集只读原始响应;在映射与校验完成前,演示仍使用明确标记的场景模拟数据。
npm run demo # 打一局比赛,输出中文战报(任务卡/双 Agent 指标/裁判结论)
npm run bench # 跑 8 个官方测试场景,输出双 Agent 五维对比表
npm run demo -w @mcarena/arena-core -- timeout # 演示:Agent 超时 → 降级恢复(明确标注)
npm run demo -w @mcarena/arena-core -- cancel # 演示:取消执行 → CANCELLED,不产出提案
--goal 可选:balanced / protein / low-sodium / low-cal / budget / none;
--mode 可选:auto(默认;当前官方快照目录为空,运行使用场景数据集)/ mock / replay / live。
npm run lint # ESLint(typescript-eslint 类型感知规则)
npm run typecheck # TypeScript strict 全量检查
npm test # Vitest:契约 / 协议 / 编排 / API / 前端客户端
npm run build # 生产构建(API tsup 打包 + Web Vite 构建)
node skill/mc-arena/scripts/install.mjs # 安装到 ~/.workbuddy-ai/skills/mc-arena
node skill/mc-arena/scripts/parse-request.mjs "3个人 预算60 要低卡 外带"
node skill/mc-arena/scripts/run-match.mjs --people 2 --budget 60 --goal balanced --seed 42
安装后在 WorkBuddy 对话中说「来一场麦门竞技,2 个人 60 块要均衡搭配」即可触发。
Skill 不含业务逻辑,全部调用仓库内共享引擎(与网页同源)。详见
skill/mc-arena/SKILL.md、skill/mc-arena/INSTALL.md
与 docs/archive/STAGE_06_REPORT.md。开发过程记录见 workbuddy.md。
一条命令跑一局完整的「自定义挑战 → 双 Agent 决策 → 独立裁判 → 可复现配置」闭环:
npm run challenge -w @mcarena/arena-core -- --people 2 --budget 60 --goal balanced --seed 42
真实输出(2026-10-15 实测,演示模式):
任务卡:自定义挑战 · 2 人堂食|预算 ¥60、人均 500 kcal、人均蛋白 20g、必含标签 burger/side/drink
数据来源:mock(scenario://stage03-fixtures)|比赛 ID match_mv9660tm_42
⚠ 阶段03 场景测试数据集(模拟数据,非麦当劳官方数据)
【α 极速猎手】[email protected]|总分 78.5/100
自述应付 ¥22.00|裁决成本 ¥22.00|核价 not-verified|资格 通过
实测 7ms|候选 1|工具调用 1
【β 深度优化师】[email protected]|总分 79.6/100
自述应付 ¥25.00|裁决成本 ¥25.00|核价 not-verified|资格 通过
实测 3ms|候选 248|工具调用 6
裁判结论:极速猎手胜出(五维总分 78.5 : 79.6 / 100)——双方均无官方核价记录(NOT_VERIFIED),按裁判重算成本比较,α更低(¥22.00 : ¥25.00)
规则 judge-rules/1.1.0|实验 exp_bcc724febf31e0b8|成本依据 claimed-unverified
同一 seed 重复运行得到同一 experimentId(该 ID 已在 2026-10-14 的阶段06 实测中复现)。输出末尾会给出 reproducibleConfig——粘贴到网页「挑战设置」或同种子重跑即可复现同一局。
┌────────────┐ ┌──────────────────┐ ┌─────────────────────────┐
│ apps/web │──▶│ apps/api │──▶│ packages/arena-core │
│ React+Vite │ │ Fastify + SSE │ │ 规则/双Agent/裁判(纯函数) │
└────────────┘ └──────────────────┘ └───────────┬─────────────┘
│ │ packages/shared (zod 契约)
┌─────────▼──────────┐ ┌────────▼─────────┐
│ snapshots/ (回放) │◀──│ mcd-mcp-client │──▶ mcp.mcd.cn
└────────────────────┘ └──────────────────┘
packages/shared 用 zod 定义跨模块契约(MenuSnapshot / TaskCard / DecisionTrace / Verdict / MatchRecord),API 与 Web 两端共享;runArenaMatch()(arena-core),Skill 不复制业务逻辑;official-live / official-snapshot / mock,由 DataOrigin 贯穿 MatchResult 与 UI;详细设计见 ARCHITECTURE.md,实施计划见 PROJECT_PLAN.md。
npm test # Vitest:契约 / 协议 / 决策 / 裁判 / 复现性 / API / 前端 / E2E 辅助
npm run build # TypeScript strict 全量构建
复现性测试:相同 (seed, snapshotId) 两次运行的 MatchRecord(除记录 ID 外)字节级一致。
当前基线(2026-10-15 真实执行):
no-console 与 react-refresh 两处为精确豁免并附注释);npm audit 0 漏洞(全量与 --omit=dev);docs/screenshots/stage07/)。| 路径 | 说明 |
|---|---|
packages/shared | 数据契约(zod schema + TS 类型,单一事实来源) |
packages/mcd-mcp-client | 官方 MCP Streamable HTTP 客户端(退避重试 / 写操作黑名单 / 快照采集) |
packages/arena-core | 竞技内核:规则引擎、双 Agent、裁判引擎(零网络纯函数)+ challenge CLI |
apps/api | Fastify 服务:比赛 API + SSE 实时流 |
apps/web | React 中文可视化界面(决策时间轴 / 雷达图 / 解释面板 / Agent 指标) |
skill/mc-arena | WorkBuddy Skill(SKILL.md + scripts + references + INSTALL.md) |
snapshots/ | 官方数据快照目录(当前为空;空时自动回退场景数据集。采集:MCD_MCP_TOKEN=<token> tsx tools/snapshot-capture.ts,需 Token) |
docs/screenshots/ | 真实浏览器截图(stage05 / stage07 / gif-frames) |
docs/evidence/ | 各阶段真实运行证据(CLI 输出、HTML 战报、JSON 结果、浏览器实测报告) |
docs/PROMOTION.md | 传播材料(中文介绍 / English / GitHub 描述 / 技术亮点 / 架构说明) |
docs/archive/ | 阶段报告、测试/性能/安全报告与交接文档 |
tools/ | 工程脚本:快照采集 CLI、报名就绪自查、GIF 帧捕获、浏览器实测 |
23767dc / f5b301f)docs/archive/STAGE_03_REPORT.mddocs/archive/STAGE_04_REPORT.md 与 JUDGE_SPEC.mddocs/archive/STAGE_05_REPORT.md(含真实浏览器实测与截图)challenge CLI / Skill 三脚本 / 官方规范校验通过)——见 docs/archive/STAGE_06_REPORT.mddocs/archive/STAGE_07_REPORT.md / docs/archive/TEST_REPORT.md / docs/archive/SECURITY_AUDIT.md / docs/archive/PERFORMANCE_REPORT.mddocs/archive/FINAL_WORKBUDDY_REPORT.md 与 now-time-info、query-nearby-stores、query-meals、query-meal-detail、calculate-price、query-store-coupons、list-nutrition-foods、campaign-calendar。
调用流程与业务价值详见 MCP_INTEGRATION.md。
本仓库不内置二进制 GIF:20 帧真实采集帧位于 docs/screenshots/gif-frames/(按文件名排序即为播放顺序)。在装有 ffmpeg 的机器上一条命令即可合成:
ffmpeg -framerate 2.5 -i docs/screenshots/gif-frames/%03d-*.png \
-vf "scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
docs/screenshots/demo.gif
(帧由 node tools/e2e/capture-demo-frames.mjs 真实采集,未经任何画面伪造;本环境不生成视频,故不在仓库内置 GIF。)
create-order 等写操作,不会产生任何真实订单;见 CONTRIBUTING.md。本地完整检查是 npm run verify(依次执行 lint、typecheck、build、test)。
docs/archive/CODEX_HANDOFF.md