League Loom
Every roster. Every league. One view.
League Loom connects Claude, ChatGPT, or any AI assistant to your fantasy leagues on ESPN, Sleeper, and Fantrax. Ask about your rosters, matchups, and the waiver wire in plain language, and the answers come straight from your live league data. Free, read-only, and about two minutes to connect.
Live site
Open the live site βLIVEleagueloom.com, embedded at desktop scale. Click the frame to scroll inside it, or Screenshot of the live site β open it in a new tab β
https://leagueloom.com/mcpAdd as a custom connector in Claude or ChatGPTThe Build Story
League Loom is my first MCP server. It started as a single-platform connector for Fantrax β the one major fantasy platform most AI tools skip β and grew into a multi-provider hub that weaves Fantrax, ESPN, and Sleeper into one view an AI assistant can actually reason over.
Building it meant learning the full Model Context Protocol surface area in one project: a spec-compliant OAuth 2.1 flow with dynamic client registration, a stateless streamable-HTTP transport that spins up fresh on every serverless request, and tool responses designed for a language model's context window instead of a browser.
It shipped fast, too β fifteen versioned releases in the first five days, every one promoted from a staging environment that mirrors production.
What the AI Can Read β 18 Tools, 3 Platforms
Every tool is read-only and capability-gated: ask for something a platform can't serve and the assistant gets a clean βnot available on ESPNβ instead of an error. The matrix is the honest version of the pitch.
| Capability | Sleeper NFL Β· NBA no credentials | Fantrax 9 sports read-only Secret ID | ESPN NFL Β· NBA Β· MLB Β· NHL Β· WNBA cookies for private leagues |
|---|---|---|---|
| Leagues & data | |||
| Discover your leagues | β | β | β |
| League info & settings | β | β | β |
| Rosters | β | β | β |
| Standings | β | β | β |
| Matchups | β | β | β |
| Live scoreboard | β | β | β |
| Draft results | β | β | β |
| Available players (waivers) | β | β | β |
| Transactions | β | β | β |
| Trending adds & drops | β | β | β |
| Player data | |||
| Identity & availability | β | β | β |
| % owned | β | β | β |
| Season fantasy points | β | β | β |
| Weekly fantasy points | β | β | β |
| Projections | β | β | β |
| Cross-platform ids | β | β | β |
| Schedule & playoffs | |||
| Season schedule | β | β | β |
| Strength of schedule | β | β | β |
| Playoff picture & clinch math | β | β | β |
Cross-league hub3
One call, every league you play in.
fantasy_get_my_teamsAll your teams across every providerfantasy_get_my_playersPlayer exposure map across platformsfantasy_get_weekly_digestCross-league newsletter in one call
One league11
Everything about a single league, normalized.
fantasy_get_my_teamYour standing, matchup, and rosterfantasy_get_league_infoLeague name, teams, and settingsfantasy_get_rostersEvery team's roster and slotsfantasy_get_standingsRank, record, points for and againstfantasy_get_matchupsHead-to-head scoreboard for any weekfantasy_get_scheduleSeason schedule and exact playoff mathfantasy_get_transactionsRecent adds, drops, waivers, tradesfantasy_get_draftDraft picks with rounds and auction bidsfantasy_get_available_playersFree agents ranked best-firstfantasy_get_player_dataLive ownership, points, projectionsfantasy_get_league_healthCommissioner report on league balance
Setup & catalog4
The front door β no league required.
fantasy_get_my_setupLeagues and teams on your profilefantasy_list_user_leaguesDiscover your leagues on a platformfantasy_list_providersProvider catalog and capability flagsfantasy_get_trending_playersPlatform-wide most added and dropped
Architecture β One Question's Journey
A single tool call in at the left, three fantasy platforms on the right, and nothing stored in between. The three thread colors are the same ones in the League Loom logo β the loom is literally the server, and the stack it's built with is drawn right into it.
The Website Ships With the Server
leagueloom.com isn't a separate marketing project β it ships from the same repo as the server and is measured by the same telemetry. The numbers below are read live from the League Loom GA4 property and cached for an hour; the third tile isn't web traffic, it's AI assistants actually calling the server on people's behalf.
View the daily numbers as a table
| Date | Visitors | MCP tool calls |
|---|---|---|
| Sep 16 | 910 | 4,822 |
| Sep 17 | 925 | 3,088 |
| Sep 18 | 776 | 1,991 |
| Sep 19 | 666 | 2,018 |
| Sep 20 | 765 | 3,647 |
| Sep 21 | 846 | 3,696 |
| Sep 22 | 1,116 | 9,206 |
| Sep 23 | 1,057 | 6,487 |
| Sep 24 | 1,023 | 4,734 |
| Sep 25 | 876 | 4,864 |
| Sep 26 | 701 | 3,780 |
| Sep 27 | 908 | 6,345 |
| Sep 28 | 1,088 | 5,910 |
| Sep 29 | 1,215 | 10,184 |
| Sep 30 | 1,188 | 7,353 |
| Oct 1 | 1,129 | 5,747 |
| Oct 2 | 996 | 4,714 |
| Oct 3 | 873 | 3,594 |
| Oct 4 | 981 | 5,310 |
| Oct 5 | 1,106 | 5,541 |
| Oct 6 | 1,241 | 11,580 |
| Oct 7 | 1,190 | 7,824 |
| Oct 8 | 1,169 | 7,877 |
| Oct 9 | 1,095 | 5,594 |
| Oct 10 | 933 | 6,030 |
| Oct 11 | 1,032 | 8,498 |
| Oct 12 | 1,123 | 8,731 |
| Oct 13 | 1,311 | 14,750 |
Generated, not written
Every page β home, capabilities, FAQ, prompt library, changelog, and a long tail of per-platform and per-sport landing pages β is rendered to static HTML at build time from the same TypeScript that powers the server. The marketing copy cannot drift from what the tools do, and a test suite fails the build if it tries.
Two streams, one property
Browser events (every CTA, tab, FAQ toggle, and prompt copy, via a declarative data-track layer over gtag) and server-side MCP tool calls (mirrored through the GA4 Measurement Protocol with synthetic 30-minute sessions and caller/environment dimensions) land in a single GA4 property. That makes one funnel run from βread the siteβ to βasked their AI a questionβ β the numbers in the band above.
Nothing identifying, ever
A strict allowlist keeps each event down to tool, provider, sport, format, and outcome. No credentials, league ids, user identity, or prompt text are recorded β the server never receives the prompt in the first place. Mixpanel mirrors the same pseudonymous hash for retention questions; a structured [ll-metric] log line per call lives in Vercel.
Built for answer engines
An llms.txt brief, a full JSON-LD graph (Organization, WebSite, SoftwareApplication, FAQPage, HowTo), a robots.txt that explicitly welcomes AI crawlers, and an IndexNow ping on every production deploy so Bing β and the assistants that search it β re-crawl within minutes.
Optimization
Token budget
Responses cap at 25,000 characters and default to trimmed markdown tables. Per-player box scores are opt-in so a matchup check stays cheap.
Layered caching
Sleeper's full player dump caches for 24 hours, ESPN's reference data for 12, and Fantrax player maps memoize for the life of the process.
Parallel fan-out
Cross-league reads run concurrently with per-league failure isolation β one slow league can't block your weekly digest.
Zero database
Fully stateless serverless functions. Nothing to migrate, back up, or breach β credentials live in the user's own encrypted token.
Automation
Staging-first releases
Every push auto-deploys to staging.leagueloom.com; production only advances by a fast-forward promotion once staging checks out.
Self-updating changelog
Publishing a GitHub Release commits the notes to the changelog and rebuilds the /changelog page β fifteen releases shipped this way in the first five days.
Instant re-indexing
Every production push pings IndexNow so Bing β and the AI assistants that search it β re-crawl the site within minutes.
~300 tests + eval harness
Vitest suites cover tools, providers, and site invariants, and an XML eval set regression-checks real tool answers against stable player facts.
Frequently Asked
What is League Loom?
League Loom is a free, read-only Model Context Protocol (MCP) server that connects Claude, ChatGPT, and other MCP-compatible AI assistants to your live fantasy sports leagues on ESPN, Sleeper, and Fantrax. You add one connector URL, pick your teams in a two-minute wizard, and then ask questions about rosters, standings, matchups, waivers, and drafts in plain language.
Which fantasy platforms and sports does League Loom support?
League Loom supports three platforms β ESPN, Sleeper, and Fantrax β across nine sports. ESPN covers NFL, NBA, MLB, NHL, and WNBA; Sleeper covers NFL and NBA; Fantrax covers NFL, NBA, MLB, NHL, NCAA football, NCAA basketball, PGA, NASCAR, and the Premier League.
Can League Loom change my lineup or make trades?
No. All 18 tools League Loom registers today are read-only β they retrieve or analyze league data. The server cannot submit lineup changes, waiver claims, adds, drops, or trades, and a stored credential never becomes permission to act on its own.
How does League Loom handle my ESPN, Sleeper, or Fantrax credentials?
Credentials are sealed into your own encrypted access token (AES-256-GCM) when you connect and are never written to a shared database. The server is stateless: every request carries its own authorization, so there is no session store or credential table to breach. Sleeper needs no credentials at all, and public ESPN leagues need none either.
How do I connect League Loom to Claude or ChatGPT?
In Claude, open Settings β Customize β Connectors, choose Add custom connector, and paste https://leagueloom.com/mcp as the remote MCP server URL. In ChatGPT, open Settings β Plugins and add the same URL as a custom connector with OAuth authentication. Any other MCP-compatible tool β Cursor, Cline, Goose, Raycast β accepts the same URL.
How is League Loom built?
League Loom is a TypeScript MCP server built on the official MCP SDK with Zod-validated tool inputs, deployed as stateless serverless functions on Vercel with a Streamable HTTP transport and OAuth 2.1 with dynamic client registration and PKCE. A provider-adapter layer normalizes ESPN, Sleeper, and Fantrax data into one shape, and the marketing site is generated from the same TypeScript source at build time.
More Like This

How I Built This Site
This portfolio β built with Claude Code, Codex, and Gemini. Deployed on Vercel with zero manual syntax. Every page, component, and CI workflow written prompt-by-prompt.

ChartSmithGPT
An AI-powered micro app that converts any table into styled charts with PNG/SVG export. Paste data, pick a palette, download instantly.

Menu Labs
Prompt-to-menu generator, built for $2.48 on Replit.