Quick start
https://db-mcp.tigzig.com/mcphttps://db-mcp.tigzig.com/v1Documentation
The full reference. Every endpoint, every field, and every enforced limit with the message you get when you cross it. Rendered from the running service.
The machine contract for this API. The site-wide directory of every TigZig API is the RFC 9727 catalog at api.tigzig.com/.well-known/api-catalog.
Download the whole dataset
The queryable database and every download file are regenerated from source twice daily, so new matches appear here as Cricsheet publishes them.
The exact build time of the files being served right now is the generated_at field in the manifest.
Every table is downloadable as a file. ~5.4M rows across eleven tables. Nothing to sign up for.
Two ways to get it. Scripting? Call GET https://api.tigzig.com/cricket/v1/download/all, or /downloads on this service, which redirects to the same place. Not scripting? Open the list below.
Show all 40 download filesthe whole database as one DuckDB or SQLite file, and each of the 11 tables in Parquet and CSV
The whole database, one file
DuckDB is the one to take: open it locally and every table is there, nothing to load. SQLite if your tooling prefers it.
| DuckDB | ~5.4M rows | zip ~16 MB gz ~16 MB |
| SQLite | ~5.4M rows | zip ~103 MB gz ~103 MB |
All deliveries in one table
Every ball, every format, men's and women's internationals plus the IPL. Filter on the gender and team_type columns.
ball_by_ball | ~5.1M rows | Parquet ~14 MB CSV.gz ~58 MB CSV.zip ~58 MB |
The same deliveries, split by format and gender
Each is a slice of ball_by_ball with identical columns. They sum to it exactly, so pick the slice or the whole, never both.
ball_by_ball_test_men | ~1.7M rows | Parquet ~3 MB CSV.gz ~19 MB CSV.zip ~19 MB |
ball_by_ball_odi_men | ~1.4M rows | Parquet ~4 MB CSV.gz ~16 MB CSV.zip ~16 MB |
ball_by_ball_t20_men | ~820K rows | Parquet ~3 MB CSV.gz ~10 MB CSV.zip ~10 MB |
ball_by_ball_test_women | ~47K rows | Parquet ~100 KB CSV.gz ~500 KB CSV.zip ~500 KB |
ball_by_ball_odi_women | ~324K rows | Parquet ~900 KB CSV.gz ~4 MB CSV.zip ~4 MB |
ball_by_ball_t20_women | ~500K rows | Parquet ~2 MB CSV.gz ~6 MB CSV.zip ~6 MB |
ball_by_ball_ipl | ~296K rows | Parquet ~920 KB CSV.gz ~3 MB CSV.zip ~3 MB |
Match and player tables
match_info is one row per match across every format. match_players is who played in each match. people is the player register, one row per person. These three also come as plain uncompressed .csv. The ball_by_ball files do not, so take Parquet or CSV.gz for those.
match_info | ~11K rows | Parquet ~360 KB CSV ~3 MB CSV.gz ~580 KB CSV.zip ~590 KB |
match_players | ~298K rows | Parquet ~1 MB CSV ~13 MB CSV.gz ~2 MB CSV.zip ~2 MB |
people | ~19K rows | Parquet ~520 KB CSV ~1 MB CSV.gz ~470 KB CSV.zip ~470 KB |
File-name addresses. Every file also has an address that ends in its own file name, for example https://api.tigzig.com/cricket/v1/download/ball_by_ball.parquet. curl -O and wget save it under the right name. The ?format= form keeps working. Every file's address: https://api.tigzig.com/downloads/cricket.
Query a parquet file in place. Parquet files support HTTP range requests, so DuckDB, pyarrow, polars or a browser can query them in place and read only the parts a query needs. For browsers, responses expose Content-Range, Content-Length and ETag to cross-origin JavaScript.
SELECT count(*) FROM read_parquet('https://api.tigzig.com/cricket/v1/download/ball_by_ball.parquet');
Zip and gz hold the same bytes, pick whichever your tooling prefers. Sizes and row counts here are approximate because the files are regenerated twice daily - exact per-file figures, always current, are in the manifest. A README.txt is inside every full-database file.
What you can call
6 endpoints. Request bodies, every field and every enforced limit are in the full reference.
| GET | /downloads | Bulk file downloads for the cricket data |
| GET | /terms | Licence and source for the cricket data |
| GET | /v1/query/duckdb | GET variant: read-only SQL on DuckDB (men's and women's T20, ODI and Test internationals, plus the IPL) via ?sql= |
| POST | /v1/query/duckdb | Run read-only SQL on DuckDB: men's and women's T20, ODI and Test internationals, plus the IPL cricket ball-by-ball |
| GET | /v1/query/postgres | GET variant: read-only SQL on Postgres (men's and women's T20, ODI and Test internationals, plus the IPL) via ?sql= |
| POST | /v1/query/postgres | Run read-only SQL on Postgres: men's and women's T20, ODI and Test internationals, plus the IPL cricket ball-by-ball |
Overview
Every ball of international and IPL cricket, men's and women's, plus the match-level tables - published as files and refreshed twice daily. Take the whole database as a single DuckDB or SQLite file, or any individual table as Parquet or CSV.
No coding needed - go to Download the whole dataset and click a file. Prefer to automate it? One call pulls everything: GET https://api.tigzig.com/cricket/v1/download/all. Or skip the download entirely and run your own read-only SQL against it live, from the browser or from an AI agent - see What you can call.
This MCP server is also listed in the machine-readable API catalog at /.well-known/api-catalog. Connect a transport below and run read-only SQL as a tool call.
A security-hardened, read-only SQL query API exposing two databases as MCP tools for AI clients - an open endpoint for public use and an Auth0-secured endpoint for gated access. Connect from Claude Code, Claude Desktop, Claude.ai (web connectors), Claude in Excel, or any MCP client. Setup instructions in the README.
Both query endpoints take POST with a JSON body, which is the one to use - no URL-length limit and nothing to percent-encode. Each also has a GET variant, listed below, for clients that cannot send a body.
MCP endpoints
Open MCP endpoint (no auth)
https://db-mcp.tigzig.com/mcp- Streamable HTTP, the recommended transport (MCP spec 2025-03-26). No API key, no login on any open endpoint - open by design, defended by the multi-layer stack below.
Secured MCP endpoint (Auth0 OAuth)
https://db-mcp.tigzig.com/mcp-secure- Streamable HTTP, Auth0-gated (recommended). Requires Auth0 login with an email whitelist - same databases and tools as the open endpoint, with authentication on top.
What's inside
Both engines carry the same tables, joined on match_id, so the endpoint you pick is a choice of SQL dialect, not of format - the same question returns the same answer on either:
ball_by_ball- every delivery in one table: men's and women's Test, ODI and T20 internationals, plus the IPL. Filter on thegenderandteam_typecolumns.- The same deliveries split by format and gender -
ball_by_ball_test_men,ball_by_ball_odi_women,ball_by_ball_ipland so on, seven in all. Each is a slice ofball_by_ballwith identical columns, and they sum to it exactly. match_info- one row per match across every format. Who won, by how much, the competition, player of the match, the officials and the match conditions - none of which is in the ball tables. Per-format views such asmatch_info_odi_menexist too.match_players- who played in each match, one row per player per match.people- the player register, one row per person.- Refreshed twice daily.
- Both read-only at database and application level.
- JSON and TSV output (TSV uses ~70% fewer tokens).
Row counts, column lists and every enforced limit are deliberately not repeated here. They move - twice daily for the counts, and whenever a field is added. The service root at db-mcp.tigzig.com derives the counts per request, and the full reference carries the columns, the guardrails and the refusal messages, generated from the running service. Any query against a wrong table or column also returns a 400 that hands back the real tables, all columns and working calls - so the service will correct you faster than this page could. A wrong number here would be worse than no number.
Pick Postgres or DuckDB on dialect. QUALIFY works on DuckDB and fails on Postgres; date and string functions differ. Standard SELECT, JOIN, GROUP BY, CTEs, window functions and FILTER work on both. If a query works on one endpoint and fails on the other, check the dialect before you check your table names.
Before you count anything. match_info holds every match across every format, so a count there will not reconcile with a count in any single ball table unless you filter on match_type. Those values are uppercase - 'Test' matches nothing - and the current list is in the spec. Test cricket landed in August 2026; before that match_info carried Test matches with no deliveries behind them, so a query you wrote earlier will now return more rows than it used to.
The table names changed in September 2026, and the old ones are gone. odi_ball_by_ball, t20_ball_by_ball_women, match_info_women and the rest of the August names no longer resolve on either engine - they return a 400 saying the relation does not exist. The pattern is now ball_by_ball_<format>_<gender>, so odi_ball_by_ball became ball_by_ball_odi_men. The columns are the same, so a rename is the whole fix. ball_by_ball itself is a live table again, and it is now the whole dataset rather than one format.
Source and licence
Source: Cricsheet. Licence: Open Data Commons Attribution License 1.0 (ODC-BY). TigZig is not affiliated with or endorsed by Cricsheet. The tables are derived from Cricsheet's data: reshaped into two engines, joined to match and player tables and refreshed twice daily.
Coverage note. Cricsheet withholds matches featuring the Afghanistan men's team or played in the Afghanistan Premier League (see cricsheet.org/withheld-matches). That exclusion is inherited here, so this is not a complete record of men's internationals.
Provided as is, with no guarantee of accuracy, completeness or availability and no support commitment. Full terms: db-mcp.tigzig.com/terms
Security hardening
The open endpoint is intentionally public - anyone with the URL can query. It is defended by a multi-layer stack:
- Cloudflare WAF + application-level rate limiting.
- Per-IP and global concurrency caps.
- Multi-layer SQL validation. Read-only statements only, with joins, functions and query shape all bounded. The exact allowlist, every enforced limit and the refusal message each one returns are enumerated in the full reference.
- Schema discovery is readable on purpose, so you can explore the shape without guessing. Server and role catalogs stay blocked.
- Query timeouts with DuckDB engine interrupt.
- Database-level read-only enforcement (Postgres + DuckDB) and container resource limits.
- Error-message sanitization - no internal details leaked.
- Auth0 OAuth with JWT verification on the secured endpoint.
For the broader web-app security checklist (135 items across all stacks), see tigzig.com/security.
What is new
- 5 Nov 2026 Venue names standardised: 609 distinct names became 382, applied to 5,145 older matches
- 1 Nov 2026 Cricket data on Kaggle and Hugging Face, plus plain CSV files
- 28 Oct 2026 Cricket match_info, match_players and people files are now plain CSV downloads, no unzipping, refreshed twice a day
- 18 Oct 2026 Second week of October matches are in, with Renshaw's 190 in Durban, Farhan's 238 across three T20Is, and hundreds for Hope and Voll
- 11 Oct 2026 Download hub: 46 datasets, 172 files in one indexAll APIs
Everything that changed, newest first - the full log across every API and app.
Guides
This page is the reference - what the endpoints are and how to call them. The guides below are the long-form versions, with worked examples and the edges you only meet in real use:
- A database server you can point an AI agent at - Start here. what this service is, with ball-by-ball cricket behind it: the REST API, the MCP server, and what an agent does with each.
- Your agents and scripts have been talking to me - what real callers actually do, read out of the server logs: the common mistakes, what works, and the patterns worth copying.
- Is it you, or is it me? - the public status page for every TigZig API, so you can check whether a failure is at your end or ours before you start debugging.
- Run your own SQL on the cricket database - worked queries against T20 and ODI ball-by-ball data, free and with no key, plus what the row caps mean in practice.
- Taking the whole dataset as files - the download paths, how the file names are formed, and when a bulk pull is the better move over a query.
Each is a plain page with a Markdown twin, so you can hand a URL straight to an agent. Come back to this page when you want parameter-level detail.
Rate limits
These are per-IP limits:
- Per IP: 60 requests / minute.
- At most 2 concurrent queries per IP.
- Up to 1,000 rows per answer and 3,500 characters of SQL.
Every refused request, including one over the rate limit, gets HTTP 400 with the body {"error":{"code":"REJECTED","message":"Rejected."},"download":"https://db-mcp.tigzig.com/downloads"}. The body gives no reason, so stay inside the limits above. For heavy work, download the files.
Staying inside the limits: These are ~1M-row tables, so aggregate or LIMIT server-side in the SQL rather than paginating. One GROUP BY costs a single request where pagination costs dozens.
The current numbers are also published as machine-readable JSON at https://db-mcp.tigzig.com/, derived from live config. Read those at runtime rather than hard-coding the figures above - limits change, and these channels change with them.
Try it
No key, no signup.
https://db-mcp.tigzig.com/v1/query/postgres?sql=SELECT%20COUNT(*)%20AS%20balls%20FROM%20ball_by_ball_t20_men
curl -X POST "https://db-mcp.tigzig.com/v1/query/postgres" -H 'Content-Type: application/json' -d '{"sql":"SELECT striker, SUM(runs_off_bat) AS runs, COUNT(*) AS balls FROM ball_by_ball WHERE season = '2023' GROUP BY striker ORDER BY runs DESC LIMIT 10","format":"json"}'
Open-source edition
There is an open-source edition of this MCP server - an earlier release you can run as your own service or borrow components from. Treat it as a reference implementation rather than a mirror of what is running here: the hosted service has moved on since. Licensed Apache 2.0.
github.com/amararun/shared-fastapi-database-mcp
Built on FastAPI, fastapi-mcp, asyncpg, DuckDB, SlowAPI.
Auth0 OAuth is optional - the repo covers enabling the secured endpoint or running open-only.