An MCP server for managing employee leave balances and leave applications
Three tools with basic verb-noun naming (get_*, apply_*) but significant quality gaps. All tools have descriptions (10-60 chars, below the 194-char baseline), but lack depth on WHEN to use them and prerequisites. Input schemas are present with type definitions, but parameter descriptions are minimal (5-20 chars vs 72-char baseline). No output schemas documented. No error handling guidance, responses are free-text strings, not structured objects. No pagination, no field-level documentation. Tool composition is reasonable (three separate concerns), but responses lack the IDs and metadata needed for chaining downstream calls.
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
Descriptions are too brief (30-60 chars vs 194-char baseline). Missing WHEN to use each tool, prerequisites, and dependencies. E.g., 'Check how many leave days are left' does not explain when to call this vs get_leave_history, or what the response format is.
Parameter descriptions are minimal (5-20 chars). 'The employee ID to check leave balance for' is adequate, but lacks format hints (e.g., 'Format: E001-E999') or validation rules. LLMs cannot infer constraints from bare names.
No output schemas documented. Responses are free-text strings ('E001 has 18 leave days remaining'). LLMs cannot parse structured data or chain calls. Should return JSON objects with typed fields (employee_id, balance, remaining_days, etc.).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 44 | 2026-07-28+ | v2 |
Error responses lack recovery guidance. 'Employee ID not found' and 'Insufficient leave balance' are bare errors. Should guide LLM: 'Employee ID not found. Valid IDs: E001, E002, E003. Try a different ID or call list_employees() to discover valid IDs.'
apply_leave modifies state (deducts balance, adds to history) but description does not explicitly state this is a WRITE operation with side effects. LLMs need to know which calls are safe to retry and which are irreversible.