A Model Context Protocol server that provides soccer/football data tools including latest matches, next matches, players, transfers, and trophies information
The server has 5 tools with basic schemas and descriptions, but significant quality gaps reduce the score substantially. All tools follow a consistent verb_noun naming pattern (get_*), which is a strength. However, descriptions are minimal (8-17 characters), falling far below the 194-char baseline for A+ tools. Input schemas are present but trivial, each tool accepts only a single required 'team' string parameter with minimal context. Output schemas are completely undocumented: there is no indication what fields get_latest_matches returns, what structure get_players provides, or how pagination (if any) works. Error handling is absent, there are no recovery guides, retry hints, or suggestions for invalid inputs. The tools lack parameter constraints (e.g., enums for team names, validation of the 'team' parameter format). No tool documents what its output looks like, forcing LLMs to guess. The server is STDIO-only, which is a hard transport limitation but not scored here, see protocolReadiness.
Get the latest matches
Get the next matches
Get the players
Get the transfers
Get the trophies
All tool descriptions are under 20 characters (e.g., 'Get the latest matches'). These descriptions lack context for LLM selection, do not explain WHEN to use the tool, and do not hint at output structure or prerequisites.
Output schemas are completely undocumented. The source code shows internal handlers return Match structs with fields like Title, Home, HomeLogo, Away, AwayLogo, Date, ScoreBoard (for matches), but the MCP tool definitions do not declare what fields the tool returns. LLMs cannot plan downstream actions or extract the right data without a documented return type.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 42 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 28 | - | v1 |
No error handling or recovery guidance. Tools do not return actionable error messages. If a team name does not exist, the LLM receives no hint to try an alternative, search for valid team names, or check spelling. Error responses should tell the LLM what to do next (e.g., 'Team not found. Try search_teams() or see available_teams.').
All tools accept a single 'team' string parameter with minimal constraint documentation. The parameter description is generic: 'The name of the team to get the [resource] for.' No enum of valid team names, no format specification, no hint about case sensitivity, and no guidance on how the LLM should know what team names are valid. This invites the LLM to hallucinate team names.
No pagination or result limits declared. If get_latest_matches returns 500 past matches, that blows the context window. No page_size, limit, or cursor parameters are documented.
Tool definitions are registered in cmd/soccer/mcp/main.go via tool.GetLatestMatchesTool(server) etc., but the actual tool implementations in internal/mcp/tool/*.go are not shown in the source. The tool schemas are inferred from the handler layer, but explicit MCP registration code is not visible.
No tool composition or chaining hints. If an agent wants to 'get matches for the team, then get the players,' there is no guidance on parameter naming consistency. The tools do not document whether get_latest_matches and get_players accept team names in the same format, or whether the output of one can feed directly into another.