Model Context Protocol server providing access to Australian Football League (AFL) data via the Squiggle API
This MCP server exposes 16 AFL-related tools with mixed quality. All tools have names that start with action verbs (Get*), which is good. However, descriptions are uniformly terse (10-60 characters), falling well below the production baseline of 194 chars. Most critically, INPUT SCHEMAS ARE NOT VISIBLE in the provided source code, only tool names and parameter names are documented. The BaseAFLTool class shows error handling patterns and logging infrastructure, but the actual JSON Schema definitions that should accompany each tool are not shown. Without visible schemas, schema scores must be capped at 0 per the hard rules. Parameter descriptions exist (e.g., 'The ID of the game'), but are minimal and lack guidance on ranges, formats, or dependencies. No output schemas are documented. All 16 tools are READ_ONLY, which is good for safety but suggests limited value-add complexity. The server appears to be a wrapper around a third-party AFL sports API with no custom logic for composition or multi-step workflows.
Gets the current standing
Get the tips for current and future games
Gets result from a played game
Get Power Ranking by Round and Year
Get Power Ranking by Round, Year, and Model Source
Get the projected ladder for a particular round and year
Get the projected ladder for a particular round and year by source
Input schemas are not visible in provided source code. All tools scored 0 for schema compliance. Without JSON Schema definitions showing parameter types, constraints, and required/optional status, the MCP protocol cannot properly validate or guide LLM tool selection.
Tool descriptions are uniformly terse (10-60 characters), far below the production baseline of 194 chars. Examples: 'Gets result from a played game' (30 chars), 'Get the tips for current and future games' (42 chars). These descriptions lack context on WHEN to use the tool, WHAT it returns, or HOW to interpret results. LLMs cannot reliably select the correct tool from a list of 16 similar Get* calls without richer descriptions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 32 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Get the results from a round of a particular year
Gets a source by ID
Gets a list of sources
Get the standings for a particular round and year
Gets information for a AFL team
Get Power Ranking for Team by Round, Year, and Model Source
Gets a list of teams who played in a particular season
Get the tips of a particular game
Get the tips for a particular round and year
Parameter descriptions are minimal and lack actionable constraint information. For example, 'year' parameters state only 'The year of the round' without documenting valid range (1897 - 2026 per BaseAFLTool.IsValidYear). LLMs cannot infer constraints from names alone and will pass invalid values. Parameters should state: 'The year (integer, 1897 - 2026; power rankings available from 2022 onwards).'
No output schemas are documented. Agents have no way to know what fields to expect from tool responses (e.g., does GetGameResult return {gameId, teams, score, date} or something else?). This forces agents to reason about response structure and risks downstream tool failures when expected fields are missing.
Naming contains multiple 'and' conjunctions (GetProjectedLadderByRoundAndYear, GetProjectedLadderByRoundAndYearBySource, GetPowerRankingByRoundYearAndSource). While these names are specific, they suggest tools that accept multiple independent filters. Consider whether separate tools for 'by round only' vs 'by round and year' vs 'by round, year, and source' would enable clearer composition.
No tool-level error handling guidance visible. The BaseAFLTool class catches exceptions (HttpRequestException, TaskCanceledException, JsonException) and logs them, but there's no evidence of structured error responses returned to the MCP protocol or guidance on what the LLM should do when a call fails (retry, try an alternative, ask the user).