cricket-mcp
by asaraog
README.md
# 🏏 Cricket MCP Server
[](https://modelcontextprotocol.io)
[](https://go.dev)
[](LICENSE)
> Cricket analytics for Claude Desktop, Claude Code, Cursor and any other MCP
> client — a calibrated win-probability model, 22,479 archived matches, and
> live prediction-market prices.
A [Model Context Protocol](https://modelcontextprotocol.io) server that gives
AI assistants real cricket knowledge: a **calibrated win-probability model**, a
**ball-by-ball archive of 22,000+ matches**, live prediction-market prices,
career records, and live scores.
Ask cricket questions in plain language and get answers computed from data
rather than recalled from training.
## ⚡ Add it in one step
It is hosted. There is nothing to install, download, build or configure.
```
https://cricketfornoobs.com/mcp
```
Paste that into your client's connector settings and you are done.
| Client | Where |
|---|---|
| **Claude** (free plan included) | Customize → Connectors → Add custom connector |
| **ChatGPT** | Settings → Apps → Developer mode → add server |
| **Claude Code** | `claude mcp add --transport http cricket https://cricketfornoobs.com/mcp` |
| **Cursor / VS Code** | one-click buttons at [cricketfornoobs.com/mcp](https://cricketfornoobs.com/mcp) |
| **Gemini CLI** | add `{"cricket": {"httpUrl": "https://cricketfornoobs.com/mcp"}}` to `~/.gemini/settings.json` |
No account, no API key, no data pipeline. Read-only.
Prefer to run it on your own machine? See [Quick start](#-quick-start) below:
same tools, one static binary.
## 💬 Things to ask it
- *"Who's winning the India match right now, and what does the model say?"*
- *"What's the score in the Minor League Cricket game, and who's favoured?"*
- *"Who is favoured at 149 for 7 chasing 178 with three overs left?"*
- *"How does Kohli bat against Bumrah in T20s?"*
- *"What does the market think versus your model for Welsh Fire vs Southern Brave?"*
- *"How does Bumrah get his wickets — bowled, caught, lbw?"*
- *"What's Rashid Khan's dot-ball percentage in T20s?"*
- *"Is Kohli better batting first or chasing?"*
- *"Who does Rohit Sharma score most of his runs with?"*
- *"Does Grand Prairie Stadium favour chasing?"*
- *"Show me Pooran's death-overs record."*
- *"What actually is a googly?"*
The same win model runs in production at
**[cricketfornoobs.com](https://cricketfornoobs.com)**, a live cricket explainer
for American sports fans. This server exposes the analytics side of it to any
MCP client.
## ✨ What makes this different
Most sports MCP servers wrap a scores API. This one ships analysis:
- **Win probability from a fitted model** — logistic regression per format and
innings over 10,847 matches (3.4M ball states), with pre-match Elo ratings.
Held-out log loss 0.42 (T20 chases) / 0.40 (ODI chases); ~91% accurate on
confident calls. It knows that 149/7 chasing 178 is not the same story as
149/2.
- **Ball-by-ball archive** — 22,479 matches and 11.4M deliveries across T20,
ODI/List-A, Tests and domestic multi-day cricket.
- **Career and matchup records** — batter-vs-bowler head-to-heads, phase
splits (powerplay / middle / death), venue reports, league leaderboards.
- **Baseball translations** — every cricket term explained through its closest
baseball equivalent, for newcomers to the sport.
## 🛠️ Tools
| Tool | What it does |
|------|-------------|
| `cricket_win_probability` | Win probability for any live or hypothetical match state |
| `cricket_head_to_head` | Career batter-vs-bowler record (balls, runs, dismissals, strike rate) |
| `cricket_player_career` | Career aggregates per format, men's and women's cricket |
| `cricket_match_archive` | Scorecard for an archived match, searched by teams / league / year |
| `cricket_phase_stats` | Batting and bowling split by powerplay, middle overs and death |
| `cricket_venue_stats` | Ground report: average first-innings score, chase win rate |
| `cricket_leaders` | League and season leaderboards for runs or wickets. `t20i` is the T20Is alone; `t20` adds the domestic T20s that have no code of their own. `t20i`, `t20`, `odi`, `test`, `bbl`, `cpl` and `hundred` hold men's and women's games and read the men's unless `gender` is `female` |
| `cricket_team_form` | A team's recent archived results. Optional `format` (`t20`, `odi`, `test`) and `gender` (`male`, `female`) keep one side's games: the archive gives a country's men's and women's teams one name |
| `cricket_dismissals` | How a batter gets out, or how a bowler takes wickets |
| `cricket_discipline` | Dot-ball and boundary percentage, the numbers no scorecard shows |
| `cricket_situational` | A batter's record batting first versus chasing |
| `cricket_partnerships` | Runs added with each partner at the crease, and the best stand |
| `cricket_market_odds` | Live prediction-market prices (Kalshi) beside this model's number |
| `cricket_live_matches` | Matches live and upcoming right now |
| `cricket_explain_term` | Any cricket term, with its baseball equivalent |
| `cricket_minor_league` | Minor League Cricket (US domestic T20): live scores, situation and win chances from Kalshi's live data |
| `cricket_minor_league_info` | Minor League history, teams, grounds and player records. Hosted-only data: the local build points you to the hosted server |
All tools are read-only.
**Minor League Cricket data.** ESPN does not carry the league, so its
fixtures and scores come from Kalshi's public live data: the schedule, each
game's score and state, and Kalshi's market beside it. That feed has no
ball-by-ball commentary and names no batters or bowlers, so
`cricket_minor_league` cannot say who is batting, who took a wicket or what
happened on a given ball. A market figure appears only when Kalshi's book is
a real price, and the model prices only the chase. The hosted server's
`cricket_minor_league_info` does name players: it draws on CricClubs
scorecards and results, and on Wikipedia's season articles (CC BY-SA 4.0),
which is why that data stays on the hosted server.
## 🚀 Quick start
### 1. Install
One static binary, no runtime, no interpreter, no dependencies.
```bash
go install github.com/asaraog/mcp-cricket/cmd/cricket-mcp@latest
```
Or download a prebuilt binary for macOS (Apple silicon or Intel), Linux
(x86-64 or arm64) or Windows from
[Releases](https://github.com/asaraog/mcp-cricket/releases).
Register it with Claude Code:
```bash
claude mcp add cricket -- ~/go/bin/cricket-mcp
```
### 2. Or configure a desktop client
Add the server to your client's config — for Claude Desktop:
| OS | Config file |
|----|-------------|
| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
| Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
| Linux | `~/.config/Claude/claude_desktop_config.json` |
```json
{
"mcpServers": {
"cricket": {
"command": "/ABSOLUTE/PATH/TO/cricket-mcp"
}
}
}
```
Restart the client and the cricket tools appear. Live scores, the win model,
market prices and the glossary work as they are. The archive tools need the
ball-by-ball database, which is not in the binary.
### 3. The archive
The database is built by the
[asaraog/cricket-history-data](https://github.com/asaraog/cricket-history-data)
workflow from public [Cricsheet](https://cricsheet.org) data and published
there as a release asset, `history-full.db.gz` (206 MB). That release is
private. With `HISTORY_DB_TOKEN` set to a GitHub token that can read it, the
server resolves the latest release on first use, downloads the archive once
into your OS cache directory (`~/Library/Caches` on macOS, `~/.cache` on
Linux, `%LocalAppData%` on Windows) and reuses it from then on; when a later
release replaces the asset, the next start downloads the new one. Without a
token the download fails and the archive tools say the archive is missing.
Building it yourself needs no token:
```bash
curl -O https://cricsheet.org/downloads/all_json.zip
python3 scripts/histgen.py all_json.zip history.db
```
Then point `HISTORY_DB` at the result. A file you built is opened as it is
and never replaced by a download. Limited-overs-only archives work too:
tools degrade gracefully when a format is absent.
`scripts/histgen.py` is the same script the workflow runs. Since 2026-10-06
its `deliveries` table carries `wide` and `noball` columns, so balls faced
leave out wides and a bowler's balls leave out wides and no-balls, as a
scorecard counts them. An archive built before that has neither column; the
server reads it as before, counting every row as a ball.
Since 2026-10-07 its `matches` table also carries a `gender` column, `male`
or `female` as Cricsheet records it. `cricket_leaders` and
`cricket_team_form` filter on it. Older archives (the v1 file and the
2026-10-06 rebuild) still work: without the column, a game's gender is read
off its event name, which says "Women" for Cricsheet's women's events.
## ⚙️ Configuration
| Variable | Purpose |
|----------|---------|
| `HISTORY_DB` | Where the archive lives (default: your OS cache directory) |
| `HISTORY_DB_URL` | Download the archive from this URL instead of the latest release |
| `HISTORY_DB_TOKEN` | GitHub token that can read the private release, or a bearer token for `HISTORY_DB_URL` |
| `HISTORY_QUERY_TIMEOUT` | Deadline for match lookups and scorecards, default `3s` |
| `HISTORY_ANALYTICS_TIMEOUT` | Deadline for phase splits, leaders, dismissals, discipline, situational and partnership queries, default `15s` |
| `MILC_LIVE` | `off` turns off Minor League Cricket live data |
Live-score tools work without any archive; archive tools report clearly when
the database is missing rather than inventing an answer.
## 📊 About the model
The win model is fitted offline, not guessed at runtime. Features are match
state (runs, wickets, balls remaining, required rate), pre-match Elo, and a
wickets × required-rate interaction — because thin batting hurts far more when
the asking rate is steep. Calibration is measured by wickets in hand: within
about one point across most of the range.
**Par is per ground.** A first-innings score only means something relative to
what the ground usually yields, so the innings-one segments are fitted against
a table of 371 grounds and 7 leagues rather than one global constant. Real pars
run from 153.7 to 172.5 by league alone, and further by ground. Pass `venue`
(and `league`) to `cricket_win_probability` and the same 80/2 at ten overs is
47% at Chinnaswamy and 60% at Newlands. Without a venue it falls back
ground → league → global, which costs about 0.006 of held-out log loss.
It cannot see injuries, weather, pitch reports or team news.
## 📈 Markets
`cricket_market_odds` reads public prices from [Kalshi](https://kalshi.com), a
CFTC-regulated US exchange where contracts settle at $1 and a price in cents
*is* the implied probability. Put beside `cricket_win_probability`, the gap
between the two is the edge a trader would be claiming.
This is informational only — read-only market data, no account, no orders, no
advice. The model cannot see injuries, weather or team news, which is often
exactly why it disagrees with the market. Event contracts are legal in some
jurisdictions and not others.
## 🙏 Data
Ball-by-ball data from [Cricsheet](https://cricsheet.org), licensed
[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). Live scores
from public ESPNcricinfo endpoints, and for Minor League Cricket from Kalshi's
public live data; market prices from Kalshi's public API.
This project is unaffiliated with any of them.
## 📝 License
BSD 3-Clause. See [LICENSE](LICENSE).
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues