StatsPlus MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@StatsPlus MCP Serverget batting stats for Mike Trout in 2024"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
StatsPlus MCP Server
An MCP server that exposes the StatsPlus API as tools for use with Claude and other MCP-compatible clients.
Prerequisites
Node.js 18+
A StatsPlus league account linked to a team
Related MCP server: mlb-api-mcp
Installation
git clone https://github.com/joshuarichard/StatsPlus-MCP.git
cd StatsPlus-MCP
npm install
npm run buildConfiguration
Getting your session cookie
The StatsPlus API requires an active browser session. To get your cookie:
Log into
https://statsplus.net/<your-league-url>in your browserOpen DevTools (
Cmd+Option+Ion Mac,F12on Windows/Linux)Go to Application → Cookies →
https://statsplus.netCopy the
sessionidandcsrftokenvalues and combine them:sessionid=<value>;csrftoken=<value>
Adding to your MCP client
Add the following to your MCP client config (e.g. ~/.claude/mcp.json for Claude Code):
{
"mcpServers": {
"statsplus": {
"command": "node",
"args": ["/path/to/StatsPlus-MCP/dist/index.js"],
"env": {
"STATSPLUS_LEAGUE_URL": "<your-league-url>",
"STATSPLUS_COOKIE": "sessionid=<sessionid>;csrftoken=<csrftoken>"
}
}
}Replace:
/path/to/StatsPlus-MCP— the absolute path where you cloned this repo<your-league-url>— your league's URL slug (e.g.myleague,mlb2025)<sessionid>— thesessionidcookie value from your browser<csrftoken>— thecsrftokencookie value from your browser
Alternatively, with the Claude Code CLI:
claude mcp add statsplus \
-e STATSPLUS_LEAGUE_URL=<your-league-url> \
-e "STATSPLUS_COOKIE=sessionid=<sessionid>;csrftoken=<csrftoken>" \
-- node /path/to/StatsPlus-MCP/dist/index.jsAvailable Tools
Tool | Description | Parameters |
| Player batting statistics |
|
| Player pitching statistics |
|
| Player fielding statistics by position |
|
| Team batting statistics with rate stats |
|
| Team pitching statistics with rate stats |
|
| Player roster with names and team assignments |
|
| Search players by name (partial, case-insensitive) |
|
| Start the async ratings export; returns | — |
| Collect ratings results (pass |
|
| All major league games with scores, hits, errors, and pitcher IDs | — |
| All current and active player contracts |
|
| Signed extensions taking effect in future seasons | — |
| Team list with IDs and abbreviations | — |
| Draft picks |
|
| CSV export of all league games | — |
Split IDs: 1 = Overall, 2 = vs Left-handed, 3 = vs Right-handed
Usage tips
Name-to-ID resolution: Use
find_player(name)for quick name → ID lookups without downloading the full roster. For a full org's players, useget_players(org_id)which filters byParent Team ID.Ratings workflow: The ratings export is an async job that takes 60–90 seconds. To avoid blocking mid-workflow, call
start_ratings_job()first, do your other lookups while it processes, then callget_ratings(poll_url)to collect results:start_ratings_job() → { poll_url: "..." } get_player_batting_stats(...) ← runs concurrently get_contracts(team_id: ...) get_ratings(poll_url: "...") → results ready, no extra waitCalling
get_ratings()without apoll_urlstarts a new job and blocks until complete. Ratings columns include batting attributes (Cntct,Gap,Pow,Eye,Ks) with L/R splits,Pot*potential counterparts, and positional grades. Key encoding notes:Star ratings are stored as
stars × 2— e.g. 3.5 stars =7, 5 stars =10International complex players have a negative
Leaguevalue (e.g.-100)Column names are not guaranteed to be stable across OOTP versions
Preseason / empty responses: During preseason, all stat endpoints return HTTP 204 with no data for the upcoming year. Always pass
year=<most recent completed season>to get data.Fielding:
get_player_fielding_statsreturns one row per player per position per split. A player who appeared at multiple positions will have multiple rows — one for each.Game history:
runs0/hits0/errors0are the home team;runs1/hits1/errors1are the away team.winning_pitcher,losing_pitcher,starter0, andstarter1are numeric player IDs.save_pitcheris0when there is no save pitcher.Contracts:
salary0is the current season salary,salary1is next season, and so on throughsalary14. Unpopulated years are0.is_majorandno_tradeare0/1integers.contract_team_idis the MLB org that holds the contract (use this with theteam_idfilter).get_contract_extensionsuses the same schema for deals already signed but not yet in effect.Splits: All stat endpoints that accept a
splitparameter use1= Overall,2= vs Left-handed,3= vs Right-handed. Omittingsplitreturns all three rows per player/team.
Development
npm run build # Compile TypeScript
npm test # Run tests
npm run test:watch # Run tests in watch mode
npm run lint # Type-check without emittingLicense
MIT
Available Tools
15 toolsfind_playerA
Search for players by name (partial, case-insensitive). Returns matching players with their IDs and team info. Use this to resolve a player name to an ID without downloading the full roster.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name to search (partial, case-insensitive match on first name, last name, or full name) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes search behavior (partial, case-insensitive), matching fields, and return content (IDs, team info). No annotations exist, so description carries the burden; it is transparent but could mention result limits or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two highly efficient sentences that front-load the purpose and provide all necessary information with zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately covers purpose, parameters, and returns for a simple search tool. Could mention handling of multiple matches or default behavior, but sufficient for common use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides 100% coverage with a description that repeats the same information as the tool description (partial, case-insensitive). No additional meaning added beyond what schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specifically states 'search for players by name (partial, case-insensitive)' and distinguishes from sibling get_players by clarifying this resolves a name to an ID without downloading the full roster.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to 'use this to resolve a player name to an ID without downloading the full roster', implying when to use it over alternatives. Does not list explicit exclusions but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contract_extensionsB
Retrieve signed contract extensions that take effect in future seasons.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only states the basic retrieval purpose and does not disclose any behavioral traits such as whether it is read-only, any side effects, authentication needs, or rate limits. Since annotations are not provided, the description carries the full burden for transparency, which it fails to meet beyond the minimal action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, effective sentence with no wasted words. It directly communicates the purpose without extraneous detail, achieving high conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters, no output schema, and no annotations, the description provides the basic purpose but lacks detail on return format, data scope, or any constraints. It is adequate but leaves gaps for an agent to infer behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so the baseline score is 3. The description does not add any parameter information since there are none, and no additional meaning is required beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves signed contract extensions that take effect in future seasons. It uses a specific verb 'retrieve' and identifies the resource as 'contract extensions' with a qualifying condition 'signed' and 'future seasons', which distinguishes it from siblings like 'get_contracts' that likely deal with current contracts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. With 15 sibling tools, the description does not mention when this tool is appropriate or when to choose another. There is no explicit context or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contractsA
Retrieve all current and active player contracts. IMPORTANT: The API does not expose service time or team control status. A 1-year contract does NOT necessarily mean the player will hit free agency — pre-arbitration players (~$900K salary) and arbitration-eligible players ($1–8M salary) both show as 1-year deals that auto-renew under team control. Only multi-year contracts or high-AAV 1-year deals indicate a negotiated free-agent signing. Use salary level and player age to infer team control status.
| Name | Required | Description | Default |
|---|---|---|---|
| team_id | No | MLB team ID — filters by the team that holds the contract (contract_team_id) | |
| player_id | No | Player ID to fetch a single player's contract |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of behavioral disclosure. It explicitly states API limitations: 'The API does not expose service time or team control status' and details the implications for contract interpretation. This high transparency is critical for correct tool usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a clear opening sentence for purpose, followed by important caveats. It is front-loaded and each sentence adds value. While not minimalistic, it avoids unnecessary words and is efficient for its informative content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (API limitations, nuanced contract interpretation) and the absence of an output schema, the description provides essential context. It explains the meaning of different contract types and how to infer team control. It is comprehensive but could be slightly more complete regarding edge cases (e.g., option years).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with descriptions for both 'team_id' and 'player_id'. The tool description does not add any additional meaning beyond what the schema provides for these parameters, so the baseline score of 3 applies. The description's value is in output interpretation, not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Retrieve all current and active player contracts.' The verb 'retrieve' and resource 'player contracts' are specific, and the context of 'current and active' clarifies the scope. This distinguishes it from sibling tools like 'get_contract_extensions' which focus on extensions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance, especially regarding the interpretation of 1-year contracts. It warns that a 1-year contract does not necessarily mean free agency and advises using salary level and player age to infer team control. This helps the agent decide when to use this tool and how to interpret results, effectively differentiating scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draftA
Retrieve draft data. For multi-league associations, specify the league ID.
| Name | Required | Description | Default |
|---|---|---|---|
| lid | No | League ID for associations with multiple drafts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description only mentions 'retrieve', implying read-only, but lacks disclosure about error behavior or data completeness when lid is omitted, leaving ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no redundancy, front-loading the key action and adding conditional detail efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no explanation of return format or draft context; sufficient for a simple retrieval but could be more complete given lack of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a description for 'lid'. The description adds the same context, so minimal value beyond schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Retrieve' and the resource 'draft data', and adds a specific condition for multi-league associations, distinguishing it from siblings like 'get_teams'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a conditional hint about specifying league ID for multi-league associations, but does not explicitly state when to use this tool versus alternatives or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exportsA
Retrieve a CSV export of all major league games since the league started, including scores, starting pitchers, winning/losing pitchers, and game dates.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses output format (CSV) and content (all games since start), but does not mention potential long runtime, large payload, or whether it blocks. Basic transparency but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence that efficiently conveys purpose, scope, and output fields. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Description provides core information but lacks details like whether CSV is returned inline or as a download, or any timeouts. Without output schema, more context on return format could help. Adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema, so baseline is 4. Description does not add parameter info, but none is needed. Adequate given zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it retrieves a CSV export of major league games with specific fields (scores, pitchers, dates). Verb 'retrieve' and resource 'CSV export' are specific. Different from siblings like get_game_history which likely returns JSON, so purpose is distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this vs sibling tools like get_game_history. The description implies it's for bulk CSV export, but does not state alternatives or exclusions. Usage context is implied but not clarified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_game_historyA
Retrieve all major league games since the league started, including scores, hitting, pitchers, and game dates.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description effectively conveys a read-only retrieval operation and specifies output content. It lacks details on performance, rate limits, or auth, but the operation is simple and non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with verb and resource. No wasted words; all information is relevant and succinct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides scope and data types but lacks explicit return structure (e.g., list of objects). Given no output schema, more clarity on format would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and schema coverage is 100% (trivially). The description does not add parameter-level meaning but provides context about the tool's scope and output, which is baseline for a param-less tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves all major league games since league inception, listing included data (scores, hitting, pitchers, game dates). This distinguishes it from sibling tools like get_team_batting_stats or get_player_pitching_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for obtaining full game history, but lacks explicit guidance on when to use this tool versus alternatives. No when-not or sibling comparisons are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_player_batting_statsA
Retrieve player batting statistics. Returns stat lines with splits. Defaults to top-level (MLB) leagues; pass lid to get stats for a specific league (e.g. minor leagues). Omit all params to get all players for all seasons.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Season year, e.g. 2024 | |
| pid | No | Player ID for a single player | |
| split | No | Split ID: 1 = Overall, 2 = vs Left-handed, 3 = vs Right-handed | |
| lid | No | League ID — defaults to all top-level leagues; pass a specific league ID to get minor league stats |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Mentions returns 'stat lines with splits' but does not disclose rate limits, authorization needs, or data scope beyond defaults. Lacks detail on what 'splits' entail in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with purpose, no wasted words. Each sentence adds essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema; description only says 'Returns stat lines with splits' which is vague. Agent may not know exact fields returned. However, for a stats tool with common knowledge, it is borderline adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds value by explaining default behavior ('top-level leagues') and how omitting all params yields all players for all seasons, which is not evident from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'Retrieve' and resource 'player batting statistics', distinguishing from sibling tools like get_player_fielding_stats and get_player_pitching_stats. Mentions key aspects: stat lines with splits, default scope, and optional parameters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to pass lid (for minor leagues) and when to omit all params (to get all players for all seasons). However, does not explicitly state when not to use this tool or mention alternatives for similar needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_player_fielding_statsA
Retrieve player fielding statistics by position. Returns stat lines with splits. Defaults to top-level (MLB) leagues; pass lid to get stats for a specific league. Omit all params to get all players for all seasons.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Season year, e.g. 2024 | |
| pid | No | Player ID for a single player | |
| split | No | Split ID: 1 = Overall, 2 = vs Left-handed, 3 = vs Right-handed | |
| lid | No | League ID — defaults to all top-level leagues; pass a specific league ID to get minor league stats |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions 'Returns stat lines with splits' but does not disclose potential side effects, authorization requirements, or rate limits. The behavioral disclosure is minimal but not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences; no unnecessary words. The description is front-loaded with the core purpose and efficient in providing additional context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters, no annotations, and no output schema, the description covers defaults, league filtering, and the effect of omitting parameters. It does not detail the output structure beyond 'stat lines with splits', which is acceptable for a retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the description adds value by explaining default behavior and the effect of omitting parameters ('Omit all params to get all players for all seasons'). This goes beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Retrieve'), the resource ('player fielding statistics'), and the context ('by position'). It distinguishes from sibling tools like get_player_batting_stats and get_player_pitching_stats by specifying 'fielding'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains default behavior (top-level leagues) and how to override with 'lid', and notes that omitting all parameters returns all players for all seasons. This provides clear usage context, though it does not explicitly state when not to use this tool or suggest alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_player_pitching_statsA
Retrieve player pitching statistics. Returns stat lines with splits. Defaults to top-level (MLB) leagues; pass lid to get stats for a specific league (e.g. minor leagues). Omit all params to get all players for all seasons.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Season year, e.g. 2024 | |
| pid | No | Player ID for a single player | |
| split | No | Split ID: 1 = Overall, 2 = vs Left-handed, 3 = vs Right-handed | |
| lid | No | League ID — defaults to all top-level leagues; pass a specific league ID to get minor league stats |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It mentions returns stat lines with splits and defaults, but does not disclose error handling, rate limits, data freshness, or what happens with invalid inputs. This is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the main action, and contains no redundant information. Every sentence adds useful context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 4 optional parameters and no output schema. The description covers default behavior and lid usage, but lacks information on return format, pagination, error codes, or performance implications. For a data retrieval tool, more completeness would be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with descriptions for each parameter. The description adds value by explaining the default behavior of lid (top-level leagues) and the effect of omitting all params (all players all seasons). This improves understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves player pitching statistics and returns stat lines with splits. This distinguishes it from sibling tools like get_player_batting_stats and get_player_fielding_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains default behavior (top-level leagues) and how to use lid for specific leagues, including minor leagues. It also tells users what happens when all params are omitted. However, it does not explicitly state when not to use this tool or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playersA
Retrieve the player roster. Optionally filter by team_id to get a single team's players.
| Name | Required | Description | Default |
|---|---|---|---|
| team_id | No | Team ID to filter by | |
| org_id | No | MLB org team ID — returns all players in the org (MLB roster + all affiliates) by filtering on Parent Team ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. The verb 'Retrieve' implies a read-only operation, but no additional behavioral details (e.g., rate limits, auth, error handling) are provided. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, front-loaded with the main purpose, and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the tool's basic function and optional filtering, but lacks details about the output structure (e.g., what fields are returned) or any edge cases. Adequate for a simple retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds minimal value beyond the schema by restating the filtering option. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Retrieve') and the resource ('player roster'), with optional filtering. It distinguishes from sibling tools like 'find_player' which is for specific players.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions optional filtering by team_id, implying default behavior (all players). It provides some guidance when to use the filter, but does not explicitly state when not to use or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ratingsA
Retrieve player ratings (overall, potential, and per-attribute). If you have a poll_url from start_ratings_job, pass it here to collect results without re-starting the job. Without poll_url, starts a new job and blocks up to ~5 minutes waiting for results.
| Name | Required | Description | Default |
|---|---|---|---|
| poll_url | No | Poll URL returned by start_ratings_job. If provided, skips the job startup and 30s initial delay. | |
| player_ids | No | Filter results to specific player IDs. The full async job still runs, but only matching players are returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It transparently discloses that without poll_url the tool blocks up to 5 minutes and that with poll_url it skips the job startup and 30s delay. However, it does not mention error handling or what happens if the job fails, which would be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the primary action, then the key behavioral nuances. Every word earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of output schema, the description names the returned data (overall, potential, per-attribute) and explains the two usage modes. It covers the essential behavioral details, though it could be more precise about the exact output format or pagination. Still, it is fairly complete for an async result retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description adds meaningful context: for poll_url, it explains that it skips startup and delay; for player_ids, it clarifies that the full job still runs but only matching results are returned. This adds value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool retrieves player ratings (overall, potential, per-attribute) and explains the two modes: using a poll_url to collect results or starting a new job. This distinguishes it from sibling tools like start_ratings_job (which creates the job) and get_players (which retrieves player info, not ratings).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the poll_url parameter (to skip job startup) and when to omit it (to start a new job). It also mentions the blocking behavior (~5 minutes) and the 30s initial delay, giving the agent clear context for decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_team_batting_statsA
Retrieve team batting statistics. Omit params to get all teams for all seasons.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Season year, e.g. 2058 | |
| split | No | Split ID: 1 = Overall, 2 = vs Left-handed, 3 = vs Right-handed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states 'retrieve' implying a read operation, but lacks details on potential side effects, rate limits, or authentication needs. It is not misleading but is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no wasted words. It is front-loaded with the core purpose and includes a useful usage hint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks details about the return value since no output schema is provided. An agent would not know what 'team batting statistics' includes (e.g., specific metrics, format). It also does not mention pagination or limits, which is important for a retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds value by explaining default behavior (omitting params returns all teams all seasons), which is not in the schema. This goes beyond baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb+resource: 'Retrieve team batting statistics.' It distinguishes from sibling tools like get_player_batting_stats and get_team_pitching_stats. However, it could specify the type of statistics returned (e.g., runs, hits) to be more precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a usage hint: 'Omit params to get all teams for all seasons.' But it does not provide explicit when-to-use or when-not-to-use guidance compared to alternatives like get_player_batting_stats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_team_pitching_statsA
Retrieve team pitching statistics. Omit params to get all teams for all seasons.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Season year, e.g. 2058 | |
| split | No | Split ID: 1 = Overall, 2 = vs Left-handed, 3 = vs Right-handed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It only says 'Retrieve team pitching statistics' without disclosing any behavioral traits such as data freshness, side effects, or performance implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The first sentence states the main purpose, and the second clarifies parameter behavior, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with two optional parameters and no output schema, the description adequately covers the core function and default behavior. It is sufficiently complete given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for both parameters (100% coverage). The description adds value by explaining that omitting all params retrieves all teams for all seasons, which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Retrieve team pitching statistics' with a specific verb and resource. It implicitly distinguishes from siblings like get_team_batting_stats (pitching vs. batting) and get_player_pitching_stats (team vs. player).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes 'Omit params to get all teams for all seasons,' which provides guidance on parameter usage. While it doesn't explicitly list alternatives, the context and naming make usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_teamsA
Retrieve the list of teams in the league with their IDs and abbreviations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the burden. It discloses the output content (IDs and abbreviations) but does not mention behavioral traits like rate limits, authentication needs, or whether pagination is involved. For a simple read-only tool, this is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no extraneous words. Every word is necessary and provides clear, concise information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no parameters, the description is mostly complete. It tells what is returned. However, it could mention that it returns all teams (presumably) and that no further filtering is possible, but for a simple list tool, it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are 0 parameters, so per instructions the baseline is 4. The description adds no parameter information, but none is needed since the input schema is empty.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'retrieve' and resource 'teams', and specifies what is returned ('IDs and abbreviations'). It distinguishes from sibling tools like get_players and get_contracts because those are about different entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating it retrieves teams, but does not explicitly say when to use this over siblings. Since the tool has no parameters and is simple, it is implicitly clear, but lacks direct guidance or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_ratings_jobA
Start the async ratings export job and return a poll_url immediately, without waiting. Call this at the beginning of a workflow, do other data lookups while the job processes (~60–90s), then call get_ratings(poll_url) to collect results. This avoids blocking the workflow mid-step.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses async nature, immediate return, and ~60-90s processing time. No annotations exist, so description carries full burden. Could mention error handling or polling limits, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences covering action, workflow pattern, and benefit. Zero waste, well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple async job with no params/output schema, description adequately covers purpose and usage. Could add polling timeout or failure details, but not essential given context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist and schema coverage is 100%. Baseline 4 for zero-param tools; description adds no param info but none needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool starts an async ratings export job and returns a poll_url immediately. It uses specific verbs and resource, and distinguishes the tool from siblings like get_ratings by describing the polling pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call this at workflow start, perform other lookups during processing, then use get_ratings. Provides clear usage context and alternative action, avoiding blocking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct resource or action. The only potential overlap is between find_player (search by name) and get_players (roster by team), but they serve different purposes—one for ID resolution, the other for full roster retrieval.
Most tools follow the get_<resource> pattern, but two tools deviate: find_player and start_ratings_job. This minor inconsistency is understandable given their different operations.
15 tools cover the key aspects of a sports stats server: players, teams, contracts, draft, game data, exports, and ratings. The count feels well-scoped—neither too sparse nor overwhelming for the domain.
The tool surface covers essential read operations for player and team stats, contracts, draft, and game history. Missing components like standings or league info are minor gaps that can be derived from existing data.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MLB Stats API MCP — official MLB statistics (keyless).
Provide detailed Pokémon data and information through a standardized MCP interface. Enable LLMs an…
Hosted MCP server for live public-data APIs and Skills for AI agents.
Live sports stats and pre-computed analysis for AI assistants across NBA, MLB, NFL, and NHL.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables interaction with MLB (Major League Baseball) v3 projections through the SportsData.io API, allowing access to baseball statistics and projections through natural language.
- AlicenseBqualityBmaintenancePython MCP server that provides comprehensive access to MLB statistics and baseball data through a FastAPI-based interface. Acts as a bridge between AI applications and MLB data sources, enabling seamless integration of baseball statistics, game information, player data, and more.2457MIT
- AlicenseNot gradedqualityCmaintenanceConnect ESPN & Yahoo fantasy leagues to AI assistants via MCP. Read-only tools for rosters, standings, matchups, free agents, and league info across football and baseball.15MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for natural language analysis of baseball league data, enabling team statistics, standings, lineup suggestions, and scouting reports via Claude Desktop.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/joshuarichard/StatsPlus-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server