MCP server exposing the Workhours Calendar API as tools for tracking worked hours by client, project and task with reporting capabilities.
14 tools with clear verb-noun naming and consistent descriptions (avg 95 chars). All tools have input schemas with typed parameters. However, output schemas are undocumented, LLMs cannot predict response structure for chaining. Parameter descriptions lack format constraints (e.g., date format YYYY-MM-DD stated in description but not in schema; status enum values not formally declared). Error handling returns raw API errors without recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Missing idempotency guidance for write operations.
Create a client (customer) to group projects under.
Create a project belonging to a client. Use list_clients to find the client_id.
Create a task inside a project. Use list_projects to find the project_id.
Tasks and hours worked on a specific day (YYYY-MM-DD).
Delete a time entry logged by mistake.
List all clients with their ids.
List time entries with optional filters. Dates in YYYY-MM-DD format.
Output schemas completely undocumented. LLMs cannot predict response structure (fields, types, nesting) for downstream tool chaining. E.g., create_client returns what? {id, name, notes}? {client_id, ...}? Forces LLM to guess or fail.
Enum constraints not formally declared in schemas. 'status' param in update_task_status and list_tasks accepts 'open' or 'done' but schema shows type:string with no enum. LLMs may hallucinate invalid values like 'pending', 'closed', 'in_progress'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
List projects, optionally filtered by client_id.
List tasks, optionally filtered by project_id and/or status ('open' or 'done').
Log worked hours on a date (YYYY-MM-DD). Provide task_id (preferred) or project_id. When task_id is given, project and client are derived automatically.
Hours worked in a month, broken down by client, project, task and day.
Total effort spent on a task: hours, entry count, date range and per-day detail.
Fix a time entry: change its date (YYYY-MM-DD), hours or notes.
Set a task's status to 'open' or 'done'.
Error handling returns raw API errors without recovery guidance. E.g., _request() returns {error: 'HTTP 400', detail: '...'} but does not tell LLM what to do next. Should include 'Try list_clients() first' or 'Invalid client_id format' for self-correction.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes. delete_entry is destructive but unmarked; list_clients is read-only but unmarked. Agents may retry destructive ops or skip safe ones.
Date format constraints stated in descriptions ('YYYY-MM-DD') but not in JSON Schema. LLMs read descriptions but may not enforce format. Schema should include 'format': 'date' or 'pattern': '^\d{4}-\d{2}-\d{2}$' for validation.