Dice roller and probability calculator for tabletop RPGs
Dice Stats is a STDIO-only MCP server with 2 tools (roll, stat). Both tools have basic descriptions and identical single-parameter schemas. Naming follows verb conventions (roll, stat are action-oriented), but descriptions are extremely brief (under 30 chars each, falling well below the 194-char baseline for production tools). Parameter descriptions are present but generic. Output schemas are undocumented, callers cannot infer the structure of results. Error handling is minimal (generic try-catch with message passthrough). The server has no pagination, no enums, no structured output documentation, and no recovery guidance. Tool definitions are explicitly registered with the MCP SDK, so they are directly visible and not inferred. This is a simple, narrow-domain tool that works but lacks the depth, documentation, and error sophistication required for production agent integration.
Dice notation to roll (e.g., 2d6, 1d20+5, 3d6-2d4)
Dice notation to analyze (e.g., 2d6, 1d20+5, 3d6-2d4)
Tool descriptions are too brief (<30 chars each). Production baseline is 194 chars; descriptions under 20 chars must score ≤40. Current descriptions ('Dice notation to roll...', 'Dice notation to analyze...') lack context on WHEN to use each tool and what distinguishes them.
Output schemas are undocumented. Both tools return text/plain responses ('🎲 Result: N', 'Probability distribution for...') but callers cannot parse or chain results. No structured object schema is defined for downstream tool composition. LLMs cannot infer field names or types.
Error handling is generic catch-all with no recovery guidance. Errors return plain text like 'Error: invalid notation'. No categorization (retryable vs user-fixable vs fatal), no actionable suggestions, no example of valid input to self-correct. Per pattern:recovery-guide, errors should tell the LLM what to do next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 42 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 33 | - | v1 |
Parameter descriptions are trivial and identical across tools. Both just repeat the parameter name: 'Dice notation to roll' vs 'Dice notation to analyze', minimal differentiation. Production baseline calls for format constraints, range, and examples of valid notation embedded in the description (e.g., '2d6, 1d20+5, 3d6-2d4 supported; min 1d1, max 100d100').
No input validation constraints visible in schema. Parameter is a free-form string with no enum, pattern, or minLength/maxLength. LLMs can pass invalid notation (e.g., '999d999', '5d', 'abc') without schema-level rejection. Pattern:constrained-input calls for enum/regex where inputs are bounded.
Tools do not declare idempotency. 'roll' returns a random result on each call, not idempotent. If an agent retries on a timeout, it will get a different number, causing silent failures and incorrect totals. Pattern:idempotent-operation calls for explicit documentation of side effects and repeatability.