u/ismejmp

Built an MCP that gives Claude/Chat/Others normalized stats across sports. Here's it disproving my own analysis.
▲ 1 r/mcp

Built an MCP that gives Claude/Chat/Others normalized stats across sports. Here's it disproving my own analysis.

Disclosure up front: I work on the team behind StatsHawk, a sports-stats MCP server (+ REST API). I'm posting this because the session genuinely surprised me, it's the cleanest example I've hit of an MCP doing analysis.

I wanted a matchup card for last night's slate. I had an obvious angle: Kevin Gausman (splitter guy) vs Munetaka Murakami (who'd been chasing splitters). Asked Claude, connected to the MCP. What happened:

Take 1: Gausman's splitter eats Murakami. Claude pulled Murakami's strikeout splits and Gausman's K rate:

get_player_props(Murakami, "so")→ 1.43 K/g, but only 1.32 vs RHP; cooling to 1.1 over last 10

get_player_props(Gausman, "pitching.so")→ 5.46 K/start, UNDER 6.5 in 65% of starts, 5.0 last 5

Dead. Gausman isn't missing bats this year, and Murakami strikes out less vs righties. The premise was stale.

Take 2: Corbin Carroll (LHB) downgrades vs a lefty starter (Ranger Suárez). The lineup-card platoon read. Claude pulled it:

get_player_props(Carroll, "total_bases")→ vs LHP: 2.83/g vs RHP: 1.55/g

get_player_props(Suárez, "pitching.so")→ 3.2 K/start last 5, down from 5.1

Flipped again. Carroll is a reverse-split lefty, he crushes lefties, and the lefty he's facing has lost his swing-and-miss. The "platoon disadvantage" is actually a plus spot.

The point isn't any single number. It's that the model could keep pulling normalized splits and reason across them until the true story fell out, two hypotheses tested and discarded in one conversation. Every get_player_props call comes back with season / recent / home-away / platoon context already shaped, so the model reasons over structured splits instead of raw rows.

What it is: one normalized schema across MLB / NBA / NFL / NHL / NCAA / soccer with stable IDs, its own ingest (box scores, pitch-level play-by-play), transparent pricing, and a real free tier.

Honest limitations: samples get small, Carroll's vs-LHP split is 12 games, and I'd flag that on any card. It won't invent an edge; it'll tell you when the obvious take is wrong, which is the useful part. Coverage depth varies by sport (there's a capabilities call so the model knows what's actually there before it assumes). To reproduce this yourself: the raw box/play-by-play lines are on the free tier, so you can rebuild these splits by hand, the one-call prop/hit-rate card I used is a paid convenience, not a gate on the data.

The takeaway isn't a pick, it's that a model with structured splits in front of it will talk you out of the lazy take before you commit to it. That's the use case I keep coming back to.

Server + free tier: https://statshawk.ai, genuinely after feedback from people who've built MCP data servers, especially on the normalization layer.

u/ismejmp — 17 hours ago