MCP server for live football data (teams, fixtures, results, standings) powered by TheSportsDB. Built with TypeScript and Zod.
Solid foundation with clear verb-based naming and consistent parameter descriptions. All 6 tools have documented schemas and descriptions. However, output schemas are not formally documented, responses are formatted strings rather than structured objects. Parameter descriptions lack constraint details (enums, ranges, formats). Error handling is present but minimal. No tool annotations (readOnlyHint, etc.). Descriptions average ~80 chars, below the 194-char baseline for A+ tools.
Compare two teams' recent form and results
Find a team by name and get its details
Get matches for a competition, optionally filtered by status and matchday
Get league standings for a competition and season
Get a team's matches in its domestic league for a season
Get top scorers for a competition in a season
Output schemas not documented. All tools return formatted strings (e.g., formatStandings, formatMatch) rather than structured JSON objects. LLMs cannot parse or chain results reliably.
Parameter descriptions lack constraint details. 'status' accepts 'FINISHED', 'SCHEDULED', 'LIVE' but no enum is declared. 'limit' has no min/max bounds. 'season' format not specified (e.g., '2024' for 2024-25).
No tool annotations. Tools are read-only but lack readOnlyHint in schema. This prevents clients from optimizing caching, retry logic, or UI presentation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Error handling is minimal. ToolError class exists but error messages are user-facing strings, not structured error objects with recovery guidance. No categorization of retryable vs. fatal errors.
No pagination support. Tools like get_matches slice results to 30 items but do not expose limit/offset parameters or return a total count. Large result sets risk context window exhaustion.