mcpField
P
Pybaseball MCP Server

Pybaseball MCP Server

Local
github.com/jweingardt12Games & Entertainment4Updated 36w ago

About Pybaseball MCP Server

Pybaseball MCP Server exposes MLB player, team, leaderboard and Statcast data, including video links, for baseball analysis through AI assistants.

Key features

  1. 01Player and team season statistics
  2. 02Statcast filters for pitches and outcomes
  3. 03League and Statcast leaderboards
  4. 04Team batting and pitching rankings
  5. 05Video links for selected plays

Use cases

  1. 01Review a player's performance by pitch type
  2. 02Compare team Statcast metrics
  3. 03Find top home runs or fastest pitches

MCP support

It provides eight baseball-data tools to MCP clients, covering player and team statistics, leaderboards, Statcast queries and counts.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

No install method listed yet

We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.

Repository

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README

MLB Stats MCP Server

A Model Context Protocol (MCP) server that provides comprehensive MLB baseball statistics with video highlights through the pybaseball library.

Overview

This MCP server enables AI assistants to access real-time MLB statistics, historical data, and video highlights. It provides eight powerful tools for querying baseball data, from individual player performance to team statistics and advanced Statcast metrics.

Features

🎯 8 Core Tools
1. get_player_stats

Get detailed Statcast data for any MLB player with optional date filtering.

  • Parameters:
    • name (required): Player name (e.g., "Mike Trout", "Ronald Acuña Jr.")
    • start_date (optional): Start date in YYYY-MM-DD format
    • end_date (optional): End date in YYYY-MM-DD format
  • Returns: Player statistics including hits, home runs, exit velocity, launch angle, and barrel rate
2. player_statcast

Get comprehensive Statcast data for a specific player with advanced pitch-type and result filtering.

  • Parameters:
    • player_name (required): Player name (e.g., "Aaron Judge", "Mike Trout")
    • start_date (optional): Start date in YYYY-MM-DD format (defaults to current season)
    • end_date (optional): End date in YYYY-MM-DD format (defaults to current season)
    • pitch_type (optional): Filter by pitch type - 'FF' (4-seam), 'SL' (slider), 'CH' (changeup), 'CU' (curveball), 'SI' (sinker), 'FC' (cutter), 'FS' (splitter)
    • result_type (optional): Filter by result - 'home_run', 'hit', 'single', 'double', 'triple', 'batted_ball'
    • min_exit_velocity (optional): Minimum exit velocity in mph
    • min_distance (optional): Minimum distance in feet
  • Returns: Player stats with overall metrics, breakdown by pitch type/result, and top 5 examples with video links
  • Example Queries:
    • "How many fastballs has Aaron Judge hit for a home run?"
    • "What's Shohei Ohtani's average exit velocity on sliders?"
    • "Show me Mike Trout's stats against breaking balls this season"
3. get_team_stats

Retrieve comprehensive team batting or pitching statistics for any season.

  • Parameters:
    • team (required): Team name or abbreviation (e.g., "Yankees", "NYY", "Red Sox")
    • year (required): Season year (1871-present)
    • stat_type (optional): "batting" (default) or "pitching"
  • Returns: Complete team statistics for the specified season
4. get_leaderboard

Access statistical leaderboards for any MLB stat category.

  • Parameters:
    • stat (required): Statistic abbreviation (e.g., "HR", "AVG", "ERA", "K")
    • season (required): Season year
    • leaderboard_type (optional): "batting" or "pitching"
    • limit (optional): Number of results (default: 10)
  • Returns: Top players for the specified statistic
5. statcast_leaderboard

Query advanced Statcast data with filtering, sorting, and video highlight links.

  • Parameters:
    • start_date (required): Start date in YYYY-MM-DD format
    • end_date (required): End date in YYYY-MM-DD format
    • result (optional): Filter by outcome (e.g., "home_run", "single", "double")
    • min_ev (optional): Minimum exit velocity filter
    • min_pitch_velo (optional): Minimum pitch velocity filter
    • pitch_type (optional): Filter by pitch type - 'FF' (4-seam), 'SL' (slider), 'CH' (changeup), 'CU' (curveball), 'SI' (sinker), 'FC' (cutter), 'FS' (splitter)
    • player_name (optional): Filter by batter name (e.g., "Aaron Judge", "Mike Trout")
    • sort_by (optional): Sort metric:
      • "exit_velocity" (default) - Hardest hit balls
      • "distance" - Longest hits
      • "launch_angle" - Optimal launch angles
      • "pitch_velocity" - Fastest pitches
      • "spin_rate" - Highest spin rates
      • "xba" - Highest expected batting average
      • "xwoba" - Highest expected weighted on-base average
      • "barrel" - Barrel rate (perfect contact)
    • limit (optional): Number of results (default: 10)
    • order (optional): Sort order - "desc" (default) or "asc"
    • group_by (optional): Group results by "team" for team-wide rankings
  • Returns: Detailed play-by-play data with video links (or team aggregations when group_by="team")
6. team_season_stats

Get fast team season averages for Statcast metrics. Optimized for queries like "which team hits the ball hardest?".

  • Parameters:
    • year (required): Season year (e.g., 2025)
    • stat (optional): Metric to analyze
      • "exit_velocity" (default) - Average exit velocity
      • "distance" - Average and max distance
      • "launch_angle" - Average launch angle
      • "barrel_rate" - Percentage of barrels (perfect contact)
      • "hard_hit_rate" - Percentage of balls hit 95+ mph
      • "sweet_spot_rate" - Percentage hit at optimal launch angles (8-32°)
    • min_result_type (optional): Filter by result type
      • "batted_ball" - All balls in play
      • "home_run" - Home runs only
      • "hit" - All hits (singles, doubles, triples, home runs)
  • Returns: Team rankings with averages, counts, and other statistics
  • Performance: Uses sampling strategy (every 7th day) and 24-hour caching for instant responses
7. team_pitching_stats

Get fast team pitching averages for Statcast metrics. Optimized for queries like "which team has the best pitching staff?".

  • Parameters:
    • year (required): Season year (e.g., 2025)
    • stat (optional): Metric to analyze
      • "velocity" (default) - Average and max pitch velocity
      • "spin_rate" - Average and max spin rate
      • "movement" - Pitch break (horizontal, vertical, total)
      • "whiff_rate" - Swing-and-miss percentage
      • "chase_rate" - Swings at pitches outside the zone
      • "zone_rate" - Percentage of pitches in strike zone
      • "ground_ball_rate" - Ground balls per balls in play
      • "xera" - Expected ERA based on quality of contact
    • pitch_type (optional): Filter to specific pitch type
      • "FF" - 4-seam fastball
      • "SL" - Slider
      • "CH" - Changeup
      • "CU" - Curveball
      • "SI" - Sinker
      • "FC" - Cutter
      • "FS" - Splitter
  • Returns: Team pitching rankings with averages, counts, and other statistics
  • Performance: Uses sampling strategy (every 7th day) and 24-hour caching for instant responses
8. statcast_count

Count Statcast events matching specific criteria. Optimized for multi-year queries like "how many 475+ ft home runs since 2023?"

  • Parameters:
    • start_date (required): Start date in YYYY-MM-DD format
    • end_date (required): End date in YYYY-MM-DD format
    • result_type (optional): Type to count - 'home_run' (default), 'hit', 'batted_ball', or specific like 'double'
    • player_name (optional): Filter by batter name (e.g., "Aaron Judge", "Mike Trout")
    • pitch_type (optional): Filter by pitch type - 'FF' (4-seam), 'SL' (slider), 'CH' (changeup), 'CU' (curveball), 'SI' (sinker), 'FC' (cutter), 'FS' (splitter)
    • min_distance (optional): Minimum distance in feet (e.g., 475)
    • max_distance (optional): Maximum distance in feet
    • min_exit_velocity (optional): Minimum exit velocity in mph
    • max_exit_velocity (optional): Maximum exit velocity in mph
  • Returns: Total count, yearly breakdown, and top 5 examples with video links
  • Performance:
    • Multi-year queries: Samples 3 days per month (~90x fewer API calls)
    • 6-12 months: Weekly sampling (~7x fewer API calls)
    • <6 months: Complete data with chunking
    • 24-hour caching for all queries
🎥 Video Highlights Integration

Every result from statcast_leaderboard includes detailed metrics and video access points:

{
  "rank": 1,
  "player": "Ronald Acuña Jr.",
  "date": "2024-07-20",
  "exit_velocity": 113.7,
  "launch_angle": 23.0,
  "distance": 456.0,
  "result": "home_run",
  "pitch_velocity": 95.2,
  "pitch_type": "FF",
  "spin_rate": 2450,
  "xba": 0.920,
  "xwoba": 1.823,
  "barrel": true,
  "description": "Ronald Acuña Jr. homers (13) on a fly ball to center field.",
  "video_links": {
    "game_highlights_url": "https://www.mlb.com/gameday/745890/video",
    "film_room_search": "https://www.mlb.com/video/search?q=Ronald+Acuna+Jr.+2024-07-20",
    "game_pk": "745890",
    "api_highlights_endpoint": "https://statsapi.mlb.com/api/v1/schedule?gamePk=745890&hydrate=game(content(highlights(highlights)))"
  }
}
🏟️ Smart Team Recognition

The server intelligently handles team names:

  • Full names: "Orioles" → "BAL", "Red Sox" → "BOS"
  • Cities: "Boston" → "BOS", "New York Yankees" → "NYY"
  • Historical teams: "Expos" → "MON", "Indians" → "CLE"
  • All 30 current MLB teams supported with common variations
📊 Team-Wide Rankings

New team aggregation feature for statcast_leaderboard:

  • Group results by team to see team-wide performance
  • Calculates averages, maximums, and counts for each metric
  • Perfect for questions like "Which team hits the hardest home runs?"
  • Returns comprehensive team statistics including barrel counts and expected metrics

Installation

Deploy on Railway (Recommended for Smithery)

Deploy to Railway for a hosted HTTP MCP endpoint that Smithery can connect to:

  1. Create a new Railway project and connect your GitHub repository
  2. Railway will auto-detect the Procfile and deploy automatically
  3. Your MCP endpoint will be available at https://<your-railway-domain>/mcp
  4. Connect this URL to Smithery for distribution

Manual Start Command (if needed): If Railway doesn't auto-detect the Procfile, set this Start Command in Railway Settings:

uv run fastmcp run src/mlb_mcp/server.py:mcp --transport http --host 0.0.0.0 --port $PORT
Deploy on Smithery Direct
  1. Fork this repository
  2. Connect your GitHub account to Smithery
  3. Deploy directly from your repository
Local Development
# Clone the repository
git clone https://github.com/yourusername/mlb_mcp.git
cd mlb_mcp

# Install dependencies with uv
uv sync

# Run the server (stdio mode for local testing)
uv run python -m mlb_mcp.server

# Or run with HTTP transport for local HTTP testing
MCP_TRANSPORT=http MCP_PORT=8000 uv run python -m mlb_mcp.server
Claude Desktop Configuration

Add to your Claude Desktop configuration (uses stdio transport):

{
  "mcpServers": {
    "mlb-stats": {
      "command": "uv",
      "args": ["run", "python", "-m", "mlb_mcp.server"],
      "cwd": "/path/to/mlb_mcp"
    }
  }
}

Usage Examples

Player-Specific Queries (NEW!)
How many fastballs has Aaron Judge hit for a home run?
Query: "How many fastballs has Aaron Judge hit for a home run this season?"
Tool: player_statcast("Aaron Judge", "2024-04-01", "2024-10-31", "FF", "home_run")
OR
Tool: statcast_count("2024-04-01", "2024-10-31", "home_run", player_name="Aaron Judge", pitch_type="FF")
What's a player's performance on specific pitch types?
Query: "Show me Shohei Ohtani's stats against sliders this season"
Tool: player_statcast("Shohei Ohtani", "2024-04-01", "2024-10-31", "SL")
Player's hardest hit balls on specific pitch types
Query: "Show Aaron Judge's hardest hit balls on fastballs"
Tool: statcast_leaderboard("2024-04-01", "2024-10-31", player_name="Aaron Judge", pitch_type="FF", sort_by="exit_velocity", limit=10)
Find the Longest Home Runs
Query: "Show me the longest home runs from yesterday"
Tool: statcast_leaderboard("2024-07-20", "2024-07-20", "home_run", None, None, "distance", 10)
Hardest Hit Balls on Fast Pitches
Query: "What were the hardest hit balls on 99+ mph pitches last week?"
Tool: statcast_leaderboard("2024-07-14", "2024-07-20", None, 0, 99.0, "exit_velocity", 10)
Fastest Pitches Thrown
Query: "Show me the fastest pitches thrown yesterday"
Tool: statcast_leaderboard("2024-07-20", "2024-07-20", None, None, None, "pitch_velocity", 10)
Highest Spin Rate Pitches
Query: "What pitches had the highest spin rate today?"
Tool: statcast_leaderboard("2024-07-20", "2024-07-20", None, None, None, "spin_rate", 10)
Best Quality Contact (Barrels)
Query: "Show me the best quality contact this week"
Tool: statcast_leaderboard("2024-07-14", "2024-07-20", None, None, None, "barrel", 10)
Player Season Stats
Query: "Get Mike Trout's stats for this season"
Tool: get_player_stats("Mike Trout", "2024-04-01", "2024-10-01")
Team Performance
Query: "How are the Red Sox doing this year?"
Tool: get_team_stats("Red Sox", 2024, "batting")
League Leaders
Query: "Who's leading the league in home runs?"
Tool: get_leaderboard("HR", 2024, "batting", 10)
Team-Wide Rankings (statcast_leaderboard)
Query: "Which team has the hardest hit home runs this season?"
Tool: statcast_leaderboard("2024-04-01", "2024-10-01", "home_run", None, None, "exit_velocity", 10, "desc", "team")
Query: "Show me teams with the longest average home run distance this month"
Tool: statcast_leaderboard("2024-07-01", "2024-07-31", "home_run", None, None, "distance", 10, "desc", "team")
Query: "Which teams have the highest average pitch velocity?"
Tool: statcast_leaderboard("2024-07-20", "2024-07-20", None, None, None, "pitch_velocity", 10, "desc", "team")
Team Season Averages (team_season_stats)
Query: "What team averages the hardest hit balls in 2025?"
Tool: team_season_stats(2025, "exit_velocity")
Query: "Which team has the highest barrel rate this season?"
Tool: team_season_stats(2025, "barrel_rate")
Query: "Show me teams with the highest hard-hit rate on home runs only"
Tool: team_season_stats(2025, "hard_hit_rate", "home_run")
Query: "What team hits the ball the farthest on average?"
Tool: team_season_stats(2025, "distance")
Team Pitching Analysis (team_pitching_stats)
Query: "Which team throws the hardest in 2025?"
Tool: team_pitching_stats(2025, "velocity")
Query: "What team has the best slider spin rate?"
Tool: team_pitching_stats(2025, "spin_rate", "SL")
Query: "Which pitching staff gets the most swings and misses?"
Tool: team_pitching_stats(2025, "whiff_rate")
Query: "Show me teams with the highest ground ball rate"
Tool: team_pitching_stats(2025, "ground_ball_rate")
Query: "Which team has the lowest expected ERA based on contact quality?"
Tool: team_pitching_stats(2025, "xera")
Counting Queries (statcast_count)
Query: "How many home runs hit over 475 ft have been hit since 2023?"
Tool: statcast_count("2023-01-01", "2025-12-31", "home_run", 475)
Query: "Count all 110+ mph batted balls this season"
Tool: statcast_count("2025-04-01", "2025-10-31", "batted_ball", None, 110)
Query: "How many home runs between 400-450 feet were hit last year?"
Tool: statcast_count("2024-04-01", "2024-10-31", "home_run", 400, None, 450)
Query: "Total hits with exit velocity over 100 mph since 2022"
Tool: statcast_count("2022-01-01", "2025-12-31", "hit", None, 100)

Technical Details

Architecture
  • Transport: stdio (local) or HTTP (Railway/hosted) - auto-detected via PORT env var
  • Framework: FastMCP for protocol implementation
  • Data Source: pybaseball library (MLB official data)
  • Language: Python 3.11+
  • Deployment: Railway (HTTP) or Smithery (containerized)
Performance Optimizations
  • Query Chunking: Automatically splits large date ranges into 5-day chunks to handle Baseball Savant's 30,000 row limit
  • Response Caching: 15-minute cache for repeated queries, 24-hour cache for team season stats
  • Vectorized Operations: Uses NumPy for efficient team identification instead of slower pandas apply() operations
  • Sampling Strategy:
    • team_season_stats and team_pitching_stats: Every 7th day sampling
    • statcast_count: Adaptive sampling (3 days/month for multi-year, weekly for 6-12 months)
  • Specialized Tools: Dedicated tools for common aggregate queries that would timeout with full data:
    • team_season_stats for batting metrics
    • team_pitching_stats for pitching metrics
    • statcast_count for counting queries across multiple years
  • Lazy Loading: Heavy dependencies (pandas, numpy, pybaseball) loaded only when needed for fast startup
  • Efficient Filtering: Applies filters sequentially to minimize data processing overhead
Key Features
  • Error Handling: Comprehensive error messages for common issues
  • Type Safety: Proper type conversion for JSON serialization
  • Video Integration: Automatic video highlight links for all plays and team top performances
  • Smart Team Lookup: Handles full names, abbreviations, cities, and historical teams
File Structure
mlb_mcp/
├── src/
│   └── mlb_mcp/
│       ├── __init__.py    # Package exports
│       └── server.py      # Main MCP server implementation
├── pyproject.toml         # Project configuration and dependencies
├── smithery.yaml          # Smithery deployment configuration
├── Procfile               # Railway start command
└── README.md              # This file

Requirements

  • Python 3.11 or higher
  • Internet connection for MLB data access
  • Smithery account for deployment (optional)

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project uses publicly available MLB data through the pybaseball library. All MLB data is property of MLB Advanced Media.


Built with pybaseball and FastMCP

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.