An MCP server for managing employee leave balances, applications, and history
Three tools with basic verb-noun naming (get_*, apply_*) and present descriptions, but significant gaps in parameter documentation and output schema clarity. All tools lack parameter descriptions in the schema, only tool names and employee_id/leave_dates are typed, but no descriptions explain what each parameter controls or constrains. Output is unstructured plain text (e.g., 'Employee ID not found.'), not structured JSON. No error handling guidance for LLMs. apply_leave is a write operation but lacks idempotent/destructive hints. Descriptions are 40 - 80 chars, below the 50 - 200 char ideal for LLM optimization.
Apply leave for specific dates (e.g., ["2025-04-17", "2025-05-01"])
Check how many leave days are left for the employee
Get leave history for the employee
Parameter descriptions missing from all tools. Schema defines employee_id and leave_dates types but provides no descriptions explaining what values are valid, format constraints, or when to use each parameter.
Output is unstructured plain text (e.g., 'Employee ID not found.', 'Leave applied for 2 day(s)...') instead of structured JSON with typed fields. LLMs cannot reliably parse or chain results.
apply_leave is a destructive write operation (modifies employee_leaves state) but lacks tool annotations (destructiveHint, idempotentHint) and no confirmation/dry-run pattern. Agents cannot distinguish safe reads from risky writes.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Error responses lack recovery guidance. 'Employee ID not found.' tells the LLM nothing about what to do next (e.g., 'Try searching for the employee first'). No error classification (retryable vs. user-fixable).
In-memory mock database (employee_leaves dict) is not persistent and resets on server restart. No indication in tool descriptions that data is ephemeral or for demo only.