Single tool ('do_game') with minimal definition quality. Tool name is generic verb-noun without action clarity. Description is extremely terse (28 chars, below 10-char baseline minimum for context). Input schema present but parameters critically underdescribed. No output schema documented. No error guidance for invalid inputs. Tool is read-only game logic with no real-world applicability, but definition defects would fail any production review.
Rock, paper, scissors game
Tool name 'do_game' is a generic action verb without clarity. 'do' is explicitly listed in the rubric as an anti-pattern. Does not convey what happens. Should be 'play_rock_paper_scissors' or 'play_game'. LLMs cannot infer intent from 'do_game' alone.
Description 'Rock, paper, scissors game' is 28 characters, far below the 34-char p10 baseline and critically under the 50-char minimum for LLM decision-making. Does not explain WHEN to call this tool, WHAT it returns, or WHY the agent would select it over alternatives. Fails pattern:tool-description critical check.
Input parameter 'choice' has description 'Choose from rock, paper, or scissors' but is declared as free-form string type, not an enum. Must declare as enum: {"enum": ["rock", "paper", "scissors"]} to be self-documenting and prevent LLM from passing invalid options like 'Rock' or 'stone'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 31 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 27 | - | v1 |
No output schema documented. Response structure returns {"content": [{"type": "text", "text": JSON string with message}]}, but this is not declared anywhere for the LLM. LLMs need to know what fields to expect so they can plan downstream tool calls.' Output is wrapped in JSON string rather than structured fields.
No error guidance. Invalid input 'choices' are caught and throw McpError with 'Invalid arguments', but this error message does not tell the LLM what to do next or what constraint was violated. Must be one of: rock, paper, scissors'.
Game logic is deterministic and non-idempotent in practice, calling 'play_game' with the same input always returns 'I win!', which is unrealistic. Real game tools should return random outcomes. This trivial implementation undermines credibility as a production tool pattern example.