sportsdata-mcp
Allows retrieval of Contentful CMS entries (e.g., promotions, major-event navigation) via the Entain/Ladbrokes provider.
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., "@sportsdata-mcpcompare AFL odds for Collingwood vs Essendon across Sportsbet and Entain"
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.
sportsdata-mcp
An MCP server that exposes sports-data APIs (bookmakers, league/governing-body feeds, aggregators) as tools, configurable so you only load the tool groups you need. A capability-tag system makes tools from different providers interchangeable wherever they answer the same question — so the model can compare odds across bookies or stats across data sources with one discovery call.
Three providers ship today — AFL (api.afl.com.au), Sportsbet, and
Entain / Ladbrokes — exposing 101 provider tools across 14 groups, plus
3 always-on meta-tools. New providers are added by dropping a YAML spec into
src/sportsdata_mcp/specs/; the engine needs no code changes.
Design notes and roadmap live in
PLAN.md.
Install
uvx sportsdata-mcp serve # run without installing
# or
pip install sportsdata-mcpQuickstart
sportsdata-mcp version # print version info
sportsdata-mcp list-groups # see every available tool group
sportsdata-mcp lint # validate the packaged specs
sportsdata-mcp doctor # probe enabled groups for reachability + auth
sportsdata-mcp serve # start the MCP stdio server (default command)Enable tool groups with a config file or the SPORTSDATA_MCP_GROUPS env var:
SPORTSDATA_MCP_GROUPS="afl.public.core,sportsbet.racing,entain.graphql" sportsdata-mcp serveSee examples/ for Claude Desktop / Claude Code config snippets
and a worked cross-bookie odds-comparison prompt.
Configuration
Config is resolved in this order (first hit wins):
--config <path>flag$SPORTSDATA_MCP_CONFIG./sportsdata-mcp.yaml~/.config/sportsdata-mcp/config.yamlbuilt-in defaults
# sportsdata-mcp.yaml
enabled_groups:
- afl.public.core
- sportsbet.racing
- entain.graphql
providers: # all optional; sensible defaults apply
sportsbet:
request_timeout_seconds: 30
rate_limit_rps: 10 # sustained requests/sec (token bucket)
max_response_bytes: 0 # 0 = no cap (default); set a positive byte count to guard context
secrets: {} # for authenticated providers; prefer env vars in prodEnvironment variables
Variable | Effect |
| Comma-separated group list; overrides |
| Path to a config file (see resolution order above). |
| Global response-size cap in bytes for every provider that doesn't set its own |
Meta-tools (list_available_groups, list_tools_by_capability, list_resources)
are always registered regardless of what is enabled, so a fresh install can still
guide the model to turn groups on.
On the response-size cap. There is no cap by default — every tool returns
whatever the upstream API sends. If you want to guard the model's context window you
can opt in to a cap: precedence is providers.<id>.max_response_bytes >
SPORTSDATA_MCP_MAX_BYTES > the default (0, unlimited). Be aware that very large
payloads (e.g. Sportsbet's full *_event_markets firehose, ~2 MB) won't fit in
Claude's ~200 K-token context regardless — for those, prefer a narrower tool such as
sportsbet_sports_card with includeTopMarkets: true.
Tool groups
Run sportsdata-mcp list-groups for live counts and descriptions.
AFL — api.afl.com.au
Group | Tools | Notes |
| 22 | Competitions, seasons, rounds, fixtures, ladders, match stats |
| 9 | Broadcast regions, guides, providers |
| 8 | News/articles, videos, photos |
| 1 | CFS premium ops — needs the anonymous |
| 1 | StatsPro ops — needs the |
| 1 | HLS video URL signing |
Sportsbet — sportsbet.com.au
Group | Tools | Notes |
| 15 | Race meetings, racecards, results, futures, SRMs |
| 14 | Sport events, markets, prices, SGMs |
| 12 | Live status, commentary, ladders, promos, video |
| 2 | Resulted events by date |
| 1 | Persisted GraphQL gateway ( |
Entain / Ladbrokes — ladbrokes.com.au
Group | Tools | Notes |
| 13 | Navigation quick-links and REST surfaces |
| 1 | 127 persisted GraphQL ops ( |
| 1 | Contentful CMS entries (promotions, major-event nav) |
NRL — mc.championdata.com
Group | Tools | Notes |
| 4 | Champion Data match centre: competitions, fixture, per-match player stats, app settings |
Plus the nrl://stats/definitions resource (dictionary of every NRL stat code).
Cross-provider comparison
Every tool is tagged with provider-agnostic capability slugs (e.g.
sport.event_markets, racing.race_card). Tools sharing a slug answer the same
question and are directly comparable across providers. The discovery flow:
list_tools_by_capability("sport.event_markets")→ every enabled tool exposing itCall each provider's tool concurrently with the resolved event ids
Compare the raw snapshots (schemas are not normalised — the model reconciles them)
See examples/comparator-prompt.md for a full
"compare Storm v Cowboys odds across bookies" walkthrough.
Per-provider notes
Sportsbet — anonymous public APIs; no secrets needed. REST events are keyed by integer
eventId; a persisted-GraphQL gateway is exposed viasportsbet_graphql_call(browsesportsbet://graphql/operations).Entain / Ladbrokes — a persisted-GraphQL gateway; the model supplies an operation name + variables (discover them in
entain://graphql/operations). Hashes can drift when the front-end bundle ships; refresh them withsportsdata-mcp refresh-hashes entain.AFL —
afl.public.*is anonymous.afl.premium.*mints an anonymousx-media-mis-tokenautomatically; some premium endpoints still return 401 for anonymous callers.NRL — the anonymous Champion Data match-centre CDN (
mc.championdata.com), the same static JSON the official nrl.com match centre reads. No secrets, no cache-buster params needed. Resolve acompetitionIdfromnrl_competitions(e.g. 12999 = 2026 NRL Premiership), amatchIdfromnrl_fixture, then pull per-player match stats fromnrl_match; decode stat codes vianrl://stats/definitions.
CLI reference
Command | Purpose |
| Start the MCP stdio server (default when no subcommand) |
| Print every group with tool count + description |
| Validate specs against the schema + capability catalogue (nonzero on failure) |
| Per-provider reachability + auth + REST-contract probe (nonzero on failure) |
| Refresh persisted-query hashes from the live front-end bundle ( |
| Print version info |
-v / --verbose enables DEBUG logging (and un-silences httpx/httpcore).
Contributing
Adding a provider is a spec-only change in the common case:
Write
src/sportsdata_mcp/specs/<provider>.yaml(copy an existing spec).Tag each tool with capability slugs from
specs/_capabilities.yaml; add a new slug there if none fits (two providers sharing a slug makes them comparable).sportsdata-mcp lint— must pass.sportsdata-mcp doctor(with the new groups enabled) — probes it live.pytest -m "not live"— offline suite; drop the marker filter to run live tests.
pip install -e ".[dev]"
pytest -m "not live"
ruff check .License
MIT
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
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/DanielTomaro13/sportsdata-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server