Skip to main content
Glama
guillochon

mlb-api-mcp

get_mlb_game_lineup

Retrieve starting lineup details for any MLB game using its unique game ID to access player positions and batting orders.

Instructions

Get lineup information for a specific game by game_id.

Args: game_id (int): The game ID.

Returns: dict: Game lineup information.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
game_idYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • The handler function decorated with @mcp.tool(), implementing the logic to fetch game boxscore and extract detailed lineup information for away and home teams, including player IDs, names, positions, batting orders, and game statuses.
    @mcp.tool()
    def get_mlb_game_lineup(game_id: int) -> dict:
        """
        Get lineup information for a specific game by game_id.
    
        Args:
            game_id (int): The game ID.
    
        Returns:
            dict: Game lineup information.
        """
        try:
            # Get the boxscore data
            boxscore = mlb.get_game_box_score(game_id)
    
            result = {"game_id": game_id, "teams": {}}
    
            # Process both teams (away and home)
            for team_type in ["away", "home"]:
                if hasattr(boxscore, "teams") and hasattr(boxscore.teams, team_type):
                    team_data = getattr(boxscore.teams, team_type)
    
                    team_info = {
                        "team_name": getattr(team_data.team, "name", "Unknown"),
                        "team_id": getattr(team_data.team, "id", None),
                        "players": [],
                    }
    
                    # Get players from the team data
                    if hasattr(team_data, "players") and team_data.players is not None:
                        players_dict = team_data.players
    
                        # Extract player information
                        for player_key, player_data in players_dict.items():
                            if player_key.startswith("id"):
                                player_info = {
                                    "player_id": getattr(player_data.person, "id", None),
                                    "player_name": getattr(player_data.person, "fullname", "Unknown"),
                                    "jersey_number": getattr(player_data, "jerseynumber", None),
                                    "positions": [],
                                    "batting_order": None,
                                    "game_entries": [],
                                }
    
                                # Get position information
                                if hasattr(player_data, "allpositions") and player_data.allpositions is not None:
                                    for position in player_data.allpositions:
                                        position_info = {
                                            "position": getattr(position, "abbreviation", None),
                                            "position_name": getattr(position, "name", None),
                                        }
                                        player_info["positions"].append(position_info)
    
                                # Get batting order from player data directly
                                if hasattr(player_data, "battingorder"):
                                    player_info["batting_order"] = getattr(player_data, "battingorder", None)
    
                                # Get game entry information (substitutions, etc.)
                                if hasattr(player_data, "gamestatus"):
                                    game_status = player_data.gamestatus
                                    entry_info = {
                                        "is_on_bench": getattr(game_status, "isonbench", False),
                                        "is_substitute": getattr(game_status, "issubstitute", False),
                                        "status": getattr(game_status, "status", None),
                                    }
                                    player_info["game_entries"].append(entry_info)
    
                                team_info["players"].append(player_info)
    
                    # Sort players by batting order (starting lineup first, then substitutes)
                    def sort_key(player):
                        batting_order = player.get("batting_order")
                        if batting_order is None:
                            return 999  # Put non-batting order players at the end
                        return int(str(batting_order).replace("0", ""))  # Handle batting order formatting
    
                    team_info["players"].sort(key=sort_key)
                    result["teams"][team_type] = team_info
    
            return result
        except Exception as e:
            return {"error": str(e)}
  • main.py:19-23 (registration)
    Registration of the MLB tools, including get_mlb_game_lineup, by calling setup_mlb_tools(mcp) after initializing the FastMCP server.
    mcp = FastMCP("MLB API MCP Server")
    
    # Setup all MLB and generic tools
    setup_mlb_tools(mcp)
    setup_generic_tools(mcp)
  • mlb_api.py:221-221 (registration)
    The setup function that defines and registers all MLB tools, including the @mcp.tool() decorator for get_mlb_game_lineup.
    def setup_mlb_tools(mcp):
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states it's a read operation ('Get'), but doesn't cover aspects like error handling (e.g., invalid game_id), rate limits, authentication needs, or data freshness. The description lacks behavioral context beyond the basic action, which is insufficient for a tool with no annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded, with the core purpose in the first sentence and additional details in a structured Args/Returns format. There's no wasted text, though the 'Args' and 'Returns' sections are somewhat redundant given the input/output schemas, but they add clarity in a concise manner.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (1 parameter) and the presence of an output schema (which handles return values), the description is minimally adequate. However, with no annotations and 0% schema coverage, it should provide more behavioral context (e.g., error cases, data scope) to fully guide the agent, making it incomplete for optimal use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the schema provides no parameter details. The description adds minimal semantics by specifying 'game_id (int): The game ID,' which clarifies the parameter's purpose and type. However, it doesn't explain format constraints (e.g., valid ranges, source) or examples, leaving gaps despite the single parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as 'Get lineup information for a specific game by game_id,' specifying the verb ('Get'), resource ('lineup information'), and key identifier ('game_id'). It distinguishes from most siblings (e.g., get_mlb_boxscore, get_mlb_linescore) by focusing on lineups, though it doesn't explicitly contrast with get_mlb_roster or get_mlb_players, which are related but not identical.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a valid game_id), exclusions, or comparisons to siblings like get_mlb_roster (team rosters) or get_mlb_players (player lists), leaving the agent to infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/guillochon/mlb-api-mcp'

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