Skip to main content
Glama
MoRocety

fotmob-mcp

by MoRocety

fotmob-mcp

Exploring FotMob football data. Two things live here:

  1. An MCP (Model Context Protocol) server for querying FotMob from any MCP-compatible LLM client.

  2. A Premier League stats dashboard: a pipeline that pulls full-squad player stats into SQLite, plus a web UI for sorting players by any stat and viewing FBref-style percentile breakdowns.

Both talk to FotMob's public web API endpoints (undocumented, used by fotmob.com itself), so behavior may change if FotMob changes their API.

Stats dashboard

Pulls every Premier League squad (~580 players) with meta data (age, position, foot, nationality, height, market value) and ~37 season-long stat categories (goals, xG, xA, tackles, defensive actions, goalkeeping stats, etc.) into a local SQLite database, then serves a dashboard to sort, filter, and compare players — including percentile bars against same-position peers, similar to old FBref scouting reports.

npm install
npm run pipeline      # fetch everything into data/fotmob.db (~5-10 min; foot/value lookups are the slow part)
npm run pipeline:fast # same, but skips the slow per-player foot/market-value enrichment
npm run web           # serve the dashboard at http://localhost:3000

Re-run npm run pipeline periodically to refresh with the latest stats (it's a full upsert, safe to re-run anytime — e.g. weekly during the season). The SQLite file lives at data/fotmob.db and is gitignored; each environment builds its own.

Dashboard structure

  • pipeline/ — fetches league squads + stat leaderboards from FotMob, writes to SQLite

  • server/ — Express API (/api/meta, /api/players, /api/players/:id, /api/leaders/:statName) serving the SQLite data

  • public/ — vanilla JS/HTML/CSS frontend: sortable player table, category tabs (Standard/Shooting/Passing/Possession/Defense/Discipline/Goalkeeping), player detail drawer with percentile bars, and a leaders view

No hosting is set up yet — this runs locally. To make it publicly accessible, deploy server/ (it serves both the API and the static frontend) to any Node host with a persistent disk for the SQLite file (e.g. Render, Railway, Fly.io, a VPS), and schedule npm run pipeline to run periodically there.

Related MCP server: football-scraper-mcp

MCP server

Tools

  • get_matches_by_date — all matches across leagues on a given date (YYYYMMDD)

  • get_match_details — lineups, stats, events, and score for a match

  • get_team — squad, fixtures, recent results, and table position for a team

  • get_league — table, top scorers, and fixtures for a league

  • get_player — bio, stats, and recent ratings for a player

  • search — search teams, players, leagues, or matches by name

Setup

npm install
npm run build

Usage

Run directly:

npm start

Or point an MCP client at it, e.g. in Claude Code / Claude Desktop config:

{
  "mcpServers": {
    "fotmob": {
      "command": "node",
      "args": ["/absolute/path/to/fotmob-mcp/dist/index.js"]
    }
  }
}

During development, run without building first:

npm run dev

Finding IDs

FotMob team/league/player/match IDs aren't obvious from names alone — use the search tool first to resolve a name to an ID, then feed that ID into the other tools.

Available Tools

6 tools
get_leagueA

Get a league's overview: table, top scorers, and fixtures.

ParametersJSON Schema
NameRequiredDescriptionDefault
leagueIdYesFotMob league ID

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of behavioral disclosure. The description indicates this is a read operation (getting an overview) but doesn't disclose details like whether it returns live or historical data, pagination, or any rate limits. It's a simple read tool, so the lack of extensive behavioral detail is acceptable, but it could mention what 'overview' includes beyond the listed items.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that front-loads the purpose and lists the key components. Every word earns its place, with no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema, no nested objects), the description is reasonably complete. It tells the agent what the tool returns (table, top scorers, fixtures) and what input is needed. It could be slightly more explicit about the scope (e.g., current season vs. all time), but for a simple overview tool, this is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100% (the only parameter, leagueId, is described as 'FotMob league ID'). The description adds no additional parameter semantics beyond what the schema provides, but since the schema fully covers the parameter, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: retrieving a league's overview including table, top scorers, and fixtures. It uses a specific verb ('Get') and resource ('league'), and the mention of specific components (table, top scorers, fixtures) helps distinguish it from sibling tools like get_team or get_player, though it doesn't explicitly differentiate from get_matches_by_date.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context (when you need a league overview) but provides no explicit guidance on when to use this tool versus alternatives like get_matches_by_date or get_team. It doesn't mention exclusions or prerequisites, but the purpose is clear enough that an agent could infer appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_match_detailsA

Get detailed info for a single match: lineups, stats, events, and score.

ParametersJSON Schema
NameRequiredDescriptionDefault
matchIdYesFotMob match ID

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the transparency burden. It communicates a read-only lookup via 'Get' and specifies the main content categories returned. It does not cover error behavior or prerequisites, but for a simple single-ID read tool this is reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one sentence, front-loaded with the action and resource, and contains no filler or redundant phrasing. Every word contributes to understanding the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with one parameter and no output schema, the description is largely complete: it identifies the resource and what the returned details include. It could mention that matchId may come from get_matches_by_date or address missing-match behavior, but these are minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes matchId as a 'FotMob match ID' with 100% coverage. The description adds no extra semantic detail about the parameter beyond referencing a single match, so it meets the baseline without exceeding it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves detailed info for a single match, enumerating lineups, stats, events, and score. This distinguishes it from siblings like get_matches_by_date (date-based listing), get_team, get_player, and get_league.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for a single match' makes the use case clear: call this when a specific match ID is already known and full match-level detail is needed. It does not explicitly name alternatives, but the contrast with list-oriented siblings is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_matches_by_dateA

Get all football matches (across leagues) scheduled on a given date.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate in YYYYMMDD format, e.g. 20260821

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of explaining behavior. It clearly conveys that this is a read-only lookup of all matches on a date, but does not disclose other details such as match status, ordering, pagination, or coverage limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise, well-structured sentence with no filler. It front-loads the action and resource and includes meaningful scope qualifiers ('across leagues', 'scheduled on a given date').

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter query tool with no output schema or annotations, the description provides sufficient context. It tells the agent exactly what the tool retrieves and how the result set is scoped, making the tool usable without further detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes the single date parameter with format and example, so the description does not need to add much. The tool description's 'given date' merely restates the parameter's purpose without adding extra semantic meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and a clear resource ('all football matches across leagues') with an explicit temporal filter ('scheduled on a given date'). The phrase 'across leagues' helps distinguish it from sibling tools like get_match_details, which focuses on a single match.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: querying matches by date across all leagues. However, the description does not explicitly provide when/when-not guidance or mention alternatives such as get_match_details for individual matches or search for broader queries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_playerB

Get a player's profile: bio, stats, and recent performance ratings.

ParametersJSON Schema
NameRequiredDescriptionDefault
playerIdYesFotMob player ID

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description alone must disclose operational behavior. It states the tool returns a profile with bio, stats, and ratings, implying a read operation, but does not mention error handling, authentication, rate limits, or any side effects. Since the description only describes the output content, not the behavioral nuances, it falls short for full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence that states exactly what the tool returns. It is appropriately concise and well-structured with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lists key output elements (bio, stats, recent performance) which gives some contextasi si. However, it lacks details on error handling, edge cases, or any prerequisites. For a simple get tool, it is mostly adequate, but not exhaustive. Given no output schema, the description partially compensates by naming the returned fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage for the sole parameter (playerId) with a basic description. The tool description adds no extra meaning beyond the schema. Per the rubric, when schema coverage is high, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get'), the resource ('a player's profile'), and the specific contents (bio, stats, recent performance ratings). This is unambiguous and distinguishes the tool from siblings like get_team or get_league, which target different entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for retrieving player profiles, but it does not explicitly compare against alternatives like search or get_team. It doesn't say when to prefer this over a broader search. However, for a simple resource getter, the context is fairly clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_teamA

Get a team's overview: squad, fixtures, recent results, and league table position.

ParametersJSON Schema
NameRequiredDescriptionDefault
teamIdYesFotMob team ID

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It conveys a read-only intent via 'Get' and lists the returned data categories, but it does not disclose error behavior, data scope, freshness, or any potential limitations beyond the high-level content list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word contributes to explaining the tool's purpose and return contents.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no output schema, the description adequately summarizes the returned information. It could be more complete by clarifying scope (e.g., current season) or error behavior, but the low complexity and full schema coverage keep the description reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents the only parameter (teamId as 'FotMob team ID'), so schema coverage is 100%. The description adds no additional parameter-level meaning beyond what the schema provides, matching the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and a specific resource ('a team's overview'), then enumerates the included content: squad, fixtures, recent results, and league table position. This clearly distinguishes it from sibling tools like get_matches_by_date or get_player.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when a team-level summary is needed, but it does not explicitly state when to use this tool versus alternatives such as get_matches_by_date or get_league. There is no exclusionary guidance or mention of prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 6 tool updatesv0.1.0
    • First observedget_league
    • First observedget_match_details
    • First observedget_matches_by_date
    • First observedget_player
    • First observedget_team
    • First observedsearch

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a clearly distinct resource: matches by date, match details, teams, leagues, players, and search. There is no meaningful overlap between the entity-specific getters and the general search tool.

Naming Consistency4/5

Five tools follow the consistent get_<resource> pattern, while 'search' is a bare verb that breaks the pattern slightly. The naming is otherwise predictable and all snake_case.

Tool Count5/5

Six tools is a well-scoped set for a football data server, covering all major entity types without redundancy. Each tool earns its place in the surface.

Completeness5/5

The surface covers core football data needs: matches by date, detailed match info, teams, leagues, players, and discovery via search. There are no dead ends or obvious missing operations for the stated domain.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Provides live football data through MCP tools, enabling users to fetch today's matches and top scorers for competitions like the Premier League or World Cup.
    2
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides tools to query football match data, odds, standings, and team statistics via natural language, integrating with the football-scraper-api.
    -
  • F
    license
    B
    quality
    B
    maintenance
    Enables access to live FotMob football data for fixture lookup, team and player research, match details, lineups, league discovery, and search-based entity lookup.
    7
    8
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables MCP clients to access live football data from FotMob, including match stats, team form, injuries, and player workload, without making predictions.
    10
    1
    MIT