statshawk
// mcp server + rest api

Your LLM is wrong
about sports.

Trained models hallucinate teams and rosters. Web search returns hype articles instead of box scores. Raw-stat providers ship JSON dumps that bloat your context. statshawk wires real, normalized stats and pre-computed analysis cards into any LLM. Hosted, OAuth, no BYO key.

$claude mcp add statshawk https://mcp.statshawk.ai/mcp
claude · mcp tool callmcp.statshawk.ai
get_player_props
player:"Steph Curry"
stat: "3pm" line: 4.5
opp:"MIA"
analysis_card
last 10 vs MIA
5/10 over
vs top-10 D
7/12 over
pace-adj proj
4.8 (+0.3 vs line)
01without statshawk · with statshawk

Models confidently invent. statshawk returns what's real.

without statshawk
you

What was Curry's stat line last night vs Miami?

claude

I don't have real-time data on last night's games, but based on his season averages Curry typically scores in the high 20s and shoots well from three. The Heat have a top-10 defense, but he often plays well against them.

with statshawk
you

What was Curry's stat line last night vs Miami?

get_box_score(player: "S. Curry", league: "nba")
28 PTS · 7-13 FG · 4-7 3PT · 6 AST · GSW W 118-112
claude

Curry went for 28 and 6 assists in last night's 118-112 win over Miami. He shot 4 of 7 from three on 13 total attempts.

// any LLM that supports MCP can call statshawk tools. for non-MCP clients, use the REST API directly. either way, the response is shaped for context, not for a dashboard.

02the other way

The other way is scraping ESPN.

An LLM can answer this through web search or HTML scraping. It just costs you ~500x more tokens and gets the math wrong. Same question, three sports.

without statshawk~1.2M tokens · ~60s
you

Should I take Mahomes over 249.5 passing yards Sunday?

fetch_url(espn.com/.../mahomes) [HTML, ~500KB]
fetch_url(.../boxscore/...) ×5 [HTML, ~200KB ea]
fetch_url(.../defense/chiefs/...) [HTML, ~300KB]
in-context HTML parsing & arithmetic (error-prone)
claude

Mahomes averages around 250 yards, but my math on the recent boxscores might be off.

with statshawk~800 tokens · ~2s
you

Should I take Mahomes over 249.5 passing yards Sunday?

get_player_props(player_name:'Mahomes', stat:'pass_yds', line:249.5)
season_avg:256.2 · L5:247.6 · hit_rate season:71% · L10:80% · vs top-10 pass D
claude

Mahomes is over 249.5 in 71% of season games (80% L10), facing a top-10 pass defense Sunday.

// switch sports above. same question, two ways to answer it. one burns context and gets arithmetic wrong. the other returns the prop card pre-computed.

03build with it

A pitcher-vs-batter matchup, from one API call.

Per-zone hit rates, a swing-and-miss map, and every pitch a starter has thrown a hitter all season — already joined, already shaped. Toggle the metric. Tap or hover a pitch.

2026 season
Adrian Houser21 pitches · RHP · MIL
.300.636.043.292.233.114.100.182.188
Manny Machado271 at bats · RHB · SD
the read · AVG

Machado hits .636 up over the plate and just .043 up and away. Houser works the cold corners and stays off the barrel.

the numbers
Hottest
up over the plate
.636
Coldest
up and away
.043
Top whiff
down and away, chasing
57%
Go-to
Sinker
12 of 21
Batting average by zone
cold
hot
Adrian Houser · 21 pitches
Sinker12
Four-Seam Fastball4
Slider4
Changeup1

Manny Machado's 2026 zone profile (74 games) vs. every pitch Adrian Houser threw him. One get_play_by_play call.

// real Statcast pitch data from get_play_by_play(detail='full'). the same call powers your own zone models, scouting cards, and matchup tools.

04why mcp-first

The wedge isn't more sports data. It's less work for the LLM.

01/principle

~15 tools, not 250

One get_player_props that takes a league, not eight league-prefixed copies. Smaller catalog, faster tool selection, fewer context tokens.

02/principle

Analysis in the surface

Hit rates, defensive ranks, pace-adjusted projections, pre-computed and shaped for your model's context. ~500x fewer tokens than the same answer scraped from ESPN, and the math is already done.

03/principle

Sign in, no BYO key

OAuth from Claude, Cursor, ChatGPT. We issue and rotate the bearer token. No juggling provider API keys in your MCP config.

05the platform underneath

One schema, every league. Same key for REST and MCP.

01

One schema, every league

Normalized box scores, season stats, and standings across NBA, MLB, NFL, and NHL. Stop writing per-provider adapters.

02

REST + MCP, same auth

Plain HTTP for backends. MCP for LLMs. Same key, same metering, same response shape.

03

Weight-aware metering

Light lookups cost 1 unit, heavy analysis costs 10. Predictable bills, hard caps, no surprise overage.

04

Direct from the ingest

Backed by stat-engine, our Rust ingestion pipeline. Fresh data within minutes of the box score posting.

// signups open

An assistant that already knows last night's box score.