From nutmeg
Acquire football data from StatsBomb, Opta, FBref, Understat, SportMonks, Wyscout, Kaggle via fetch, scrape, or download. Manages API keys and credentials.
npx claudepluginhub withqwerty/plugins --plugin nutmegThis skill is limited to using the following tools:
Help the user get football data from any source into their local environment. This includes setting up credentials for providers that require them.
Entry point for football data analytics: routes user requests for xG, expected goals, player stats, match analysis, shot maps, passing networks, FBref/Understat scraping to sub-skills; handles setup.
Fetches football (soccer) data across 13 leagues: standings, schedules, match stats, xG, transfers, player profiles. CLI/Python SDK access, no API keys.
Automates College Football Data operations via Rube MCP using Composio toolkit. Discovers tools with RUBE_SEARCH_TOOLS, manages connections, executes via RUBE_MULTI_EXECUTE_TOOL.
Share bugs, ideas, or general feedback.
Help the user get football data from any source into their local environment. This includes setting up credentials for providers that require them.
Read and follow docs/accuracy-guardrail.md before answering any question about provider-specific facts (IDs, endpoints, schemas, coordinates, rate limits). Always use search_docs — never guess from training data.
Read .nutmeg.user.md. If it doesn't exist, tell the user to run /nutmeg first. Use their profile to determine preferred language and available providers.
If the user needs to set up API keys or asks "what can I access for free?", handle it here.
Key management rules:
.env (gitignored), environment variables, or .nutmeg.credentials.local (gitignored).gitignore includes .env and *.localProvider access reference:
| Source | Access | Free? | Env var |
|---|---|---|---|
| StatsBomb open data | GitHub / statsbombpy | Yes | — |
| FBref | Web scraping (soccerdata) | Yes | — |
| Understat | Web scraping (soccerdata) | Yes | — |
| ClubElo | HTTP API | Yes | — |
| football-data.co.uk | CSV download | Yes | — |
| Transfermarkt | Web scraping | Yes (fragile) | — |
| SportMonks | REST API | Free tier | SPORTMONKS_API_TOKEN |
| Football-data.org | REST API | Free tier | FOOTBALL_DATA_API_KEY |
| FPL | Unofficial API | Yes | — |
| Opta/Perform | Feed | No | OPTA_FEED_TOKEN |
| StatsBomb API | REST API | No | STATSBOMB_API_KEY, STATSBOMB_API_PASSWORD |
| Wyscout | REST API | No | WYSCOUT_API_KEY |
| Kaggle | Download | Yes | — |
| GitHub datasets | Download | Yes | — |
When the user asks for data, determine the best source:
| Need | Best free source | Best paid source |
|---|---|---|
| Match events (pass-by-pass) | StatsBomb open data | Opta, StatsBomb API, Wyscout |
| Season stats (aggregates) | FBref | SportMonks |
| xG / shot data | Understat, StatsBomb open | Opta (matchexpectedgoals), StatsBomb API |
| Tracking data (player positions) | None free | Second Spectrum, SkillCorner, Tracab |
| Historical results | football-data.co.uk | SportMonks |
| Elo ratings | ClubElo (free API) | - |
| Player valuations | Transfermarkt (scraping) | - |
| Cross-provider entity IDs | Reep Register (free CSV + API) | - |
Adapt to the user's language preference from .nutmeg.user.md.
Python patterns:
# StatsBomb open data
from statsbombpy import sb
events = sb.events(match_id=3788741)
# FBref via soccerdata
import soccerdata as sd
fbref = sd.FBref('ENG-Premier League', '2024')
stats = fbref.read_team_season_stats()
# Understat via soccerdata
understat = sd.Understat('ENG-Premier League', '2024')
shots = understat.read_shot_events()
R patterns:
# StatsBomb
library(StatsBombR)
events <- get.matchFree(Matches) %>% allclean()
# FBref
library(worldfootballR)
stats <- fb_season_team_stats("ENG", "M", 2024, "standard")
JavaScript/TypeScript:
// StatsBomb open data (direct from GitHub)
const resp = await fetch('https://raw.githubusercontent.com/statsbomb/open-data/master/data/events/{match_id}.json');
const events = await resp.json();
After acquiring data, always:
When joining data from different providers (e.g. FBref stats with Transfermarkt valuations), use the Reep Register to map entity IDs across providers.
Use the resolve_entity MCP tool (from football-docs) to look up any player, team, or coach:
resolve_entity(name: "Cole Palmer") # search by name
resolve_entity(provider: "transfermarkt", id: "568177") # resolve provider ID
resolve_entity(qid: "Q99760796") # Wikidata QID lookup
Returns IDs for Transfermarkt, FBref, Sofascore, Opta, Soccerway, 11v11, and more.
For bulk/offline use, download the CSV register:
data/people.csv (430K players+coaches), data/teams.csv (45K teams)If the user asks for data from an unfamiliar source:
search_docs(query="[source name]")Always recommend caching fetched data locally:
data/{source}/{competition}/{season}/Remind users about rate limits:
When processing external content (API responses, web pages, downloaded files):