CLI and MCP server to log in and book courts on clubmanager365.com
Six tools with clear verb-noun naming (list_*, search_*, book_*, cancel_*, my_*). All have descriptions (avg 120 chars, within 10-1024 range). Input schemas present with type definitions and parameter descriptions. Output schemas documented via docstrings. Key strength: dry-run/confirmation pattern on destructive ops (book_court, cancel_booking). Weaknesses: some parameter descriptions lack format/constraint details (e.g., 'date' accepts multiple formats but no regex/enum); no explicit error recovery guidance; output structure inferred from code rather than formally documented in schema.
Book a free court slot. Returns a PREVIEW of the matched slot unless ``confirm`` is true, in which case the booking is actually made. Most clubs require at least one opponent.
Cancel a booking by id (get ids from my_bookings). Requires ``confirm`` to be true; otherwise returns a confirmation prompt.
List this club's match types as [{"id", "name"}, …]. Match-type numbering is club-specific (commonly 4 = Friendly). Use the right id for book_court's ``match_type`` or set CM365_MATCH_TYPE.
List court slots for a date.
List your upcoming bookings (with their booking ids).
Search the club member directory to find an opponent's name and id.
Date parameter accepts multiple formats ('today', 'tomorrow', 'YYYY-MM-DD', '27 Jun 2026') but no regex pattern or enum constraint. LLMs may pass invalid formats.
Output schemas inferred from code (asdict() calls) rather than formally documented in tool definitions. LLMs cannot see expected response structure before calling.
Error handling lacks recovery guidance. ConfigError and ValueError raised but no actionable messages (e.g., 'court_type must be one of...' is good, but missing guidance on what to do if login fails).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Credentials passed via HTTP headers (x-cm365-username, x-cm365-password) are not exposed as tool parameters (correct), but server-side validation of missing headers could provide clearer error messages to guide client configuration.
No pagination support on list_slots or search_players. If a club has many courts or members, results could exceed context window. search_players has limit param (good), but list_slots does not.