Install any skill in seconds. Free to start, no credit card required.
Get Started Free →College Football (CFB) data via ESPN public endpoints — scores, standings, rosters, schedules, game summaries, play-by-play, rankings, injuries, futures, team/player stats, and news for NCAA Division I FBS. Zero config, no API keys. Use when: user asks about college football scores, standings, rankings, team rosters, schedules, game results, play-by-play, injuries, betting futures, team/player statistics, or CFB news. Don't use when: user asks about NFL (use nfl-data), college basketball (use c
.claude/skills/machina-sports-cfb-data/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 160% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -42% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 386% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 87% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 13% | 0% |
Before writing queries, consult references/api-reference.md for endpoints, conference IDs, team IDs, and data shapes.
Before first use, check if the CLI is available:
bashwhich sports-skills || pip install sports-skills
If pip install fails with a Python version error, the package requires Python 3.10+. Find a compatible Python:
bashpython3 --version # check version # If < 3.10, try: python3.12 -m pip install sports-skills # On macOS with Homebrew: /opt/homebrew/bin/python3.12 -m pip install sports-skills
No API keys required.
Prefer the CLI — it avoids Python import path issues:
bashsports-skills cfb get_scoreboard sports-skills cfb get_rankings sports-skills cfb get_standings --group=8
CRITICAL: Before calling any data endpoint, verify:
currentDate — never hardcoded.group parameter is set to the correct conference ID (see references/api-reference.md).get_teams to resolve the team ID.Derive the current year from the system prompt's date (e.g., currentDate: 2026-02-28 → current year is 2026).
season = current_year - 1. From August onward, use the current year.group parameter to filterrank field (null = unranked) on scoreboard competitors| Command | Description | |---|---| | get_scoreboard | Live/recent college football scores | | get_standings | Standings by conference (use group parameter) | | get_teams | All 750+ FBS college football teams | | get_team_roster | Full roster for a team | | get_team_schedule | Schedule for a specific team | | get_game_summary | Detailed box score and scoring plays | | get_rankings | AP Top 25, Coaches Poll, CFP rankings | | get_news | College football news | | get_play_by_play | Full play-by-play for a game | | get_win_probability | Win probability timeline for a completed game | | get_schedule | Season schedule by week | | get_injuries | Injury reports across all teams | | get_futures | Futures/odds markets (National Championship, Heisman, etc.) | | get_team_stats | Team statistical profile | | get_player_stats | Player statistical profile | | get_ncaa_scoreboard | Official NCAA scoreboard — FBS and FCS | | get_ncaa_schedule | Which weeks have games (official index) | | get_ncaa_game | Official NCAA game information | | get_ncaa_boxscore | Official NCAA box score | | get_ncaa_play_by_play | Official play-by-play with drive context | | get_ncaa_scoring_summary | Official scoring summary | | get_ncaa_schools | NCAA schools index (all divisions) |
See references/api-reference.md for full parameter lists and return shapes.
The get_ncaa_* commands read the NCAA's own endpoints (data.ncaa.com + sdataprod.ncaa.com) — coverage ESPN does not carry:
division="fcs" — ESPN's college coverage isFBS-centric.
get_ncaa_game, get_ncaa_boxscore,get_ncaa_play_by_play (with drive context), get_ncaa_scoring_summary.
get_ncaa_schools.NCAA game ids (e.g. 6306261, from get_ncaa_scoreboard) and ESPN event ids share nothing — join on game date plus team names. Football divisions are fbs/fcs (not d1-d3). Game-detail commands ride NCAA's GraphQL persisted queries, whose hashes rotate when ncaa.com redeploys; when that happens those commands say so explicitly while the scoreboard/schedule commands keep working.
Example 1: Current rankings User says: "What are the college football rankings?" Actions:
get_rankings()Result: AP Top 25, Coaches Poll, and CFP rankings with rank, previous rank, record
Example 2: Conference standings User says: "Show me SEC football standings" Actions:
currentDateget_standings(group=8, season=<derived_year>) (group 8 = SEC)Result: SEC standings with W-L records per team
Example 3: Team schedule User says: "What's Alabama's schedule this season?" Actions:
currentDateget_team_schedule(team_id="333", season=<derived_year>)Result: Alabama's full season schedule with opponent, date, score (if played)
Example 4: Weekly scores User says: "Show me this week's college football scores" Actions:
get_scoreboard()Result: All live and recent CFB games with scores and ranked status
Example 5: Heisman favorites User says: "Who's the Heisman favorite?" Actions:
get_futures(limit=10)Result: Top Heisman Trophy candidates with odds values
Example 6: Team statistics User says: "Show me Alabama's team stats" Actions:
currentDateget_team_stats(team_id="333", season_year=<derived_year>)Result: Alabama's season stats by category with value, rank, and per-game averages
get_odds~~ / ~~get_betting_odds~~ — not available. For prediction market odds, use the polymarket or kalshi skill.search_teams~~ — does not exist. Use get_teams instead.get_box_score~~ — does not exist. Use get_game_summary instead.get_player_ratings~~ — does not exist. Use get_player_stats instead.get_bcs_rankings~~ / ~~get_playoff_rankings~~ — does not exist. Use get_rankings instead.If a command is not listed in the Commands table above, it does not exist.
When a command fails, do not surface raw errors to the user. Instead:
Error: sports-skills command not found Cause: Package not installed Solution: Run pip install sports-skills
Error: No games found Cause: CFB is seasonal (August–January); off-season scoreboard will be empty Solution: Use get_rankings or get_news year-round; use get_schedule to find when the season starts
Error: Too many teams returned Cause: get_teams returns 750+ FBS teams Solution: Help users narrow down by suggesting specific team IDs from references/api-reference.md, or use ESPN URLs to look up IDs
Error: Rankings empty in off-season Cause: Rankings are only published during the season and early off-season Solution: Use get_news in the offseason; rankings resume in August
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 16,401 | 16,471 | +0% | 1 | 1 | 0% | 2,418 | 2,445 | +1% | 0 | 0 | — |
case-02 | fail→fail | 16,077 | 14,780 | -8% | 1 | 1 | 0% | 2,286 | 2,192 | -4% | 0 | 0 | — |
case-03 | pass→pass | 9,014 | 7,045 | -22% | 1 | 1 | 0% | 773 | 2,377 | +208% | 0 | 0 | — |
case-04 | fail→pass | 11,449 | 8,629 | -25% | 1 | 1 | 0% | 1,018 | 2,651 | +160% | 0 | 0 | — |
case-05 | fail→pass | 26,709 | 7,453 | -72% | 1 | 1 | 0% | 3,954 | 2,312 | -42% | 0 | 0 | — |
case-06 | fail→pass | 8,350 | 9,089 | +9% | 1 | 1 | 0% | 556 | 2,702 | +386% | 0 | 0 | — |
case-07 | pass→pass | 11,451 | 10,717 | -6% | 1 | 1 | 0% | 1,156 | 2,604 | +125% | 0 | 0 | — |
case-08 | pass→pass | 7,587 | 7,904 | +4% | 1 | 1 | 0% | 432 | 2,540 | +488% | 0 | 0 | — |
case-09 | pass→pass | 11,290 | 6,804 | -40% | 1 | 1 | 0% | 653 | 2,303 | +253% | 0 | 0 | — |
case-10 | fail→pass | 12,896 | 7,554 | -41% | 1 | 1 | 0% | 1,311 | 2,447 | +87% | 0 | 0 | — |
case-11 | fail→pass | 19,759 | 8,866 | -55% | 1 | 1 | 0% | 2,222 | 2,519 | +13% | 0 | 0 | — |
case-12 | fail→pass | 16,156 | 6,682 | -59% | 1 | 1 | 0% | 1,859 | 2,299 | +24% | 0 | 0 | — |
case-13 | fail→pass | 17,277 | 6,870 | -60% | 1 | 1 | 0% | 2,233 | 2,314 | +4% | 0 | 0 | — |
case-14 | fail→pass | 18,951 | 6,787 | -64% | 1 | 1 | 0% | 2,706 | 2,323 | -14% | 0 | 0 | — |
case-15 | fail→pass | 12,092 | 7,569 | -37% | 1 | 1 | 0% | 1,068 | 2,471 | +131% | 0 | 0 | — |
case-16 | fail→pass | 17,613 | 6,904 | -61% | 1 | 1 | 0% | 2,114 | 2,239 | +6% | 0 | 0 | — |
case-17 | pass→pass | 14,728 | 8,639 | -41% | 1 | 1 | 0% | 1,656 | 2,551 | +54% | 0 | 0 | — |
case-18 | fail→pass | 29,099 | 7,231 | -75% | 1 | 1 | 0% | 999 | 2,455 | +146% | 0 | 0 | — |
case-19 | fail→pass | 7,786 | 8,121 | +4% | 1 | 1 | 0% | 1,306 | 2,608 | +100% | 0 | 0 | — |
case-20 | pass→pass | 10,919 | 9,982 | -9% | 1 | 1 | 0% | 957 | 2,720 | +184% | 0 | 0 | — |
case-21 | fail→fail | 15,775 | 18,253 | +16% | 1 | 1 | 0% | 1,874 | 2,551 | +36% | 0 | 0 | — |
case-22 | fail→pass | 17,072 | 7,901 | -54% | 1 | 1 | 0% | 1,997 | 2,565 | +28% | 0 | 0 | — |
case-23 | pass→pass | 16,385 | 7,683 | -53% | 1 | 1 | 0% | 1,920 | 2,526 | +32% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 19 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +57 percentage points is the difference between those two pass rates over the 19 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/11/2026 | — |
| gemini-3.6-flash | verified | 8/4/2026 | — |
Other measured skills in the registry, with their headline benchmark lift.