The server defines 20 tools across rendering, Chessboard Magic, ChessDojo, and Lichess integrations. Overall quality is mixed. Naming is generally verb-first and clear (render_*, get_*, fetch_*, update_*). Descriptions are present for all tools and range 50 - 250+ characters, meeting minimum thresholds. However, parameter descriptions vary significantly, some tools have well-described parameters (e.g., 'get-chessboardmagic-tcec-games' with pagination, sorting), while others are minimal (e.g., 'fetch-lichess-game' has only 'gameId' with a brief description). Input schemas are visible for all tools and use Zod types, but schema validation details are inconsistent. Error handling is not visible in the tool registration code, the underlying HTTP adapter catches Axios errors but provides generic HTTP status messages ('HTTP 404: not found') without guidance for recovery. No tool annotations (readOnlyHint, idempotentHint, destructiveHint) are present, though most tools are read-only. Output schemas are not documented in the source. Critical issue: token parameters are exposed in tool input schemas (e.g., 'token' param in multiple tools), violating secret-injection pattern, tokens should be injected server-side via HTTP context headers, not passed as parameters.
Tools (20)
fetch-chess-puzzleread onlysource verified75/100
Fetch a random chess puzzle from the Lichess-backed puzzle service. Can filter by themes and rating range. Use this to start a puzzle session with the user.
fetch-lichess-gameread onlysource verified63/100
Fetch a specific Lichess game in PGN format by game ID.
Token parameters exposed in tool input schemas (tools 3 - 12, 14 - 16, 19 - 20). Tokens should be injected server-side via HTTP authorization headers, not passed as tool parameters. Agent traces log all parameters, tokens in schemas will leak into logs.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. Most tools are read-only and should declare this; update-dojo-progress is destructive and should be annotated. Lack of annotations prevents agents from making safe assumptions about retry behavior and side effects.
Recommendations
CRITICAL: Remove 'token' parameters from all tool input schemas. Implement server-side token injection via HTTP header in remoteHttpToolAdapter. Tokens are secrets and must never be exposed as tool parameters. If supporting user-provided tokens, use a separate authentication flow outside of tool invocation.
Add tool annotations to all tools. Use readOnlyHint=true for 19 read-only tools (render_*, get_*, fetch_*). Use destructiveHint=true for update-dojo-progress. This enables agents to reason about retry safety and side effects.
Document output schemas for all tools. In tool registration, add a comment or description block specifying returned fields, types, and examples. This is essential for tool chaining (e.g., if get_dojo_requirements returns requirement_id, update-dojo-progress must accept requirement_id).
Enhance error handling in remoteHttpToolAdapter.ts. Catch specific error classes (network timeout, auth failure, not found, validation error) and return recovery guidance. E.g.: 'User not found (404). If using a username, try get-lichess-games() first to find valid usernames.' Classify errors: retryable (5xx), user-fixable (4xx validation), fatal (auth).
Standardize tool naming convention. Migrate from kebab-case to snake_case (or vice versa) across all tools. Choose one: get_chessboardmagic_repertoires or get-chessboardmagic-repertoires, not a mix.
Add min/max bounds to numeric parameters. E.g., size: {type: 'number', minimum: 1, maximum: 100}, page: {type: 'number', minimum: 1}. Specify these constraints in parameter descriptions as well.
Score history
Overall score trend
↑ 56 points across a rubric change (v1 → v2)
56/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
D
56
2026-07-28+
v2
2026-03-09
F
0
-
v1
read onlyauthsource verified65/100
Fetch correspondence chess statistics for a specific chess position
Fetch actual TCEC (Top Chess Engine Championship) games that reached a specific position, or games played by a specific engine. Returns complete game records from the strongest engine matches. Results are paginated and can be sorted by rating or date. Provide at least one of 'fen' or 'player'. Each game includes both engine names, their ratings, the result, event details, ply count, and the full PGN move list. Use this to study how top engines played from a specific position and learn from their continuations.
Fetch master-level games and opening statistics from Lichess for a given position
render_chess_boardread onlysource verified77/100
Render an interactive chess board with the given position. Shows the board visually for a single position. Use this for displaying a specific chess position from FEN notation.
render_pgn_viewerread onlysource verified77/100
Render an interactive PGN game viewer that allows navigating through chess game moves. Use this for displaying complete chess games with move history, annotations, and the ability to step through moves. Supports PGN format with headers like Event, Site, Date, White, Black, Result, and move notation.
Output schemas not documented. No schema descriptions in the tool definitions or code comments. LLMs cannot predict what fields will be returned, making it difficult to chain tools or extract needed data for downstream calls.
Generic error handling in remoteHttpToolAdapter. HTTP errors return bare status codes and messages ('HTTP 404: not found'). No recovery guidance, no classification of errors as retryable/user-fixable/fatal. LLM cannot determine next action.
Parameter descriptions are minimal or absent for some tools. E.g., 'fetch-lichess-game' has only 'Lichess game ID (for example abc12345)', no guidance on format or constraints. 'Fetch user's chess games' lacks detail on what fields/structure will be returned.
No input validation or constraints on numeric/string parameters. E.g., 'size' and 'page' in pagination tools have no min/max bounds; 'ratingFrom'/'ratingTo' in fetch-chess-puzzle specify ranges (1000 - 2500) in schema but inconsistently. LLM could pass absurd values (page=999999999, size=-1).
Tool names use kebab-case (get-chessboardmagic-repertoires) inconsistently. Two rendering tools use snake_case (render_chess_board, render_pgn_viewer). Inconsistent naming adds cognitive load for LLMs and users.
Enhance parameter descriptions for brevity. Replace 'Fetch user's chess games from the Chessboard Magic Repertoire Builder' with 'Retrieves user's stored chess games from Chessboard Magic. Returns list of games with metadata (date, opponent, result). Requires valid API token.' Be explicit about what data is returned.
Add pagination guidance to tool descriptions for tools returning lists (get_*_games, get_*_stats, fetch_lichess_*). Document default/max page size, whether cursors or offsets are supported, and total count availability.
For Lichess tools, clarify the distinction between 'master games' (top-level play), 'user games' (personal), and 'games from studies' (training). Descriptions conflate these; disambiguate in parameter descriptions and tool descriptions.
Add enum constraints for sort/dir parameters in pagination tools. E.g., sort: ['date', 'rating', 'wins'] (enum), dir: ['asc', 'desc'] (enum). Currently free-form strings that the LLM can hallucinate.