MCP server and CLI for the Private Lessons REST API. Provides task-specific tools for managing gymnastics lessons, athletes, scheduling, and payments.
Strong tool definitions with excellent descriptions (avg 180+ chars), comprehensive parameter documentation, and clear error guidance. All 12 tools have explicit schemas with type definitions and descriptions. Tool names follow verb_noun convention consistently. Standout features: dry_run pattern for mutations, idempotency keys, ETag-based concurrency control, and athlete disambiguation logic. Minor gaps: some parameter descriptions could be more concise; output schemas documented in code but not formally exposed in tool registration.
WRITE. Cancel an existing lesson. Requires the lessons:write scope and the strong ETag from a prior read. This is a destructive action and declares its side effects in the description.
READ-ONLY. Check coach availability for a given date and duration. Returns a calendar of available and conflicted slots.
WRITE. Create a new athlete. Requires the athletes:write scope. Returns the new athlete and its id for use in subsequent lesson writes.
WRITE. Book a new private lesson. Requires the lessons:write scope. When dry_run is true, WRITES NOTHING and returns the advisory quote plus an availability/conflict preview so you can confirm with the user before committing.
READ-ONLY. Fetch the account balance (credits, prepaid balance, or account status). Requires the balance:read scope.
STDIO-only transport prevents remote accessibility and hosted MCP client integration. No HTTP/SSE endpoint exposed.
Output schemas not formally documented in tool registration. Decorators (decorateLesson, decorateResult) add fields (etag, timezone, *_pacific) that are not declared in the tool's output schema to the LLM.
Parameter descriptions for RFC 3339 timestamps are verbose (200+ chars) and repeat the same constraint across 4 tools (create_lesson, update_lesson, mark_lesson_paid, check_availability). Consider a shared constant or shorter phrasing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2025-06-18+ | v2 |
READ-ONLY. Fetch a single lesson by id. Returns the lesson plus its strong ETag for use as If-Match on a subsequent write.
READ-ONLY. Compute the advisory pricing quote for a lesson without writing anything. Useful for confirming cost before booking.
READ-ONLY. List audit events (lesson creates, updates, cancellations, payments, etc.). Requires the audit:read scope. Cursor-paginated; pass the cursor from a prior response to fetch the next page.
READ-ONLY. Lists private lessons visible to the authenticated token (Admin/Management see all; Coach/Staff see only their own). Date filters are calendar dates in Pacific. Times come back in Pacific. Requires the lessons:read scope.
WRITE. Mark a lesson as paid. Requires the lessons:write scope and the strong ETag from a prior read. This is a destructive action and declares its side effects in the description.
READ-ONLY. Search for athletes by name. Returns candidates; when the search matches more than one athlete, that is the ATHLETE_AMBIGUOUS condition and you MUST ask the user which one before writing.
WRITE. Update an existing lesson (reschedule, change duration, add/remove athletes). Requires the lessons:write scope and the strong ETag from a prior read. When dry_run is true, WRITES NOTHING and returns the advisory quote plus an availability/conflict preview.
No explicit rate limiting or timeout configuration visible. Agents calling list_lessons or list_audit_events in loops could overwhelm the backend without guards.
Error handling returns JSON-serialized PrivateLessonsError objects but does not document error codes or recovery paths in tool descriptions. LLM cannot infer what to do on ATHLETE_AMBIGUOUS, EXTERNAL_REF_CONFLICT, or VERSION_MISMATCH.