open-leaguesryanwaits/open-leagues
NFL and fantasy football data for your agent
- Problem
- The data is public. It isn't a tool an agent can call.
- Door
- Two
mcp addlines. 81 of 93 catalog verbs, no account. - Compose
- New features are prompts. The agent composes the verbs, or fails and shows the gap.
- Receipts
- One team's week as facts: when the lead last changed, points left on the bench, what the wire cost.
- The lab
- A plain-words betting hunch graded against the closing line since 1999. 7,548 games. It never picks a side.
- Run your own
- The public box keeps no accounts and hosts no leagues. docker compose up -d is league mode on a box you run.
An Agent Can't Call It
Sleeper leagues are readable by id. Open projections exist. The closing line since 1999 is in nflverse. None of that is a tool. There is no official Sleeper MCP, no public catalog of verbs, no JSON an LLM can curl into a decision. The data is out there. It isn't plugged into the agent.
# sleeper league by id# open projections# closing line since 1999# none of it is a tool an agent can call
Two Lines
Point Claude or Codex at the public box. 81 of 93 catalog verbs, no account: any Sleeper league by id, open projections, NFL stats, the closing line since 1999. Same primitives over JSON if you'd rather skip the agent and wire it into an app.
claude mcp add --transport http open-leagues https://leagues.waits.dev/api/mcpcodex mcp add open-leagues --url https://leagues.waits.dev/api/mcp
New Features Are Prompts
The verbs are atomic, so a new feature is a prompt. A receipt, a lab run, a waiver question you didn't design a screen for: the agent composes them, or fails and shows the gap. Six skills ship for the patterns that kept coming up. Changing behavior is a prompt, not a deploy.
"Give me the receipt for that matchup.""Home dogs of 3 to 7 in division games, 2015 to 2024.""Which week is it, and who is trending on Sleeper?"# same 81 verbs# no new screen, no deploy
One Week, As Facts
Any Sleeper league by id, no account. The minute the lead last changed, replayed from nflverse play-by-play under that league's own scoring, and the win probability 30 minutes earlier. Points left on the bench against the best legal lineup. What each waiver claim cost as a share of FAAB, and what that player cleared for in other leagues. Team names only, never a person's name.
Took the lead for good at 3:41pm ET on a Trevor Lawrence completion,78.8-78.6 · 78% to win at 3:11pm.6.5 left on the bench — Omarion Hampton (13.7) started over Saquon Barkley (20.2).Wire: bid $26 on Stefon Diggs — 13% of a $200 budget — lost.# leagues.waits.dev/r/1255972181892935680/14/14
A Hunch, Graded
Backtest a betting hunch stated in plain words against the closing line since 1999: 7,548 games, nflverse. The return is a record with n and pBreakEven, the one-sided binomial probability of a run that good by luck alone at the break-even rate. Tune on some seasons, verify on a holdout you never touched. The spec freezes only if it clears (pBreakEven < 0.05, n >= 100). It never picks a side and cannot place a bet: placeWager is not on the public box's allowlist.
/*** The lab's arithmetic. Pure: hand it games with lines and results,* and bets against them, and it settles, grades, and summarizes.* No opinions live here — which games to bet and which side is* the agent's job. This is the part an agent cannot do reliably* in prose: grading four hundred bets without an arithmetic slip.*/
Three JSON Files
Anonymous, CORS on, no key. One row per player with sleeper, gsis, espn, and yahoo ids. Every game since 1999 with closing spread, total, moneylines, result, plus roof, surface, rest, QBs, and referee.
curl https://leagues.waits.dev/api/players.json# 11,826 rows — sleeper / gsis / espn / yahoo idscurl https://leagues.waits.dev/api/lines/2025.json# 272 games/season, closing spread, total, moneylines, result# 1999 on
League Mode, On Your Box
The public box keeps no accounts and hosts no leagues. Draft, FAAB, waivers, trades, and an in-league book are all built; they live on a box you run. docker compose up -d sets league mode.
git clone https://github.com/ryanwaits/open-leagues.git && cd open-leaguesdocker compose up -d# league mode: draft, FAAB, waivers, trades, an in-league book