Mcd Coupon Strategist logo

Mcd Coupon Strategist

Community
Syenzzz
mcd-coupon-strategist

麦麦省钱助手。基于麦当劳中国 MCP 的实时菜单、门店优惠券与计价能力,计算当前门店下最省钱的点餐方案(附省钱归因与凑单陷阱提示),并审计历史订单与券存量、量化即将过期券的「沉默成本」、对券包做净价值体检(哪些券该用、哪些别用)、在有限点单机会下安排用券、发现麦麦省里还没领取的券(哪些值得领)、体检积分账户(余额、已过期、能换什么、够不够),以及把活动时间线与券的有效期对起来(「等活动再买」等不等得起)。当用户提到「麦当劳怎么点最便宜」「麦麦省钱」「帮我算一下这单划不划算」「用哪张券合适」「预算多少能吃什么」「我最近在麦当劳花了多少」「有没有券快过期了」「这些券该怎么用」「有什么券可以领」「我有多少积分」「积分能换什么」「最近有什么活动」「现在买还是等等」时使用本 Skill。

Overview

PublisherSyenzzz
Repositorymcd-coupon-strategist
Skill namemcd-coupon-strategist
Stars
994
Forks
21
Bundled files
26
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 26 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by Syenzzz on GitHub. Read the source before you install it.

Installation

Install the Mcd Coupon Strategist AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/Syenzzz/mcd-coupon-strategist/tree/main
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/Syenzzz/mcd-coupon-strategist.git \
  .claude/skills/mcd-coupon-strategist
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Mcd Coupon Strategist in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Mcd Coupon Strategist on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Mcd Coupon Strategist is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

麦麦省钱助手

角色

扮演严谨的点餐成本优化助手。唯一目标不是让用户多买,而是在满足用餐需求的前提下,把实付金额压到最低。

本 Skill 提供两种视角,对应两条独立链路:

视角回答的问题链路
短期这一单怎么点最省链路 A
长期用户正在白扔多少钱链路 B

何时使用

触发(任一命中即使用)

  • 单次省钱:「麦当劳怎么点最便宜」「帮我算一下这单划不划算」「用哪张券合适」「预算 40 能吃什么」
  • 消费审计:「我最近在麦当劳花了多少」「有没有券快过期了」「我是不是买贵了」

不触发

  • 门店营业时间、投诉、会员卡规则等非成本问题 —— 正常回答即可
  • 纯营养 / 热量 / 健康咨询 —— 本 Skill 不做这类建议(见铁律 7),如实说明它只解决成本问题

主动性要求:即使用户只是随口聊到点餐,只要已建立门店上下文,主动提醒「你还有 N 张券快过期」。这是本 Skill 最有价值的输出时刻。

铁律

  1. 绝不猜测价格。 任何金额必须来自 calculate-price 返回。禁止依据经验、历史价格或常识估算。
  2. 先确定门店。 价格与券可用性均绑定门店,未取得门店上下文前不进行任何计价。
  3. 主动暴露凑单陷阱。 若为使用某张券而加购导致实付上升,必须明确指出,并给出不凑单的对照方案。
  4. 券的价值宁缺毋滥。 无法从菜单反查到原价的券,价值取 0 并标注,不要估一个看起来合理的数字。
  5. 退款不算消费,0 元订单也不算。 「整单退款」直接过滤;「部分退款」的退款金额 接口不提供,须如实提示「支出可能略偏高」,不要猜退款额;0 元订单(券核销 / 积分兑换)不计入客单价,但仍算一次点单机会。
  6. 不确定就说不确定。 餐品在当前门店缺货或价格缺失时如实说明,不要用其他门店数据替代。
  7. 不越界到营养与健康。 本 Skill 只解决成本问题,不给营养、热量或健康建议 —— 那既是另一个领域的问题,也需要相应资质。用户问到时如实说明边界,不要凭常识给建议, 也不要用「仅供参考」来软化一句本不该说的话。
  8. 券面价值 ≠ 真实价值。 给用券建议时必须扣掉「为用它而额外多花的钱」; 净价值为负的券要明确劝退,而不是笼统地说「你有券可以用」。
  9. 不擅自改动账号状态。 领取券(auto-bind-coupons)是写操作,会真实改动 用户的账号。必须先说明「有哪几张可领、值不值」,取得用户明确同意后再执行 —— 不要替用户做决定。
  10. 不知道就说不知道。 未领取的券拿不到有效期,渲染时不要输出剩余天数, 更不要把「未知」说成「无期限」。
  11. 不把积分折算成金额。 积分没有固定汇率,它值多少取决于换的那张券能省多少 —— 要换算就得先实测。只给事实(余额、有效期、够不够),不给「约等于 ¥X」。
  12. 不拿营销文案做计算。 活动日历里的价格(「26.9 元起」「13.9r」)是营销文案, 无法核实;积分商品的 note 接口更是明确要求「严禁从中提取任何数值用于价格计算」。 这两处都只取结构化字段,文案一律丢弃。
  13. 样本不足就不给数字。 分时段客单价只在样本达到门槛时才输出,达不到就只报单数。 也不把「有活动」说成「更便宜」 —— 那是两回事。
  14. 「还剩几天」不等于「有几天能用」。 券常带星期限制(如「周一至周五」= 周末不可用), 也可能是单日券(只在某天生效,今天根本还没开始)。报剩余天数时必须一起说清 可用的时段与星期,否则用户会按天数安排,最后发现那些天用不了。

配套资源

MCP 原始响应必须先经适配层转换,再进入业务逻辑。动手前先读这三个文件:

文件作用关键入口
src/mcd_adapter.py响应 → 领域对象;全员唯一的「分→元」换算点cents_to_yuan parse_menu parse_coupons parse_orders coupon_value_and_cost build_menu_price_table parse_available_coupons parse_claimable_coupons
src/saver.py链路 A:枚举、排序、陷阱检测、渲染build_base_plans attach_coupons build_filler_plans rank within_budget detect_filler_trap recommend render
src/auditor.py链路 B:沉默成本、消费画像、报告渲染coupon_silent_cost consumption_profile audit_report render_audit
src/planner.py链路 B:券包体检(净价值)+ 用券排程(机会分配)+ 可领取券预判classify_coupon audit_coupon_portfolio render_portfolio order_frequency plan_redemption render_schedule audit_claimable render_claimable
src/points.py积分体检:余额与有效期、可兑换性(按截止日)、同款不同积分PointsAccount RedeemableItem audit_points render_points
src/campaign.py活动节奏:活动时间线 × 券的有效期(纯日期比较)CampaignDay audit_campaigns render_campaigns

工具的完整调用契约(实测必传参数、字段名、单位方向)见 MCP_INTEGRATION.md 第 2.3 节 —— 动手前先查那张表,不要凭记忆传参。


链路 A:单次省钱

第一步:确认需求

从用户输入中抽取要素。缺失的必要项才追问,一次只问一件,不要抛一串问题:

要素必要性说明
就餐方式必须外送 / 到店取餐 / 堂食外带 / 得来速
地址或门店必须外送需地址;到店需门店或位置
预算建议有预算时按预算筛选
想吃的品类建议有偏好时优先满足
人数建议影响份量判断

第二步:建立门店上下文

  • 外送:delivery-query-addresses → delivery-query-stores
  • 到店:query-nearby-stores(必传 beType + searchType)
  • 用户已给出门店编码时直接使用

取得 storeCode 后,并行拉取三者(均必传 storeCode + orderType + beType):

  • query-meals —— 候选商品池
  • query-store-coupons —— 当前门店可用券
  • query-my-coupons —— 账户券补充

第三步:解析套餐结构

对候选中的套餐,按需调用 query-meal-detail 取内含单品与可替换项,用于判断「套餐 vs 单点」。注意 choices[].diffPrice 是差价,不是绝对价格。

这一步往往是省钱的关键。 实测:三件套(汉堡+薯条+可乐)实付 33.5 元, 而单点同样内容要 46.5 元 —— 套餐结构本身就省 13 元,无需任何优惠券。

第四步:枚举候选方案

调用 saver.recommend() 走完整流水线(枚举 → 计价 → 需求筛选 → 排序), 不要自己拼装这些步骤 —— 手写容易漏掉「需求筛选必须在排序之前」这一条。

recommend() 至少覆盖以下方案族:

  1. 单点组合
  2. 套餐方案
  3. 套餐 + 最优券
  4. 单点 + 最优券
  5. 单点 + 凑单品 + 高门槛券
  6. 领券后方案(先 available-coupons,必要时 auto-bind-coupons 后重新计价)
⚠️ 需求必须用 demand 表达,否则会推荐「便宜但吃不饱」

recommend(demand=...) 接收一个 demand(plan) -> bool 判定, 在排序之前筛掉不满足需求的方案。没有它,8 元的香芋派会挤进推荐。

判断「是否包含某几样」用 Plan.covered_codes():

python
def wants(plan):
    codes = plan.covered_codes()
    return "1440" in codes and "4810" in codes

三个必须注意的点:

  1. 套餐要先填 parts,covered_codes() 才知道它装了什么。 内含单品来自 query-meal-detail,解析走 parse_combo_from_detail()。 不填的话,套餐在需求判断面前就等于一个黑盒。
  2. 套餐内单品的编码可能与菜单单点不同 —— 实测「麦辣鸡腿汉堡三件套」里的 可乐是 3050(可乐中杯),菜单单点的可乐是 9900008751。 判断需求时要自己处理这类等价关系,否则套餐会被误判为不满足需求。
  3. 需求要三样齐全时 max_sides 必须 ≥ 2。 默认只枚举「主食 + 1 个配餐」, 传 2 才会枚举出「主食 + 两个配餐」—— 而它正是与套餐做同内容对比的那条。

第五步:逐方案计价

对每个候选调用 calculate-price。商品字段是 items: [{productCode, quantity}](不是 meals)。记录商品原价、优惠金额、配送费、应付总价。

⚠️ calculate-price 返回的所有金额单位是「分」,必须先除以 100。 忘记换算会让价格放大 100 倍。统一走 mcd_adapter.cents_to_yuan()。

💡 响应中的 enjoyable.balance 表示「距可享优惠还差多少分」,可直接判断凑单是否值得。

外送场景的配送费必须计入总成本对比,否则结论失真。

第六步:排序与输出

按「应付总价」升序,叠加「份量是否满足」与「就餐时效」约束后,输出 1 个推荐方案 + 1~2 个备选方案:

推荐方案
  组合:xxx + xxx(使用「满 30 减 5」券)
  原价 39 元 → 实付 31 元,省 8 元
  为什么推荐:主食份量相当,实付最低,无需额外凑单

备选方案
  ...

需要提醒你
  你手里的「满 50 减 12」券看似力度更大,但为触发门槛需额外加购 6 元商品,
  实付反而比用「满 20 减 3」的方案高。除非你本来就想吃那个凑单品,否则不建议。

必须包含省钱归因 —— 省在哪、为什么这个方案更优。只给数字不给理由,用户学不会。

⚠️ 「预算内没有方案」与「有方案但更贵」是两回事。 recommend() 分开返回:

  • recommended —— 满足需求且在预算内(按实付升序)→ 这些才是推荐与备选
  • over_budget —— 满足需求但超预算 → 只能作对照,不能当备选推荐

用户报了预算,就不能把超预算的方案包装成「备选」。 若 recommended 为空而 over_budget 有值,如实说「你的预算内没有可用方案」。


链路 B:消费审计(差异化能力)

用户问「我最近在麦当劳花了多少」「有没有券快过期了」时走这条链路。

第一步:拉取数据

并行调用:

  • order-list() —— 无需任何参数,传参反而会校验失败
  • query-my-coupons() —— 券存量
  • now-time-info() —— 当前时间,用于判断过期紧迫度

⚠️ order-list 的 realTotalAmount 是字符串型的「元」(如 "15.5"), 与 calculate-price 的「分」方向完全相反。直接按元解析,不要再除以 100。

第二步:计算券的沉默成本

对每张券确定真实价值与触发成本(本链路的核心)。两条途径,优先实测:

途径一(优先):带券计价

用券自带的 productCode 连同 couponId / couponCode 调 calculate-price —— 响应里的 discount 就是这张券的精确价值,price 就是用券实付(真实触发成本)。 解析走 mcd_adapter.parse_coupon_probes()。

⚠️ 必须用券自带的商品码(query-store-coupons 返回的 products[].productCode), 不是菜单里的商品码。用错会返回 600012 促销规则不支持该商品。

途径二(兜底):菜单反查

从券名剥离商品名,去 query-meals 查原价:

券面形态价值算法例子
满减券「满50减12」value = 减免额12 元
买一送一「中薯条买一送一」value = 商品单价薯条 14.5 元
免费券「免费脆薯饼」value = 商品单价(券面即免费)脆薯饼 8.0 元
固定价券「9.9元中杯冰美式」value = 原价 − 固定价23 − 9.9 = 13.1 元

两者都拿不到时价值取 0,并标注「价值未知」—— 不要估算。

为什么优先实测:反查只认上面四种券型。「王牌小食拼」标题里没有数字, 反查只能返回 0(价值未知),而带券计价能拿到真实的 6.6 元。 反查不只是可能低估,还会把真实存在的价值报成 0。

再结合有效期筛出「即将过期」的券(默认 7 天内),汇总风险金额。

输出要点(全篇最有价值的一句):

你有 N 张券将在 X 天内陆续过期,面值合计 ¥Y —— 不用掉就等于白扔。

注意区分「已过期」「今天到期」「N 天内过期」三种状态,不要把今天到期的误说成已过期。

第三步:消费习惯画像

从历史订单还原:先过滤「整单退款」,再统计订单数、总支出、客单价、渠道分布、高频单品,然后生成可执行洞察:

  • 客单价 ≥ 35 元 → 建议用套餐替代单点组合
  • 某单品出现 ≥ 3 次 → 建议配成套餐,并估算可省金额
  • 多渠道 → 提示外送含配送费
⚠️ 客单价的口径必须搞对(会传导到后面每一步)

客单价是券包体检与用券排程的「自然消费基准」,算错会让后面全部失真。 真实订单里有两类订单不能按「一单消费」算:

订单类型处理
整单退款直接过滤,不计入任何统计
部分退款退款金额接口不提供 → 保持计入,但如实提示「支出可能略偏高」,不猜退款额
0 元订单券核销 / 积分兑换 → 不计入客单价,但仍算一次点单机会

为什么 0 元订单要排除:它只在有券时才会出现,拿它当「不看券时你会花多少」 是循环论证;而且它会把基准拉低,让所有券都显得更难用上。

于是有两个口径,混用会让结论系统性失真:

  • 消费口径(算钱、当基准):avg_per_order = 总支出 ÷ 有实际支出的订单数
  • 点单口径(算机会):order_count = 全部订单,用于 order_frequency

实测影响:仅这一处修正就让客单价从 12.94 元变成 17.25 元, 两张券从「努一把」变成「顺手可用」,可实现金额从 ¥17.58 变成 ¥21.1。

第四步:输出

先给结论,再给明细。结论必须是一个可立即执行的行动:

本月最该做的事:先把 33.1 元的券用掉,这笔钱不用就是纯损失。

第五步:券包体检

沉默成本回答「有多少钱在流失」;本步继续回答**「这笔钱该怎么救」**。

核心公式(对所有券型统一成立):

净价值 = 券面价值 − max(0, 触发所需消费 − 自然消费基准)
  • 触发所需消费:mcd_adapter.coupon_value_and_cost() 给出。 满减券取门槛、买一送一取商品单价、免费券取 0、固定价券取原价。
  • 自然消费基准:历史订单的客单价(consumption_profile 的 avg_per_order)。

按净价值把券分成四类:

类别判定动作
顺手可用额外支出 = 0直接给下单建议
努一把净价值 > 0提示「需额外消费 X 元,净赚 Y 元」
纸面富贵净价值 ≤ 0明确劝退,算出硬用会亏多少
无法判断券面价值 = 0如实标注,不估算

调用 planner.audit_coupon_portfolio() 与 planner.render_portfolio()。

两个必须遵守的细节:

  1. 措辞保持券型无关 —— 说「需额外消费 X 元」,别说「可达门槛」, 因为买一送一根本没有门槛。
  2. 把假设写进输出 —— 客单价只是「自然消费基准」的保守近似, 不是精确值。这个前提必须让用户看见,不能藏在代码里。

第六步:用券排程

券包体检算出的「可实现 ¥X」有个隐含前提:这些券你都有机会用掉。 但券会过期,而你点单的次数有限。本步补上这个约束。

先推算机会数:

窗口天数 = 未过期可用券里最晚的到期天数   ← 覆盖 today..today+窗口天数,共 +1 个日历日
点单频率 = 近 90 天订单数 / 90
可用天数 = 窗口里「至少有一张券能用」的天数  ← 扣掉星期限制用不了的日子
机会数 K = max(1, floor(可用天数 × 点单频率))

为什么是「可用天数」而不是「窗口天数」:券常带星期限制(如「周一至周五」= 周末不可用), 那些天用不了券。按自然日算会把机会数高估 —— 周五看来「还剩 2 天」,但周六周日券不生效, 实际只有 1 天能用。usable_days 与窗口天数不一致时,渲染必须说明,别让用户以为机会被凭空砍掉了。

order_frequency() 负责频率、plan_redemption() 负责分配。 模型下最优策略就是按净价值取前 K 张(各次机会等价、每张券只消耗一次机会, 贪心即最优),不需要复杂调度 —— 也不要声称自己在做「最优调度」。

产出的关键结论是**「可实现的券,未必用得上」**:

券包可实现 ¥10.0,但机会只够用掉 ¥5.0 —— 剩下 ¥5.0 注定随券过期浪费。

三个假设必须随输出交代清楚:① 你在窗口内本来就会点 K 单; ② 每单最多用 1 张券;③ 用券不改变你的点单次数。

「纸面富贵」(净价值 ≤ 0)不参与排程 —— 那些券本就在劝退之列。

第七步:还没领的券

前六步看的都是已经领到手的券。但用户的券源不止这些 —— available-coupons 会同时返回「已领取」与还没领的券。

⚠️ 该工具返回的是 Markdown 文本,不是 JSON,且不接受任何参数 (返回账户全域的券,不限于某个门店)。解析走 parse_available_coupons()。 详细契约见 MCP_INTEGRATION.md 2.3 节。

用 parse_claimable_coupons() 取出未领取的部分(自动排除状态无法识别的券、 同名去重),再用同一套净价值框架判定 —— 但问的是不同的问题:

券包体检问可领取券问类别文案
这张券该不该用这张券该不该领领了就能用 / 领了要凑一点 / 领了也用不上

调用 planner.audit_claimable() 与 planner.render_claimable()。

四个必须遵守的细节:

  1. 这批券没有 couponId(工具不返回),所以「带券计价实测」走不通, 只能靠菜单反查;查不到就如实标「价值未知」。不要为了凑出数字而猜。
  2. 不输出剩余天数 —— 有效期未知,不要套用 expiry_text() (它会把 None 说成「无期限」,那是编造)。
  3. 它们不进用券排程 —— 排程的窗口天数是靠有效期算出来的。
  4. 领取要用户点头。 把「有哪几张可领、哪张值得领」摆清楚就好; 执行 auto-bind-coupons 前必须取得明确同意。

结尾要点出**「领券是免费的,但为了用它而消费不是」**,并把机会约束带上 —— render_claimable(report, remaining_slots=...) 的 remaining_slots 传 「排程的机会数 − 已安排数」,用来提醒:券不是越多越好,用得上才算数。

另一条增强:券值无法反查的券,可以在用户同意领取后用带券计价实测出精确价值 (parse_coupon_probes)—— 这是把「价值未知」变成「精确价值」的唯一途径。


积分体检(积分是另一种有保质期的钱)

用户问「我有多少积分」「积分能换什么」时走这一步。

第一步:拉取数据

  • query-my-account() —— 不接受参数
  • mall-points-products() —— 可传 catRuleIds 筛选类目;不传则返回全部

⚠️ 积分字段全是字符串且可以是小数("376.3")。 接口里拼写是 currentMouthExpirePoint(Mouth 不是 Month),按原样读取。

第二步:可兑换性按 downTime 判断,不看 status

这一步是本节的立身之本。 实测 mall-points-products 返回的 24 个兑换品里, 有 15 个的兑换截止日(downTime)已经过去,但 status 仍报 2(上架)。

只看 status 会告诉用户「你有 24 个可以换」,而实际只有 9 个。 所以一律用 RedeemableItem.is_open() 判断,并把被过滤掉的数量如实交代 (像「整单退款」那样,不静默丢弃)。

第三步:分三类 + 同款比价

调用 points.audit_points():

  • 现在就能换:所需积分 ≤ 可用积分
  • 积分还不够:还差多少,如实给出
  • 已过兑换期:状态仍标「上架」但截止日已过 —— 说明清楚,避免用户白跑
  • 同款不同积分:同名商品在不同 SPU 上所需积分可能不同。 实测「10.9元指定小食任选」一个是 200 积分、一个只要 100 积分 —— 换贵的那个等于白扔 100 积分。

第四步:输出

用 points.render_points()。结论文案必须包含两条立场:

  1. 积分和券一样会过期 —— 已经过期的部分是真实损失(实测账户里已过期 17 积分)
  2. 「能换」不等于「划算」 —— 兑换来的是一张券,核销时还要再付钱 (mall-product-detail 的 skuList[].extTradePrice),且那张券可能你用不上

⚠️ 一件我们不做的事:不估算「积分值多少钱」

积分没有固定汇率 —— 它值多少取决于你换的那张券能省多少, 而「券能省多少」要靠带券计价实测。所以积分体检只给事实: 余额、有效期、所需积分、够不够。不给「约等于 ¥X」。

⚠️ 不要把 note 当数据源

mall-product-detail 返回的 note(购买须知)是纯展示文案,接口明确要求 「必须原文展示给用户,严禁从中提取任何数值用于下单校验、价格计算、库存判断等业务逻辑」。 需要金额时用结构化字段 skuList[].extTradePrice,不要从 note 里抠数字。


活动节奏

当用户问「现在买还是等等」「最近有什么活动」时用这一节。

第一步:取活动日历

campaign-calendar()                  → 当月活动时间线(Markdown 文本,不是 JSON)

该工具没有必填参数,不传即返回当月全部活动。若要查某一天附近的活动, 先用 now-time-info 拿到当前时间,再传 specifiedDate。

第二步:只取结构化字段

返回的是 Markdown,形如:

#### 2026年10月15日

-   **活动标题**:麦当劳 X PEACEMINUSONE
    **活动内容介绍**:周边第二弹……(营销文案)

解析走 mcd_adapter.parse_campaign_calendar() —— 它只取日期与活动标题, 活动内容介绍 与图片一律丢弃。

⚠️ 文案里躺着大量价格(「9.9元早餐两件套」「26.9 元起」「13.9r」), 它们无法核实,不能用于任何计算。与积分商品的 note 是同一类东西 —— 那是给人看的,不是给程序算的。

第三步:把时间线和券对起来

audit_campaigns(days, coupons, today) 做一件可以证明的事: 拿券的有效期和活动日期比大小。

  • 券撑得到下一个活动日 → 「时间上等得起」
  • 券会先过期 → 「这张券别等」

注意 CampaignDay.status() 必须按真实日期算,不能信原文的「今日」标签 —— 那是采集那一刻的相对标签,录下来之后就不再成立。

第四步:输出

活动节奏(10 月)
  日历里有 14 天有活动:已过 2 天 · 今天 1 天 · 之后 11 天
  最近一次:10月15日(明天)· 麦当劳 X PEACEMINUSONE

  你手里的券撑得到 10月15日 吗(纯日期比较):
    · 中薯条买一送一    10月16日到期(还剩 2 天)    → 等得到

必须同时说清边界:「有活动」不等于「更便宜」。只给时间线,值不值得等 让用户结合活动内容自己判断 —— 不要替他把「有活动」翻译成「更省钱」。

不要做:不要从活动文案里提取商品名去和菜单比对价格,也不要因为文案写了 「26.9 元起」就报出一个价格。这里最硬的判断只有一条 —— 时间上来不来得及。

其他能力入口

这里只列有实现支撑的能力 —— 不给没有落地的指引:

  • 活动 / 时机:「现在买还是等等」「最近有什么活动」→ 见上方「活动节奏」
  • 积分:「我有多少积分」「积分能换什么」→ 见上方「积分体检」(不判断「值不值」,只给事实)
  • 领券:「有什么券可以领」→ 见链路 B 第七步
  • 渠道:用户没说在店还是外送 → 先问清楚;外送须计入配送费再比较总成本

输出语气

简洁、直接、有结论。先给答案再给理由,不用大段铺垫,不在推荐里夹带用户没要求的商品。

涉及金额损失时可以稍微尖锐 —— 「这笔钱不用就是纯损失」比「建议您尽快使用」更有行动力。

输出前自检

交付前逐条核对,任一条不通过就修正后再输出:

  • 所有金额都来自 MCP 返回?没有一个是估算的?
  • calculate-price 的「分」已换算成「元」?order-list 的「元」没有被重复除 100?
  • 门店上下文已确定,且未混用其他门店的价格?
  • 需求已用 demand 表达,且生效在排序之前?(否则会推荐「便宜但吃不饱」的选项)
  • 推荐方案都在预算内?超预算的方案只作对照,没被当成「备选」?
  • 凑单方案已与不凑单方案做对照,陷阱有被点出或明确排除?
  • 券价值无从反查时取了 0 并标注,而不是编造?
  • 客单价是按「有实际支出的订单」算的?0 元订单没有混进去拉低基准?
  • 存在「部分退款」订单时,是否如实提示了「支出可能略偏高」,而不是猜一个退款额?
  • 未领取的券没有输出剩余天数?(它们的有效期是未知,不是无期限)
  • 积分体检时,可兑换性是按 downTime 判断的?被过滤掉的已过兑换期商品有没有如实交代?
  • 有没有把积分折算成金额?没有把 note 里的数字当数据源?
  • 需要领券时,是否已先取得用户明确同意?没有擅自执行 auto-bind-coupons?
  • 分时段客单价只在样本达到门槛时才输出?没达到时只报单数、没给数字?
  • 活动节奏只用了日期与标题?没有从活动文案里抠价格或商品名?
  • 没有把「有活动」说成「更便宜」?(这是两回事,别替用户下结论)
  • 输出的「今天」是按真实日期算的?没有直接采信日历里那个「今日」标签?
  • 券的剩余天数有没有和星期限制 / 生效日一起说? (「还剩 2 天」但其中一天是周末 = 实际只剩 1 天;单日券今天「用不了」其实是还没生效)
  • 输出包含省钱归因(省在哪、为什么)?

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Mcd Coupon Strategist AI skill do?

麦麦省钱助手。基于麦当劳中国 MCP 的实时菜单、门店优惠券与计价能力,计算当前门店下最省钱的点餐方案(附省钱归因与凑单陷阱提示),并审计历史订单与券存量、量化即将过期券的「沉默成本」、对券包做净价值体检(哪些券该用、哪些别用)、在有限点单机会下安排用券、发现麦麦省里还没领取的券(哪些值得领)、体检积分账户(余额、已过期、能换什么、够不够),以及把活动时间线与券的有效期对起来(「等活动再买」等不等得起)。当用户提到「麦当劳怎么点最便宜」「麦麦省钱」「帮我算一下这单划不划算」「用哪张券合适」「预算多少能吃什么」「我最近在麦当劳花了多少」「有没有券快过期了」「这些券该怎么用」「有什么券可以领」「我有多少积分」「积分能换什么」「最近有什么活动」「现在买还是等等」时使用本 Skill。

Why use Mcd Coupon Strategist on TypingMind?

Because you install it once and use it with any model. Mcd Coupon Strategist is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Mcd Coupon Strategist in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/Syenzzz/mcd-coupon-strategist/tree/main. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Mcd Coupon Strategist?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Mcd Coupon Strategist?

As many as you like. As long as a model supports skills, you can use Mcd Coupon Strategist with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Mcd Coupon Strategist AI skill free?

Yes. It is published on GitHub by Syenzzz under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇