Like everything else in my life, I’m agentifying fantasy football. I’m the commissioner of one ESPN league, the Supper Club, ten teams made up of five couples, and a member of two others. This season I wanted my agents to see all three and do something fun with them.

Claude Code does amazing things with simple interfaces to interesting data, so I built one for ESPN Fantasy Football. Give Claude a fantasy-sports standings that prints something predictable and it will build on top of it all day. ESPN has no official fantasy API, though. There’s an unofficial one, and a Python library called espn-api that reads it, but every CLI and MCP server I could find built on top of it was dead: ESPN moved something, nobody noticed for months, the repo went quiet.

I built fantasy-sports, a plain, stable front door on ESPN’s opaque one. At a terminal it prints tables. Piped into anything else, it prints JSON in a shape that doesn’t change.

Sites That Don’t Want You There

The hard part of building on a site like ESPN is that it doesn’t want programmatic access. No API docs, no changelog, no promise that tomorrow’s response looks like today’s. Self-healing matters more than any feature, and with agents and scheduled jobs it’s easy. So I have GitHub Actions check ESPN’s public test league every morning and go red the day a response changes shape. fantasy-sports doctor checks config, cookies, and cache on the client side. And when a command fails, the error comes back as data an agent can act on: a code, whether a retry will help, and a one-line instruction like “ask the human to confirm the league id.”

Self-healing started before kickoff. The box-scores response for the opener came back in a shape we hadn’t seen before: every player’s opponent filled in for the Supper Club and none for my other two leagues, from the same command, on the same night. Claude traced it the next day: ESPN had served one view with a key missing for two of my three leagues, and espn-api gates the opponent on that key. The tool now reads the opponent from ESPN’s schedule instead.

The Supper Club Gazette

Now that I’d hooked Claude Code up to my leagues, I could start playing. I’ve been into generating movie posters and infographics to visualize life lately, and I’ve been making a Wulff Street Journal front page for my family every week. All this data, distilled down, is the best way to consume and share it. I digress.

The Supper Club has five households, a Constructors’ Championship for the couples table, and a group text that deserves better than screenshots of the ESPN app. So my agents write it a newspaper. A Claude Code skill pulls everything through fantasy-sports, a panel of five writer personas argues over the story, an editor writes it, and a validator checks every number against the facts before it goes out. Issue 0 was the Draft Day Special: Erica and Trevor drafted closer to market than any other couple by skipping running backs, Zack drafted six of them, and the paper drew the first trade before anyone proposed it.

The Supper Club Gazette, Issue No. 0, Draft Day Special: an illustration of a kitchen table with a football, a helmet, and a bowl of oranges, above a headline about which couple beat the market

Halftime of the opening game I generated a one-picture bulletin for the group text, in about a minute. This is the final report from the same night.

The Supper Club Gazette Final Report card for Seahawks v Patriots: five matchups with fantasy points, the players in the game with their owners, and the Constructors' Championship table

The first full weekly issue comes out Tuesday. I love it.

Try It

uv tool install git+https://github.com/jwulff/fantasy-sports
fantasy-sports auth login
fantasy-sports doctor
fantasy-sports standings --league my-league

The README walks through the league id, the two cookies, and config.toml. The commands in this screenshot are in a short script.

A terminal running fantasy-sports: doctor's health checks, the ten Supper Club teams and owners, Courtney's starting lineup with projections and kickoff times, and the week-one box score sorted by points

Next is writes: lineups, waivers, drops, trades. They’re gated behind research into ESPN’s write surface, with a journal for the reversible ones and a sanity gate for the rest, and none of it ships until the read path has survived a few more weeks of a real season.

Open source on GitHub, MIT.

– John