An MCP (Model Context Protocol) server that exposes read-only HR information system tools to an AI client like Claude Desktop. Backed by a synthetic mock data layer; production version swaps the data layer for authenticated calls to a real HRIS such as Rippling.
Four read-only tools with clear verb-noun naming (list_*, get_*) and reasonable descriptions (60 - 150 chars). All tools have input schemas with type definitions and parameter descriptions. Output schemas are documented via Pydantic models (EmployeeRecord, dict). However, descriptions lack actionable context (when to use, dependencies, error recovery), parameter constraints are minimal (no enums, ranges, or format specs), and error handling is basic. No tool annotations (readOnlyHint, idempotentHint). Schemas are present but sparse, no pagination, no result limits documented, no chaining IDs in responses.
Look up a single employee's record by their employee ID. Returns null if no employee matches the given ID.
Get the remaining paid-time-off balance (in hours) for one employee. Returns an explanatory message if the employee ID is not found.
List all departments with their current headcount.
List employees who started within the last N days, newest first. Use this to brief onboarding, provisioning, or new-hire check-ins.
Descriptions lack actionable context. 'List employees who started within the last N days' does not explain when to call this vs get_employee, what the LLM should do with the results, or dependencies. Descriptions should state WHAT, WHEN, and WHY.
No parameter constraints (enums, ranges, formats). 'days' parameter accepts any integer with no documented bounds, LLM could pass 999999 or negative values. Should specify min=1, max=365 and document the constraint in the description.
Output schemas lack pagination and result limits. list_recent_hires and list_departments return unbounded lists with no documented cap, offset, or next_cursor. Large result sets will blow context windows. Should cap at 20 - 50 items and document the limit.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | <=2025-11-25 | v2 |
Error handling is minimal. get_pto_balance returns a dict with 'found: false' and a message, but other tools do not document error cases. No guidance on what the LLM should do if an employee_id is invalid or a lookup fails. Should include recovery hints (e.g., 'Try search_employees() with a partial name').
No tool annotations. Tools lack readOnlyHint, idempotentHint, or destructiveHint. All four are read-only and idempotent, annotating them helps LLMs reason about safety and retry logic.