fotmob-mcp
fotmob-mcp
Explorando los datos de fútbol de FotMob. Aquí hay dos cosas:
Un servidor MCP (Model Context Protocol) para consultar FotMob desde cualquier cliente LLM compatible con MCP.
Un panel de estadísticas de la Premier League: un pipeline que extrae las estadísticas de todos los jugadores de la plantilla a SQLite, más una interfaz web para ordenar a los jugadores por cualquier estadística y ver desgloses de percentiles al estilo de FBref.
Ambos usan los endpoints de la API web pública de FotMob (no documentados, usados por el propio fotmob.com), por lo que el comportamiento puede cambiar si FotMob modifica su API.
Panel de estadísticas
Extrae todas las plantillas de la Premier League (~580 jugadores) con metadatos (edad, posición, pie, nacionalidad, altura, valor de mercado) y ~37 categorías de estadísticas de temporada (goles, xG, xA, entradas, acciones defensivas, estadísticas de porteros, etc.) a una base de datos SQLite local, y luego sirve un panel para ordenar, filtrar y comparar jugadores, incluidas las barras de percentiles frente a los de su misma posición, similar a los antiguos informes de scouting de FBref.
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:3000Vuelve a ejecutar npm run pipeline periódicamente para actualizar las últimas estadísticas (es un upsert completo, seguro de re-ejecutar en cualquier momento — p. ej., semanalmente durante la temporada). El archivo SQLite se encuentra en data/fotmob.db y está ignorado por GitHub; cada entorno construye el suyo.
Estructura del panel
pipeline/— recupera las plantillas de las ligas y las clasificaciones de estadísticas de FotMob, y las escribe en SQLiteserver/— API de Express (/api/meta,/api/players,/api/players/:id,/api/leaders/:statName) que sirve los datos de SQLitepublic/— frontend en JS/HTML/CSS sin frameworks: tabla de jugadores ordenable, pestañas de categorías (Estándar/Tiro/Pases/Posesión/Defensa/Disciplina/Portero), panel de detalle del jugador con barras percentiles y una vista de líderes
Todavía no hay hosting configurado — esto se ejecuta en local. Para que sea accesible públicamente, despliega server/ (que sirve tanto la API como el frontend estático) en cualquier host de Node con un disco persistente para el archivo SQLite (p. ej. Render, Railway, Fly.io, o un VPS), y programa que npm i run seam se ejecute periódicamente ahí.
Related MCP server: football-scraper-mcp
Servidor MCP
Herramientas
get_matches_by_date— todos los partidos de una fecha dada (YYYYMMDD)get_match_details— alineaciones, estadísticas, eventos y resultado de un partidoget_team— plantilla, calendario, resultados recientes y posición en la clasificación de un equipoget_league— clasificación, máximos goleadores y calendario de una ligaget_player— biografía, estadísticas y valoraciones recientes de un jugadorsearch— busca equipos, jugadores, ligas o partidos por nombre
Configuración
npm install
npm run buildUso
Ejecuta directamente:
npm startO apunta un cliente MCP hacia él, p. ej. en la configuración de Claude Code / Claude Desktop:
{
"mcpServers": {
"fotmob": {
"command": "node",
"args": ["/absolute/path/to/fotmob-mcp/dist/index.js"]
}
}
}Durante el desarrollo, ejecútalo sin compilar antes:
npm run devEncontrar IDs
Los IDs de equipos, ligas, jugadores y partidos de FotMob no se deducen solo a partir del nombre: usa primero la herramienta search para resolver un nombre y obtener su ID, y luego pasa ese ID a las demás herramientas.
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.
Sportmonks Football MCP — wraps the Sportmonks Football v3 API (docs.sportmonks.com/football).…
Football-Data.org MCP — soccer competitions, matches, standings
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.-
- FlicenseBqualityDmaintenanceEnables access to live FotMob football data for fixture lookup, team and player research, match details, lineups, league discovery, and search-based entity lookup.2710-
- AlicenseAqualityDmaintenanceEnables MCP clients to access live football data from FotMob, including match stats, team form, injuries, and player workload, without making predictions.101MIT