Skip to main content
Glama
sbanthia92

fpl-context-mcp

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
DRY_RUNNoSet to true/1/yes to run without writing to PostgreSQL.false
DATABASE_URLYesRead-only PostgreSQL connection string for the query_historical_stats tool. Example: postgresql://fpl_readonly:password@localhost:5432/fpl
MCP_AUTH_TOKENNoHTTP transport only (--transport http): if set, /mcp requests must include Authorization: Bearer <token>.
DATABASE_ETL_URLNoPostgreSQL read/write connection string used by the fpl-context-ingest-match job. Falls back to DATABASE_URL if not set.

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

CapabilityDetails
tools
{
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
query_historical_statsA

Execute a read-only SQL SELECT against the FPL stats database. Use this to answer questions about player stats, fixtures, team strength, gameweek history, and player injury/availability status (FPL's status, chance of playing and news note) for the seasons in the database. Availability here is as of the last data refresh; call get_live_availability for the current flags.

Available tables (read-only). The current season is fully populated; past seasons exist only as season totals in players (see notes below the table list):

seasons — id, label (e.g. '2025/26'), start_year, is_current teams — season_id, fpl_id, name, short_name, strength, strength_attack_home/away, strength_defence_home/away gameweeks — season_id, gw_number (1–38), deadline_time, is_current, is_next, is_finished, average_entry_score, highest_score players — season_id, fpl_id, team_fpl_id, first_name, second_name, web_name, position (GKP/DEF/MID/FWD), now_cost, form, total_points, minutes, goals_scored, assists, clean_sheets, expected_goals, expected_assists, ict_index, selected_by_percent, status, chance_of_playing_next_round, news, news_added fixtures — season_id, fpl_id, gw_number, kickoff_time, home_team_fpl_id, away_team_fpl_id, home_score, away_score, finished, home_team_difficulty, away_team_difficulty gw_player_stats — season_id, player_fpl_id, gw_number, fixture_fpl_id, opponent_team_fpl_id, was_home, minutes, goals_scored, assists, clean_sheets, bonus, total_points, expected_goals, expected_assists, ict_index, starts

Notes:

  • teams, fixtures, gameweeks and gw_player_stats hold the CURRENT season only.

  • For past seasons, players has one row per player per season with season totals (points, minutes, goals, assists, clean sheets, cards, bonus). team_fpl_id is NULL there, and fpl_id is the player's current FPL id. Join seasons for the label.

  • Past seasons only include players in the CURRENT FPL player list. Departed players are absent, so league-wide or team-wide totals for past seasons are incomplete; only trust per-player history for players who appear in the current season.

Injury and availability (current season players rows, refreshed from FPL):

  • status: 'a' available, 'd' doubtful, 'i' injured, 's' suspended, 'u' unavailable (e.g. left the club / on loan), 'n' not in squad.

  • chance_of_playing_next_round: 0–100, NULL when there is no concern.

  • news: FPL's one-line note (e.g. 'Hamstring injury - 75% chance of playing'), '' when none. news_added: when that note last changed — use it for "what's new this week" questions (ORDER BY news_added DESC).

Join hint: teams.fpl_id = players.team_fpl_id (current season, same season_id).

get_live_availabilityA

Current FPL injury, suspension and availability flags, fetched live from the FPL API (no database needed). Call this before recommending, picking or captaining any player, so a newly flagged or suspended player isn't missed. With no arguments it lists every player who currently has a flag, newest news first. Pass player names to check specific players (returned even when fully available), and/or statuses to filter.

Status codes: a available, d doubtful, i injured, s suspended, u unavailable (left club / on loan), n not in squad. chance_of_playing is FPL's estimate for the next round.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.4/5.0

Scored across 2 tools

Disambiguation4/5

The two tools have largely distinct purposes: one is a broad SQL query interface for historical/current database stats, and the other fetches live injury/availability flags. There is some overlap on availability data, but the descriptions clearly explain that the database version is stale and the live tool should be used for current flags.

Naming Consistency5/5

Both tools use consistent snake_case and follow a clear verb_noun pattern: query_historical_stats and get_live_availability. Minor verb choice differs, but the convention is predictable and readable.

Tool Count4/5

Two tools is on the low side, but the SQL query tool is a powerful catch-all that covers many data needs, and the live availability tool addresses a specific, time-sensitive gap. The set is focused rather than incomplete.

Completeness4/5

The server covers historical/season stats via SQL and live availability via a dedicated tool, which handles the core context needs. Minor gaps exist, such as no direct live match/points tool, but agents can work around these through the SQL interface for most questions.

Maintenance

ActivityMaintained
ResponsivenessNo issues