League Loom

Every roster. Every league. One view.

June 2026
MCP ServerFantrax Β· ESPN Β· Sleeper
18
MCP Tools
3
Platforms
9
Sports

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

Screenshot of leagueloom.comOpen the live site β†—
🧡Loading leagueloom.com...

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 β†—

MCP Endpointhttps://leagueloom.com/mcpAdd as a custom connector in Claude or ChatGPT

The 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 provider
  • fantasy_get_my_playersPlayer exposure map across platforms
  • fantasy_get_weekly_digestCross-league newsletter in one call

One league11

Everything about a single league, normalized.

  • fantasy_get_my_teamYour standing, matchup, and roster
  • fantasy_get_league_infoLeague name, teams, and settings
  • fantasy_get_rostersEvery team's roster and slots
  • fantasy_get_standingsRank, record, points for and against
  • fantasy_get_matchupsHead-to-head scoreboard for any week
  • fantasy_get_scheduleSeason schedule and exact playoff math
  • fantasy_get_transactionsRecent adds, drops, waivers, trades
  • fantasy_get_draftDraft picks with rounds and auction bids
  • fantasy_get_available_playersFree agents ranked best-first
  • fantasy_get_player_dataLive ownership, points, projections
  • fantasy_get_league_healthCommissioner report on league balance

Setup & catalog4

The front door β€” no league required.

  • fantasy_get_my_setupLeagues and teams on your profile
  • fantasy_list_user_leaguesDiscover your leagues on a platform
  • fantasy_list_providersProvider catalog and capability flags
  • fantasy_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.

1 Β· THE QUESTIONClaude Β· ChatGPT Β· any MCP clientβ€œWho should I start at flex this week?”STREAMABLE HTTP Β· leagueloom.com/mcp2 Β· AUTHORIZATIONOAuth 2.1 gatedynamic client registration + PKCE Β· AES-256-GCM sealed tokenSTATELESS Β· A FRESH SERVER PER REQUEST3 Β· THE LOOM β€” SERVERLESS CORE Β· ZERO DATABASETool router18 tools Β· Zod-validatedNormalizersone shape per entityIn-memory cachesSleeper 24h Β· ESPN 12hTelemetrytool Β· provider Β· sport Β· okBUILT WITHTypeScriptNode.jsMCP SDKZodExpressVitestVercelGitHub ActionsPROVIDER ADAPTERS Β· CAPABILITY-GATEDSleeperpublic API Β· 2 sportsFantraxfxea API Β· 9 sportsESPNlm-api-reads Β· 5 sports4 Β· THE ANSWEROne normalized shape, whichever platform answered

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.

Live from Google AnalyticsLast 28 days Β· refreshes hourly
5.2K
Visitors
unique people on leagueloom.com
13.4K
Pageviews
across every page
173.9K
MCP tool calls
AI assistants reading live league data
Daily visitorsby day
05001K1.5K2K1.3KSep 16Sep 25Oct 4Oct 13
Daily MCP tool callsby day
05K10K15K20K14.8KSep 16Sep 25Oct 4Oct 13
View the daily numbers as a table
DateVisitorsMCP tool calls
Sep 169104,822
Sep 179253,088
Sep 187761,991
Sep 196662,018
Sep 207653,647
Sep 218463,696
Sep 221,1169,206
Sep 231,0576,487
Sep 241,0234,734
Sep 258764,864
Sep 267013,780
Sep 279086,345
Sep 281,0885,910
Sep 291,21510,184
Sep 301,1887,353
Oct 11,1295,747
Oct 29964,714
Oct 38733,594
Oct 49815,310
Oct 51,1065,541
Oct 61,24111,580
Oct 71,1907,824
Oct 81,1697,877
Oct 91,0955,594
Oct 109336,030
Oct 111,0328,498
Oct 121,1238,731
Oct 131,31114,750
PUBLISHING PIPELINETypeScript sourcebrand, copy, FAQs, tool manifest β€” one source of truthtsc + gen-landing.mjspublic/ is deleted and regenerated on every deploy~40 static pages + guard teststhe build fails if copy drifts from the live tool setleagueloom.com on Vercelstatic CDN Β· same repo serves /mcp + OAuth as serverless functionsMEASUREMENT PLANEBROWSER Β· THE WEBSITEgtag.js + llTrackevery CTA, tab, FAQ, copySERVER Β· THE MCP TOOLSMeasurement Protocolevery tool_call, mirrored+ Vercel Web Analytics+ Mixpanel Β· [ll-metric] logsONE FUNNELONE GA4 PROPERTYsite visit β†’ URL copied β†’ OAuth β†’ tool callallowlisted events only β€” never credentials, prompts, or league idsBUILT FOR AI SEARCHllms.txtJSON-LDIndexNowAI robots.txt

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.

Read the Full Story
How Fantasy Sports Taught Me Digital Marketing

More Like This