MCP server for PlayerElo — player- and coach-level football Elo ratings, predictions, value bets and recruitment fit.
PlayerElo MCP demonstrates solid tool design with consistent naming (verb_noun pattern), comprehensive descriptions (avg 180 chars), and proper parameter typing. All 17 tools follow the search/get/list pattern clearly. Input schemas are well-formed with type declarations and parameter descriptions. However, output schemas are not explicitly documented in the code, responses are inferred from API behavior rather than declared. Error handling is present but generic (PlayerEloError wrapping). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being read-only. Parameter descriptions could be more prescriptive about constraints (e.g., 'limit max 100' stated in description but not enforced in schema). Missing guidance on when to use similar tools (e.g., search_players vs list_top_players distinction).
One club's current record by team_id: name, Team Elo, league, country and its standout player. Returns null if no club has that id.
A club's squad-need analysis: which positions are weakest relative to its level — the recruitment gaps a sporting director would target.
Full current record for one coach by id (e.g. "coach_4"): name, club, league and Elo rating. Returns null if no coach has that id.
A league's clubs ranked by Team Elo (current-season strength order).
Full current record for one player by id: name, age, position, club, league, Elo rating and EAR (Elo Above Replacement). Returns null if no player has that id.
A player's Elo and EAR over time (one point per date) — the rating trajectory, useful for form/trend analysis and charts.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Returns matches with player_id, name, Elo rating...') but no formal JSON Schema output definitions exist in code. LLMs cannot reliably plan downstream tool calls without knowing response structure.
No tool annotations despite all tools being read-only. FastMCP supports readOnlyHint annotation; applying it to all 17 tools would signal to agents that these are safe, non-destructive calls and can be retried without side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Recruitment opportunity map for a player: realistically reachable clubs that could plausibly sign them, ranked by fit. Requires a Business-tier key.
A player's playing-style profile — per-90 output and a multi-axis process fingerprint describing how they play, not just how good they are.
PlayerElo's own model-based market-value estimate for a player (in euros), with the signals behind it. This is our computed estimate, not a third-party valuation.
Upcoming-match win/draw/win probabilities from confirmed lineups, refreshed roughly every 10 minutes. Optionally filter by a league name/code. These are lineup-aware predictions, not just team form.
A 0-100 transfer-fit score for a specific player → club move, blending tactical fit (style match to the club's system), financial fit (our value estimate vs the club's typical spend) and strategic fit (squad need, age, level), with the per-signal breakdown. Requires an Ultra-tier key or higher.
Current value-bet signals — where PlayerElo's fair odds diverge from the market price. Optionally filter by strategy ("hs2_v6" = High Volume, "hs1_v6" = Sweet Spot). To poll for only NEW picks, pass since=<the largest id from your previous call>; signals refresh about every 10 minutes.
All competitions PlayerElo covers, with each league's id, name and country. Use a league_id with get_league_ranking.
The highest-rated players worldwide by current Elo (active players only). Paginate with limit (max 100) and offset.
Find clubs by name (case-insensitive). Returns matches with their team_id, name, Team Elo (squad-derived strength), league and country. Use the team_id with the other club tools.
Find coaches/managers by name (case-insensitive). Returns matches with their coach_id (a string like "coach_4"), name, Elo and current club — PlayerElo is the only public system that rates coaches. Use the coach_id with the other coach tools.
Find football players by name (case-insensitive). Returns matches with their player_id, name, Elo rating, position, current club and league — use the player_id with the other player tools. This is how you resolve a name like "Bellingham" to an id.
Parameter constraints stated in descriptions but not enforced in schema. E.g., 'limit (max 100)' appears in description text for list_top_players and search_* tools, but JSON Schema has no maximum constraint. LLMs may pass invalid values; validation happens at API call time, not schema validation time.
Error handling is generic. PlayerEloError wraps all failures (auth, rate limit, network, 404) with user-friendly messages, but no error classification (retryable vs user-fixable vs fatal) is exposed to the agent. Agents cannot distinguish 'retry in 60s' from 'check your API key' from 'resource not found'.
Ambiguous tool selection guidance. search_players and list_top_players both return player lists; descriptions do not clearly state when to use each. 'Find by name' vs 'highest-rated worldwide' is clear in isolation, but an agent may conflate them or choose wrong. Add explicit 'Use this when...' guidance.