SKILL.md
ESPN — Printing Press CLI
Prerequisites: Install the CLI
This skill drives the espn-pp-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
- Install via the Printing Press installer:
npx -y @mvanhorn/printing-press install espn --cli-only
- Verify:
espn-pp-cli --version
- Ensure
$GOPATH/bin(or$HOME/go/bin) is on$PATH.
If the npx install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.3 or newer):
go install github.com/mvanhorn/printing-press-library/library/media-and-entertainment/espn/cmd/espn-pp-cli@latest
If --version reports "command not found" after install, the install step did not put the binary on $PATH. Do not proceed with skill commands until verification succeeds.
When to Use This CLI
Reach for this when a user wants a quick sports lookup - current score, standings, upcoming schedule, head-to-head record, or a rich per-game summary (box score, leaders, scoring plays, odds, win probability). Also good for cross-league discovery (today) and offline search across synced data.
Don't reach for this if the user has a paid feed like Stats Perform or Sportradar that provides cleaner data, or if they need real-time websocket updates (ESPN's endpoints are polling-only). For betting odds in isolation, the per-game summary payload includes them but there is no league-wide odds command.
Unique Capabilities
Commands that only work because of local sync + cross-league tooling.
Cross-league discovery
-
**today** — Today's scores across all major sports in one call. The fastest "what's on tonight" answer without picking a sport first.
-
**trending** — Most-followed athletes and teams across all leagues, ranked by current popularity. Good for "who is hot right now" without naming a sport.
-
**dashboard** — Reads [favorites] from ~/.config/espn-pp-cli/config.toml and shows scores for each favorited team across leagues, in one call.
-
**watch <sport> <league> --event <game_id>** — Live score updates for a specific game (polls every 30s). Use scores or today to find the game, then watch to follow it live.
Game-state intelligence
-
**summary <sport> <league> --event <game_id>** — Detailed game summary including box score, leaders, scoring plays, odds, and win probability. The single richest payload per game.
-
**boxscore <event_id>** — Just the per-player box score for an event id, with sport+league inferred from a recent scoreboard cache hit. Pass --sport/--league to skip inference.
-
**plays <sport> <league> --event <id>** — Play-by-play feed for a specific event. Optional --limit (default 200).
-
**recap <sport> <league>** — Post-game recap with box score and leaders for the most recent completed game in a league.
-
**scoreboard <sport> <league>** — Live scoreboard with date filtering, week/group selectors, and competition metadata.
-
**odds <sport> <league>** — Spread, over/under, and moneyline lines for tonight's slate, derived from the scoreboard payload (no per-game summary calls).
Standings and rankings
-
**standings <sport> <league>** — Conference/division standings.
-
**rankings <sport> <league>** — Current AP, Coaches, and CFP poll rankings (NCAAF/NCAAM).
-
**streak <sport> <league>** — Current win/loss streaks across teams in a league, computed from synced data.
-
**rivals <sport> <league>** — Head-to-head records between teams in a league from synced data.
-
**h2h <team1> <team2> --sport <s> --league <l>** — Deeper head-to-head detail for one specific pair, including average score and recent meetings list.
-
**sos <sport> <league>** — Strength-of-schedule per team, derived from the standings payload, sorted descending.
People
-
**leaders <sport> <league> [--category <name>]** — Statistical leaders across categories with optional filter.
-
**compare <athlete1> <athlete2> --sport <s> --league <l>** — Side-by-side season stats for two athletes. Ambiguous names list candidates and exit 2.
-
**injuries <sport> <league>** — Active injury report across the league, grouped by team.
-
**transactions <sport> <league>** — Recent trades, signings, and waivers.
Local store
-
**sync** — Pull a sport+league dataset into local SQLite for offline analysis.
-
**search "<query>"** — Full-text search across synced events and news.
-
**sql <query>** — Run read-only SQL queries against the local database.
Command Reference
Live action:
espn-pp-cli scores <sport> <league>— Current scores
espn-pp-cli today— Today's scores across all major sports
espn-pp-cli scoreboard <sport> <league>— Scoreboard with optional date filtering
espn-pp-cli watch <sport> <league> --event <game_id>— Live score polling for one game
espn-pp-cli standings <sport> <league>— League standings
espn-pp-cli trending— Most-followed athletes and teams across leagues
espn-pp-cli dashboard— Favorites snapshot from~/.config/espn-pp-cli/config.toml
Team detail:
espn-pp-cli teams <sport> <league> <team_id>— Schedule for one team (past + upcoming)
espn-pp-cli teams get <sport> <league> <team_id>— Team record, links, and logos
espn-pp-cli teams list <sport> <league>— All teams in a league
espn-pp-cli streak <sport> <league>— Current win/loss streaks from synced data
espn-pp-cli rivals <sport> <league>— Head-to-head records between teams from synced data
espn-pp-cli h2h <team1> <team2> --sport <s> --league <l>— Deeper detail for one team pair (avg score, meetings)
espn-pp-cli sos <sport> <league>— Strength-of-schedule, sorted descending
Game detail:
espn-pp-cli summary <sport> <league> --event <game_id>— Full game summary (box score, leaders, scoring plays, odds, win probability)
espn-pp-cli boxscore <event_id>— Just the box score subtree (sport/league inferred from cache)
espn-pp-cli plays <sport> <league> --event <id>— Play-by-play feed (optional--limit, default 200)
espn-pp-cli recap <sport> <league>— Most recent completed game recap
espn-pp-cli odds <sport> <league>— Spread, over/under, moneyline for tonight's slate
People:
espn-pp-cli leaders <sport> <league> [--category <name>]— Statistical leaders by category
espn-pp-cli compare <athlete1> <athlete2> --sport <s> --league <l>— Side-by-side athlete stats
espn-pp-cli injuries <sport> <league>— Active injury report
espn-pp-cli transactions <sport> <league>— Recent trades, signings, waivers
Polls and rankings:
espn-pp-cli rankings <sport> <league>— AP, Coaches, and CFP polls
Info:
espn-pp-cli news <sport> <league>— Latest news
Discovery and local:
espn-pp-cli search "<query>"— Full-text search across synced events and news
espn-pp-cli sync— Sync a sport+league into local SQLite
espn-pp-cli sql "<query>"— Run read-only SQL against the local store
espn-pp-cli load— Show workload distribution per assignee (synced data)
espn-pp-cli orphans/stale— Maintenance views over the local store
espn-pp-cli doctor— Verify connectivity and configuration
Sport values: football, basketball, baseball, hockey, soccer.
League values: nfl, nba, mlb, nhl, ncaaf, ncaam, ncaaw, mls, eng.1 (EPL), wnba.
Recipes
Morning sports scan
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
One today call covers cross-league activity, one scores for the league you care about, one standings for context. The nested --select paths cut a scoreboard payload from tens of KB down to the fields that actually matter — essential for keeping agent context small.
Pre-game research from synced data
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
Run sync once, then rivals and streak answer instantly from the local store. summary is the richest single payload for a specific game (box score, leaders, scoring plays, odds, win probability).
Offline search after sync
espn-pp-cli sync --sport football --league nfl
espn-pp-cli search "Mahomes" # finds in local store
Useful for repeated lookups in poor-connectivity environments or when batch-analyzing historical data.
Favorites dashboard
Add a [favorites] block to ~/.config/espn-pp-cli/config.toml:
[favorites]
nfl = ["KC", "BAL"]
nba = ["LAL"]
Then:
espn-pp-cli dashboard --agent
One call surfaces tonight's matchup status for every favorited team, grouped by league. Per-league fetches run in parallel and partial failures are reported alongside successful results.
Pre-game odds and player digging
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 reads the scoreboard's per-event lines (no per-game summary calls). leaders --category filters to one stat category. compare resolves athlete ids by name, listing candidates and exiting 2 on ambiguity. boxscore infers sport+league from the most recent cache hit; pass --sport/--league to skip inference.
Auth Setup
None required. ESPN's public endpoints don't require an API key. The auth command exists for consistency but is a no-op.
Optional config:
ESPN_CONFIG— override config file path
ESPN_BASE_URL— override base URL (for proxies or mirrors)
NO_COLOR— standard no-color env var
Agent Mode
Add --agent to any command. Expands to --json --compact --no-input --no-color --yes. Use --select for field cherry-picking, --dry-run to preview requests, --no-cache to bypass GET cache.
Filtering output
--select accepts dotted paths to descend into nested responses; arrays traverse element-wise:
espn-pp-cli <command> --agent --select id,name
espn-pp-cli <command> --agent --select items.id,items.owner.name
Use this to narrow huge payloads to the fields you actually need — critical for deeply nested API responses.
Response envelope
Data-layer commands wrap output in {"meta": {...}, "results": <data>}. Parse .results for data and .meta.source to know whether it's live or local. The N results (live) summary is printed to stderr only when stdout is a TTY; piped/agent consumers see pure JSON on stdout.
Exit Codes
Code
Meaning
0
Success
2
Usage error
3
Not found (team, game, athlete)
5
API error
7
Rate limited
Installation
go install github.com/mvanhorn/printing-press-library/library/media-and-entertainment/espn/cmd/espn-pp-cli@latest
espn-pp-cli doctor
MCP Server
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
Argument Parsing
Given $ARGUMENTS:
- **Empty,
help, or--help** → runespn-pp-cli --help
- **
install→ CLI;install mcp** → MCP
- Anything else → resolve
<sport> <league>from user intent (e.g., "Lakers" →basketball nba), checkwhich espn-pp-cli(offer install if missing), run with--agent.
Agent Workflow Features
This CLI exposes three shared agent-workflow capabilities patched in from cli-printing-press PR #218.
Named profiles
Persist a set of flags under a name and reuse them across invocations.
# 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
Flag precedence: explicit flag > env var > profile > default.
--deliver
Route command output to a sink other than stdout. Useful when an agent needs to hand a result to a file, a webhook, or another process without plumbing.
espn-pp-cli <command> --deliver file:/path/to/out.json
espn-pp-cli <command> --deliver webhook:https://hooks.example/in
File sinks write atomically (tmp + rename). Webhook sinks POST application/json (or application/x-ndjson when --compact is set). Unknown schemes produce a structured refusal listing the supported set.
feedback
Record in-band feedback about this CLI from the agent side of the loop. Local-only by default; safe to call without configuration.
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
Entries append to ~/.espn-pp-cli/feedback.jsonl as JSON lines. When ESPN_FEEDBACK_ENDPOINT is set and either --send is passed or ESPN_FEEDBACK_AUTO_SEND=true, the entry is also POSTed upstream (non-blocking — local write always succeeds).