麦麦出场图鉴
先领取所有当前可领优惠券,再把用户的麦当劳用餐需求变成一份真实可用的推荐菜单,用固定 HTML 模板逐个揭晓餐品。每次更换菜单 JSON,不重写模板。没有匹配餐品时也生成 HTML,在页面内说明原因和调整建议。
客户端交付规则
- 对应客户端最终只交付生成的 HTML 附件,或一条可点击的 HTML 文件链接。不在对话中列出推荐餐品、价格、套餐组成、推荐理由或预算不足的解释,不粘贴 HTML 源码。
- 需求不完整时可以在生成前进行必要补问,不能先在对话里曝光候选或推荐物品。执行进度只描述处理步骤。
- 推荐成功、待核价和预算不足的原因、金额及建议都写进 HTML。生成后不要追加文字总结或重复菜单。
- 根据运行环境识别客户端名,填入
clientName,例如确实在 WorkBuddy 运行时填 WorkBuddy。环境不提供可靠名称时使用「当前客户端」,不猜测、不为此额外追问。 - 页面可以提示用户回到该客户端,并提供可复制的调整需求。不能自行给客户端发送新消息、修改预算或自动开启新一轮推荐。
- 客户端交付 HTML;页面内的导出按钮只导出 PNG 海报,不导出 HTML。PNG 展示完整菜单与预算,或无匹配结果与客户端调整提示,离线生成。
选餐与数据查询
- 提取预算(包含整单费用)、人数、口味、忌口、用餐方式。只补问会影响选餐或报价的信息;默认预算是整单总预算,含配送费。
- 每次新的真实推荐流程先调用
auto-bind-coupons,领取麦麦省所有当前可领优惠券,不根据本次想吃的菜品预先挑券,也不凭空指定 couponId。参数以当前工具 schema 为准。只有调用成功或服务明确返回无券可领,才进入后续选餐;领取失败、部分失败或结果不明时,先说明并处理失败,不跳过这一步,不盲目重复领取。已领取的券、领取数量均以真实返回为准。 - 使用用户选择的门店;没有门店时询问大致位置,通过
query-nearby-stores查询,到店堂食 / 外带需选择合适的用餐方式。外送时按服务工具要求用delivery-query-stores查询可配送门店。只读已有地址时可用delivery-query-addresses;导出时不保留地址。 - 领取完成并确定门店后,必须调用
query-store-coupons,查询当前门店和用餐方式实际可使用的优惠券,再选餐。领取成功不等于该券适用于当前门店、时段或餐品;需要账户券信息时可补充query-my-coupons,但不能替代门店可用券查询。 - 从实际 MCP
query-meals返回的可售菜单选餐,用query-meal-detail核实套餐组成、可替换项及与需求相关的信息。工具参数以当前服务提供的 schema 为准,不猜测参数名或餐品编码。 - 需要营养数据时调用
list-nutrition-foods,只能引用对应餐品及规格确实返回的数据;缺失信息写明未知。不能凭口味名称保证无过敏原。 - 筛选满足用户明确限制的候选组合,兼顾人数、用户偏好及用餐场景,再调用
calculate-price核验所选门店、餐品规格、数量、用餐方式、优惠和整单费用。不可自行叠加优惠或用单品价格猜测套餐价。 - 有有效报价且总价不超过预算时,输出
quote.status: verified。更换任何餐品、数量、门店、优惠或用餐方式后必须重新核价。 - 无法取得有效报价时,可输出
quote.status: unknown的待核价页面,所有金额及单价写为 null,明确不能保证满足预算。没有符合当前预算和需求的餐品时,输出result.status: no-match、items: []、quote.status: not-applicable的结果页面,原因写入result.message,不在对话里解释或等待用户调高预算才生成 HTML。 - 预算不足只是本轮查询结论,不能按 1 元等固定阈值判断;检查领取后的可用优惠,实际可能存在免费或低价方案。
result.minimumTotal只有在真实核验候选方案报价后才填写,否则设为 null,页面不编造起价或差额。需求或供应导致无匹配时使用对应 reason,不把查询故障当作预算不足。 - MCP 不可用或未配置时,说明需要接入麦当劳 MCP;只有用户选择演示时才用示例数据,不把示例标为实际查询。
领券是推荐流程的前置步骤。该流程不包含下单、积分兑换或购买付费权益。离线演示、PNG 导出和重播出场不调用 MCP;同一轮已成功领券后的改菜或重新核价无需再次领券,但更换门店或用餐方式需要重新查询可用券。
生成页面
-
按 菜单数据格式 组装
data/menu.json。sourceTools按本轮首次实际调用顺序记录工具名,真实菜单必须包含先领券、再查门店券、后查菜单的记录;仅填工具名不能证明调用成功。仅保留展示所需的字段,不能把完整 MCP 响应或原始用户地址放进 JSON。 -
有匹配菜单时,为每个餐品写 1–3 条由宽到窄的提示、
我就是——{餐品名称}!的揭晓台词及具体推荐理由。无匹配时使用空数组,按 1 元预算示例 填写结果状态和客户端提示,不展示或暗中推荐超预算餐品。事实来自查询结果;文案可以活泼,不编造促销、价格、营养信息或官方背书。 -
有合法可用的餐品图片时,提供本地 PNG / JPEG / WebP 的
imageFile;脚本会嵌入 HTML。没有图片则按餐品类别设置art,使用模板内的原创示意插画。猜谜玩法使用原创舞台,不使用宝可梦角色、标志、素材或原作音频。 -
在 Skill 根目录执行:
shnode scripts/render-menu.mjs --data data/menu.json --out outputs/menu.html -
若校验失败,修正对应数据;预算冲突时重新选餐与核价,确实无匹配则生成无匹配状态的 HTML。生成成功后,对话仅交付 HTML 附件或文件链接。输出是一份可离线打开的 HTML;推荐成功时默认音效关闭,用户可揭晓、集结菜单、重播、导出 PNG 或打印;无匹配时可导出 PNG 结果或复制调整需求。
演示
用户希望先看效果时执行:
shnode scripts/render-menu.mjs --data data/menu.example.json --out outputs/demo.html
示例餐品、价格和优惠只用于展示交互。实际接入方式及核验状态见 MCP_INTEGRATION.md。


