MCP server for managing employee attendance, leave requests, and related HR operations with PostgreSQL backend
Server has 7 tools with basic schemas and descriptions, but significant gaps limit production readiness. All tools have descriptions (10-200 chars, mostly adequate) and input schemas with type definitions. However, output schemas are undocumented (tools return JSON strings, not structured objects with declared fields), error handling is minimal (generic try-catch with no recovery guidance), and parameter constraints are missing (e.g., no enums for 'status' values, no format validation for dates). No tool annotations (readOnlyHint/destructiveHint). Naming is clear and verb-based. Composition is reasonable, tools are single-purpose. Critical issue: submit_attendance_record and submit_leave_request lack confirmation/dry-run patterns for irreversible operations. Average tool score: 52/100.
Get attendance records with optional filtering. Args: employee_id: Filter by employee ID (optional) employee_number: Filter by employee number (optional) start_date: Start date in YYYY-MM-DD format (optional) end_date: End date in YYYY-MM-DD format (optional) status: Filter by attendance status (e.g., 'Normal', 'Late', 'Absent') (optional) Returns: Attendance records in a formatted string
Get employee information by ID or employee number. Args: employee_id: The ID of the employee (optional if employee_number is provided) employee_number: The employee number (optional if employee_id is provided) Returns: Employee information in a formatted string
Get leave requests with optional filtering. Args: employee_id: Filter by employee ID (optional) employee_number: Filter by employee number (optional) start_date: Filter by leave start date in YYYY-MM-DD format (optional) end_date: Filter by leave end date in YYYY-MM-DD format (optional) status: Filter by leave status (e.g., 'Pending', 'Approved', 'Rejected') (optional) leave_type: Filter by leave type (e.g., 'Annual', 'Sick', 'Personal') (optional) Returns: Leave requests in a formatted string
List all departments. Returns: List of departments in a formatted string
Output schemas undocumented. All tools return JSON strings without declaring field structure. LLMs cannot plan downstream calls or extract specific fields reliably.
No parameter constraints (enums, patterns, ranges). 'status' parameter accepts free-form strings ('Normal', 'Late', 'Absent', 'Pending', 'Approved', 'Rejected') without enum declaration. LLMs will hallucinate invalid values.
Irreversible write operations lack confirmation/dry-run. submit_attendance_record and submit_leave_request modify state without user confirmation, risking accidental data corruption.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
List employees with optional filtering by department and status. Args: department_id: Filter by department ID (optional) status: Filter by employee status (e.g., 'Active', 'Inactive') (optional) Returns: List of employees in a formatted string
Submit a new attendance record or update an existing one. Args: employee_id: The ID of the employee record_date: The date of the record in YYYY-MM-DD format clock_in_time: Clock-in time in YYYY-MM-DD HH:MM:SS format (optional) clock_out_time: Clock-out time in YYYY-MM-DD HH:MM:SS format (optional) status: Attendance status (default: 'Normal') remark: Additional remarks (optional) Returns: Result message
Submit a new leave request. Args: employee_id: The ID of the employee leave_type: Type of leave (e.g., 'Annual', 'Sick', 'Personal') start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format reason: Reason for the leave duration: Duration in days (optional, will be calculated if not provided) Returns: Result message
Error handling is generic. All exceptions caught with 'Error executing {func_name}: {error_message}'. No recovery guidance, no categorization (retryable vs fatal), no actionable next steps for LLM.
No tool annotations. Missing readOnlyHint for read tools and destructiveHint for write tools. Clients cannot infer safety properties.