Skip to main content
Glama
FPL MCP

FPL MCP

by MoayadAbbara

FPL MCP

Manage your Fantasy Premier League team with AI. An MCP server that lets an LLM client like Claude read your FPL team, analyse players and fixtures, suggest transfers, spy on your mini-league rivals, and actually make transfers, set your captain, and play chips — all from plain-language chat.

⚠️ Unofficial. Not affiliated with, endorsed by, or connected to the Premier League. Uses the public FPL API. Runs entirely on your own machine — your session token never leaves your computer, and your password is never seen by this tool or the model.


Demo

One sentence, multiple moves — a transfer, a captaincy change, and a line-up swap, all executed on the real team:

"Transfer out João Pedro, bring in Havertz, make Haaland captain, and bring Yates into the starting eleven for Le Fée"

FPL MCP demo — managing a team from chat


Related MCP server: FPL MCP Server

What makes it different

Most FPL tools only read data and give advice you then apply by hand. This one:

  • Actually manages your team — transfers, captaincy, line-up, and chips, executed for real.

  • Signs you in without ever touching your password — a real browser opens, you log in on the official FPL page, and only the session token is captured.

  • Spies on your mini-league — rivals' squads are public, so it computes ownership within your league and tells you your edge and the threats.

  • Suggests transfers with a position-aware model — three strategies: best points, safe template picks, or differentials to climb the rank.

Tools

Category

Tools

Auth

login_to_fpl

Your team

get_my_team

Data

get_gameweek_status, search_players, compare_players, get_player, get_fixtures, blank_double_gameweeks, get_league_standings, transfer_history, team_news

Analysis

suggest_transfers, analyze_mini_league

Manage

make_transfer, transfer_preview, set_captain, substitute, play_chip

How sign-in works (and why it's safe)

FPL migrated to a token-based login (PingOne OIDC). Instead of asking for your password, login_to_fpl:

  1. Opens a real browser window on the official FPL site.

  2. You sign in there yourself.

  3. The session token is read from the network traffic and stored locally in token.txt.

Your password is typed only into FPL's own page — it never reaches this code or the model. No bot-detection is bypassed; a human logs in. See docs/FINDINGS.md for the full technical write-up.

Requirements

  • Python 3.12+

  • uv

  • Node.js (only if you use the MCP Inspector for development)

Setup

git clone https://github.com/MoayadAbbara/FPL-MCP.git
cd FPL-MCP
uv sync --extra browser      # includes Playwright for browser login
uv run playwright install chromium

Connect it to Claude

Register the server with your MCP client. For Claude Code:

claude mcp add fpl -- uv run --directory /path/to/FPL-MCP python src/server.py

Or add it to your client's MCP config (.mcp.json / claude_desktop_config.json):

{
  "mcpServers": {
    "fpl": {
      "command": "uv",
      "args": ["run", "python", "src/server.py"],
      "cwd": "/path/to/FPL-MCP"
    }
  }
}

Restart the client, then just talk to it.

Usage

Once connected, use natural language:

"Sign in to FPL"
"Show my team"
"Any injury news on Arsenal players?"
"Compare Haaland and Gyökeres"
"Suggest transfers — differential mode"
"Analyse my mini-league 123456"
"Transfer out Haaland, bring in João Pedro, and make Watkins captain"

The model calls the right tools and, for anything that changes your team, tells you what it did.

Architecture

Layered — each layer only knows the one below it:

src/
  tools/    MCP tool surface (thin glue: fetch -> domain -> format -> text)
  format/   raw data -> compact, model-friendly text
  domain/   pure FPL logic (scoring, suggestions, roster maths) — no HTTP, no MCP
  api/      FPL HTTP client
  auth/     token capture (browser) and storage
  server.py entry point

Raw FPL JSON never reaches the model; everything passes through domain/ then format/ so only decision-relevant fields remain.

Development

uv run ruff format . && uv run ruff check --fix .   # format + lint
uv run python src/server.py                          # run the server (stdio)

Notes

  • The season-dependent tools (suggest_transfers, analyze_mini_league) work best once the season has started; before the first deadline they return a clear "not yet" message.

  • Automating team management may bump against the FPL Terms of Service. Use it for your own team, keep it personal, and stop if asked to.

License

MIT

Available Tools

18 tools
analyze_mini_leagueA

Spy on a classic mini-league: your rank, your edge, and the threats, compared against the ~10 managers above and below you.

    Args:
        league_id: The mini-league ID.
        team_id: Optional; detected from your account if omitted.
    

Inputs: league_id (required), team_id. Returns: result

blank_double_gameweeksA

List upcoming blank and double gameweeks by club.

Inputs: no named parameters. Returns: result

compare_playersC

Compare two or more players side by side by name.

Inputs: players (required). Returns: result

get_fixturesC

Upcoming fixtures and difficulty for a club (e.g. 'Arsenal' or 'ARS').

Inputs: team (required), next_n. Returns: result

get_gameweek_statusA

Show the current, previous, and next gameweeks, plus the next deadline.

Inputs: no named parameters. Returns: result

get_league_standingsB

Show standings for a classic mini-league by its ID.

Inputs: league_id (required). Returns: result

get_my_teamA

Get an FPL team: starting XI, bench, captain, bank, value, and chips.

    Requires authentication (a Bearer token). Args:
        team_id: The FPL team ID. If omitted, it is detected automatically
            from the authenticated account.
    

Inputs: team_id. Returns: result

get_playerB

Detailed profile for one player: stats, status, and upcoming fixtures.

Inputs: name (required). Returns: result

login_to_fplA

Open a browser to sign in to Fantasy Premier League and save the token.

A real browser window opens on the FPL site. The user signs in there themselves; their password is never seen by this tool or the model. Once signed in, the session token is captured and stored for later calls.

Inputs: no named parameters. Returns: result

make_transferA

Transfer one player out and another in (by name).

    Args:
        sell: Name of a player currently in your squad to sell.
        buy: Name of the player to buy.
        team_id: Optional; detected from your account if omitted.
    

Inputs: buy (required), sell (required), team_id. Returns: result

play_chipB

Activate a chip, or cancel the active one.

    Args:
        chip: One of wildcard, free hit, bench boost, triple captain
            (aliases like wc/fh/bb/3xc/tc also work), or "cancel" to turn it off.
        team_id: Optional; detected from your account if omitted.
    

Inputs: chip (required), team_id. Returns: result

search_playersA

Find players by filters, best first.

    Args:
        position: GKP, DEF, MID, or FWD.
        team: Club short or full name (e.g. ARS or Arsenal).
        max_price: Maximum price in millions.
        min_price: Minimum price in millions.
        sort_by: points, form, price, ownership, goals, or assists.
        limit: How many players to return.
    

Inputs: team, limit, sort_by, position, +2 more. Returns: result

set_captainA

Set your captain, and optionally your vice-captain (by name).

    Args:
        player: Name of the squad player to make captain.
        vice: Optional name of the squad player to make vice-captain.
        team_id: Optional; detected from your account if omitted.
    

Inputs: player (required), vice, team_id. Returns: result

substituteA

Swap a bench player into the starting XI and move a starter to the bench.

    Args:
        bench_in: Name of the bench player to bring into the XI.
        starter_out: Name of the starting player to move to the bench.
        team_id: Optional; detected from your account if omitted.
    

Inputs: bench_in (required), starter_out (required), team_id. Returns: result

suggest_transfersB

Suggest transfers that improve your squad over the next 3 gameweeks.

    Args:
        mode: "normal" (best expected points), "template" (safe, well-owned
            picks), or "differential" (low-owned picks to climb your rank).
        team_id: Optional; detected from your account if omitted.
    

Inputs: mode, team_id. Returns: result

team_newsB

Injury and availability news: who is injured, doubtful, or suspended, their chance of playing, and the official note.

    Args:
        team: Optional club filter (e.g. 'Arsenal' or 'ARS').
        player: Optional player name; shows that player's status even if fit.
    

Inputs: team, player. Returns: result

transfer_historyA

Show a team's transfers this season. Auto-detects your team if logged in.

Inputs: team_id. Returns: result

transfer_previewA

Show what a transfer would do (funds, position) WITHOUT submitting it.

Inputs: buy (required), sell (required), team_id. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 18 tools

    Disambiguation4/5

    Most tools target a distinct action and resource: search, compare, get profile, fixtures, transfers, chips, and squad moves are well separated. The main potential confusion is between get_league_standings and analyze_mini_league, which both deal with mini-league data, though their descriptions indicate different scopes.

    Naming Consistency3/5

    There is a clear majority pattern of imperative get_/set_/make_/play_ verbs, but several names are noun phrases instead, such as team_news, transfer_history, transfer_preview, and blank_double_gameweeks. The convention is consistent enough to be readable, but it is not uniformly verb_noun.

    Tool Count4/5

    18 tools is on the heavier end, but the FPL domain is broad and each tool serves a distinct part of the workflow: login, squad, players, fixtures, news, transfers, chips, and leagues. A few could arguably be folded together, but the count feels justified rather than bloated.

    Completeness5/5

    The tool surface covers the core FPL lifecycle: authentication, team viewing, player research, fixture difficulty, injuries, league standings, mini-league analysis, transfer history/suggestions/preview/execution, captain selection, substitutions, and chips. There are no obvious dead ends or missing domain-critical operations.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Enables interaction with Fantasy Premier League data through natural language queries. Supports retrieving fixtures, league standings, player performance, and other FPL statistics via the official FPL API.
      16
      22 npm
      3
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Connects LLMs to the Fantasy Premier League API for intelligent team management, enabling natural language player research, competitor analysis, transfer decisions, and strategic planning using friendly names instead of IDs.
      3
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to analyze Fantasy Premier League data, providing tools for player search, fixture analysis, manager comparisons, and strategy prompts for transfer planning and lineup selection.
      19
      25 PyPI
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides tools and resources to interact with the Fantasy Premier League API, enabling player analysis, fixture insights, and team management through natural language.
      63 npm
      MIT