Model Context Protocol server for the speedrun.com API — games, leaderboards, world records, players, personal bests, and (with an API key) run submission and moderation.
Strong foundation with 17 well-named tools following verb_noun convention (search_*, get_*, list_*, submit_*, verify_*, reject_*). All tools have descriptions (avg ~120 chars, within 10-1024 baseline). Input schemas present with types and descriptions for all parameters. Tool annotations correctly applied (readOnlyHint, destructiveHint). Key gaps: output schemas not documented in source; some parameter descriptions lack format/constraint details; error handling guidance minimal; no pagination metadata (has_more, next_offset) visible in schema definitions despite being mentioned in descriptions.
Get a game's details plus its categories (and optionally its levels). The embedded categories give you the ``category_id`` needed for ``get_leaderboard``.
Get a game's leaderboard for a category, optionally filtered by variables (subcategories). Pass ``top`` to limit results; use ``offset`` to paginate. Omit ``top`` to fetch the full leaderboard (may be large). Filters are optional; pass ``var_<id>=<value_id>`` for each variable constraint (get ids from ``list_variables``).
Get the authenticated user's notifications (requires API key).
Get a player's personal bests (top runs across all games/categories).
Get a player's profile.
Get the authenticated user's profile (requires API key).
Output schemas not documented. Tool descriptions mention return fields (e.g., 'ids, abbreviations and release years' for search_games) but no formal schema definition visible in source code. LLMs cannot plan downstream calls without knowing response structure.
Pagination metadata (has_more, next_offset) mentioned in instructions but not visible in parameter schemas. Descriptions state 'use next_offset to continue' but next_offset is not a documented output field, creating ambiguity about response structure.
Parameter descriptions lack format/constraint details. E.g., 'game' param accepts 'id or abbreviation' but no regex pattern or length bounds stated. 'date' in submit_run says 'YYYY-MM-DD' in description but no format constraint in schema. LLMs cannot validate without explicit constraints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Get a run's full details (requires API key for moderation info).
Get a series' details and its games.
Get the world record for a game/category, optionally filtered by variables. Pass ``var_<id>=<value_id>`` for each variable constraint (get ids from ``list_variables``). Timing defaults to 'primary'; pass ``timing`` to use 'realtime', 'realtime_noloads', or 'ingame' instead.
List a game's categories (e.g. 'Any%', '120 Star'), with their ids and rules.
List a category's filterable variables (subcategories, difficulty, etc.).
Reject a pending run (moderator only; requires API key and SPEEDRUN_ENABLE_WRITES=1).
Fuzzy-search games by name. Returns ids, abbreviations and release years. Use the returned ``id`` (or ``abbreviation``) with the other tools.
Fuzzy-search players by name or URL.
Fuzzy-search series (groups of related games) by name.
Submit a speedrun (requires API key and SPEEDRUN_ENABLE_WRITES=1).
Verify a pending run (moderator only; requires API key and SPEEDRUN_ENABLE_WRITES=1).
Error handling guidance absent. No recovery hints in tool descriptions (e.g., 'If game not found, try search_games'). Error responses from the API are not documented, leaving LLMs without actionable next steps on failure.
Write tool descriptions lack confirmation/dry-run guidance. submit_run, verify_run, reject_run are irreversible but no mention of confirmation step or dry-run capability. Agents could accidentally submit invalid runs or reject legitimate ones.