MLB Statcast
Get pitch-by-pitch Statcast data, expected stats, pitch arsenals, and advanced metrics for any MLB player, team, or season. Wraps the statcast MCP server (installed via pip install statcast-mcp).
When to use
Use this skill whenever the user asks about:
- An MLB player’s Statcast metrics (exit velocity, barrel rate, launch angle, sprint speed, etc.)
- Expected stats (xBA, xSLG, xwOBA) vs actual performance
- A pitcher’s arsenal (fastball, slider, changeup, etc.) and performance by pitch type
- Matchup analysis (batter vs a specific pitch type)
- League leaderboards (EV, barrel%, sprint speed, OAA)
- MLB standings or team-level season stats
- Defensive metrics (Outs Above Average)
If the question can be answered with traditional box-score stats only, prefer wikipedia or a web search. This skill is for advanced, Statcast-derived numbers.
Quick Usage
# Player ID lookup (always do this first for new players)
mcporter call statcast.player_lookup "player_name=Shohei Ohtani"
# Batter percentile ranks (note: param is `year`, not `season`)
mcporter call statcast.batter_percentile_ranks "player_name=Aaron Judge" "year=2025"
# Pitcher arsenal stats (param is `year`)
mcporter call statcast.statcast_pitcher_arsenal_stats "player_name=Paul Skenes" "year=2025"
# Expected stats for a custom group (param is `year`)
mcporter call statcast.expected_stats_batch "player_names=[\"Judge\",\"Ohtani\",\"Soto\"]" "year=2025"
# Standings (param is `year`)
mcporter call statcast.team_standings "year=2025"
# Pitch-level data for a single game
mcporter call statcast.statcast_search "start_date=2025-06-15" "end_date=2025-06-15" "team=NYY"
Tools (24 total)
Identity
player_lookup — Look up MLBAM ID + alternate IDs (FanGraphs, Baseball-Reference, Retro) for a player
team_standings — Current/season MLB division standings
Pitch-level data (date-range)
statcast_search — All pitches in a date range (optionally filtered by team)
statcast_batter — All pitches seen by a specific batter
statcast_pitcher — All pitches thrown by a specific pitcher
Season-level actual stats (FanGraphs)
season_batting_stats / season_pitching_stats — full-season traditional stats
batting_stats_date_range / pitching_stats_date_range — same metrics over a custom window
team_season_batting_stats / team_season_pitching_stats — full-roster team totals
Expected stats (Statcast)
statcast_batter_expected_stats / statcast_pitcher_expected_stats — xBA, xSLG, xwOBA for a player
expected_stats_batch — same, but for many players in one call (cheaper)
Pitch arsenals
statcast_batter_pitch_arsenal — hitter’s outcomes split by incoming pitch type
statcast_pitcher_pitch_arsenal — all pitchers’ pitch mix + outcomes
statcast_pitcher_arsenal_stats — performance (BA/SLG/wOBA/Whiff%/K%/Hard-Hit%) by pitch type for one pitcher
Batted-ball quality
statcast_batter_exitvelo_barrels — hitter EV + barrel% leaderboard
statcast_pitcher_exitvelo_barrels — pitcher EV-allowed + barrel%-allowed
League leaderboards & percentiles
batter_percentile_ranks — hitter percentile vs the league (EV, barrel%, xwOBA, sprint speed, etc.) — param: year
pitcher_percentile_ranks — pitcher percentile vs the league (spin, whiff%, xERA, K%, etc.) — param: year
sprint_speed_leaderboard — top sprinters (param: year)
outs_above_average — OAA leaderboard by position (param: year, position)
outfield_directional_oaa — outfield OAA split by direction
Workflow: how agents should use this
- Resolve IDs first. For any new player, call
player_lookup to get the MLBAM ID. Some downstream tools are stricter about exact names; a player_lookup confirms spelling and years active.
- Prefer batch tools.
expected_stats_batch over multiple statcast_batter_expected_stats calls.
- Keep date ranges short for
statcast_search / statcast_batter / statcast_pitcher. The upstream API is slow on long windows. 1–5 days is ideal; a full month can take 30+ seconds.
- Use last names with care. Substring matching is loose —
player_lookup("Trout") works, but uncommon names may return multiple candidates. Always check the response.
- Cross-check with Wikipedia for biographical context (career milestones, awards, draft info). The
wikipedia MCP is the right companion tool.
Naming & spelling gotchas
- For
player_lookup use player_name="Ohtani" (last name only). The matcher is substring + last-name, and full first+last can over-match.
- For downstream tools like
batter_percentile_ranks / pitcher_percentile_ranks / statcast_pitcher_arsenal_stats, use the full name ("Aaron Judge", not "Judge") — those tools reject single-name lookups.
- For “Joe Green”-style common names,
player_lookup may return multiple candidates — read the response and disambiguate by mlb_played_first / mlb_played_last years.
- Pitcher/hitter ambiguity: if
player_lookup returns a pitcher when you wanted a hitter (or vice versa), pass the full name in Last, First form to disambiguate.
Installation (Universal)
1. Install the MCP server
pip install statcast-mcp
This gives you the statcast-mcp command. The server uses pybaseball under the hood (no API key needed — it pulls from public Baseball Savant / FanGraphs endpoints).
2. Register the server with mcporter
Add to your mcporter.json:
{
"mcpServers": {
"statcast": {
"command": "statcast-mcp"
}
}
}
3. Verify
mcporter call statcast.player_lookup "player_name=Aaron Judge"
You should see Judge’s MLBAM ID (592450) and active years.
Requirements
- Python 3.10+
pip install statcast-mcp (pulls in lxml, mcp, pandas, pybaseball, tabulate)
Data sources
All data comes from public Baseball Savant (Statcast) and FanGraphs endpoints via pybaseball. No API keys, no rate-limit auth — but please be polite with call volume.
What this skill does NOT do
- Live game scores / play-by-play (use
mlb-daily-scores ClawHub skill or a sports-odds MCP)
- Odds, props, betting lines (use a sportsbook or odds API)
- Minor league or college baseball (Statcast coverage is MLB-only)
- Historical seasons before 2008 (Statcast launched in 2008)
Example questions this answers
- “What was Aaron Judge’s 95th-percentile exit velocity in 2025?”
- “Show me Paul Skenes’ whiff% by pitch type.”
- “Which pitchers had the lowest barrel% allowed last season?”
- “Is Shohei Ohtani outperforming his expected stats?”
- “Who are the top 10 sprinters in baseball right now?”
- “Where did the Yankees rank in barrel% last year?”
1---2name: mlb-statcast3description: Query MLB Statcast data via the statcast MCP server — player lookups, expected stats, pitch arsenals, exit velocity, barrel rate, percentile ranks, standings, and more. Use when asked about any MLB player, team, or pitching/hitting metric beyond traditional box score numbers.4---56# MLB Statcast78Get pitch-by-pitch Statcast data, expected stats, pitch arsenals, and advanced metrics for any MLB player, team, or season. Wraps the `statcast` MCP server (installed via `pip install statcast-mcp`).910## When to use1112Use this skill whenever the user asks about:13- An MLB player’s Statcast metrics (exit velocity, barrel rate, launch angle, sprint speed, etc.)14- Expected stats (xBA, xSLG, xwOBA) vs actual performance15- A pitcher’s arsenal (fastball, slider, changeup, etc.) and performance by pitch type16- Matchup analysis (batter vs a specific pitch type)17- League leaderboards (EV, barrel%, sprint speed, OAA)18- MLB standings or team-level season stats19- Defensive metrics (Outs Above Average)2021If the question can be answered with traditional box-score stats only, prefer `wikipedia` or a web search. This skill is for **advanced, Statcast-derived** numbers.2223## Quick Usage2425```bash26# Player ID lookup (always do this first for new players)27mcporter call statcast.player_lookup "player_name=Shohei Ohtani"2829# Batter percentile ranks (note: param is `year`, not `season`)30mcporter call statcast.batter_percentile_ranks "player_name=Aaron Judge" "year=2025"3132# Pitcher arsenal stats (param is `year`)33mcporter call statcast.statcast_pitcher_arsenal_stats "player_name=Paul Skenes" "year=2025"3435# Expected stats for a custom group (param is `year`)36mcporter call statcast.expected_stats_batch "player_names=[\"Judge\",\"Ohtani\",\"Soto\"]" "year=2025"3738# Standings (param is `year`)39mcporter call statcast.team_standings "year=2025"4041# Pitch-level data for a single game42mcporter call statcast.statcast_search "start_date=2025-06-15" "end_date=2025-06-15" "team=NYY"43```4445## Tools (24 total)4647### Identity48- `player_lookup` — Look up MLBAM ID + alternate IDs (FanGraphs, Baseball-Reference, Retro) for a player49- `team_standings` — Current/season MLB division standings5051### Pitch-level data (date-range)52- `statcast_search` — All pitches in a date range (optionally filtered by team)53- `statcast_batter` — All pitches seen by a specific batter54- `statcast_pitcher` — All pitches thrown by a specific pitcher5556### Season-level actual stats (FanGraphs)57- `season_batting_stats` / `season_pitching_stats` — full-season traditional stats58- `batting_stats_date_range` / `pitching_stats_date_range` — same metrics over a custom window59- `team_season_batting_stats` / `team_season_pitching_stats` — full-roster team totals6061### Expected stats (Statcast)62- `statcast_batter_expected_stats` / `statcast_pitcher_expected_stats` — xBA, xSLG, xwOBA for a player63- `expected_stats_batch` — same, but for many players in one call (cheaper)6465### Pitch arsenals66- `statcast_batter_pitch_arsenal` — hitter’s outcomes split by incoming pitch type67- `statcast_pitcher_pitch_arsenal` — all pitchers’ pitch mix + outcomes68- `statcast_pitcher_arsenal_stats` — performance (BA/SLG/wOBA/Whiff%/K%/Hard-Hit%) by pitch type for one pitcher6970### Batted-ball quality71- `statcast_batter_exitvelo_barrels` — hitter EV + barrel% leaderboard72- `statcast_pitcher_exitvelo_barrels` — pitcher EV-allowed + barrel%-allowed7374### League leaderboards & percentiles75- `batter_percentile_ranks` — hitter percentile vs the league (EV, barrel%, xwOBA, sprint speed, etc.) — param: `year`76- `pitcher_percentile_ranks` — pitcher percentile vs the league (spin, whiff%, xERA, K%, etc.) — param: `year`77- `sprint_speed_leaderboard` — top sprinters (param: `year`)78- `outs_above_average` — OAA leaderboard by position (param: `year`, `position`)79- `outfield_directional_oaa` — outfield OAA split by direction8081## Workflow: how agents should use this82831. **Resolve IDs first.** For any new player, call `player_lookup` to get the MLBAM ID. Some downstream tools are stricter about exact names; a `player_lookup` confirms spelling and years active.842. **Prefer batch tools.** `expected_stats_batch` over multiple `statcast_batter_expected_stats` calls.853. **Keep date ranges short for `statcast_search` / `statcast_batter` / `statcast_pitcher`.** The upstream API is slow on long windows. 1–5 days is ideal; a full month can take 30+ seconds.864. **Use last names with care.** Substring matching is loose — `player_lookup("Trout")` works, but uncommon names may return multiple candidates. Always check the response.875. **Cross-check with Wikipedia** for biographical context (career milestones, awards, draft info). The `wikipedia` MCP is the right companion tool.8889## Naming & spelling gotchas9091- For `player_lookup` use `player_name="Ohtani"` (last name only). The matcher is substring + last-name, and full first+last can over-match.92- For downstream tools like `batter_percentile_ranks` / `pitcher_percentile_ranks` / `statcast_pitcher_arsenal_stats`, use the **full name** (`"Aaron Judge"`, not `"Judge"`) — those tools reject single-name lookups.93- For “Joe Green”-style common names, `player_lookup` may return multiple candidates — read the response and disambiguate by `mlb_played_first` / `mlb_played_last` years.94- Pitcher/hitter ambiguity: if `player_lookup` returns a pitcher when you wanted a hitter (or vice versa), pass the full name in `Last, First` form to disambiguate.9596## Installation (Universal)9798### 1. Install the MCP server99100```bash101pip install statcast-mcp102```103104This gives you the `statcast-mcp` command. The server uses `pybaseball` under the hood (no API key needed — it pulls from public Baseball Savant / FanGraphs endpoints).105106### 2. Register the server with mcporter107108Add to your `mcporter.json`:109110```json111{112 "mcpServers": {113 "statcast": {114 "command": "statcast-mcp"115 }116 }117}118```119120### 3. Verify121122```bash123mcporter call statcast.player_lookup "player_name=Aaron Judge"124```125126You should see Judge’s MLBAM ID (592450) and active years.127128## Requirements129130- Python 3.10+131- `pip install statcast-mcp` (pulls in `lxml`, `mcp`, `pandas`, `pybaseball`, `tabulate`)132133## Data sources134135All data comes from public Baseball Savant (Statcast) and FanGraphs endpoints via `pybaseball`. No API keys, no rate-limit auth — but please be polite with call volume.136137## What this skill does NOT do138139- Live game scores / play-by-play (use `mlb-daily-scores` ClawHub skill or a sports-odds MCP)140- Odds, props, betting lines (use a sportsbook or odds API)141- Minor league or college baseball (Statcast coverage is MLB-only)142- Historical seasons before 2008 (Statcast launched in 2008)143144## Example questions this answers145146- “What was Aaron Judge’s 95th-percentile exit velocity in 2025?”147- “Show me Paul Skenes’ whiff% by pitch type.”148- “Which pitchers had the lowest barrel% allowed last season?”149- “Is Shohei Ohtani outperforming his expected stats?”150- “Who are the top 10 sprinters in baseball right now?”151- “Where did the Yankees rank in barrel% last year?”