MCP Server

stat-api — Sports Data

com.stat-api/sports-data
Data & Analytics Gaming Public & reachable MCP 2026-07-28

What this MCP does

Provides queryable NFL, NBA, MLB, NHL, PGA, DFS, and prediction-market data through table, record, GraphQL, player-search, and schema tools.

api_usage
Your key's quota position: plan, monthly record limit, records used, remaining, and when the quota resets. Requires an API key; costs 1 record.
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
describe_table
Full contract for one table: fields with types and descriptions, the filters query_table accepts (with operators like __gte/__lte/__between/__like and required filter combinations), page-size limits, primary key, and a runnable example URL. No credentials needed. Always call this before query_table — filters not listed here are rejected.
Input schema
{'type': 'object', 'required': ['league', 'table'], 'properties': {'table': {'type': 'string'}, 'league': {'enum': ['nfl', 'nba', 'mlb', 'nhl', 'pga', 'dfs', 'kalshi', 'polymarket', 'reference'], 'type': 'string'}}, 'additionalProperties': False}
games_on_date
Games scheduled/played on one calendar date (US-Eastern) for nba, mlb, or nhl; defaults to today. Returns the same envelope as query_table on the games table. NFL is week-based, not date-based — for nfl, use query_table on nfl/games with season_id + week filters instead. Requires an API key; rows count against quota.
Input schema
{'type': 'object', 'required': ['league'], 'properties': {'date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'YYYY-MM-DD; defaults to today in US-Eastern time'}, 'league': {'enum': ['nba', 'mlb', 'nhl'], 'type': 'string'}}, 'additionalProperties': False}
get_record
Fetch a single row by primary key. Returns the row object. Requires an API key; costs 1 record of quota.
Input schema
{'type': 'object', 'required': ['league', 'table', 'id'], 'properties': {'id': {'type': 'string', 'description': 'primary-key value (integer or text PK)'}, 'table': {'type': 'string'}, 'league': {'enum': ['nfl', 'nba', 'mlb', 'nhl', 'pga', 'dfs', 'kalshi', 'polymarket', 'reference'], 'type': 'string'}}, 'additionalProperties': False}
graphql_query
Run a GraphQL query against the same data with relations — nest from a game to its teams/players/odds in one call. Root fields are leagues (nfl, nba, …), each exposing its tables with the same filter arguments as REST plus `first`/`after` pagination. Do NOT send introspection queries (the schema is huge) — use describe_table instead; the SDL is at https://api.stat-api.com/api/v1/graphql/sdl. Requires an API key; every row resolved anywhere in the tree counts against quota.
Input schema
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string'}, 'variables': {'type': 'object'}}, 'additionalProperties': False}
list_leagues
List every league/data group this API serves (nfl, nba, mlb, nhl, pga, dfs, kalshi, polymarket, reference) with table counts and availability. No credentials needed. Start here, then call list_tables.
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
list_tables
List every queryable table in one league with a one-line summary each. No credentials needed. Follow with describe_table before querying.
Input schema
{'type': 'object', 'required': ['league'], 'properties': {'league': {'enum': ['nfl', 'nba', 'mlb', 'nhl', 'pga', 'dfs', 'kalshi', 'polymarket', 'reference'], 'type': 'string'}}, 'additionalProperties': False}
query_table
Query any table. Returns `{"<table>": [rows], "limit": N, "next_from_id": M|null, "has_more": bool}`. To read every row, start with from_id=0 and re-call with from_id set to the previous next_from_id until it is null. A call without from_id returns the first page in the table's default sort with next_from_id null. filters is a flat object of `field` or `field__op` keys from describe_table (e.g. {"season_id": 2024, "day__between": "20250101,20250131"}). Requires an API key (Authorization: Bearer <key>; free tier at https://stat-api.com). Every returned row counts against the monthly record quota.
Input schema
{'type': 'object', 'required': ['league', 'table'], 'properties': {'limit': {'type': 'integer', 'minimum': 1}, 'table': {'type': 'string'}, 'league': {'enum': ['nfl', 'nba', 'mlb', 'nhl', 'pga', 'dfs', 'kalshi', 'polymarket', 'reference'], 'type': 'string'}, 'filters': {'type': 'object', 'description': 'field or field__op keys → scalar values; see describe_table', 'additionalProperties': {'type': ['string', 'number', 'boolean']}}, 'from_id': {'type': 'integer', 'description': 'keyset cursor: 0 for the first page of a full walk, then the previous next_from_id'}}, 'additionalProperties': False}
search_players
Fuzzy player-name search (typo-tolerant). Currently NBA only — for other leagues query the players table with a name filter via query_table. Returns player rows ordered by match quality. Requires an API key; rows count against quota.
Input schema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 100, 'minLength': 1}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1}, 'league': {'enum': ['nba'], 'type': 'string', 'default': 'nba'}}, 'additionalProperties': False}
Changed
query_table
Sept. 27, 2026, 2:53 a.m.
Added
api_usage
Sept. 17, 2026, 12:37 p.m.
Added
graphql_query
Sept. 17, 2026, 12:37 p.m.
Added
games_on_date
Sept. 17, 2026, 12:37 p.m.
Added
search_players
Sept. 17, 2026, 12:37 p.m.
Added
get_record
Sept. 17, 2026, 12:37 p.m.
Added
query_table
Sept. 17, 2026, 12:37 p.m.
Added
describe_table
Sept. 17, 2026, 12:37 p.m.
Added
list_tables
Sept. 17, 2026, 12:37 p.m.
Added
list_leagues
Sept. 17, 2026, 12:37 p.m.