绿茵雷达
基于 LiveScore MCP 的足球数据工具,覆盖实时比分、赛程、球队/球员信息、比赛详情、H2H、比分预测、转会查询、主队关注与快讯。
🔴 最高优先级 · 不可跳过
用户消息涉及任何足球内容 → 第一个动作必须是加载此 Skill。
足球内容 = 赛事名(世界杯/欧冠/英超/西甲/中超/……)、球队名、球员名、比分/赛程/预测/转会/引援/签约/离队/排名/积分榜等数据查询动词、"看球""球迷""今晚有球吗"等口语句式、未指明运动的"比赛"。
特别注意:转会类查询(转会信息/引援/签约/离队/转会窗/夏窗/冬窗/赛季转会等)必须触发此 Skill,不要直接用 WebSearch/WebFetch。
禁止先用 WebSearch / WebFetch 查询足球内容再加载 Skill,这是降级行为。
⚠️ 强制规则
规则 1: 全部输出为中文
所有面向用户的输出必须 100% 使用中文。球队名、赛事名、球员名(国外球员用中英对照)、预测报告等全部中文。
规则 2: 球员输出格式
从 get_player 提取:姓名(中英对照)、国籍、年龄/出生日期、身高/体重、位置、现效力球队、球衣号码、赛季数据(出场/进球/助攻/黄红牌/评分)、生涯履历、国家队数据、伤病、合同到期、市场身价、上场时间。缺失字段标注"暂无数据"。输出模板同原版。
规则 3: 球队输出格式
从 get_team 提取:球队中文名、联赛/排名、主教练、成立年份、主场、赛季统计(胜平负/进失球/积分,分总计+主+客)、常用阵型、阵容名单、头号射手、近期走势、转会信息。输出模板同原版。
规则 4: 禁止输出可视化页面
所有数据以 Markdown 表格输出,禁止 show_widget/preview_url/SVG/HTML。用户明确要求"画图/可视化/图表"时例外。
规则 5: 大结果文件处理(重要)
MCP 工具返回数据量过大时,系统会自动将结果保存到临时文件,并返回文件路径。这是正常机制,不是错误。
MCP 结果文件格式
文件开头有描述行(非 JSON),后面才是实际数据:
Output saved to C:\Users\64314\.workbuddy\projects\...\tool-results\xxx.txt
{"data": {"team": {"name": "South Korea", ...}}}
所有 skill 内置脚本(predict.py、extract_predict_input.py)已内置自动跳过描述行的逻辑,无需手动处理。
正确做法
- 不要手动拼文件路径 — 系统返回的文件路径是权威的,手动拼容易出错(大小写、连字符、空格等)
- 直接将系统返回的路径传给 predict.py/extract_predict_input.py — 这些脚本会自动处理描述行
- 如需手动查看文件内容 — 用 Read 工具读取系统返回的路径
禁止做法
- ❌ 手动构造临时文件路径(如拼
C:\Users\...\tool-results\xxx.txt)— 路径格式不稳定,容易拼错 - ❌ 将格式化脚本写入磁盘再执行(如
gen_xxx.py→ 执行 → 读输出文件)— 额外 3 次以上工具调用,严重拖慢速度 - ❌ 将中间结果写入
.md/.txt/.json文件再读取展示给用户 - ❌ 使用
python3命令(Windows 环境不可用),必须用 managed Python 全路径
示例:正确处理 MCP 大结果文件
# 系统返回:"Output saved to C:\Users\64314\.workbuddy\projects\...\tool-results\xxx.txt"
# ✅ 方式 1:直接传给 predict.py --mcp-files(推荐,一步到位)
PYTHON="C:/Users/64314/.workbuddy/binaries/python/versions/3.13.12/python.exe"
"$PYTHON" predict.py --mcp-files --match <match_path> --home <home_path> --away <away_path> --format markdown
# ✅ 方式 2:用 Read 工具读取该路径查看内容
Read(file_path="C:\Users\64314\.workbuddy\projects\...\tool-results\xxx.txt")
例外
- 预测脚本
scripts/predict.py是 skill 内置文件,属于例外,可直接调用 - 日常查询产生的格式化脚本一律内联执行,不写磁盘
规则 6: 球队名翻译由 LLM 负责,禁止在脚本中硬编码字典(重要)
Python/Bash 脚本只负责提取原始英文数据并结构化输出(JSON/表格),球队名、球员名、国家名的中英文翻译由 LLM 在对话中直接完成,禁止在脚本里写死庞大的 team_names 映射字典。
- ❌ 错误做法:脚本里写
team_names = {'Brazil': '巴西', 'Germany': '德国', ...},让脚本输出中文。 - ✅ 正确做法:脚本输出
{"home": "Brazil", "away": "Germany", ...}等原始英文,LLM 在构建回复时直接翻译成中文。 - 原因:LLM 本身就掌握所有国家队/俱乐部/球员的中文译名,硬编码字典既冗余(上百个条目)又不完整(总有遗漏),还会让脚本变得臃肿难维护。
- 例外:极冷门球队/球员 LLM 不确定译名时,保留英文并标注"译名待确认"。
规则 7: 转会查询用指定数据源
通过 WebFetch 抓取,优先球迷屋,备用 GOAL/虎扑/天体号。禁止凭空编造。详见 references/transfer-sources.md。
规则 8: 强制触发(见顶部 🔴 横幅,此处不再赘述)
🔐 前置:LiveScore MCP 自动配置(最高优先级)
Skill 加载后第一件事:确保 MCP 已配置并启用。
Step 1: 检查配置
读 ~/.workbuddy/mcp.json,查 mcpServers 中有无 "livescore":
- 缺则追加:
"livescore": { "url": "https://livescoremcp.com/sse", "disabled": false },不覆盖已有配置 - 已存在:跳到 Step 2
Step 2: 引导用户信任连接器(手动步骤)
这是用户必须自己操作的一步,不可跳过。
告知用户按以下路径操作:
左侧边栏 → 专家 → 连接器 → 自定义连接器 → 找到 "livescore" → 启用并点击「信任」
⚠️ 在这之前,不要联网查询任何足球信息。 不要在 MCP 未信任前用 WebSearch / WebFetch 替代查询,这是降级行为。
Step 3: 验证
信任完成后,用 health 工具验证连接:
DeferExecuteTool({ toolName: "mcp__livescore__health", params: {} })
Step 4: 异常处理
- 配置已存在但调不通 → 提醒用户按 Step 2 路径检查连接器是否已信任,不降级联网查询
- health 返回异常 → 告知用户可能网络问题或 MCP 服务暂时不可用,稍后重试
环境与工具路径(重要)
Python 运行时
禁止使用 python3 或裸 python 命令,Windows 环境下不可用或版本不对。必须使用 managed Python 全路径:
C:\Users\64314\.workbuddy\binaries\python\versions\3.13.12\python.exe
所有 Bash 工具中调用 Python 时必须用此路径。示例:
"C:/Users/64314/.workbuddy/binaries/python/versions/3.13.12/python.exe" "C:/Users/64314/.workbuddy/skills/livescore-radar/scripts/predict.py" --data input.json
脚本路径
| 脚本 | 绝对路径 |
|------|---------|
| 预测引擎 | C:/Users/64314/.workbuddy/skills/livescore-radar/scripts/predict.py |
| 数据提取器 | C:/Users/64314/.workbuddy/skills/livescore-radar/scripts/extract_predict_input.py |
MCP 大结果文件格式
MCP 工具返回数据量过大时,系统自动存到临时文件。文件开头有描述文字,不是纯 JSON。 格式:
Output saved to C:\Users\64314\.workbuddy\projects\...\tool-results\xxx.txt
{"data": {"team": ...}}
正确读取方式:
- 用 Read 工具读取系统返回的完整路径(不要手动拼路径!)
- 用 predict.py 的
--data参数可直接处理此类文件(v2.1+ 自动跳过描述行) - 用 extract_predict_input.py 也可直接处理此类文件
Windows 注意事项
- 路径格式:Bash 工具中使用 Git Bash,路径用
/c/Users/...或C:/Users/...均可 - 中文编码:所有 Python 脚本内置
sys.stdout.reconfigure(encoding='utf-8'),直接 print 中文不会乱码 - 引号嵌套:避免在
python -c "..."中嵌套复杂引号,改用脚本文件方式 - 路径空格:路径含空格时必须加引号
球队/球员中英文名称
遵循规则 6:翻译由 LLM 直接完成,不在脚本中硬编码字典。
- LLM 在格式化输出时,直接将英文球队名/球员名/国家名翻译为中文(如 Brazil → 巴西,Manchester United → 曼联)。
references/team-names.md仅作为冷门球队/边缘联赛的辅助参考,不用于脚本查询。- 遇极冷门或不确定译名时,保留英文并标注"译名待确认"。
LiveScore MCP 工具清单
通过 DeferExecuteTool 调用,前缀 mcp__livescore__:
| # | 工具 | 干什么 |
|---|------|--------|
| 1 | search | 搜球队/球员/赛事,必填 q |
| 2 | get_live_scores | 正在踢的比赛 |
| 3 | get_day_fixtures | 某天所有比赛,必填 date(DD/MM/YYYY) |
| 4 | get_fixtures | 杯赛赛程,必填 competition |
| 5 | get_league_fixtures | 联赛赛程,必填 league_key |
| 6 | get_match | 比赛详情+事件+阵容+统计+H2H |
| 7 | get_player | 球员详情,必填 id |
| 8 | get_team | 球队详情,必填 id |
| 9 | get_team_image | 球队Logo |
| 10 | health | 检查连接 |
联赛 Key 速查见 references/league_keys.md。找不到时用 search(英文名)搜。
核心场景
场景 1: 实时比分
DeferExecuteTool({ toolName: "mcp__livescore__get_live_scores", params: {} })
表格输出,中文队名,进球高亮。
场景 2: 某日赛程
日期 DD/MM/YYYY,中国用户 tzoffset=480。按联赛分组,标注北京时间。
场景 3: 联赛/杯赛赛程
已知 Key 直接调,未知先 search。杯赛用 get_fixtures + competition,中国杯赛和世界杯用 get_league_fixtures + league_key。
- 数据量过大被保存到临时文件时,遵循规则 5:用内联
python -c解析 stdout,直接在对话中以 Markdown 表格输出。 - 不要在磁盘生成
.md或.txt文件再读取展示。
场景 4: 球队信息
search → 拿 team_id → 并行 get_team + get_team_image。按规则 3 模板输出。
场景 5: 球员信息
search → 拿 player_id → get_player。按规则 2 模板输出,所有字段覆盖。
场景 6: 转会信息(高频场景)
这是用户最常问的场景之一,必须优先响应。
LiveScore MCP 不支持转会。使用 WebFetch 抓取,详尽的数据源、slug对照表、查询策略、URL模板、输出格式见 references/transfer-sources.md。
查询流程:
- 识别用户查询的球队/联赛 → 确定球迷屋 slug
- 先试球迷屋球队页:
WebFetch("https://www.qiumiwu.com/team/{slug}/transfer") - 404则改用联赛页:
WebFetch("https://www.qiumiwu.com/league/{slug}/transfer"),从返回中筛选目标球队 - 转会费补充:WebSearch
"{球队名} 转会 转会费"或搜 GOAL/虎扑 - 按标准格式输出:转入/转出表格 + 转会总结
输出格式:
## [球队中文名] [赛季] 转会信息
### 转入
| 球员 | 位置 | 原俱乐部 | 转会费 | 转会类型 |
|------|------|---------|--------|---------|
### 转出
| 球员 | 位置 | 新俱乐部 | 转会费 | 转会类型 |
|------|------|---------|--------|---------|
### 转会总结
- 总支出 / 总收入 / 净投入
常用球队 slug 速查: 皇马=huangma 巴萨=basa 曼城=mancheng 利物浦=liwupu 阿森纳=asena 曼联=manlian 切尔西=qieerxi 拜仁=bairen 巴黎=balishengrierman 尤文=youwentusi 国米=guojimilan
常用联赛 slug 速查: 西甲=xijia 英超=yingchao 意甲=yijia 德甲=dejia 法甲=fajia
注意: Transfermarkt 被 Cloudflare 拦截不可用;球迷屋不提供转会费金额,需从 GOAL/虎扑/天体号补充。
场景 7: 比赛详情
从赛程定位 match ID → get_match(id, h2h=1)。分块输出:比赛信息 → 事件时间线 → 统计对比 → H2H。
场景 7: 比分预测
流水线(一步到位版,v2.9+):
- 并行拉取数据(3路):
get_match(id, h2h=1)+ 主队get_team+ 客队get_team - 一条命令完成提取+预测:使用
predict.py --mcp-files直接传入3个MCP结果文件路径
PYTHON="C:/Users/64314/.workbuddy/binaries/python/versions/3.13.12/python.exe"
SCRIPT="C:/Users/64314/.workbuddy/skills/livescore-radar/scripts/predict.py"
"$PYTHON" "$SCRIPT" --mcp-files \
--match "<get_match结果文件路径>" \
--home "<主队get_team结果文件路径>" \
--away "<客队get_team结果文件路径>" \
--format markdown
就这么简单! --mcp-files 模式自动完成:
- 跳过 MCP 结果文件的描述行
- 从
get_team提取近期战绩、赛季统计、阵容信息 - 从
get_match提取 H2H 数据 - 组装输入 JSON → 运行六维预测 → 输出 Markdown
旧方式(分步,不推荐但仍可用):
- 并行拉取3路数据
- 用
extract_predict_input.py提取并组装 JSON - 用
predict.py --data <json文件>运行预测
predict.py 输入 JSON Schema(供手动组装时参考):
{
"home_team": "South Korea",
"away_team": "Czechia",
"venue": "Estadio Akron",
"recent_form": {
"home": [{"result": "W|D|L", "score": "2-1", "opponent": "Japan", "date": "2026-06-01"}],
"away": [{"result": "W|D|L", "score": "1-0", "opponent": "Denmark", "date": "2026-06-01"}]
},
"h2h": {
"matches": [{"home": "Czechia", "away": "South Korea", "score": "1-2", "date": "2016-11-11"}]
},
"team_stats": {
"home": {"played": 10, "wins": 5, "draws": 2, "losses": 3, "goals_for": 15, "goals_against": 12, "league_position": 3, "home_played": 5, "home_wins": 3, "home_draws": 1, "home_losses": 1, "away_played": 5, "away_wins": 2, "away_draws": 1, "away_losses": 2},
"away": {"played": 10, "wins": 4, "draws": 3, "losses": 3, "goals_for": 12, "goals_against": 10, "league_position": 5, "home_played": 5, "home_wins": 3, "home_draws": 1, "home_losses": 1, "away_played": 5, "away_wins": 1, "away_draws": 2, "away_losses": 2}
},
"squad": {
"home": {"top_scorer": {"name": "Son Heung-min", "goals": 8}, "key_injuries": ["Player1"], "squad_depth": "strong|normal|weak"},
"away": {"top_scorer": {"name": "Patrik Schick", "goals": 6}, "key_injuries": [], "squad_depth": "normal"}
},
"external": {
"news_sentiment": {"home": 0.5, "away": 0.5},
"rest_days": {"home": null, "away": null},
"schedule_pressure": {"home": "low", "away": "low"}
}
}
预测因子权重: 近期状态30% | 历史交锋20% | 球队实力20% | 阵容强度15% | 主场优势10% | 外部因素5%
特殊处理: 休赛期用上赛季数据并标注;杯赛淘汰赛上调外部因素权重,近期窗口缩至5场;德比战标注"德比加成"。
场景 8: 积分榜
无 standings API。从 get_league_fixtures 重建:已完场比赛算积分(胜3/平1/负0),按积分→净胜球→进球排序。
场景 9: 主队自动识别
用户提及"我的主队/我是XX球迷/XX是我的队/关注XX"时自动执行:提取队名 → search 拿 team_id 和 league_key → 写入 profile.json → 告知用户。
场景 10: 主队快讯
从 profile.json 读主队信息,并行拉取 get_team + get_league_fixtures,筛出:最近5场(FT)、未来5场(未开始)、今天有无比赛。中文格式输出。
场景 11: (已合并至场景 6)
查询效率与限流
API 限流(重要)
LiveScore MCP 有频率限制,单次最多并行 3 个请求。收到 429 错误时告知用户等待 30 秒,不自动重试。
效率原则
- 并行无依赖调用(≤3个)
- 热门联赛直接用已知 Key,不浪费 search
- 先拿 ID 再拿详情
- Match ID 获取:
get_live_scores(最快) →get_day_fixtures→get_league_fixtures→search(最慢) - 主队 ID 缓存到 profile.json,后续零搜索开销
已知限制
| 限制 | 处理方式 |
|------|---------|
| 无原生积分榜 | 从 fixtures 重建 |
| 无新闻/预测/转会接口 | 分别用 WebFetch/本地脚本/指定数据源 |
| 联赛 Key 非标准名 | 查 references/league_keys.md 或 search |
| 时间戳 GMT | 加 tzoffset=480,标"北京时间" |
| MCP 未启用 | 自动补配置后,引导用户去「左侧边栏→专家→连接器→自定义连接器→livescore→信任」 |
| API 限流(429) | ≤3并行,收到后等30秒不自动重试 |
文件位置
| 文件 | 路径 |
|------|------|
| 技能文件 | ~/.workbuddy/skills/livescore-radar/SKILL.md |
| 用户主队 | ~/.workbuddy/skills/livescore-radar/profile.json |
| 预测脚本 | ~/.workbuddy/skills/livescore-radar/scripts/predict.py |
| 数据提取脚本 | ~/.workbuddy/skills/livescore-radar/scripts/extract_predict_input.py |
| 球队名称对照 | ~/.workbuddy/skills/livescore-radar/references/team-names.md |
| 联赛 Key 速查 | ~/.workbuddy/skills/livescore-radar/references/league_keys.md |
| 转会数据参考 | ~/.workbuddy/skills/livescore-radar/references/transfer-sources.md |
Scan to join WeChat group