关于 pp-espn
pp-espn 是围绕 ESPN 数据的命令行技能,供 Agent 查询多项体育赛事、球队与运动员信息。它结合跨联赛查询和本地 SQLite 同步,支持离线搜索与分析。
主要功能
- 01跨联赛今日赛况与热门趋势
- 02比赛摘要、比分与逐回合记录
- 03排名、球员数据及伤病查询
- 04同步至本地 SQLite 并离线搜索
- 05只读 SQL 查询本地数据
适用场景
- 01快速查看今日各联赛赛况
- 02研究比赛赔率、数据与胜率
- 03离线搜索已同步的赛事和新闻
MCP 相关
README 提供独立的 espn-pp-mcp 安装和 Claude MCP 注册方式。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mvanhorn/ printing-press-library --skill pp-espn安装后在 Claude Code 中输入/pp-espn确认已加载。
详细介绍
ESPN — Printing Press CLI
前提条件:安装 CLI
此技能使用 espn-pp-cli 二进制文件。调用此技能中的任何命令前,必须确认 CLI 已安装。 如果尚未安装,请先安装:
- 使用 Printing Press 安装程序安装。在 macOS/Linux 上,二进制文件默认安装到
$HOME/.local/bin;在 Windows 上,默认安装到%LOCALAPPDATA%\Programs\PrintingPress\bin:npx -y @mvanhorn/printing-press-library install espn --cli-only - 验证:
espn-pp-cli --version - 确保报告的安装目录位于将调用此技能的 Agent/运行时的
$PATH中。
如果 npx 安装失败(没有 Node、处于离线状态等),请改用直接通过 Go 安装的方式(需要 Go 1.26.6 或更高版本):
go install github.com/mvanhorn/printing-press-library/library/media-and-entertainment/espn/cmd/espn-pp-cli@latest
如果安装后 --version 报告 "command not found",则运行时无法在 $PATH 中找到二进制文件目录。验证成功前,请勿执行此技能中的命令。
何时使用此 CLI
当用户想快速查询体育信息时,请使用此 CLI,例如当前比分、排名、即将开始的赛程、交锋记录,或丰富的单场比赛摘要(技术统计、领先者、得分回合、赔率、获胜概率)。它也适用于跨联盟查询(today)和搜索已同步数据。
如果用户拥有 Stats Perform 或 Sportradar 等付费数据源(可提供更整洁的数据),或需要实时 websocket 更新(ESPN 的端点仅支持轮询),则不适合使用此 CLI。若只想查询投注赔率,单场比赛的 summary 数据中包含赔率,但没有全联盟赔率命令。
独特功能
这些命令依赖本地同步和跨联盟工具,因此只能通过此 CLI 使用。
跨联盟查询
-
today— 一次调用即可查询所有主要体育项目的今日比分。无需先选择体育项目,即可最快回答“今晚有什么比赛”。 -
trending— 显示所有联盟中当前最受关注的运动员和球队,并按当前热度排序。适合在不指定体育项目的情况下查询“现在谁最火”。 -
dashboard— 从~/.config/espn-pp-cli/config.toml读取[favorites],并通过一次调用显示各联盟中每支收藏球队的比分。 -
watch <sport> <league> --event <game_id>— 持续更新特定比赛的实时比分(每 30 秒轮询一次)。使用scores或today查找比赛,然后用watch实时关注。
比赛状态信息
-
summary <sport> <league> --event <game_id>— 详细的比赛摘要,包括技术统计、领先者、得分回合、赔率和获胜概率。每场比赛中信息最丰富的数据。 -
boxscore <event_id>— 仅显示指定事件 ID 的球员技术统计;若近期记分牌缓存命中,则自动推断体育项目和联盟。传入--sport/--league可跳过推断。 -
plays <sport> <league> --event <id>— 指定事件的逐回合数据流。可选参数--limit(默认值为 200)。 -
recap <sport> <league>— 显示该联盟最近一场已结束比赛的赛后回顾,包括技术统计和领先者。 -
scoreboard <sport> <league>— 实时记分牌,支持按日期筛选、按周/组选择,并提供赛事元数据。 -
odds <sport> <league>— 显示今晚赛程的让分、大小分和独赢赔率,数据来自记分牌,无需逐场调用摘要。
排名与榜单
-
standings <sport> <league>— 分区/赛区排名。 -
rankings <sport> <league>— 当前 AP、Coaches 和 CFP 民意调查排名(NCAAF/NCAAM)。 -
streak <sport> <league>— 显示联盟中各队当前的连胜/连败情况,根据已同步数据计算。 -
rivals <sport> <league>— 显示联盟中球队之间的交锋记录,数据来自已同步数据。 -
h2h <team1> <team2> --sport <s> --league <l>— 深入展示指定两支球队的交锋详情,包括平均比分和近期交锋列表。 -
sos <sport> <league>— 根据排名数据,为各队计算赛程强度并按降序排列。
球员与人员
-
leaders <sport> <league> [--category <name>]— 查看各类别的统计领先者,可选筛选条件。 -
compare <athlete1> <athlete2> --sport <s> --league <l>— 并排比较两位运动员的赛季数据。若姓名不明确,将列出候选项并以退出码 2 结束。 -
injuries <sport> <league>— 查看联盟内各球队的现役伤病报告。 -
transactions <sport> <league>— 查看近期交易、签约和弃用球员信息。
本地存储
-
sync— 将某项运动和联盟的数据集拉取到本地 SQLite,以供离线分析。 -
search "<query>"— 在已同步的赛事和新闻中进行全文搜索。 -
sql <query>— 对本地数据库执行只读 SQL 查询。
命令参考
实时操作:
espn-pp-cli scores <sport> <league>— 当前比分espn-pp-cli today— 所有主要运动项目今天的比分espn-pp-cli scoreboard <sport> <league>— 记分牌,可选按日期筛选espn-pp-cli watch <sport> <league> --event <game_id>— 轮询一场比赛的实时比分espn-pp-cli standings <sport> <league>— 联盟排名espn-pp-cli trending— 各联盟中最受关注的运动员和球队espn-pp-cli dashboard— 从~/.config/espn-pp-cli/config.toml获取收藏快照
球队详情:
espn-pp-cli teams <sport> <league> <team_id>— 单支球队的赛程(已结束和即将举行)espn-pp-cli teams get <sport> <league> <team_id>— 球队战绩、链接和标志espn-pp-cli teams list <sport> <league>— 联盟中的所有球队espn-pp-cli streak <sport> <league>— 根据已同步数据查看当前连胜/连败espn-pp-cli rivals <sport> <league>— 根据已同步数据查看球队之间的交锋记录espn-pp-cli h2h <team1> <team2> --sport <s> --league <l>— 查看两支球队交锋的更多详情(平均比分、交手次数)espn-pp-cli sos <sport> <league>— 按降序排列的赛程强度
比赛详情:
espn-pp-cli summary <sport> <league> --event <game_id>— 完整比赛摘要(技术统计、领先者、得分回合、赔率、获胜概率)espn-pp-cli boxscore <event_id>— 仅查看技术统计子树(根据缓存推断运动项目/联盟)espn-pp-cli plays <sport> <league> --event <id>— 逐回合比赛数据流(可选--limit,默认值为 200)espn-pp-cli recap <sport> <league>— 最近一场已结束比赛的回顾espn-pp-cli odds <sport> <league>— 今晚赛程的让分、大小分和独赢盘赔率
球员与人员:
espn-pp-cli leaders <sport> <league> [--category <name>]— 按类别查看统计领先者espn-pp-cli compare <athlete1> <athlete2> --sport <s> --league <l>— 并排比较运动员数据espn-pp-cli injuries <sport> <league>— 查看现役伤病报告espn-pp-cli transactions <sport> <league>— 查看近期交易、签约和弃用球员信息
民意调查和排名:
espn-pp-cli rankings <sport> <league>— AP、教练协会和 CFP 民意调查排名
信息:
espn-pp-cli news <sport> <league>— 最新新闻
发现和本地操作:
espn-pp-cli search "<query>"— 在已同步的赛事和新闻中进行全文搜索espn-pp-cli sync— 将某项运动和联盟的数据同步到本地 SQLiteespn-pp-cli sql "<query>"— 对本地存储执行只读 SQL 查询espn-pp-cli load— 显示各受派人的工作负载分布(已同步数据)espn-pp-cli orphans/stale— 本地存储的维护视图espn-pp-cli doctor— 验证连接状态和配置
运动项目值:football、basketball、baseball、hockey、soccer。
联盟值:nfl、nba、mlb、nhl、ncaaf、ncaam、ncaaw、mls、eng.1(EPL)、wnba。
示例
晨间体育速览
espn-pp-cli today --agent --select events.shortName,events.status
espn-pp-cli scores football nfl --agent --select events.shortName,events.competitions.competitors.team.displayName,events.status.type.detail
espn-pp-cli standings football nfl --agent
一次 today 调用即可涵盖多个联盟的赛事活动,再对你关注的联盟调用一次 scores,并调用一次 standings 了解排名情况。嵌套的 --select 路径可将记分牌负载从数十 KB 缩减到仅保留真正重要的字段,这对于控制 Agent 上下文大小至关重要。
从同步数据进行赛前研究
espn-pp-cli sync --sport football --league nfl
espn-pp-cli rivals football nfl --agent # historical records from synced data
espn-pp-cli streak football nfl --agent # current streaks
espn-pp-cli summary football nfl --event <id> --agent # full game payload incl. odds and box score
运行一次 sync,之后 rivals 和 streak 就能从本地存储中即时作答。对于特定比赛,summary 能提供内容最丰富的单个数据包(技术统计、领先者、得分回合、赔率、获胜概率)。
同步后离线搜索
espn-pp-cli sync --sport football --league nfl
espn-pp-cli search "Mahomes" # finds in local store
适用于网络连接不佳时的重复查询,或批量分析历史数据。
收藏夹仪表板
在 ~/.config/espn-pp-cli/config.toml 中添加一个 [favorites] 块:
[favorites]
nfl = ["KC", "BAL"]
nba = ["LAL"]
然后:
espn-pp-cli dashboard --agent
一次调用即可按联赛分组,显示所有收藏球队今晚的对阵状态。各联赛的数据获取会并行运行;部分失败时,会与成功结果一并报告。
赛前赔率与球员查询
espn-pp-cli odds basketball nba --agent # tonight's spreads / totals / moneylines
espn-pp-cli leaders basketball nba --category points --agent
espn-pp-cli compare "LeBron James" "Stephen Curry" --sport basketball --league nba --agent
espn-pp-cli boxscore <event_id> --agent # post-game player stats
espn-pp-cli plays basketball nba --event <id> --limit 50 --agent
odds 读取比分板中的单场赛事赔率(不调用单场比赛摘要)。leaders --category 可筛选单个统计类别。compare 会按姓名解析运动员 ID,列出候选项;若存在歧义,则以状态码 2 退出。boxscore 会根据最近的缓存命中推断运动项目和联赛;传入 --sport/--league 可跳过推断。
身份验证设置
无需身份验证。 ESPN 的公共端点不需要 API 密钥。auth 命令是为保持一致性而提供的,但不执行任何操作。
可选配置:
ESPN_CONFIG— 覆盖配置文件路径ESPN_BASE_URL— 覆盖基础 URL(用于代理或镜像)NO_COLOR— 标准的禁用颜色环境变量
Agent 模式
为任意命令添加 --agent。该选项会展开为 --json --compact --no-input --no-color --yes。使用 --select 挑选字段,使用 --dry-run 预览请求,使用 --no-cache 绕过 GET 缓存。
筛选输出
--select 接受点分路径,用于深入访问嵌套响应;数组会逐元素遍历:
espn-pp-cli <command> --agent --select id,name
espn-pp-cli <command> --agent --select items.id,items.owner.name
使用此功能可将庞大的数据包缩减到你实际需要的字段——这对于深度嵌套的 API 响应至关重要。
响应封装
数据层命令会将输出封装为 {"meta": {...}, "results": <data>}。解析 .results 获取数据,并检查 .meta.source 以了解数据来自 live 还是本地。仅当 stdout 是 TTY 时,才会将 N results (live) 摘要打印到 stderr;通过管道处理的内容和 Agent 消费者在 stdout 上只会看到纯 JSON。
退出代码
| 代码 | 含义 |
|---|---|
| 0 | 成功 |
| 2 | 用法错误 |
| 3 | 未找到(球队、比赛、运动员) |
| 5 | API 错误 |
| 7 | 请求过于频繁 |
安装
go install github.com/mvanhorn/printing-press-library/library/media-and-entertainment/espn/cmd/espn-pp-cli@latest
espn-pp-cli doctor
MCP 服务
go install github.com/mvanhorn/printing-press-library/library/media-and-entertainment/espn/cmd/espn-pp-mcp@latest
claude mcp add espn-pp-mcp -- espn-pp-mcp
参数解析
给定 $ARGUMENTS:
- 空、
help或--help→ 运行espn-pp-cli --help install→ CLI;install mcp→ MCP- 其他任何内容 → 根据用户意图解析
<sport> <league>(例如,“Lakers” →basketball nba),检查which espn-pp-cli(若未找到,则提供安装选项),并使用--agent运行。
自动学习
双调用协议:发现前调用 recall,输出前调用 teach &。CLI 会执行实体感知的匹配验证,并展示与查询类别对应的已存储操作手册;你需要读取封装内容并遵循六分支决策树。跳过任一环节,都会让你失去未来会话中的免费召回命中。
步骤 1:任何发现操作前先调用 recall
针对新的用户问题,在运行 scoreboard、teams、boxscore、search、standings 或任何其他发现命令前,先运行:
espn-pp-cli recall "<user's question>" --agent
响应封装如下:
{
"query": "...",
"normalized": "game tonight",
"query_entities": ["Niners"],
"found": true | false,
"match_score": 0.0,
"results": [
{ "resource_id": "...", "resource_type": "events|news|...", "venue": "...",
"confidence": 2, "entity_match": "exact|partial|unknown",
"source": "taught|preseed|pattern", "warnings": ["..."] }
],
"mismatches": [ /* only when --debug-mismatches */ ],
"warnings": [ /* top-level */ ],
"playbook": {
"query_family": "...",
"playbook": {
"steps": [ { "cmd": "teams basketball nba {team.id}", "purpose": "..." }, ... ],
"entity_slots": ["$TEAM", "$STATS"],
"expected_tool_calls": 3
},
"slots_resolved": { "$TEAM": { "token": "pistons", "canonical": "Detroit Pistons" } },
"notes": "byathlete needs seasontype=2; categories has dup labels"
},
"notes": "byathlete needs seasontype=2; categories has dup labels"
}
步骤 2:六分支决策树
依次读取 playbook、notes、results[0] 和警告:
if Playbook present:
-> READ Playbook.notes verbatim FIRST (workarounds + gotchas the CLI surface doesn't expose)
-> replay Playbook.steps in order, substituting Playbook.slots_resolved entries
for the entity slot tokens. If a step's slot is unresolved, fall back to
discovery for that step only.
-> the Playbook's expected_tool_calls is a budget; if you find yourself running
materially more, record the divergence via teach-playbook at end-of-session.
elif Notes present (no Playbook):
-> read Notes verbatim before any discovery step; they carry known gotchas
for this query family even when no structured choreography exists yet.
elif Found AND Results[0].EntityMatch == "exact" AND Results[0].Confidence >= 2:
-> skip discovery; fetch live data for Results[*].ResourceID in parallel
(e.g., espn-pp-cli boxscore <eid> for an event, espn-pp-cli teams ... for a team)
elif Found AND Results[0].EntityMatch == "partial":
-> candidate hint, NOT a hit; read the resource title to validate before trusting
elif (any row in Mismatches[] when --debug-mismatches was passed):
-> treat as cold start; the stored learning is for a different entity
(e.g., a "Cowboys" learning won't satisfy a "Niners" query — different canonical)
else: // Found == false, no playbook, no notes
-> cold start; run discovery normally; teach the answer afterward AND record
a playbook + notes via teach --playbook-file --playbook-notes-file so the
next session of the same family is faster.
操作手册和备注与每个资源的处理路径相互独立。recall 响应可能同时包含操作手册和 Results[] 命中——两者都要使用:操作手册会告诉你要运行哪种调用流程;资源命中则会跳过特定步骤。默认跳过 mismatches;仅在调查冷启动时的意外情况时传入 --debug-mismatches。
步骤 3:始终读取 warnings
low_confidence:存在confidence<2的行。将其视为提示,而非跳过发现流程的依据。resource_not_in_store:本地存储中没有学习记录所指向的资源。匹配验证器无法对实体进行分类——直接获取并重新评估。- 顶层
no_learnings_for_query_family:表中没有高于 Jaccard 下限的行。属于纯冷启动。
步骤 4:完成回复后执行 teach &
在组装好包含赛事/球队 ID 的面向用户回复后、发出回复前,在后台触发 teach 调用。在命令末尾追加 shell &,使其立即返回,不阻塞面向用户的回复:
espn-pp-cli teach --query "<user's question>" --resource-type <events|news|teams> --resource <id1> --resource <id2>
# (append shell `&` to background it)
成功时不输出任何信息。选择最具体的资源进行学习——如果用户问“下一场 Spurs 比赛是什么时候”,而你查看球队赛程后找到了赛事 401747632,就学习该赛事 ID,而不是球队 ID。CLI 会使用预置的 entity_lookups(含别名的 NFL/NBA/MLB/MLS 球队名册,例如 Niners/49ers/SF)在回忆时进行跨别名解析,因此,以“Niners”为对象进行学习,也会自动满足今后关于“49ers”的查询。
步骤 5:如果发现过程超过 5 次调用,则记录操作手册
如果你为了回答问题运行了超过 5 次工具调用,并且发现了 CLI 未提示的变通方法(被静默丢弃的标志、未记录的参数、分页技巧、负载注意事项),请记录下来,以便下一次同类查询跳过这些发现工作。可使用两个位置:
# Common case: along with the resource teach
espn-pp-cli teach --query "<question>" --resource-type <type> --resource <id> \
--playbook-file ~/playbooks/season-recap.json \
--playbook-notes-file ~/playbooks/season-recap-notes.md
# (append shell `&` to background it)
# Standalone: notes-only or recipe-only
espn-pp-cli teach-playbook --query "<question>" \
--playbook-file ~/playbooks/season-recap.json \
--notes "byathlete needs seasontype=2; categories has dup labels"
操作手册文件为包含 steps、entity_slots、expected_tool_calls 的 JSON 文件。备注文件为记录原始注意事项的 Markdown 文件。任一字段都可以为空;但两者都为空时会被拒绝。操作手册按结构化查询类型(去除实体后)建立索引,因此,从“Warriors 如何结束赛季”得出的操作流程,也适用于 Pistons、Heat 以及所有其他同类型球队查询。
今后回忆时如果找到操作手册,请将其视为事实依据:使用 slots_resolved 替换项重放步骤,跳过操作流程中已有记录的发现工作,并在执行任何步骤前阅读 notes。
步骤 6:如果调试回复指出需要修正的内容,则执行 playbook amend &
如果你的调试协议回复指出备注或操作手册应记录的具体修正内容——例如变通方法、未记录的端点结构、过时的字段名、观察到的架构变更或空负载的回退方案——请在发出面向用户的回复前触发 playbook amend。执行方式与 teach 相同,采用即发即弃模式。
espn-pp-cli playbook amend \
--query "<exact recall query string>" \
--add-note "<your concrete correction>"
# (append shell `&` to background it)
值得补充的内容包括:你在本次会话中观察到、未来的自己会受益的行为。值得补充的示例:
- “摘要端点将响应封装在
{meta, results}中——数据位于.results.header,而非.header” - “对于球队当前未进入季后赛的运动员,compare 会返回空的
team字段” - “本赛季 byathlete 的 avgRebounds 类别索引从 general[9] 变为 general[11]”
以下内容不应写入备注:
- 针对特定年份的答案(“Curry 上一场比赛投篮 4-16”)。这是回复内容,不是学习记录。
- 操作手册已在运行时获取的球队或运动员数据。
- 只是换种说法重复现有备注的陈述。
amend 命令会在该查询类型的现有备注后追加带时间戳的标记([amend YYYY-MM-DDTHH:MMZ]: <text>)。多次 amend 会累积,并保留可见的审计记录。如果该查询类型尚无操作手册,amend 会创建一个仅包含备注的操作手册(因此,冷启动时发现的修正也会被记录下来)。
示例
-
冷启动:“马刺队下一场比赛是什么时候?” —
recall返回found=false。遍历球队比分板,找到马刺队下一场即将举行的赛事 ID,然后作答。记录该赛事:espn-pp-cli recall "when's next Spurs game?" --agent # found=false -> discovery espn-pp-cli teams basketball nba 24 --agent --select events.id,events.shortName,events.date # ...answer "Tue May 26 SA @ OKC, event 401747632"... espn-pp-cli teach --query "when's next Spurs game?" --resource-type events --resource 401747632 # (append shell `&` to background it) -
已学习:“今晚的 49 人队比赛” —
recall返回found=true、results[0].entity_match="exact"、results[0].confidence>=2。跳过发现步骤,直接获取比赛数据:espn-pp-cli recall "Niners game tonight" --agent # found=true, results=[{resource_id: "401547432", entity_match: "exact"}] espn-pp-cli boxscore 401547432 --agent -
跨别名命中:“今晚的 49 人队比赛” — 从未直接记录过。
recall通过 entity_lookups(nfl_team 类型)将“49ers”解析为规范实体“San Francisco 49ers”,找到“今晚的 Niners 比赛”这条学习记录(规范实体相同),返回found=true。跳过发现步骤。 -
实体不匹配:“今晚的牛仔队比赛” — 在非实体词元(
game、tonight)上,高于 Jaccard 阈值的 Niners 学习记录,但实体规范名称不同(Dallas Cowboys ≠ San Francisco 49ers)。该记录被归入mismatches;recall返回found=false。按冷启动处理。
循环中断时:learnings list --warnings 会显示本地问题;espn-pp-cli feedback "<what tripped you up>" 会记录遇到的障碍,以便下一次输出修复。
Agent 工作流功能
此 CLI 提供了三项共享的 Agent 工作流能力,这些能力移植自 cli-printing-press PR #218。
命名配置文件
将一组选项保存在名称下,并在多次调用中重复使用。
# Save the current non-default flags as a named profile
espn-pp-cli profile save <name>
# Use a profile — overlays its values onto any flag you don't set explicitly
espn-pp-cli --profile <name> <command>
# List / inspect / remove
espn-pp-cli profile list
espn-pp-cli profile show <name>
espn-pp-cli profile delete <name> --yes
选项优先级:显式选项 > 环境变量 > 配置文件 > 默认值。
--deliver
将命令输出路由到 stdout 以外的目标。当 Agent 需要将结果交给文件、Webhook 或其他进程而无需处理数据传递时,此功能很有用。
espn-pp-cli <command> --deliver file:/path/to/out.json
espn-pp-cli <command> --deliver webhook:https://hooks.example/in
文件目标会以原子方式写入(临时文件 + 重命名)。Webhook 目标会发送 POST 请求,内容类型为 application/json(设置 --compact 时为 application/x-ndjson)。未知方案会返回结构化拒绝信息,并列出受支持的方案。
feedback
从 Agent 端的工作循环中记录对此 CLI 的内联反馈。默认仅在本地记录,无需配置即可安全调用。
espn-pp-cli feedback "what surprised you or tripped you up"
espn-pp-cli feedback list # show local entries
espn-pp-cli feedback clear --yes # wipe
条目会以 JSON 行的形式追加到 ~/.espn-pp-cli/feedback.jsonl。设置 ESPN_FEEDBACK_ENDPOINT 且传入 --send 或设置 ESPN_FEEDBACK_AUTO_SEND=true 时,该条目也会通过 POST 请求发送到上游(不会阻塞——本地写入始终会成功)。