sportsdata-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SPORTSDATA_MCP_CONFIG | No | Path to a configuration file. | |
| SPORTSDATA_MCP_GROUPS | No | Comma-separated list of enabled tool groups; overrides config file. | |
| SPORTSDATA_MCP_MAX_BYTES | No | Global response-size cap in bytes (0 = no cap). |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_available_groupsA | List every tool group across all providers, which are currently enabled, and each provider's auth requirements (env-var names + required/optional). On a fresh install (no groups enabled) this is the only functional tool, so the model can guide the user to enable what they want in sportsdata-mcp.yaml. |
| list_tools_by_capabilityA | Discover tools by capability — the unit of cross-provider comparison. Given a slug like 'sport.event_markets', returns every enabled tool exposing it across providers. Pass no argument for the full capability → tools map. |
| afl_competitions_listB | List all AFL competitions (AFL, AFLW, VFL, SANFL, …). Returns: {meta:{pagination}, competitions:[{id, providerId, code, name}]} Example: All 16 competitions |
| afl_competition_getA | Get a single competition by integer id. Returns: {meta, competitions:[{id, providerId, code, name}]} |
| afl_compseasons_listA | List comp seasons across all competitions (2012–present). Returns: {meta:{pagination}, compSeasons:[{id, providerId, name, competition, season}]} |
| afl_competition_compseasonsC | List comp seasons within one competition. Returns: {meta, compSeasons:[...]} |
| afl_compseason_getA | Get a single comp season (embeds its full rounds array + currentRoundNumber). Returns: {meta, compSeasons:[{id, providerId, name, shortName, season, rounds:[...], currentRoundNumber}]} |
| afl_rounds_listB | List rounds for a comp season (incl. byes, start/end times). Returns: {rounds:[{id, providerId, roundNumber, abbreviation, byes, utcStartTime, utcEndTime}]} |
| afl_ladders_getC | Competition ladder up to a comp season's current round. Returns: {compSeason, round, ladders:[{entries:[{position, team, played, thisSeasonRecord}]}]} Example: 2026 AFL ladder |
| afl_seasons_listC | List calendar-year season records. Returns: {meta, seasons:[{id, year}]} |
| afl_season_getA | Get a single calendar-year season by id. Returns: {meta, seasons:[{id, year}]} |
| afl_clubs_listC | List AFL/AFLW clubs (32). Returns: {clubs:[{id, providerId, name, abbreviation, nickname}]} |
| afl_club_getB | Get a single club by id. Returns: {clubs:[{id, providerId, name}]} |
| afl_teams_listB | List teams (150 incl. AFL men, AFLW, state leagues, historical). Returns: {teams:[{id, providerId, name, abbreviation, nickname, club, teamType, metadata}]} |
| afl_team_getA | Get a single team by id (incl. social/home-venue metadata). Returns: {teams:[{id, providerId, name, club, teamType, metadata}]} |
| afl_teams_idmapA | Map CD_T* team providerIds to integer aflapi ids (and vice versa). Returns: {entityType:'team', idMapResponse:{ids:{'CD_T10':1, ...}}} |
| afl_venues_listB | List venues (191) incl. location, state, timezone, landOwner. Returns: {venues:[{id, providerId, name, location, state, timezone, landOwner}]} |
| afl_venue_getA | Get a single venue by id. Returns: {venues:[{id, providerId, name, location, state, timezone}]} |
| afl_players_listB | List players (17k+ all-time catalogue). Returns: {players:[{id, providerId, firstName, surname, dateOfBirth, draftYear, heightInCm}]} |
| afl_player_getA | Get a single player by id (bio, draft, height/weight). Returns: {players:[{id, providerId, firstName, surname, draftYear, debutYear, recruitedFrom}]} |
| afl_matches_listA | List matches with filters (competition, season, round, team, status, date). Returns: {meta:{pagination}, matches:[{id, providerId, round, home, away, venue, utcStartTime, status}]} Example: Live + upcoming AFL matches from a date |
| afl_match_getA | Get a single match by integer id (teams, venue, time, score when started). Returns: {meta, matches:[{id, providerId, home, away, venue, utcStartTime, status, score?}]} |
| afl_matches_idmapA | Map every match providerId (CD_M*) to its integer id (~48 KB). Returns: {entityType:'match', idMapResponse:{ids:{'CD_M20260141201':8139, ...}}} |
| afl_players_idmapA | Map every player providerId (CD_I*) to its integer id (~98 KB, 17k+). Returns: {entityType:'player', idMapResponse:{ids:{...}}} |
| afl_broadcast_regionsB | List broadcast regions (26) with timezones. Returns: {pageInfo, content:[{id, name, timezone}]} |
| afl_broadcast_region_getC | Get a single broadcast region by id. Returns: {id, name, timezone} |
| afl_broadcasters_listC | List broadcasters (49: Foxtel, Channel 7, BBC, ESPN, …). Returns: {pageInfo, content:[{id, name, abbreviation, logo, restrictedCountries}]} |
| afl_broadcast_channelsB | List broadcast channels (272) with media types (VIDEO/AUDIO/TEXT). Returns: {pageInfo, content:[{id, name, abbreviation, broadcaster, channelTypes:[{name, mediaType}]}]} |
| afl_broadcast_eventsB | Broadcast schedule — one entry per match per channel. Returns: {pageInfo, content:[{id, name, startDateTime, channels:[...], contentReference:{id, type}}]} |
| afl_broadcast_event_getB | Get a single broadcast event by id. Returns: {id, name, startDateTime, channels:[...], contentReference} |
| afl_broadcast_match_eventsB | Broadcast events scoped to one (compseason, round). Returns: {pageInfo, content:[{id, name, startDateTime, channels}]} |
| afl_live_videoC | Live AFL video streams (empty when no game is live). Returns: {pageInfo, content:[{id, name, channels:[{streamUrl, type:'LIVE'}]}]} |
| afl_live_audioC | Live AFL audio streams (empty when no game is live). Returns: {pageInfo, content:[{id, name, channels:[...]}]} |
| afl_content_text_listA | List text articles (news) with reference/tag filters. Returns: {pageInfo, content:[{id, type:'text', title, date, tags, references, body, author}]} Example: AFL+AFLW news index |
| afl_content_text_getA | Get a single text article by id. Returns: {id, type:'text', title, body, author, references, tags} |
| afl_content_video_listB | List video content (highlights, replays, press conferences). Returns: {pageInfo, content:[{id, type:'video', title, duration, onDemandUrl, additionalInfo}]} |
| afl_content_video_getB | Get a single video content item by id. Returns: {id, type:'video', title, duration, onDemandUrl} |
| afl_content_photo_listC | List photo content. Returns: {pageInfo, content:[{id, type:'photo', title, leadMedia}]} |
| afl_content_photo_getB | Get a single photo content item by id. Returns: {id, type:'photo', title} |
| afl_content_promo_listB | List promo / marketing cards (each embeds a links[] of CTAs). Returns: {pageInfo, content:[{id, type:'promo', title, links:[{promoUrl, linkText}]}]} |
| afl_content_promo_getA | Get a single promo content item by id. Returns: {id, type:'promo', title, links:[...]} |
| afl_keyserver_url_signingA | Sign an AFL HLS video URL for playback (returns a token-signed CDN URL). Returns: {signedUrl} (anonymous tokens may return {code: KEYSERVER001, status: 401}) |
| afl_cfs_callB | Call any of the AFL CFS premium operations (api.afl.com.au/cfs/afl/...). Requires the anonymous x-media-mis-token (minted automatically). Path params use provider IDs (CD_M*/CD_R*/CD_S*/CD_I*/CD_T*) — map integer ids via the idmap endpoints/resources. Read afl://cfs/operations for the full op list. Returns: (JSON object) |
| afl_statspro_callB | Call any of the AFL StatsPro operations (api.afl.com.au/statspro/...). Requires the anonymous x-media-mis-token (minted automatically). Path params use provider IDs (CD_S*/CD_R*/CD_I*). Read afl://statspro/operations for the list. Returns: (JSON object) |
| betfair_market_pricesC | Exchange back/lay prices + state for one or more markets (the core odds feed). Returns: {currencyCode, eventTypes:[{eventTypeId, eventNodes:[{eventId, event:{eventName, countryCode, openDate}, marketNodes:[{marketId, state:{inplay, status}, description, runners:[{...prices: back/lay}]}]}]}]} Example: Price two markets |
| betfair_markets_by_eventA | Market STRUCTURE for an event (market ids, names, runners) — probed live 2026-07-06: this route STRIPS exchange prices (runners come back without the exchange block) and 400s on multi-id batches. For prices, feed the market ids into betfair_market_prices; for bulk market-id discovery, betfair_navigation with attachments=MENU,EVENT,MARKET returns 1000+ MARKET nodes per event type in one call. Returns: {currencyCode, eventTypes:[{eventNodes:[{eventId, event:{eventName}, marketNodes:[{marketId, description:{marketType}, state, runners:[{...prices}]}]}]}]} |
| betfair_cashoutB | Cash-out availability for one or more markets. Returns: [{marketId, cashout, partial}] (top-level array) |
| betfair_navigationB | Navigation graph by node — traverse sport → group → event → market. Feed market ids into betfair_market_prices. Returns: {nodes:[{nodeId, name, nodeType: EVENT_TYPE|MENU|EVENT|MARKET, navInfo, ...}]} Example: Top of the Horse Racing tree |
| betfair_scoresC | Live scores for one or more in-play events (per-sport score detail). Returns: [{eventId, eventTypeId, score:{home:{name, score, ...}, away:{...}}}] (top-level array) |
| betfair_event_detailsC | In-play event details (event name, competition, primary market, runners, start time) for one or more events. Returns: [{eventId, eventTypeId, marketId, marketName, eventName, competitionName, numberOfRunners, countryCode, startTime}] (top-level array) |
| betfair_event_timelineA | Live timeline + running score/state for one in-play event. Returns: {eventId, eventTypeId, score:{home:{name, score, numberOfYellowCards, ...}, away:{...}}, timeElapsed, ...} |
| betfair_event_timelinesB | Live timelines + running scores for several in-play events at once (batch). Returns: [{eventId, eventTypeId, score:{home:{name, score, halfTimeScore, fullTimeScore}, away:{...}}}] (top-level array) |
| betfair_scores_broadcastC | Live scores plus broadcast/streaming availability for one or more events. Returns: [{eventId, startTime, state:{score:{...}}, broadcast:{...}}] (top-level array) |
| betr_next5_racesA | Next races about to jump, with time-to-jump, for a race-type + country filter. Returns: {Items:[{Race:{EventId, Venue, RaceNo, AdvertisedStartTime, StateCode}, TimeToJump, SecondsToJump, EventType}]} |
| betr_todays_racesA | Today's races grouped by code (Thoroughbred / Greyhound / Harness), for the homepage. Returns: {Throughbred:[{VenueId, Venue, Race1:{EventId, RaceNumber, AdvertisedStartTime, SecondsToJump}}], Greyhound:[...], Harness:[...]} |
| betr_grouped_racecardC | All meetings + their races for a day offset, grouped by code. Returns: {Thoroughbred:[[{EventId, Venue, CountryCode, RaceNumber, AdvertisedStartTime, HasFixedMarkets}]], Greyhounds:[...], Trots:[...]} Example: Today's meetings |
| betr_raceA | Full racecard for one race: runners, prices, allowed bet types, results once run. Returns: {EventId, EventName, AllowedWinBetTypes:[{MarketTypeCode, DividendTypeCode}], ...runners + prices} |
| betr_race_formC | Detailed form guide for one race (runner history, comments, ratings). Returns: {RaceFormV2:{RaceNo, RaceName, NumberOfRunners, Distance, Course, RaceComment, Runners:[...]}} |
| betr_race_flucsB | Price fluctuation history per runner for one race (fixed-odds movements). Returns: {Items:[{OutcomeId, Flucs:[{Offset, Price}]}]} |
| betr_market_moversA | Racing market movers — runners whose fixed prices are shortening/drifting. Returns: {Items:[{EventId, EventName, Venue, RaceNumber, SecondsToJump, AdvertisedStartTime}]} |
| betr_fav4C | Featured 'Fav 4' upcoming races for a race-type filter. Returns: {Items:[{EventId, MasterEventId, Venue, RaceNumber, BettingCloseTimeUtc, TimeToJump}]} |
| betr_event_typesA | All event types (sports + racing) with event counts and SGM availability. Returns: {Items:[{EventTypeId, EventTypeDesc, EventCount, HasSameGameMulti, MasterEventTypeId}]} |
| betr_master_categoryC | Master categories (competitions) for one event type, optionally with levelled markets. Returns: {EventTypeDesc, EventTypeId, MasterCategories:[{MasterCategoryId, MasterCategory, Categories:[{CategoryId, CategoryName}]}]} Example: Basketball competitions |
| betr_sports_categoryC | Events + markets for one sport category (competition). Returns: {EventTypeDesc, EventTypeId, MasterCategories:[{Categories:[{CategoryId, CategoryName, Events:[...]}]}]} |
| betr_master_eventC | One sport match's markets by master event id — a market GROUP per call (Events[].Outcomes[] with prices; GroupLinks names the other groups: totals, lines, race-to, periods). Returns: {MasterEvent:{MasterEventId, MasterEventName, CategoryId, MinAdvertisedStartTime, IsLive, IsOpenForBetting}, Events:[{EventId, EventName, Outcomes:[{OutcomeName, Price, MarketTypeCode, MarketDesc, Points}]}], GroupLinks:[{GroupTypeCode, GroupName}]} |
| betr_pop_sgm_categoryB | Categories that currently have Popular Same Game Multis. Returns: {PopSGMCategoryItems:[{EventTypeId, MasterCategoryName, CategoryId, CategoryName}]} |
| betr_pop_sgm_bet_dataC | Popular Same Game Multi suggestions for one master event. Returns: {PopSGMBetItems:[{legs:[{selectionName, price}], price}]} |
| betr_statwars_eventsB | Statwars master events (head-to-head stats promo events). Returns: {Items:[{EventTypeId, EventTypeDesc, MasterEventId, MasterEventName, MinAdvertisedStart}]} |
| betr_promotionsA | Active promotions with metadata (title, end date, linked master events). Returns: {MetaData:[{PromotionId, Title, PromotionEndDate, MasterEventId:[...]}]} |
| betr_all_promotionsB | All visible promotions (name, description, dates). Returns: {Promotions:[{Id, PromotionId, Name, Description, PromotionStartDate}]} |
| betr_featured_racingB | Editorially featured racing events (carousel order, promo titles). Returns: {ContentfulFeaturedEvent:[{EventOrder, EventID, EventName, PromotionTitle}]} |
| betr_popular_market_linksB | Popular market quick-links (specials, featured competitions) for navigation. Returns: {Items:[{PopularMarketName, EventTypeId, EventType, MasterEventId, CategoryId}]} |
| cricketaustralia_fixturesB | Match list (the /matches feed) — fixtures with teams, venue, competition, status, toss and result. Filter by competition, completed/live, etc. Returns: {fixtures:[{id, name, startDateTime, gameType, isLive, isCompleted, resultText, competitionId, venueId, homeTeamId, awayTeamId, tossResult, tossDecision}], responseError} |
| cricketaustralia_competitionsB | Competition catalogue — series / tournaments with id, name, dates and artwork. Returns: {competitions:[{id, name, url, imageUrl, startDateTime, endDateTime, order}], responseError} |
| cricketaustralia_toursC | Tours / series with status flags — each tour groups its competitions and is flagged upcoming / in-progress / completed. The feed behind the site's series navigation. Returns: {tours:[{competitionId, name, startDateTime, endDateTime, isUpComing, isInProgress, isCompleted, competitions:[...], bannerUrl, logoUrl}]} |
| cricketaustralia_venueA | Venue detail for one venueId — name, city, country, state, coordinates. Resolve a fixture's venueId (one venue per call). Returns: {venue:{id, name, city, state, countryName, latitude, longitude}, responseError} |
| cricketaustralia_teamsC | Team catalogue — id, name, short name, colours, logo/badge URLs across all CA competitions. Returns: {teams:[{id, name, shortName, teamColor, logoUrl, teambadgeImageUrl, isActive}], responseError} |
| cricketaustralia_playersA | Player profiles for a batch of player ids — name, DOB, birthplace, batting/bowling hand + type, height, image. Pass a list of playerIds. Returns: {players:[{id, displayName, firstName, lastName, dob, birthPlace, battingHand, bowlingHand, bowlingType, height, imageUrl}], responseError} |
| cricketaustralia_standingsA | Competition ladder — per-team played/won/lost/drawn/tied/no-result, points, net run rate. Needs competitionId (empty for competitions without a points table). Returns: {standings:[{competitionId, teamId, groupName, played, won, lost, drawn, matchTied, noResult, points, netRunRate, deductions}], responseError} |
| cricketaustralia_scorecardB | Full match scorecard — per-innings batting, bowling and fall-of-wickets, plus the players[] lookup for the fixture. Returns: {fixture:{id, name, innings:[{inningNumber, battingTeamId, bowlingTeamId, batsmen:[...], bowlers:[...], wickets:[...]}]}, fixtureTitle, players:[{id, displayName}], dataSupport, responseError} |
| cricketaustralia_runs_graphB | Run-progression (worm/manhattan) data per innings for a fixture — the series behind cricket.com.au's run graphs. Returns: {innings:[{inningNumber, battingTeamId, bowlingTeamId, overs, overnightRuns, overnightWickets, byesRuns, legByesRuns, noBalls}]} |
| cricketaustralia_streamsB | Live video stream entries for a fixture (populated during live matches; empty array otherwise). Returns: {streams:[{...stream urls/metadata}], responseError} (streams empty when the match isn't live) |
| cricketaustralia_contentA | Pulselive CMS content list by type — VIDEO (highlights/replays), TEXT (articles), AUDIO, or PLAYLIST (curated collections). Paginated. Returns: {pageInfo:{page, pageSize, numPages, numEntries}, content:[{id, type, title, description, date, ...}]} |
| cricketaustralia_playlistC | A single Pulselive playlist by id — a curated collection of videos (e.g. a match's highlights playlist). Returns: {id, type, title, description, date, content:[{id, type, title, ...}]} |
| dabble_active_competitionsA | Every currently-bettable competition across all sports (~318) — the discovery entry point. Pick any one's Returns: {status, data:{activeCompetitions:[{id, name, sportName, country, featured, location, sportId}]}} |
| dabble_competitionsA | Look up competitions by EXACT name ( Returns: {status, data:[{id, name, sportId, country}]} (filtered by name or sportId — empty if the exact name isn't found) |
| dabble_sportsA | The 24 sports Dabble offers (Rugby League, Australian Rules, Football, Basketball, Cricket, Tennis, Horse Racing, …), each with id + name. Join sportId from a competition back to its sport here. Returns: {status, data:[{id, name, isRacing, isHidden}]} |
| dabble_competition_fixturesA | All fixtures for ONE competition, each embedding its markets + prices (decimal odds) + selections + teams. Get the competitionId from dabble_active_competitions / dabble_competitions (AFL Matches = ad4c78ec-e39d-45ee-8cec-ff5d485a3205, NRL = c709772d-d5d0-4252-af89-be8a163706dc). For the FULL book of one fixture use dabble_fixture_details. Returns: {data:[{id, name, displayName, competitionId, competitionName, advertisedStart, status, inplayAvailable, teams:[{id, name, abbreviation}], markets:[{id, name, resultingType, product, isHandicap, isTotal, isSgmAllowed, status}], selections:[{id, name, marketId, isScratched}], prices:[{marketId, selectionId, price}]}]} ( Example: AFL fixtures with markets + odds |
| dabble_fixture_detailsA | The FULL book for one fixture — every market (hundreds), all selections + prices, the marketGroups (SGM grouping) and the Pick'em playerProps product. LARGE (~1 MB+ for a major match); fetch one fixture at a time. fixtureId comes from dabble_competition_fixtures. Each market gets an engine-derived Returns: {sportFixtureDetail:{id, name, competitionName, sportName, status, teams, markets:[{id, name, resultingType, product, isSgmAllowed, isSingleAllowed}], selections:[{id, name, marketId}], prices:[{marketId, selectionId, price}], marketGroups, marketGroupMappings, playerProps:[{playerName, stats, value, lineType}]}} (LARGE — markets/selections/prices number in the hundreds-to-thousands. Each market carries an engine-derived |
| datagolf_player_listB | Full player list with Data Golf ids (dg_id), name, country, amateur flag. Returns: [{dg_id, player_name, country, country_code, amateur}] (top-level array) |
| datagolf_scheduleB | Tour schedule — the season's events with dates, courses and locations. Returns: {schedule:[{event_id, event_name, course, course_key, location, country, latitude, longitude, start_date}]} |
| datagolf_field_updatesC | Current event field — players entered, tee times, withdrawals, current round. Returns: {event_name, event_id, course_name, current_round, date_start, date_end, field:[{dg_id, player_name, ...tee times}]} |
| datagolf_rankingsA | Data Golf player rankings (top ~500) with skill estimate and OWGR rank. Returns: {last_updated, rankings:[{datagolf_rank, owgr_rank, dg_id, player_name, dg_skill_estimate, country}]} |
| datagolf_pre_tournamentC | Pre-tournament model predictions — win / top-5/10/20 / make-cut probabilities per player. Returns: {baseline:[{dg_id, player_name, win, top_5, top_10, top_20, make_cut}], baseline_history_fit:[...]} |
| datagolf_in_playC | Live (in-play) model predictions during a tournament — current position/score + updated win probabilities. Returns: {data:[{dg_id, player_name, current_pos, current_score, R1, R2, R3, R4, make_cut, win, ...}]} |
| datagolf_skill_ratingsC | Player skill ratings — strokes-gained components (off-tee, approach, around-green, putting) + driving acc/dist. Returns: {last_updated, players:[{dg_id, player_name, sg_total, sg_ott, sg_app, sg_arg, sg_putt, driving_acc, driving_dist}]} |
| datagolf_approach_skillB | Detailed approach-play skill per player across yardage/lie buckets — SG per shot, proximity, GIR, good-shot and poor-shot-avoidance rates. Returns: {last_updated, time_period, data:[{dg_id, player_name, ...per-bucket sg/proximity/gir fields}]} |
| datagolf_live_strokes_gainedC | Live strokes-gained breakdown for every player during PGA Tour events (raw, or relative to the model's pre-round expectations). Returns: {event_name, current_round, last_update, strokes_gained_values, data:[{dg_id, player_name, pos, score, thru, today, R1:{...sg}, R2, R3, R4}]} |
| datagolf_live_tournament_statsC | Live per-player tournament stats (strokes-gained by category, accuracy, etc.) for the requested round. Returns: {event_name, course_name, last_updated, live_stats:[{dg_id, player_name, sg_total, sg_ott, sg_app, ...}]} |
| datagolf_pre_tournament_archiveC | Archived pre-tournament predictions for a past event (what the model said beforehand). Returns: {baseline:[{dg_id, player_name, fin_text, win, make_cut, first_round_leader, top_10}]} |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| _catalog | |
| _catalog | |
| _ref | |
| _catalog | |
| _catalog | |
| _catalog | |
| _catalog | |
| _catalog | |
| _catalog | |
| _catalog | |
| _catalog | |
| _ref | |
| _catalog | |
| _catalog | |
| _catalog | |
| _catalog | |
| _catalog | |
| _capabilities |
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/DanielTomaro13/sportsdata-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server