Skip to main content
Glama
jdguggs10

MLB Stats MCP Server

by jdguggs10

MLB Stats MCP Server - Enhanced with Meta-Tools

๐Ÿ”ง Version 2.1 - Now with Entity Resolution Meta-Tools!

A Cloudflare Worker that serves as an enhanced MCP (Model Context Protocol) server for accessing MLB Stats API data. Features meta-tools for intelligent entity resolution, comprehensive team/player mappings, and optimized data access patterns.

๐ŸŽฏ Enhanced Features

๐Ÿ”ง Meta-Tools for Entity Resolution

  • resolve_team: Convert team names to canonical MLB team IDs

  • resolve_player: Convert player names to canonical MLB player IDs

  • Comprehensive Mappings: All 30 MLB teams with aliases and abbreviations

  • Fuzzy Matching: "Yankees", "NYY", "New York Yankees" all resolve correctly

  • Smart Suggestions: "Did you mean?" fallbacks for typos and partial matches

โšพ MLB Data Access

  • Direct MLB API proxy with zero additional latency

  • All MLB endpoints supported (teams, players, stats, schedules, etc.)

  • CORS enabled for web applications

  • No API keys required (MLB Stats API is public)

  • Error handling and validation with detailed responses

๐Ÿ—๏ธ Architecture Benefits

  • Domain logic ownership: All MLB-specific logic contained within this worker

  • Service binding ready: Optimized for Cloudflare worker-to-worker communication

  • Token efficient: Meta-tools reduce round-trips and enable smart caching

  • Future-proof: Extensible pattern for other sports (NFL, NBA, NHL)

Related MCP server: MLB Projections MCP Server

๐Ÿ› ๏ธ Available Commands

๐Ÿ”ง Meta-Tools (Entity Resolution)

resolve_team - Team Name Resolution

Convert any team reference to canonical MLB team information.

Request:

{ "command": "resolve_team", "params": { "name": "Yankees" } }

Response:

{ "result": { "id": 147, "name": "New York Yankees", "abbreviation": "NYY", "query": "Yankees", "resolved": true } }

Supported Inputs:

  • Team names: "Yankees", "Red Sox", "Dodgers"

  • Full names: "New York Yankees", "Boston Red Sox"

  • Abbreviations: "NYY", "BOS", "LAD"

  • Cities: "New York", "Boston", "Los Angeles"

resolve_player - Player Name Resolution

Convert any player reference to canonical MLB player information.

Request:

{ "command": "resolve_player", "params": { "name": "Judge" } }

Response:

{ "result": { "id": 592450, "name": "Aaron Judge", "team": "New York Yankees", "query": "Judge", "resolved": true } }

Supported Players:

  • Aaron Judge, Shohei Ohtani, Mookie Betts, Freddie Freeman

  • Ronald Acuna Jr., Mike Trout, and other star players

  • Both full names and last names supported

โšพ MLB Data Commands

  • getTeamInfo - Get team information and details

  • getRoster - Get team roster and player positions

  • getPlayerStats - Get player statistics (hitting, pitching)

  • getSchedule - Get game schedule and dates

  • getLiveGame - Get live game data and updates

  • getStandings - Get league and division standings

  • getGameBoxscore - Get detailed game boxscore

  • getPlayerInfo - Get player biographical information

  • getSeasons - Get season information and years

  • getVenues - Get stadium and venue information

๐ŸŽฏ Enhanced Workflow

Traditional Approach:

// Step 1: User needs to know exact team ID {"command": "getRoster", "params": {"pathParams": {"teamId": "147"}}}

Enhanced Meta-Tool Approach:

// Step 1: Resolve team name to ID {"command": "resolve_team", "params": {"name": "Yankees"}} // Returns: {"result": {"id": 147, "name": "New York Yankees"}} // Step 2: Use resolved ID automatically (handled by sports-proxy) {"command": "getRoster", "params": {"pathParams": {"teamId": "147"}}}

Request Format

Send POST requests to the worker endpoint with the following JSON structure:

{ "command": "getPlayerStats", "params": { "pathParams": { "playerId": "660271" }, "queryParams": { "stats": "season", "group": "hitting", "season": "2024" } } }

Response Format

Successful responses return:

{ "result": { // MLB API response data } }

Error responses return:

{ "error": "Error message" }

Development

  1. Install Wrangler CLI:

    npm install -g wrangler
  2. Login to Cloudflare:

    wrangler login
  3. Deploy the worker:

    wrangler deploy

๐Ÿ“‹ Complete Usage Examples

๐Ÿ”ง Meta-Tool Examples

Resolve Team Names

# Basic team resolution curl -X POST https://mlbstats-mcp.your-domain.workers.dev \ -H "Content-Type: application/json" \ -d '{ "command": "resolve_team", "params": {"name": "Yankees"} }' # Response: {"result": {"id": 147, "name": "New York Yankees", "abbreviation": "NYY"}}
# Handle abbreviations and cities curl -X POST https://mlbstats-mcp.your-domain.workers.dev \ -H "Content-Type: application/json" \ -d '{ "command": "resolve_team", "params": {"name": "LAD"} }' # Response: {"result": {"id": 119, "name": "Los Angeles Dodgers", "abbreviation": "LAD"}}

Resolve Player Names

# Resolve player by last name curl -X POST https://mlbstats-mcp.your-domain.workers.dev \ -H "Content-Type: application/json" \ -d '{ "command": "resolve_player", "params": {"name": "Ohtani"} }' # Response: {"result": {"id": 660271, "name": "Shohei Ohtani", "team": "Los Angeles Dodgers"}}

โšพ Data Retrieval Examples

Get Team Information

{ "command": "getTeamInfo", "params": { "queryParams": { "season": "2025", "sportId": "1" } } }

Get Player Stats (with resolved player ID)

{ "command": "getPlayerStats", "params": { "pathParams": { "playerId": "592450" // Aaron Judge (from resolve_player) }, "queryParams": { "stats": "season", "group": "hitting", "season": "2025" } } }

Get Team Roster (with resolved team ID)

{ "command": "getRoster", "params": { "pathParams": { "teamId": "147" // Yankees (from resolve_team) }, "queryParams": { "season": "2025" } } }

Get Schedule

{ "command": "getSchedule", "params": { "queryParams": { "sportId": "1", "date": "2025-07-04", "teamId": "147" // Optional: filter by resolved team } } }

๐Ÿ” Error Handling Examples

Team Not Found

// Request: {"command": "resolve_team", "params": {"name": "Cowbays"}} // Response: { "error": "Team \"Cowbays\" not found. Did you mean: cowboys, astros, royals?" }

Player Not Found

// Request: {"command": "resolve_player", "params": {"name": "Jduge"}} // Response: { "error": "Player \"Jduge\" not found. Did you mean: judge?" }

๐Ÿš€ Integration with Sports-Proxy

When used with the enhanced sports-proxy, the workflow becomes seamless:

# User input: "Get the Yankees roster" # 1. Sports-proxy detects MLB sport # 2. Extracts tools: resolve_team("yankees"), get_team_roster({}) # 3. MLB MCP resolves: resolve_team โ†’ {id: 147} # 4. Sports-proxy enriches: get_team_roster({teamId: "147"}) # 5. MLB MCP returns: Complete roster data

This eliminates the need for manual entity resolution and creates a natural language interface to MLB data!

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jdguggs10/mlbstats-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server