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 V3 Scores MCP Server
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
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- 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