Not in the top 1,000 by GitHub stars
zhutoumeme/mcd-git
用 git 命令点麦当劳:add 放购物车,rebase 凑最省,push 确认后才下单;card 生成 1024 吃麦贡献图(3D 汉堡天际线 / 年度小票)。基于麦当劳 MCP Server,附 --demo 无 Token 试玩和 Agent Skill。非官方参赛作品。
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → cb1601dad6dc
No earlier version was observed for comparison.
Heat
1.8- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- mcd-git
/
How it works
mcd-git
When your agent uses it
用本地命令行 mcd-git(git mcd --json)帮用户点麦当劳:选门店、看菜单、加购物车(去酸黄瓜、少冰、套餐换搭)、自动凑套餐挑最省的券、核价、下单拿支付链接、查取餐码、再来一单、取消订单、领券(pull,先确认),以及生成 1024 吃麦贡献图(card)。用户提到点麦当劳、麦当劳到店 / 得来速 / 麦乐送、取餐码、再来一单、取消麦当劳订单、领麦当劳的券、吃麦贡献图时使用。下单、取消和领券都必须先把确认摘要给用户看,用户明确同意后才能带 --confirm 执行。
What it loads into context
Frontmatter
191 tokensAlways available to the agent
SKILL.md
4,367 tokensWhen the skill is activated
Reference documents
20,934 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 前提
- 必须遵守的规则
- 常用流程
- 一个完整例子
Scripts executed separately
scripts/make_screenshots.pysrc/mcd_git/__init__.pysrc/mcd_git/__main__.pysrc/mcd_git/api.pysrc/mcd_git/card.pysrc/mcd_git/card_receipt.pysrc/mcd_git/card_skyline.pysrc/mcd_git/cart.pysrc/mcd_git/cli.pysrc/mcd_git/commands/__init__.pysrc/mcd_git/commands/card.pysrc/mcd_git/commands/cherry_pick.pysrc/mcd_git/commands/commit.pysrc/mcd_git/commands/common.pysrc/mcd_git/commands/completion.pysrc/mcd_git/commands/diff.pysrc/mcd_git/commands/fetch.pysrc/mcd_git/commands/help.pysrc/mcd_git/commands/init.pysrc/mcd_git/commands/log.pysrc/mcd_git/commands/log_stat.pysrc/mcd_git/commands/pull.pysrc/mcd_git/commands/push.pysrc/mcd_git/commands/rebase.pysrc/mcd_git/commands/revert.pysrc/mcd_git/commands/stage.pysrc/mcd_git/commands/status.pysrc/mcd_git/complete.pysrc/mcd_git/completion.pysrc/mcd_git/context.pysrc/mcd_git/demo/__init__.pysrc/mcd_git/demo/client.pysrc/mcd_git/demo/world.pysrc/mcd_git/entry.pysrc/mcd_git/errors.pysrc/mcd_git/gate.pysrc/mcd_git/history.pysrc/mcd_git/ledger.pysrc/mcd_git/mcp_client.pysrc/mcd_git/menucache.pysrc/mcd_git/money.pysrc/mcd_git/optimizer.pysrc/mcd_git/render.pysrc/mcd_git/state.pysrc/mcd_git/stats.pysrc/mcd_git/textnorm.pytests/__init__.pytests/conftest.pytests/test_card.pytests/test_card_styles.pytests/test_cart_state.pytests/test_cli_ux.pytests/test_client.pytests/test_complete.pytests/test_completion.pytests/test_completion_e2e.pytests/test_demo_e2e.pytests/test_ledger.pytests/test_log_stat.pytests/test_menu_cache.pytests/test_menu_cart.pytests/test_optimizer.pytests/test_parsing.pytests/test_paths.pytests/test_pull_gate.pytests/test_push_gate.pytests/test_qr.py
Files
.gitignoreasset138 bytesCHANGELOG.mddoc16,583 bytesCONTEST_DECLARATION.mddoc1,522 bytesLICENSEasset1,067 bytesMCP_INTEGRATION.mddoc17,669 bytesREADME.mddoc33,245 bytesSKILL.mdcore14,385 bytesSKILL.mdcore14,385 bytesassets/add.svgasset4,683 bytesassets/badges/demo.svgasset728 bytesassets/badges/license.svgasset700 bytesassets/badges/mcp.svgasset720 bytesassets/badges/python.svgasset700 bytesassets/badges/unofficial.svgasset725 bytesassets/card-demo.svgasset26,921 bytesassets/card-grid-demo.svgasset26,916 bytesassets/card-receipt-demo.svgasset27,273 bytesassets/card-receipt.svgasset111,082 bytesassets/card.svgasset61,885 bytesassets/cherry-pick.svgasset4,760 bytesassets/commit.svgasset4,648 bytesassets/demo.gifasset380,447 bytesassets/diff.svgasset7,349 bytesassets/help.svgasset24,715 bytesassets/init.svgasset8,954 bytesassets/log-graph.svgasset12,106 bytesassets/log-stat.svgasset18,698 bytesassets/pull.svgasset11,956 bytesassets/push.svgasset161,936 bytesassets/rebase.svgasset8,617 bytesassets/show.svgasset11,891 bytesassets/status.svgasset7,452 bytesmcp-config.example.jsonasset194 bytespyproject.tomlasset1,127 bytesscripts/demo.tapeasset1,584 bytesscripts/make_screenshots.pyruns8,131 bytessrc/mcd_git/__init__.pyruns119 bytessrc/mcd_git/__main__.pyruns50 bytessrc/mcd_git/api.pyruns25,652 bytessrc/mcd_git/card.pyruns14,399 bytessrc/mcd_git/card_receipt.pyruns13,180 bytessrc/mcd_git/card_skyline.pyruns13,204 bytessrc/mcd_git/cart.pyruns11,657 bytessrc/mcd_git/cli.pyruns11,195 bytessrc/mcd_git/commands/__init__.pyruns98 bytessrc/mcd_git/commands/card.pyruns7,483 bytessrc/mcd_git/commands/cherry_pick.pyruns6,179 bytessrc/mcd_git/commands/commit.pyruns5,305 bytessrc/mcd_git/commands/common.pyruns5,364 bytessrc/mcd_git/commands/completion.pyruns1,133 bytessrc/mcd_git/commands/diff.pyruns7,794 bytessrc/mcd_git/commands/fetch.pyruns2,526 bytessrc/mcd_git/commands/help.pyruns3,277 bytessrc/mcd_git/commands/init.pyruns12,125 bytessrc/mcd_git/commands/log.pyruns17,011 bytessrc/mcd_git/commands/log_stat.pyruns8,508 bytessrc/mcd_git/commands/pull.pyruns13,128 bytessrc/mcd_git/commands/push.pyruns24,011 bytessrc/mcd_git/commands/rebase.pyruns6,442 bytessrc/mcd_git/commands/revert.pyruns9,160 bytessrc/mcd_git/commands/stage.pyruns13,984 bytessrc/mcd_git/commands/status.pyruns7,275 bytessrc/mcd_git/complete.pyruns4,236 bytessrc/mcd_git/completion.pyruns29,775 bytessrc/mcd_git/context.pyruns6,325 bytessrc/mcd_git/demo/__init__.pyruns288 bytessrc/mcd_git/demo/client.pyruns22,882 bytessrc/mcd_git/demo/world.pyruns26,423 bytessrc/mcd_git/entry.pyruns570 bytessrc/mcd_git/errors.pyruns2,649 bytessrc/mcd_git/gate.pyruns2,994 bytessrc/mcd_git/history.pyruns4,586 bytessrc/mcd_git/ledger.pyruns9,982 bytessrc/mcd_git/mcp_client.pyruns17,115 bytessrc/mcd_git/menucache.pyruns9,238 bytessrc/mcd_git/money.pyruns2,119 bytessrc/mcd_git/optimizer.pyruns12,889 bytessrc/mcd_git/render.pyruns18,106 bytessrc/mcd_git/state.pyruns8,253 bytessrc/mcd_git/stats.pyruns2,784 bytessrc/mcd_git/textnorm.pyruns1,654 bytestests/__init__.pyruns0 bytestests/conftest.pyruns5,556 bytestests/test_card.pyruns27,253 bytestests/test_card_styles.pyruns26,507 bytestests/test_cart_state.pyruns6,938 bytestests/test_cli_ux.pyruns16,016 bytestests/test_client.pyruns16,827 bytestests/test_complete.pyruns9,831 bytestests/test_completion.pyruns18,472 bytestests/test_completion_e2e.pyruns15,465 bytestests/test_demo_e2e.pyruns15,929 bytestests/test_ledger.pyruns10,338 bytestests/test_log_stat.pyruns10,438 bytestests/test_menu_cache.pyruns9,634 bytestests/test_menu_cart.pyruns18,526 bytestests/test_optimizer.pyruns4,101 bytestests/test_parsing.pyruns6,232 bytestests/test_paths.pyruns2,358 bytestests/test_pull_gate.pyruns27,066 bytestests/test_push_gate.pyruns23,743 bytestests/test_qr.pyruns23,448 bytes
Read SKILL.md
# mcd-git:用 git 命令点麦当劳
mcd-git 把麦当劳中国 MCP Server 包装成 git 风格的命令:`add` 放进购物车,`rebase` 凑最省,`commit` 锁单,`push` 才真正下单。你通过 `git mcd … --json` 操作它,读 JSON 结果,再用自然语言告诉用户。
## 前提
- **需要能在用户本机执行命令。** 只能对话、不能跑命令的环境用不了这个 Skill。
- **安装**(没装时):
```bash
uv tool install git+https://github.com/zhutoumeme/mcd-git
# 没有 uv:
pip install "git+https://github.com/zhutoumeme/mcd-git"
```
装好后运行 `git mcd help` 确认(也可以用等价的 `mcd-git help`)。看命令对照表一律用 `git mcd help`;不要在 `mcd` 后面直接跟 `--help`,那样会被 git 拦截去找 man 手册。单个子命令的帮助用 `git mcd <命令> -h`。**人工在终端操作和补全时优先用 `mcd-git`;Agent 自动化仍走 `git mcd --json`。**真人用户需要 TAB 补全时,按 README 的平台说明运行 `mcd-git completion powershell` / `bash` / `zsh` / `fish`,再重载对应 shell;Agent 不需要安装或调用补全脚本。View the complete source on GitHubSkills included
- mcd-git
Repository facts
- License
- MIT
- Created
- Oct 10, 2026
- Last pushed
- Oct 13, 2026
- Forks
- 0
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 24 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedassets/card-receipt.svg:166Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:165Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:183Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:181Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:184Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:182Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:185Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:186Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:187Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:188Analysis incomplete: physical or joined line exceeds character limitassets/card-receipt.svg:189Analysis incomplete: physical or joined line exceeds character limitassets/card.svg:115Analysis incomplete: physical or joined line exceeds character limitassets/card.svg:113Analysis incomplete: physical or joined line exceeds character limitassets/card.svg:116Analysis incomplete: physical or joined line exceeds character limitassets/card.svg:114Analysis incomplete: physical or joined line exceeds character limitassets/card.svg:117Analysis incomplete: physical or joined line exceeds character limitassets/card.svg:118Analysis incomplete: physical or joined line exceeds character limitassets/card.svg:119Analysis incomplete: physical or joined line exceeds character limitassets/card.svg:120Analysis incomplete: physical or joined line exceeds character limit
- No broad tool permissions
- 3 dangerous shell commandsin 3 files: CHANGELOG.md:21 README.md:306 tests/test_completion.py:308
- 163 network referencesin 44 files: tests/test_client.py:4 tests/test_qr.py:1 src/mcd_git/mcp_client.py:5 and 41 more
- No hidden or obfuscated text
- No instruction overrides
- 67 executable scriptsin 67 files: scripts/make_screenshots.py:1 src/mcd_git/__init__.py:1 src/mcd_git/__main__.py:1 and 64 more
- 33 references to secretsin 20 files: src/mcd_git/mcp_client.py:68 README.md:361 tests/test_menu_cart.py:84 and 17 more
- No requests to vote in Hot
Show all 266 signals by file
.gitignore
- Access to secretsline 4
[Credential-related source omitted]
CHANGELOG.md
- Dangerous shell operationline 21
- `mcd-git completion bash|zsh|fish`:打印命令补全脚本,子命令、选项、`--qr` / `--style` 等取值都能补,zsh 候选带中文说明。安装:`eval "$(mcd-git completion zsh)"`(或 `bash`,macOS 自带 bash 3.2 可用);fish 写进 `~/.config/fish/completions/`。脚本由 argparse 的定义自动导出,以后加命令不用另改。 - Access to secretsline 39
[Credential-related source omitted] - Network accessline 91
- `push`(create-order)和 `revert`(cancel-order)走确认闸:先出摘要,用户同意后 `--confirm` 执行;commit、参数、重新算出的价格和下单指纹任何一项对不上都拒绝;结果未知不重试。 - `--demo` 合成数据全流程离线可玩;`--json` 输出 + SKILL.md 给 Agent 用。 - 终端里直接出支付二维码;只连 `https://mcp.mcd.cn`,不跟随重定向。 - Network accessline 93
- 终端里直接出支付二维码;只连 `https://mcp.mcd.cn`,不跟随重定向。
MCP_INTEGRATION.md
- Network accessline 8
|---|---| | Server | 麦当劳中国 MCP Server(`serverInfo`:`mcd-mcp` 1.0.0) | | 地址 | `https://mcp.mcd.cn`(写死在代码里,不读环境变量;别的协议或主机在发请求前就拒绝;不跟随重定向,服务端回 30x 直接报错,Token 不会被带去别处) | - Network accessline 9
| Server | 麦当劳中国 MCP Server(`serverInfo`:`mcd-mcp` 1.0.0) | | 地址 | `https://mcp.mcd.cn`(写死在代码里,不读环境变量;别的协议或主机在发请求前就拒绝;不跟随重定向,服务端回 30x 直接报错,Token 不会被带去别处) | | 传输 | Streamable HTTP,JSON-RPC 2.0,协议版本 `2025-06-18`;兼容 `application/json` 和 SSE 两种 - Network accessline 10
| 地址 | `https://mcp.mcd.cn`(写死在代码里,不读环境变量;别的协议或主机在发请求前就拒绝;不跟随重定向,服务端回 30x 直接报错,Token 不会被带去别处) | - Access to secretsline 13
[Credential-related source omitted]
README.md
- Network accessline 35
Agent:(git mcd push --at 12:20 --locker --no-tableware --confirm bfc651c --json) 下好了,请在 12:05 前打开这个链接付款:https://example.com/mcd-git-demo/pay?orderId=1024… - Network accessline 36
下好了,请在 12:05 前打开这个链接付款:https://example.com/mcd-git-demo/pay?orderId=1024… - Network accessline 124
uvx --from git+https://github.com/zhutoumeme/mcd-git mcd-git --demo status - Network accessline 130
pip install "git+https://github.com/zhutoumeme/mcd-git" # 或 uv tool install git+https://github.com/zhutoumeme/mcd-git - Dangerous shell operationline 306
sudo apt-get update && sudo apt-get install -y bash-completion # 只需安装一次 - Network accessline 353
1. **申请 Token**:在 [麦当劳 MCP 开放平台](https://open.mcd.cn/mcp) 登录控制台,激活并复制 MCP Token。 - Access to secretsline 361
[Credential-related source omitted] - Access to secretsline 369
[Credential-related source omitted] - Access to secretsline 377
[Credential-related source omitted] - Access to secretsline 386
[Credential-related source omitted] - Network accessline 395
请帮我安装 mcd-git 这个点麦当劳的 Skill: 1. 运行 uv tool install git+https://github.com/zhutoumeme/mcd-git(没有 uv 就用 pip install "git+https://github.com/zhutoumeme/mcd-git"),然后运行 `mcd-git help` 确认装好了; - Network accessline 396
1. 运行 uv tool install git+https://github.com/zhutoumeme/mcd-git(没有 uv 就用 pip install "git+https://github.com/zhutoumeme/mcd-git"),然后运行 `mcd-git help` 确认装好了; - Network accessline 397
2. 把 https://github.com/zhutoumeme/mcd-git 仓库根目录的 SKILL.md 装进你的 Skill 目录(Claude Code 是 ~/.claude/skills/mcd-git/SKILL.md,Kiro 是 ~/.kiro/skills/mcd-git/SKILL.md,WorkBuddy 在「技能」里导入); - Network accessline 406
- **结果未知不重试**:网络超时、响应不完整、返回看不懂、按了 Ctrl+C,这些情况都不会自动重发 `create-order`,会提示先 `mcd-git log` 核对,避免重复下单;`pull` 同样不会重发 `auto-bind-coupons`,会提示先 `mcd-git status` 或 `mcd-git fetch` 核对。 - **低频、手动**:每条命令由你触发;领券每次都由你手动触发,只领你自己账户的券,不做定时或循环领取;`calculate-p - Network accessline 408
- **隐私**:Token 只在请求头里,只发给 `https://mcp.mcd.cn`(地址写死在代码里,不能用环境变量改);收货地址只保留 addressId 和打码提示;状态文件在 `~/.config/mcd-git/`(目录 700、文件 600),本机订单账本 `ledger.json` 也在这里,只存贡献图要用的字段(见「1024 特别版」);给命令补全用的菜单缓存 `menu-cache.json` 也在这里,只有餐品 code、名称、类型和门店,按 TA
SKILL.md
assets/add.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 147.6" xmlns="http://www.w3.org/2000/svg">
assets/badges/demo.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="156" height="20" role="img" aria-label="try: --demo 无需 Token"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/><
assets/badges/license.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="90" height="20" role="img" aria-label="license: MIT"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGr
assets/badges/mcp.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="MCP: streamable http"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/><
assets/badges/python.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="90" height="20" role="img" aria-label="python: 3.9+"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGr
assets/badges/unofficial.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="104" height="20" role="img" aria-label="非官方: 参赛作品"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGrad
assets/card-demo.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="624" viewBox="0 0 1200 624" role="img" aria-labelledby="t d">
assets/card-grid-demo.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="750" height="288" viewBox="0 0 750 288" role="img" aria-labelledby="t d">
assets/card-receipt-demo.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="480" height="778" viewBox="-20 -20 480 778" role="img" aria-labelledby="t d">
assets/card-receipt.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 1074.8" xmlns="http://www.w3.org/2000/svg">
assets/card.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 586.8" xmlns="http://www.w3.org/2000/svg">
assets/cherry-pick.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 172.0" xmlns="http://www.w3.org/2000/svg">
assets/commit.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 172.0" xmlns="http://www.w3.org/2000/svg">
assets/diff.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 318.4" xmlns="http://www.w3.org/2000/svg">
assets/help.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 708.8" xmlns="http://www.w3.org/2000/svg">
assets/init.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 318.4" xmlns="http://www.w3.org/2000/svg">
assets/log-graph.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 269.6" xmlns="http://www.w3.org/2000/svg">
assets/log-stat.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 1074.8" xmlns="http://www.w3.org/2000/svg">
assets/pull.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 440.4" xmlns="http://www.w3.org/2000/svg">
assets/push.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 1489.6" xmlns="http://www.w3.org/2000/svg"> - Network accessline 270
</text><text class="terminal-3550284747-r3" x="1171.2" y="1288.8" textLength="12.2" clip-path="url(#terminal-3550284747-line-52)"> </text><text class="terminal-3550284747-r3" x="1171.2" y="1313.2" textLength="12.2" clip-path="url(#terminal- - Network accessline 271
</text><text class="terminal-3550284747-r3" x="1171.2" y="1313.2" textLength="12.2" clip-path="url(#terminal-3550284747-line-53)"> </text><text class="terminal-3550284747-r3" x="0" y="1337.6" textLength="122.0" clip-path="url(#terminal-3550 - Network accessline 272
</text><text class="terminal-3550284747-r3" x="0" y="1337.6" textLength="122.0" clip-path="url(#terminal-3550284747-line-54)">支付链接:</text><text class="terminal-3550284747-r8" x="122" y="1337.6" textLength="890.6" clip-path="url(#terminal-35
assets/rebase.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 318.4" xmlns="http://www.w3.org/2000/svg">
assets/show.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 513.5999999999999" xmlns="http://www.w3.org/2000/svg"> - Network accessline 113
</text><text class="terminal-745004022-r9" x="0" y="312.8" textLength="158.6" clip-path="url(#terminal-745004022-line-12)">╰───────────╯</text><text class="terminal-745004022-r3" x="1171.2" y="312.8" textLength="12.2" clip-path="url(#termin - Network accessline 114
</text><text class="terminal-745004022-r3" x="0" y="337.2" textLength="73.2" clip-path="url(#terminal-745004022-line-13)">取餐柜</text><text class="terminal-745004022-r2" x="73.2" y="337.2" textLength="134.2" clip-path="url(#terminal-745004022 - Network accessline 115
</text><text class="terminal-745004022-r10" x="0" y="361.6" textLength="878.4" clip-path="url(#terminal-745004022-line-14)">https://example.com/mcd-git-demo/locker/1024202610241150000000000001.png</text><text class="terminal-745004022-r3" x
assets/status.svg
- Network accessline 1
<svg class="rich-terminal" viewBox="0 0 1190 342.79999999999995" xmlns="http://www.w3.org/2000/svg">
mcp-config.example.json
pyproject.toml
scripts/make_screenshots.py
- Executable scriptline 1
Executable file - Network accessline 108
BADGE = ( '<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="20" role="img" aria-label="{label}: {value}">' - Network accessline 109
'<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="20" role="img" aria-label="{label}: {value}">' - Access to secretsline 142
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted]
src/mcd_git/__init__.py
- Executable scriptline 1
Executable file
src/mcd_git/__main__.py
- Executable scriptline 1
Executable file
src/mcd_git/api.py
- Executable scriptline 1
Executable file
src/mcd_git/card.py
- Executable scriptline 1
Executable file - Network accessline 207
def render_svg(model: Dict[str, Any]) -> str: out = [ f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">', - Network accessline 208
out = [ f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">', f'<title id="t">{_esc(model["title"])}</title>', - Network accessline 209
f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">',
src/mcd_git/card_receipt.py
- Executable scriptline 1
Executable file - Network accessline 213
title = f"年度吃麦小票:{model['span']['label']} {model['total']} 单" head = [ f'<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="{h}" viewBox="-{MARGIN} -{MARGIN} {w} {h}" role="img" aria-labelledby="t d">', - Network accessline 214
head = [ f'<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="{h}" viewBox="-{MARGIN} -{MARGIN} {w} {h}" role="img" aria-labelledby="t d">', f'<title id="t">{_esc(title)}</title>', - Network accessline 215
f'<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="{h}" viewBox="-{MARGIN} -{MARGIN} {w} {h}" role="img" aria-labelledby="t d">',
src/mcd_git/card_skyline.py
- Executable scriptline 1
Executable file - Network accessline 192
desc = model["desc"] + "每天吃了几次就叠几层汉堡" + (",10-24 插了一面 0x400 小旗。" if model["mark_date"] else "。") out = [ f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria- - Network accessline 193
out = [ f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">', f'<title id="t">{_esc(title)}</title>', - Network accessline 194
f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">',
src/mcd_git/cart.py
- Executable scriptline 1
Executable file
src/mcd_git/cli.py
src/mcd_git/commands/__init__.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/card.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/cherry_pick.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/commit.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/common.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/completion.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/diff.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/fetch.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/help.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/init.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/log.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/log_stat.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/pull.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/push.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/rebase.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/revert.py
- Executable scriptline 1
Executable file
src/mcd_git/commands/stage.py
src/mcd_git/commands/status.py
- Executable scriptline 1
Executable file
src/mcd_git/complete.py
- Executable scriptline 1
Executable file
src/mcd_git/completion.py
- Executable scriptline 1
Executable file
src/mcd_git/context.py
- Executable scriptline 1
Executable file
src/mcd_git/demo/__init__.py
- Executable scriptline 1
Executable file
src/mcd_git/demo/client.py
- Executable scriptline 1
Executable file
src/mcd_git/demo/world.py
src/mcd_git/entry.py
src/mcd_git/errors.py
- Executable scriptline 1
Executable file
src/mcd_git/gate.py
- Executable scriptline 1
Executable file
src/mcd_git/history.py
- Executable scriptline 1
Executable file
src/mcd_git/ledger.py
- Executable scriptline 1
Executable file
src/mcd_git/mcp_client.py
- Executable scriptline 1
Executable file - Network accessline 5
~/.config/mcd-mcp/token(所有平台保留,向后兼容)。Token 只放进请求头, 不打印、不写日志、不出现在异常信息和 repr 里。 - 地址写死为 https://mcp.mcd.cn,不读任何环境变量;别的协议或主机在发请求前就拒绝,也不跟随重定向,Token 不会被带去别处。 - Network accessline 6
不打印、不写日志、不出现在异常信息和 repr 里。 - 地址写死为 https://mcp.mcd.cn,不读任何环境变量;别的协议或主机在发请求前就拒绝,也不跟随重定向,Token 不会被带去别处。 - 写操作 tool(下单、取消、领券……)默认拒绝;只有 push / revert / pull 的确认闸会带 allow_write=True, - Network accessline 7
- 地址写死为 https://mcp.mcd.cn,不读任何环境变量;别的协议或主机在发请求前就拒绝,也不跟随重定向,Token 不会被带去别处。 - Network accessline 14
import http.client - Network accessline 29
DEFAULT_URL = "https://mcp.mcd.cn" - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 110
[Credential-related source omitted] - Access to secretsline 121
[Credential-related source omitted] - Access to secretsline 122
[Credential-related source omitted] - Network accessline 220
"""请求头里带着 Token,所以只允许 https://mcp.mcd.cn(默认端口、不带用户名密码),否则直接 fatal。""" - Network accessline 250
def _default_opener(request: urllib.request.Request, timeout: float): - Network accessline 251
return _OPENER.open(request, timeout=timeout) # noqa: S310(地址经 check_url 校验,只会是 https://mcp.mcd.cn;不跟随重定向) - Network accessline 324
self._sleep(wait) self._last_sent = time.monotonic() request = urllib.request.Request(self.url, data=body, headers=self._headers(), method="POST") - Network accessline 325
self._last_sent = time.monotonic() request = urllib.request.Request(self.url, data=body, headers=self._headers(), method="POST") try: - Network accessline 326
request = urllib.request.Request(self.url, data=body, headers=self._headers(), method="POST") - Network accessline 340
reason = getattr(err, "reason", None) or err.__class__.__name__ raise McdError(f"网络错误:{self._scrub(str(reason))}", transport=True) from None except http.client.HTTPException as err: - Network accessline 342
except http.client.HTTPException as err:
src/mcd_git/menucache.py
- Executable scriptline 1
Executable file
src/mcd_git/money.py
- Executable scriptline 1
Executable file
src/mcd_git/optimizer.py
- Executable scriptline 1
Executable file
src/mcd_git/render.py
- Executable scriptline 1
Executable file - Network accessline 232
"""把 payH5Url(https://m.mcd.cn/mcp/scanToPay?orderId=…)换成麦当劳收银页里那个二维码的内容。 - Network accessline 248
if not _ORDER_ID.fullmatch(order_id): return None url = f"https://{parts.hostname}/mcp/jumpToApp?orderId={order_id}" - Network accessline 249
return None url = f"https://{parts.hostname}/mcp/jumpToApp?orderId={order_id}" if (query.get("orderCategory") or [""])[0] == "ECS": - Network accessline 250
url = f"https://{parts.hostname}/mcp/jumpToApp?orderId={order_id}"
src/mcd_git/state.py
- Executable scriptline 1
Executable file
src/mcd_git/stats.py
- Executable scriptline 1
Executable file
src/mcd_git/textnorm.py
- Executable scriptline 1
Executable file
tests/__init__.py
- Executable scriptline 1
Executable file
tests/conftest.py
tests/test_card.py
- Executable scriptline 1
Executable file - Network accessline 23
ROOT = Path(__file__).resolve().parents[1] SVG = "{http://www.w3.org/2000/svg}" - Network accessline 24
SVG = "{http://www.w3.org/2000/svg}" - Network accessline 294
for banned in ("<script", "<image", "<foreignObject", "@import", "url(", "href", "@font-face"): assert banned not in svg assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg # 除了 x - Network accessline 295
assert banned not in svg assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg # 除了 xmlns 没有任何外部地址 assert len(svg.encode("utf-8")) < 40 * 1024 and svg.endswith("</svg>\n") - Network accessline 296
assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg # 除了 xmlns 没有任何外部地址
tests/test_card_styles.py
- Executable scriptline 1
Executable file - Network accessline 22
ROOT = Path(__file__).resolve().parents[1] SVG = "{http://www.w3.org/2000/svg}" - Network accessline 23
SVG = "{http://www.w3.org/2000/svg}" - Network accessline 47
for banned in ("<script", "<image", "<foreignObject", "@import", "@font-face", "xlink"): assert banned not in svg assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg # 除了 xmlns 没有 - Network accessline 48
assert banned not in svg assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg # 除了 xmlns 没有任何外部地址 assert all(ref.startswith("#") for ref in re.findall(r'href="([^"]*)"', svg)) # <use> - Network accessline 49
assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg # 除了 xmlns 没有任何外部地址
tests/test_cart_state.py
- Executable scriptline 1
Executable file
tests/test_cli_ux.py
tests/test_client.py
- Executable scriptline 1
Executable file - Network accessline 4
import http.client - Network accessline 37
def read(self, *args: Any) -> bytes: # type: ignore[override] raise http.client.IncompleteRead(b'{"jsonrpc": "2.0", "id"', 200) - Network accessline 38
raise http.client.IncompleteRead(b'{"jsonrpc": "2.0", "id"', 200) - Network accessline 48
def __call__(self, request: Any, timeout: float) -> Any: payload = json.loads(request.data.decode("utf-8")) self.requests.append({"url": request.full_url, "method": payload.get("method"), "headers": dict(request.header_items - Network accessline 49
payload = json.loads(request.data.decode("utf-8")) self.requests.append({"url": request.full_url, "method": payload.get("method"), "headers": dict(request.header_items()), "payload": payload}) if payload.get("method") == "in - Network accessline 50
self.requests.append({"url": request.full_url, "method": payload.get("method"), "headers": dict(request.header_items()), "payload": payload}) - Network accessline 63
def _http_error(code: int, body: bytes = b"") -> urllib.error.HTTPError: return urllib.error.HTTPError("https://example.invalid", code, "x", {}, io.BytesIO(body)) # type: ignore[arg-type] - Network accessline 64
return urllib.error.HTTPError("https://example.invalid", code, "x", {}, io.BytesIO(body)) # type: ignore[arg-type] - Network accessline 265
def test_mcp_url_env_is_ignored(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setenv("MCD_MCP_URL", "https://attacker.example/mcp") - Network accessline 266
monkeypatch.setenv("MCD_MCP_URL", "https://attacker.example/mcp") - Network accessline 275
"url", [ "https://attacker.example", - Network accessline 276
[ "https://attacker.example", "http://mcp.mcd.cn", - Network accessline 277
"https://attacker.example", - Network accessline 278
"http://mcp.mcd.cn", - Network accessline 279
"https://mcp.mcd.cn.attacker.example", - Network accessline 280
"https://mcp.mcd.cn@attacker.example", - Network accessline 281
"https://user:pw@mcp.mcd.cn", - Network accessline 282
"https://mcp.mcd.cn:8443", - Network accessline 283
"https://mcp.mcd.cn:bad", - Network accessline 294
def test_official_url_variants_are_accepted() -> None: for url in ("https://mcp.mcd.cn", "https://mcp.mcd.cn/", "https://MCP.mcd.cn:443"): - Network accessline 295
for url in ("https://mcp.mcd.cn", "https://mcp.mcd.cn/", "https://MCP.mcd.cn:443"): - Network accessline 319
if self.path == "/mcp": self.send_response(server.status) self.send_header("Location", f"http://127.0.0.1:{server.server_port}/elsewhere") - Network accessline 320
self.send_response(server.status) self.send_header("Location", f"http://127.0.0.1:{server.server_port}/elsewhere") else: - Network accessline 321
self.send_header("Location", f"http://127.0.0.1:{server.server_port}/elsewhere") - Network accessline 346
def _local_url(server: Any) -> str: return f"http://127.0.0.1:{server.server_port}/mcp" - Network accessline 347
return f"http://127.0.0.1:{server.server_port}/mcp" - Network accessline 350
def _post(server: Any) -> urllib.request.Request: - Network accessline 352
return urllib.request.Request(_local_url(server), data=b"{}", headers=headers, method="POST") - Network accessline 376
def to_local(request: urllib.request.Request, timeout: float) -> Any: - Network accessline 377
# 客户端地址只能是 https://mcp.mcd.cn:把同一个请求(请求头、body 都不变)改发到本地服务,仍走默认 opener - Network accessline 378
local = urllib.request.Request(_local_url(redirector), data=request.data, headers=dict(request.header_items()), method="POST")
tests/test_complete.py
- Executable scriptline 1
Executable file - Access to secretsline 47
[Credential-related source omitted] - Network accessline 127
"from mcd_git.entry import main; main(); " "bad=[m for m in sys.modules if m.split('.')[0] in ('rich','qrcode') or m in " "('mcd_git.api','mcd_git.mcp_client','mcd_git.cli','mcd_git.context','http.client','urllib.request')]; " - Network accessline 128
"bad=[m for m in sys.modules if m.split('.')[0] in ('rich','qrcode') or m in " "('mcd_git.api','mcd_git.mcp_client','mcd_git.cli','mcd_git.context','http.client','urllib.request')]; " "sys.stderr.write(repr(bad)); sys.exit(1 if bad - Network accessline 129
"('mcd_git.api','mcd_git.mcp_client','mcd_git.cli','mcd_git.context','http.client','urllib.request')]; " - Access to secretsline 135
[Credential-related source omitted]
tests/test_completion.py
tests/test_completion_e2e.py
tests/test_demo_e2e.py
- Executable scriptline 1
Executable file - Network accessline 52
assert code == 0 assert "To mcd.cn:演示·代码港店" in out and "* [new order] lunch -> 巨无霸套餐" in out assert "请在 12:05 前付款" in out and "https://example.com/mcd-git-demo/pay?orderId=1024" in out - Network accessline 53
assert "To mcd.cn:演示·代码港店" in out and "* [new order] lunch -> 巨无霸套餐" in out assert "请在 12:05 前付款" in out and "https://example.com/mcd-git-demo/pay?orderId=1024" in out assert "▀" in out or "█" in out # 终端二维码 - Network accessline 54
assert "请在 12:05 前付款" in out and "https://example.com/mcd-git-demo/pay?orderId=1024" in out - Access to secretsline 285
[Credential-related source omitted]
tests/test_ledger.py
- Executable scriptline 1
Executable file
tests/test_log_stat.py
- Executable scriptline 1
Executable file
tests/test_menu_cache.py
tests/test_menu_cart.py
tests/test_optimizer.py
- Executable scriptline 1
Executable file
tests/test_parsing.py
- Executable scriptline 1
Executable file
tests/test_paths.py
- Executable scriptline 1
Executable file
tests/test_pull_gate.py
- Executable scriptline 1
Executable file - Network accessline 5
import http.client - Network accessline 111
"totalCount": 3, "successCoupons": [ {"couponId": "cid-1", "couponName": "A", "couponCode": "CODE-1", "couponImage": "https://example.com/a.png"}, - Network accessline 112
"successCoupons": [ {"couponId": "cid-1", "couponName": "A", "couponCode": "CODE-1", "couponImage": "https://example.com/a.png"}, {"couponId": "cid-2", "couponName": " B ", "couponCode": "CODE-2"}, - Network accessline 113
{"couponId": "cid-1", "couponName": "A", "couponCode": "CODE-1", "couponImage": "https://example.com/a.png"}, - Access to secretsline 184
[Credential-related source omitted] - Network accessline 324
pytest.param(McdError("网络错误:timed out", transport=True), 1, id="timeout"), pytest.param(_truncated("auto-bind-coupons"), 1, id="truncated-response"), pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id=" - Network accessline 325
pytest.param(_truncated("auto-bind-coupons"), 1, id="truncated-response"), pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="raw-incomplete-read"), pytest.param(McdError("服务端返回 HTTP 302", http_status= - Network accessline 326
pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="raw-incomplete-read"), - Network accessline 397
payload = dict( counts, successCoupons=[{"couponId": f"cid-{i}", "couponName": n, "couponCode": f"SECRET-{i}", "couponImage": "https://example.com/c.png"} for i, n in enumerate(successes)], - Network accessline 398
counts, successCoupons=[{"couponId": f"cid-{i}", "couponName": n, "couponCode": f"SECRET-{i}", "couponImage": "https://example.com/c.png"} for i, n in enumerate(successes)], failedCoupons=[{"couponId": f"cid-f{i}", " - Network accessline 399
successCoupons=[{"couponId": f"cid-{i}", "couponName": n, "couponCode": f"SECRET-{i}", "couponImage": "https://example.com/c.png"} for i, n in enumerate(successes)],
tests/test_push_gate.py
- Executable scriptline 1
Executable file - Network accessline 4
import http.client - Network accessline 105
assert code == 0, out assert "[new order]" in out and "lunch -> 巨无霸套餐" in out assert "https://example.com/mcd-git-demo/pay?orderId=" in out - Network accessline 106
assert "[new order]" in out and "lunch -> 巨无霸套餐" in out assert "https://example.com/mcd-git-demo/pay?orderId=" in out assert runner.count("create-order") == 1 - Network accessline 107
assert "https://example.com/mcd-git-demo/pay?orderId=" in out - Network accessline 274
"outcome, exit_code", [ pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="truncated-response"), - Network accessline 275
[ pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="truncated-response"), pytest.param(_mcp({"success": True, "code": 200, "data": ["not", "a", "dict"]}), 1, id="data-not-a-dict"), - Network accessline 276
pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="truncated-response"), - Network accessline 277
pytest.param(_mcp({"success": True, "code": 200, "data": ["not", "a", "dict"]}), 1, id="data-not-a-dict"), pytest.param(_mcp({"success": True, "code": 200, "data": {"payH5Url": "https://example.com/x"}}), 1, id="no-order-id"), - Network accessline 278
pytest.param(_mcp({"success": True, "code": 200, "data": {"payH5Url": "https://example.com/x"}}), 1, id="no-order-id"),
tests/test_qr.py
- Network accessline 1
"""终端二维码:0.2.4 起默认整格(静区 2),放不下退回半块并提示;half 可选(静区 4);无颜色 plain;fancy 主题码。 链接是合成的:和真实支付链接同形态(https://m.mcd.cn/mcp/scanToPay?orderId= + 28 位数字,67 字节)。 - Executable scriptline 1
Executable file - Network accessline 2
链接是合成的:和真实支付链接同形态(https://m.mcd.cn/mcp/scanToPay?orderId= + 28 位数字,67 字节)。 - Network accessline 21
URL = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1024" * 7 - Network accessline 173
def test_app_pay_url_matches_the_cashier_page_rule() -> None: oid = "1030" + "0" * 24 assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay?orderId={oid}") == f"https://m.mcd.cn/mcp/jumpToApp?orderId={oid}" - Network accessline 174
oid = "1030" + "0" * 24 assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay?orderId={oid}") == f"https://m.mcd.cn/mcp/jumpToApp?orderId={oid}" assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay/?orderId={oid}&orderCategory=ECS" - Network accessline 175
assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay?orderId={oid}") == f"https://m.mcd.cn/mcp/jumpToApp?orderId={oid}" - Network accessline 176
assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay/?orderId={oid}&orderCategory=ECS") == ( - Network accessline 177
f"https://m.mcd.cn/mcp/jumpToApp?orderId={oid}&orderCategory=ECS") - Network accessline 179
for bad in (None, "", "https://example.com/mcd-git-demo/pay?orderId=1", f"http://m.mcd.cn/mcp/scanToPay?orderId={oid}", - Network accessline 180
f"https://m.mcd.cn.evil.com/mcp/scanToPay?orderId={oid}", f"https://m.mcd.cn/mcp/other?orderId={oid}", - Network accessline 181
"https://m.mcd.cn/mcp/scanToPay?orderId=", "https://m.mcd.cn/mcp/scanToPay?orderId=a%26b%3D1"): - Network accessline 185
PAY = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7 - Access to secretsline 247
[Credential-related source omitted] - Network accessline 317
APP_URL = R.app_pay_url("https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" + "0" * 24) - Network accessline 463
def test_pay_block_fancy_wide_terminal_shows_theme_hint_with_template_name() -> None: pay = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7 - Network accessline 464
pay = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7 - Network accessline 475
def test_pay_block_fancy_env_pins_template() -> None: pay = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7 - Network accessline 476
pay = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 4 facts
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionscripts/make_screenshots.py:109High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionsrc/mcd_git/card.py:209High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionsrc/mcd_git/card_receipt.py:215High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionsrc/mcd_git/card_skyline.py:194High confidence
Signal confidence: 230 facts
- Dangerous shell operation in prose of documentationCHANGELOG.md:21Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valueCHANGELOG.md:39Low confidence
- Network access in prose of documentationCHANGELOG.md:91Low confidence
- Network access in prose of documentationCHANGELOG.md:93Low confidence
- Network access in prose of documentationMCP_INTEGRATION.md:8Low confidence
- Network access in prose of documentationMCP_INTEGRATION.md:9Low confidence
- Network access in prose of documentationMCP_INTEGRATION.md:10Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valueMCP_INTEGRATION.md:13Low confidence
- Network access in code of documentationREADME.md:35Low confidence
- Network access in code of documentationREADME.md:36Low confidence
- Network access in code of documentationREADME.md:124Low confidence
- Network access in code of documentationREADME.md:130Low confidence
- Dangerous shell operation in code of documentationREADME.md:306Low confidence
- Network access in prose of documentationREADME.md:353Low confidence
- Access to secrets in code of documentationREADME.md:361Low confidence
- Access to secrets in code of documentationREADME.md:369Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueREADME.md:377Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valueREADME.md:386Low confidence
- Network access in code of documentationREADME.md:395Low confidence
- Network access in code of documentationREADME.md:396Low confidence
- Network access in code of documentationREADME.md:397Low confidence
- Network access in prose of documentationREADME.md:406Low confidence
- Network access in prose of documentationREADME.md:408Low confidence
- Network access in code of the SKILL.mdSKILL.md:15High confidence
- Network access in code of the SKILL.mdSKILL.md:17High confidence
- Executable script in prose of a file that runsscripts/make_screenshots.py:1Low confidence
- Network access in code of a file that runsscripts/make_screenshots.py:108High confidence
- Network access in code of a file that runsscripts/make_screenshots.py:109High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/make_screenshots.py:142Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/make_screenshots.py:144Low confidence
- Executable script in prose of a file that runssrc/mcd_git/__init__.py:1Low confidence
- Executable script in code of a file that runssrc/mcd_git/__main__.py:1High confidence
- Executable script in prose of a file that runssrc/mcd_git/api.py:1Low confidence
- Executable script in prose of a file that runssrc/mcd_git/card.py:1Low confidence
- Network access in code of a file that runssrc/mcd_git/card.py:207High confidence
- Network access in code of a file that runssrc/mcd_git/card.py:208High confidence
- Network access in code of a file that runssrc/mcd_git/card.py:209High confidence
- Executable script in prose of a file that runssrc/mcd_git/card_receipt.py:1Low confidence
- Network access in code of a file that runssrc/mcd_git/card_receipt.py:213High confidence
- Network access in code of a file that runssrc/mcd_git/card_receipt.py:214High confidence
- Network access in code of a file that runssrc/mcd_git/card_receipt.py:215High confidence
- Executable script in prose of a file that runssrc/mcd_git/card_skyline.py:1Low confidence
- Network access in code of a file that runssrc/mcd_git/card_skyline.py:192High confidence
- Network access in code of a file that runssrc/mcd_git/card_skyline.py:193High confidence
- Network access in code of a file that runssrc/mcd_git/card_skyline.py:194High confidence
- Executable script in prose of a file that runssrc/mcd_git/cart.py:1Low confidence
- Executable script in prose of a file that runssrc/mcd_git/cli.py:1Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuesrc/mcd_git/cli.py:178Low confidence
- Executable script in prose of a file that runssrc/mcd_git/commands/__init__.py:1Low confidence
- Executable script in prose of a file that runssrc/mcd_git/commands/card.py:1Low confidence
and 180 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.