stat-api — Sports Data
by stat-api.com · remote · no sign-in to list tools · v1.0.1 · published by com.stat-api
NFL/NBA/MLB/NHL/PGA + DFS and prediction-market data. Browse free; query with a free API key.
9 tools: 3 change things and 6 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things3Claude Code: ask: see these tools
- Only reads6Claude Code: allow: see these tools
4 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http sports-data https://api.stat-api.com/mcpFindings
Matches of fixed checks, with the text they matched.
- Warngraphql_query
The server marks "graphql_query" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "graphql_query" says "query": a word for reading.
- Infolist_leagues
The description mentions "credentials".
What this check looks forMatched text
description: "...with table counts and availability. No credentials needed. Start here, then call list_tabl..."
- Infolist_tables
The description mentions "credentials".
What this check looks forMatched text
description: "...league with a one-line summary each. No credentials needed. Follow with describe_table befo..."
- Infodescribe_table
The description mentions "credentials".
What this check looks forMatched text
description: "...ary key, and a runnable example URL. No credentials needed. Always call this before query_t..."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
9 tools
Changes things 3Claude Code: ask
api_usageYour account's quota position: plan, monthly record limit, records used, remaining, and when the quota resets.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Your account's quota position: plan, monthly record limit, records used, remaining, and when the quota resets. Requires a stat-api sign-in or API key; costs 1 record.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: API usage
games_on_dateGames scheduled/played on one calendar date (US-Eastern) for nba, mlb, or nhl; defaults to today.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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 a stat-api sign-in or API key; rows count against quota.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: Games on date
graphql_queryRun a GraphQL query against the same data with relations — nest from a game to its teams/players/odds in one call.1 finding
Why it is in this group
- The name "graphql_query" says "query": a word for reading.
- The description's first verb is "run": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "graphql_query" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "graphql_query" says "query": a word for reading.
Description, as the server wrote it 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 a stat-api sign-in or API key; every row resolved anywhere in the tree counts against quota.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: GraphQL query
Only reads 6Claude Code: allow
describe_tableFull 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)…1 finding
Why it is in this group
- The name "describe_table" says "describe": a word for reading.
Findings
- Info
The description mentions "credentials".
What this check looks forMatched text
description: "...ary key, and a runnable example URL. No credentials needed. Always call this before query_t..."
Description, as the server wrote it 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.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: Describe table
get_recordFetch a single row by primary key.No findings
Why it is in this group
- The name "get_record" says "get": a word for reading.
Description, as the server wrote it Fetch a single row by primary key. Returns the row object. Requires a stat-api sign-in or API key; costs 1 record of quota.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: Get record
list_leaguesList every league/data group this API serves (nfl, nba, mlb, nhl, pga, dfs, reference) with table counts and availability.1 finding
Why it is in this group
- The name "list_leagues" says "list": a word for reading.
Findings
- Info
The description mentions "credentials".
What this check looks forMatched text
description: "...with table counts and availability. No credentials needed. Start here, then call list_tabl..."
Description, as the server wrote it List every league/data group this API serves (nfl, nba, mlb, nhl, pga, dfs, reference) with table counts and availability. No credentials needed. Start here, then call list_tables.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: List leagues
list_tablesList every queryable table in one league with a one-line summary each.1 finding
Why it is in this group
- The name "list_tables" says "list": a word for reading.
Findings
- Info
The description mentions "credentials".
What this check looks forMatched text
description: "...league with a one-line summary each. No credentials needed. Follow with describe_table befo..."
Description, as the server wrote it List every queryable table in one league with a one-line summary each. No credentials needed. Follow with describe_table before querying.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: List tables
query_tableQuery any table.No findings
Why it is in this group
- The name "query_table" says "query": a word for reading.
Description, as the server wrote it 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 a stat-api account: sign in when the app asks (free account at https://stat-api.com), or send an API key as Authorization: Bearer <key>. Every returned row counts against the monthly record quota.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: Query table
search_playersFuzzy player-name search (typo-tolerant).No findings
Why it is in this group
- The name "search_players" says "search": a word for reading.
Description, as the server wrote it 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 a stat-api sign-in or API key; rows count against quota.
Annotations the server declares
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- readOnlyHint: true
- title: Search NBA players
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.0.1. Values in angle brackets are yours to fill in.
claude mcp add --transport http sports-data https://api.stat-api.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__sports-data__list_leagues",
"mcp__sports-data__list_tables",
"mcp__sports-data__describe_table",
"mcp__sports-data__query_table",
"mcp__sports-data__get_record",
"mcp__sports-data__search_players"
],
"ask": [
"mcp__sports-data__games_on_date",
"mcp__sports-data__graphql_query",
"mcp__sports-data__api_usage"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as sports-data. Review it before you use it.