espn-fantasy-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ESPN_S2 | Yes | Your ESPN S2 session cookie. Required to authenticate with ESPN's fantasy API. | |
| ESPN_SWID | Yes | Your ESPN SWID cookie. Required to authenticate with ESPN's fantasy API. | |
| ESPN_SPORT | Yes | The fantasy sport to operate on. Must be one of football, basketball, or baseball (e.g. 'ffl', 'fba', 'flb'). | |
| ESPN_SEASON | No | Optional. The season year (e.g. '2026'). Defaults to the current season if not set. | |
| ESPN_TEAM_ID | Yes | The numeric ID of your team within the ESPN fantasy league. | |
| ESPN_LEAGUE_ID | Yes | The numeric ID of your ESPN fantasy league. | |
| WRITES_ENABLED | No | Optional. Set to 'true' to enable write operations like lineup changes. Defaults to 'false' (dry-run / read-only mode). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_leagueA | League settings: scoring format, roster slot counts, acquisition (waiver) settings, schedule, trade settings, draft/keeper settings, and the current scoring/matchup period. |
| get_teamsA | All teams in the league: id, name, owners, record, and waiver rank. |
| get_rostersA | Every team's roster, or one team's roster if team_id is given. Each player includes id, name, position, pro team, eligible slots, current lineup slot, injury status, lock state, and season/period projections. |
| get_free_agentsA | Free agents and waiver-wire players, sorted by ownership percent (default) or projection. Optionally filter by lineup slot id (see get_league for slot ids, or the README's slot tables). |
| get_matchupsA | Matchups for a scoring period: home/away team ids, live/final totals, and live projections. |
| get_boxscoreA | Per-player actual stats for a scoring period, for both teams in each matchup. |
| get_transactionsA | Executed transactions (adds, drops, trades, lineup moves, draft picks), most recent first, with items resolved to player names. Paginated — a full season's draft alone can be 100+ records, so use limit/offset rather than expecting everything at once. Response includes total/count/offset/hasMore. |
| get_pendingA | Pending waiver claims and trade proposals, with items resolved to player names. Trades are read-only here — this server never proposes, accepts, or rejects trades. |
| get_playerA | Look up one player by ESPN player id, or by a case-insensitive name substring search across rosters and free agents. |
| snapshotA | The league in the exact line-oriented text format used by frontoffice-manager's tools/diff-snapshot.mjs: |
| optimal_lineupA | Suggests a starting lineup for one team: fills the most restrictive slots first (fewest eligible roster players), then the best remaining projection for each slot — the same approach the cheat sheets describe by hand. A heuristic, not a guaranteed-optimal assignment. Ranks by season projection by default, or by a specific scoring period's projection if scoring_period_id is given (a bye-week/no-game player ranks 0 for that period, not by season total). Locked players keep their current slot. This is a suggestion only — pass the resulting moves to set_lineup yourself if you want to apply them. |
| set_lineupA | Apply a batch of lineup moves to one team. Validates every move locally first (player is on the roster, target slot is eligible, player isn't locked, and the resulting lineup respects the league's slot counts) before sending anything. Rejected moves are reported with a reason and never sent. |
| add_free_agentA | Add an unclaimed free agent (not a waiver-wire player — use waiver_claim for those), optionally dropping another player in the same move. |
| waiver_claimB | Submit a waiver claim, optionally with a conditional drop. |
| cancel_claimA | Cancel a pending waiver claim by its transaction id (from get_pending). |
| move_to_irA | Move one player into the IR/IL slot, as a lineup move. Refuses if the player isn't eligible for IR or is locked. |
| activate_from_irA | Move one player out of the IR/IL slot into an active or bench slot, as a lineup move. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 17 tools
Each tool targets a distinct resource or action: rosters vs. teams vs. player lookup, free-agent adds vs. waiver claims, and IR moves are clearly separated. The only near pair is add_free_agent vs. waiver_claim, but their descriptions explicitly distinguish unclaimed free agents from waiver-wire players.
Read operations consistently use get_* (get_teams, get_league, get_rosters, etc.), and mutations use action_noun patterns like set_lineup, add_free_agent, cancel_claim, and move_to_ir. Two outliers, snapshot and optimal_lineup, break the verb-first pattern, but they are still recognizable and not confusing.
Seventeen tools is slightly above the typical well-scoped range, but the count is justified by the variety of fantasy-football operations: league info, roster management, waivers, transactions, matchups, and IR handling. Each tool covers a meaningful need with little redundancy.
The surface covers the full roster-management lifecycle: viewing teams/rosters, adding/dropping players, submitting/canceling claims, setting lineups, and handling IR. The main gap is trade management, which is explicitly read-only via get_pending, so agents cannot propose or execute trades; otherwise the domain is well covered.