An MCP server that reads a Spotter workout backup and lets an assistant answer questions about your training.
Six read-only tools with clear, domain-specific descriptions (avg 150 chars). All tools have explicit input schemas with typed parameters and descriptions. Naming follows verb_noun pattern (list_*, training_summary). Parameters use proper Zod schema with descriptions. Output is JSON-structured. However, no output schemas are documented for LLMs, no error handling guidance, no pagination despite list_sessions accepting limit, and no tool annotations (readOnlyHint). Missing parameter constraints (e.g., date format validation, enum for exercise IDs). Composition is sound, each tool has one responsibility and outputs chain naturally (list_exercises → exercise_history).
Every session one exercise appears in, newest first, with its sets, best set and volume. Use this to answer whether a lift is moving. Take the id from list_exercises.
Which exercises appear in the diary, most-trained first, with session and set counts. Use it to find the id an exercise is logged under.
Finished sessions, newest first: date, name, duration, volume and which exercises were logged.
How load volume split across chest, arms, shoulders, core, back and legs. Answers what is being neglected. Cardio is reported separately, not folded in.
Everything logged on one day: each exercise with its sets, exactly as recorded.
Headline numbers for a stretch of training: how many sessions, total load volume, average duration, sessions per week, distinct exercises. Start here.
No output schemas documented. LLMs cannot predict response structure (fields, types, nesting) and must infer from examples. This breaks downstream tool chaining and forces agents to guess field names.
Missing tool annotations. All six tools are read-only but lack readOnlyHint annotation. Agents cannot distinguish safe tools from destructive ones without explicit hints.
Date parameters (from, to) lack format constraints. Descriptions say 'YYYY-MM-DD' but no regex pattern or validation guidance. LLMs may pass invalid dates; tool must validate and return actionable errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
exercise_history accepts 'exercise' as free-form string but should reference IDs from list_exercises. No enum or validation. LLMs may hallucinate exercise IDs; tool must return 'Exercise not found. Available: [list]' to guide recovery.
list_sessions accepts limit (1 - 200, default 20) but no pagination cursor or total count returned. Large result sets may exceed context; tool should return next_cursor and total for proper pagination.