Query historical ATP tennis rankings data (1973-present): search for players, get career fact files and time-series history, weeks spent at world No. 1, and full rankings for any given week.
ATP Rankings MCP server demonstrates solid definition quality with clear naming conventions, consistent tool descriptions, and structured parameter handling. All 6 tools are explicitly registered with the @mcp.tool() decorator in src/mcp_server.py. Tool names follow verb_noun patterns (search_players, get_player_factfile, get_weeks_at_no1). Descriptions range from 80 - 230 characters, meeting the 10 - 1024 character guideline. However, several parameters lack descriptions (e.g., 'limit' parameter in search_players is described, but output schemas are not explicitly documented in the code). Error handling is absent from the visible tool implementations, there is no guidance on what happens if a player name is misspelled or a week_date is invalid. The service layer (imported but not shown) likely contains error logic, but the tool layer does not surface recovery guidance to the LLM.
Get the list of all rankings weeks available in the database.
Get a player's full time-series career history: ranking and points at every recorded week.
Get a player's career fact file: career-high rank, peak points, and weeks spent in the top 100 / top 10 / at No. 1.
Get the complete ATP rankings for a specific week.
Get every player who has held the World No. 1 ranking, along with the total number of weeks they held it, sorted descending.
Search for ATP players by (partial) name.
Output schemas not explicitly documented in tool definitions. While return types are implied by docstrings (e.g., 'returns Dict[str, Any]'), the actual structure of returned fields is not documented for the LLM. This forces the LLM to guess what fields are present and their meaning.
No error handling or recovery guidance in tool implementations. If search_players receives an empty query, or get_week_rankings receives an invalid date, the tool will likely raise an exception. The LLM has no guidance on what to try next (e.g., 'Try calling get_all_weeks() first to see available weeks').
Parameter 'player' in get_player_factfile and get_player_career requires 'exact player name as it appears in rankings data', but the tool does not explain how an LLM would discover the exact name without first calling search_players. A dependency hint ('First call search_players() to find the exact name') should be added.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
Parameter 'week_date' in get_week_rankings states 'YYYY-MM-DD format, e.g. "2023-01-02"' using an example. Best practice is to replace the example with a regex pattern or format constraint (e.g., 'ISO 8601 date string (YYYY-MM-DD)') to avoid the LLM reusing the literal example value.