fotmob-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fotmob-mcpWhat are the Premier League fixtures for this weekend?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fotmob-mcp
Exploring FotMob football data. Two things live here:
An MCP (Model Context Protocol) server for querying FotMob from any MCP-compatible LLM client.
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:3000Re-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 SQLiteserver/— Express API (/api/meta,/api/players,/api/players/:id,/api/leaders/:statName) serving the SQLite datapublic/— 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 matchget_team— squad, fixtures, recent results, and table position for a teamget_league— table, top scorers, and fixtures for a leagueget_player— bio, stats, and recent ratings for a playersearch— search teams, players, leagues, or matches by name
Setup
npm install
npm run buildUsage
Run directly:
npm startOr 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 devFinding 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 toolsget_leagueA
Get a league's overview: table, top scorers, and fixtures.
| Name | Required | Description | Default |
|---|---|---|---|
| leagueId | Yes | FotMob league ID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| matchId | Yes | FotMob match ID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date in YYYYMMDD format, e.g. 20260821 |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| playerId | Yes | FotMob player ID |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | Yes | FotMob team ID |
TDQS
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.
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.
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.
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.
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.
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.
searchB
Search FotMob for teams, players, leagues, or matches by name.
| Name | Required | Description | Default |
|---|---|---|---|
| term | Yes | Search term, e.g. 'Arsenal' or 'Messi' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It only says what it searches, not what results look like, whether it returns multiple matches, or any limitations (e.g., partial name matching). The agent has no information about response structure or potential ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the main action. It is concise and covers the core purpose. Could be slightly more structured but is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is a search function with no output schema and no annotations, the description is thin. It does not mention return format, result count, or how it handles no matches. For a search tool, this is insufficient context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description of 'term' and an example. The description adds the list of entity types It does not add additional meaning beyond the schema, but the schema itself is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches FotMob for teams, players, leagues, or matches by name. This distinguishes it from sibling tools that retrieve specific entities by ID or date.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when finding an entity by name, but does not explicitly state when to use this versus direct lookups (e.g., get_team or get_player). It could mention that this is a discovery entry point before fetching details.
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.
6 tool updates
v0.1.0- First observed
get_league - First observed
get_match_details - First observed
get_matches_by_date - First observed
get_player - First observed
get_team - First observed
search
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
API-Football MCP — comprehensive soccer/football data
Football fixtures, standings, and odds intelligence for AI agents.
Football-Data.org MCP — soccer competitions, matches, standings
OpenLigaDB MCP — community-run, keyless football / soccer match data.
Related MCP Servers
- FlicenseAqualityDmaintenanceProvides 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-
- FlicenseNot gradedqualityDmaintenanceProvides tools to query football match data, odds, standings, and team statistics via natural language, integrating with the football-scraper-api.-
- FlicenseBqualityBmaintenanceEnables access to live FotMob football data for fixture lookup, team and player research, match details, lineups, league discovery, and search-based entity lookup.78-
- AlicenseAqualityCmaintenanceEnables MCP clients to access live football data from FotMob, including match stats, team form, injuries, and player workload, without making predictions.101MIT