skills/football-data/SKILL.md
Football (soccer) data across 13 leagues — standings, schedules, match stats, xG, transfers, player profiles. Zero config, no API keys. Covers Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS, Champions League, World Cup, Championship, Eredivisie, Primeira Liga, Serie A Brazil, European Championship. Use when: user asks about football/soccer standings, fixtures, match stats, xG, lineups, player values, transfers, injury news, league tables, daily fixtures, or player profiles. Don't use when: user asks about American football/NFL (use nfl-data), college football (use cfb-data), NBA (use nba-data), WNBA (use wnba-data), college basketball (use cbb-data), NHL (use nhl-data), MLB (use mlb-data), tennis (use tennis-data), golf (use golf-data), Formula 1 (use fastf1), or betting odds (use polymarket or kalshi). Don't use for live/real-time scores — data updates post-match. Don't use get_season_leaders or get_missing_players for non-Premier League leagues (they return empty). Don't use get_event_xg for leagues outside the top 5 (EPL, La Liga, Bundesliga, Serie A, Ligue 1).
npx skillsauth add aaaaqwq/claude-code-skills football-dataInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Before first use, check if the CLI is available:
which sports-skills || pip install sports-skills
If pip install fails (package not found or Python version error), install from GitHub:
pip install git+https://github.com/machina-sports/sports-skills.git
The package requires Python 3.10+. If your default Python is older, use a specific version:
python3 --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:
sports-skills football get_daily_schedule
sports-skills football get_season_standings --season_id=premier-league-2025
Python SDK (alternative):
from sports_skills import football
standings = football.get_season_standings(season_id="premier-league-2025")
schedule = football.get_daily_schedule()
Derive the current year from the system prompt's date (e.g., currentDate: 2026-02-16 → current year is 2026).
get_current_season(competition_id="...") to get the active season_id. Do NOT guess or hardcode the year.{league-slug}-{year} (e.g., "premier-league-2025" for the 2025-26 season). The year is the start year of the season, not the end year.get_current_season(competition_id="mls") — don't assume MLS follows European calendar.get_current_season() or from the system date.Not all data is available for every league. Use the right command for the right league.
| Command | All 13 leagues | Top 5 only | PL only | |---------|:-:|:-:|:-:| | get_season_standings | x | | | | get_daily_schedule | x | | | | get_season_schedule | x | | | | get_season_teams | x | | | | search_team | x | | | | get_team_schedule | x | | | | get_team_profile | x | | | | get_event_summary | x | | | | get_event_lineups | x | | | | get_event_statistics | x | | | | get_event_timeline | x | | | | get_current_season | x | | | | get_competitions | x | | | | get_event_xg | | x | | | get_event_players_statistics (with xG) | | x | | | get_season_leaders | | | x | | get_missing_players | | | x |
Top 5 leagues (Understat): EPL, La Liga, Bundesliga, Serie A, Ligue 1.
PL only (FPL): Premier League — injury news, player stats, ownership, ICT index.
All leagues: via ESPN — scores, standings, schedules, match summaries, lineups, team stats.
Transfermarkt: Works for any player with a tm_player_id — market values and transfer history.
Note: MLS uses a different season structure (spring-fall calendar). Use get_current_season(competition_id="mls") to detect the right season_id.
{league-slug}-{year} e.g. "premier-league-2025", "la-liga-2025""premier-league", "serie-a", "champions-league""359" (Arsenal), "86" (Real Madrid)"740847""433177" (Saka), "342229" (Mbappe)Detect current season for a competition. Works for all leagues.
competition_id (str, required): Competition slugReturns data.competition and data.season:
{"competition": {"id": "premier-league", "name": "Premier League"}, "season": {"id": "premier-league-2025", "name": "2025-26 English Premier League", "year": "2025"}}
List available competitions with current season info. No params. Works for all leagues.
Returns data.competitions[] with id, name, code, current_season.
Get available seasons for a competition. Works for all leagues.
competition_id (str, required): Competition slugGet full season match schedule. Works for all leagues.
season_id (str, required): Season slug (e.g., "premier-league-2025")Returns data.schedules[] — same shape as events below.
Get league table for a season. Works for all leagues.
season_id (str, required): Season slugReturns data.standings[].entries[]:
{
"position": 1,
"team": {"id": "359", "name": "Arsenal", "short_name": "Arsenal", "abbreviation": "ARS", "crest": "https://..."},
"played": 26, "won": 17, "drawn": 6, "lost": 3,
"goals_for": 50, "goals_against": 18, "goal_difference": 32, "points": 57
}
Get top scorers/leaders for a season. Premier League only (via FPL).
season_id (str, required): Season slug (must be premier-league-*)Returns data.leaders[] — note: player name is nested under .player.name:
{
"player": {"id": "223094", "name": "Erling Haaland", "first_name": "Erling", "last_name": "Haaland", "position": "Forward"},
"team": {"id": "43", "name": "Man City"},
"goals": 22, "assists": 6, "penalties": 0, "played_matches": 25
}
Returns empty for non-PL leagues.
Get teams in a season. Works for all leagues.
season_id (str, required): Season slugSearch for a team by name across all leagues (or a specific one). Uses fuzzy matching.
query (str, required): Team name to search (e.g., "Corinthians", "Barcelona", "Man Utd")competition_id (str, optional): Limit search to one league (e.g., "serie-a-brazil", "premier-league")Returns data.results[] with team, competition, and season for each match:
{"team": {"id": "874", "name": "Corinthians"}, "competition": {"id": "serie-a-brazil", "name": "Serie A Brazil"}, "season": {"id": "serie-a-brazil-2025", "year": "2025"}}
Get basic team info (name, crest, venue). Does not return squad/roster — use get_season_leaders to find PL player IDs, then get_player_profile for individual player data.
team_id (str, required): ESPN team IDleague_slug (str, optional): League hint (faster resolution)Returns data.team and data.venue. data.players[] is empty — see "Deep dive on a PL team" example below for the recommended workflow.
Get all matches for a specific date across all leagues.
date (str, optional): Date in YYYY-MM-DD format. Defaults to today.Returns data.date and data.events[]:
{
"id": "748381", "status": "not_started", "start_time": "2026-02-16T20:00Z",
"competition": {"id": "la-liga", "name": "La Liga"},
"season": {"id": "la-liga-2025", "year": "2025"},
"venue": {"name": "Estadi Montilivi", "city": "Girona"},
"competitors": [
{"team": {"id": "9812", "name": "Girona", "abbreviation": "GIR"}, "qualifier": "home", "score": 0},
{"team": {"id": "83", "name": "Barcelona", "abbreviation": "BAR"}, "qualifier": "away", "score": 0}
],
"scores": {"home": 0, "away": 0}
}
Status values: "not_started", "live", "halftime", "closed", "postponed".
Get match summary with scores. Works for all leagues.
event_id (str, required): Match/event IDReturns data.event (same shape as daily schedule events).
Get match lineups. Works for all leagues (when available from ESPN).
event_id (str, required): Match/event IDReturns data.lineups[]:
{
"team": {"id": "364", "name": "Liverpool", "abbreviation": "LIV"},
"qualifier": "home",
"formation": "4-3-3",
"starting": [{"id": "275599", "name": "Caoimhín Kelleher", "position": "Goalkeeper", "shirt_number": 1}],
"bench": [{"id": "...", "name": "...", "position": "...", "shirt_number": 62}]
}
Get match team statistics. Works for all leagues.
event_id (str, required): Match/event IDReturns data.teams[]:
{
"team": {"id": "244", "name": "Brentford"},
"qualifier": "home",
"statistics": {"ball_possession": "40.8", "shots_total": "10", "shots_on_target": "3", "fouls": "12", "corners": "4"}
}
Get match timeline/key events (goals, cards, substitutions). Works for all leagues.
event_id (str, required): Match/event IDReturns data.timeline[] with goal, card, and substitution events.
Get schedule for a specific team — includes both past results and upcoming fixtures. Works for all leagues.
team_id (str, required): ESPN team IDleague_slug (str, optional): League hint (faster resolution)season_year (str, optional): Season year filtercompetition_id (str, optional): Filter results to a single competition (e.g., "serie-a-brazil", "premier-league")UNAVAILABLE — requires licensed data. Do not call this command; it will return empty results. Instead, use get_team_schedule for both teams and filter overlapping matches manually.
team_id (str, required): First team IDteam_id_2 (str, required): Second team IDGet expected goals (xG) data from Understat. Top 5 leagues only: EPL, La Liga, Bundesliga, Serie A, Ligue 1. Returns empty for other leagues.
event_id (str, required): Match/event IDReturns data.teams[] and data.shots[]:
{"team": {"id": "244", "name": "Brentford"}, "qualifier": "home", "xg": 1.812}
data.shots[] contains individual shot data with xG per shot. Note: very recent matches (last 24-48h) may not be indexed on Understat yet.
Get player-level match statistics with xG enrichment. Works for all leagues (basic stats from ESPN). xG/xA enrichment only for top 5 leagues (Understat).
event_id (str, required): Match/event IDReturns data.teams[].players[]:
{
"id": "...", "name": "Bukayo Saka", "position": "Midfielder", "shirt_number": 7, "starter": true,
"statistics": {"appearances": "1", "shotsTotal": "3", "shotsOnTarget": "1", "foulsCommitted": "1", "xg": "0.45", "xa": "0.12"}
}
xg and xa fields only present for top 5 leagues.
Get injured/missing/doubtful players. Premier League only (via FPL). Returns empty for other leagues.
season_id (str, required): Season slug (must be premier-league-*)Returns data.teams[].players[]:
{
"id": "463748", "name": "Mikel Merino Zazón", "web_name": "Merino",
"position": "Midfielder", "status": "injured",
"news": "Foot injury - Unknown return date",
"chance_of_playing_this_round": 0, "chance_of_playing_next_round": 0
}
Status values: "injured", "unavailable", "doubtful", "suspended".
Get transfer history for specific players via Transfermarkt. Works for any league.
season_id (str, required): Season slug (used to filter transfers by year)tm_player_ids (list, required): Transfermarkt player IDsReturns data.transfers[]:
{
"player_tm_id": "433177", "date": "2019-07-01", "season": "19/20",
"from_team": {"name": "Arsenal U23", "image": "https://..."},
"to_team": {"name": "Arsenal", "image": "https://..."},
"fee": "-", "market_value": "-"
}
Get player season stats via ESPN overview endpoint. Works for any league with ESPN athlete IDs.
player_id (str, required): ESPN athlete IDleague_slug (str, optional): League slug hint (e.g., "eng.1", "esp.1"). Defaults to auto-detect.Returns season stats (goals, assists, appearances, etc.) and game log when available.
Get player profile. Works for any player if you have their Transfermarkt or FPL ID. At least one ID required.
fpl_id (str, optional): FPL player ID (PL players only)tm_player_id (str, optional): Transfermarkt player ID (any league)With tm_player_id, returns data.player with:
{
"market_value": {"value": 130000000, "currency": "EUR", "formatted": "€130.00m", "date": "09/12/2025", "age": "24", "club": "Arsenal FC"},
"market_value_history": [{"value": 7000000, "formatted": "€7.00m", "date": "23/09/2019", "club": "Arsenal FC"}],
"transfer_history": [
{"player_tm_id": "433177", "date": "2019-07-01", "season": "19/20", "from_team": {"name": "Arsenal U23"}, "to_team": {"name": "Arsenal"}, "fee": "-"}
]
}
With fpl_id, also includes data.player.fpl_data with FPL stats (points, form, ICT index, ownership, etc.).
Premier League, La Liga, Bundesliga, Serie A, Ligue 1, MLS, Championship, Eredivisie, Primeira Liga, Serie A Brazil, Champions League, European Championship, World Cup.
| Source | What it provides | League coverage | |--------|-----------------|-----------------| | ESPN | Scores, standings, schedules, lineups, match stats, timelines | All 13 leagues | | openfootball | Schedules, standings, team lists (fallback when ESPN is down) | 10 leagues (all except CL, Euros, World Cup) | | Understat | xG per match, xG per shot, player xG/xA | Top 5 (EPL, La Liga, Bundesliga, Serie A, Ligue 1) | | FPL | Top scorers, injuries, player stats, ownership | Premier League only | | Transfermarkt | Market values, transfer history | Any player (requires tm_player_id) |
For licensed data with full coverage across all sports (Sportradar, Opta, Genius Sports), see Machina Sports.
User: "Show me the Premier League table"
get_current_season(competition_id="premier-league") to get the current season_idget_season_standings(season_id=<season_id from step 1>)User: "How did Arsenal vs Liverpool go?"
get_daily_schedule() or get_team_schedule(team_id="359") to find the event_idget_event_summary(event_id="...") for the scoreget_event_statistics(event_id="...") for possession, shots, etc.get_event_xg(event_id="...") for xG comparison (EPL — top 5 only)User: "Deep dive on Chelsea's recent form"
search_team(query="Chelsea") → team_id=363, competition=premier-leagueget_team_schedule(team_id="363", competition_id="premier-league") → find recent closed eventsget_event_xg(event_id="...") for xG comparison and shot mapget_event_statistics(event_id="...") for possession, shots, passesget_event_players_statistics(event_id="...") for individual player xG/xAget_missing_players(season_id=<season_id>) → filter Chelsea's injured/doubtful playersget_season_leaders(season_id=<season_id>) → filter Chelsea players, get their FPL IDsget_player_profile(fpl_id="...", tm_player_id="...") for key players — combine FPL stats (form, ownership, ICT) with Transfermarkt data (market value, transfer history)User: "What's Saka's market value?"
get_player_profile(tm_player_id="433177") for Transfermarkt datafpl_id for FPL stats if Premier League playerUser: "Tell me about Corinthians"
search_team(query="Corinthians") → team_id=874, competition=serie-a-brazilget_team_schedule(team_id="874", competition_id="serie-a-brazil") for fixturesget_event_timeline(event_id="...") for goals, cards, subsWhen a command fails (wrong event_id, missing data, network error, etc.), do not surface the raw error to the user. Instead:
get_daily_schedule() or get_team_schedule() to discover the correct ID. If ESPN is down, openfootball data may still be available via get_season_standings or get_season_schedule.This is especially important when the agent is responding through messaging platforms (Telegram, Slack, etc.) where raw exec failures look broken.
These are the ONLY valid commands. Do not invent or guess command names:
get_current_seasonget_competitionsget_competition_seasonsget_season_scheduleget_season_standingsget_season_leadersget_season_teamssearch_teamget_team_profileget_daily_scheduleget_event_summaryget_event_lineupsget_event_statisticsget_event_timelineget_team_scheduleget_head_to_headget_event_xgget_event_players_statisticsget_missing_playersget_season_transfersget_player_profileget_player_season_statsCommands that DO NOT exist (commonly hallucinated):
get_standings~~ — the correct command is get_season_standings (requires season_id).get_live_scores~~ — not available. Use get_daily_schedule() for today's matches; status field shows "live" for in-progress games.get_team_squad~~ / ~~get_team_roster~~ — get_team_profile does NOT return players. Use get_season_leaders for PL player IDs, then get_player_profile for individual data.get_transfers~~ — the correct command is get_season_transfers (requires season_id + tm_player_ids).get_match_results~~ / ~~get_match~~ — use get_event_summary with an event_id.get_player_stats~~ — use get_event_players_statistics for match-level stats, or get_player_profile for career data.Other common mistakes:
get_season_leaders or get_missing_players on non-PL leagues — they return empty. Check the Data Coverage table.get_event_xg on leagues outside the top 5 — returns empty. Only works for EPL, La Liga, Bundesliga, Serie A, Ligue 1.team_id or event_id instead of discovering them via search_team, get_daily_schedule, or get_season_schedule.If you're unsure whether a command exists, check this list. Do not try commands that aren't listed above.
sports-skills command not found: Package not installed. Run pip install sports-skills. If the package is not found on PyPI, install from GitHub: pip install git+https://github.com/machina-sports/sports-skills.git. Requires Python 3.10+ — see Setup section.ModuleNotFoundError: No module named 'sports_skills': Same as above — install the package. Prefer the CLI over Python imports to avoid path issues.get_season_leaders and get_missing_players only return data for Premier League. They silently return empty for other leagues — check the Data Coverage table.get_team_profile returns empty players: This is expected — squad rosters are not available. To get player data for a PL team, use get_season_leaders to find players and their FPL IDs, then get_player_profile(fpl_id="...") for detailed stats. For Transfermarkt data, you need the player's tm_player_id.get_season_leaders(season_id="premier-league-2025") to discover FPL IDs for PL players. Transfermarkt IDs must be looked up on transfermarkt.com — the ID is the number at the end of the player's URL. Well-known examples: Cole Palmer = 568177, Bukayo Saka = 433177, Mbappe = 342229.get_event_xg returns empty for a recent top-5 match, try again later.{league-slug}-{year} e.g. "premier-league-2025". Not "2025-2026", not "EPL-2025". Use get_current_season() to discover the correct format.search_team(query="team name") to find team IDs by name, or get_season_teams to list all teams in a season. Use get_daily_schedule or get_season_schedule to find event IDs. IDs are ESPN numeric strings.testing
通用自媒体文章自动发布工具。支持百家号、搜狐号、知乎、微信公众号、小红书、抖音号六个平台的自动化发布流程。使用Playwright自动化实现平台导航和发布,支持通过storageState管理Cookie实现账号切换。
development
# SKILL.md - Model Configuration Status (mcstatus) ## 触发条件 - `/mcstatus` 命令 - 用户询问模型配备、模型配置、model status、模型列表等 ## 功能 实时生成 Agent + Cron 的模型配置报告,展示当前所有 agent 的主模型/fallback链和所有 cron 任务的模型分配。 ## 执行步骤 ### Step 1: 收集 Agent 模型配置 读取各 agent 的 models.json 获取主模型和 fallback 链: ```bash for agent in main ops code quant data research content market finance pm law product sales batch; do config=$(cat ~/.openclaw/agents/$agent/agent/models.json 2>/dev/null) if [ -n "$config" ]; then echo "=== $agent
tools
MCP 服务器智能管理助手。自动检测 MCP 可用性、智能开关、功能问答,提供人性化的 MCP 管理体验。
tools
从GitHub搜索并自动安装配置MCP(Model Context Protocol)服务器工具到Claude配置文件。当用户需要安装MCP工具时触发此技能。工作流程:搜索GitHub上的MCP项目 -> 提取npx配置 -> 添加到~/.claude.json -> 处理API密钥(如有)。