MCP servers for managing employee leave requests and library book borrowing
This server has significant definition quality gaps. All 7 tools have basic descriptions (10-60 chars), but most fall below the 50-200 char baseline for LLM-optimized descriptions. Input schemas are present with type declarations, but parameter descriptions are minimal or missing context. No output schemas are documented. Error handling is generic ('Employee ID not found', 'Book not found') with no recovery guidance. The server mixes two unrelated domains (LeaveManager + LibraryManager) in one server, violating single-responsibility. No tool annotations (readOnlyHint/destructiveHint) despite clear read/write distinctions. Parameter naming is inconsistent: 'leave_dates' vs 'book_id' vs 'user_name' lack type suffixes.
Apply leave for specific dates (e.g., ["2025-04-17", "2025-05-01"])
Borrow a book if available
Check how many copies of the book are available
Get the borrowing history of a book
Check how many leave days are left for the employee
Get leave history for the employee
Return a borrowed book
Descriptions are too short (10-60 chars) and lack LLM-optimized context. Baseline is 50-200 chars. E.g., 'Check how many leave days are left for the employee' (54 chars) omits when to use this vs get_leave_history, what it returns, or prerequisites.
No output schemas documented. LLMs cannot plan downstream calls or extract structured data. E.g., apply_leave returns a string; should document: {success: bool, remaining_balance: int, applied_dates: [string]}.
Error handling is generic and non-actionable. 'Employee ID not found' gives no recovery path. Should be: 'Employee ID not found. Call list_employees() to see valid IDs, or provide a name to search_employees().'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). apply_leave and borrow_book are destructive writes; get_* tools are read-only. Annotations help LLMs reason about side effects and retry safety.
Two unrelated domains (LeaveManager + LibraryManager) in one server violates single-responsibility. Agents cannot reason about domain boundaries. Split into separate servers or clearly namespace tools (leave_*, library_*).