Skip to main content
Glama
lalithdabilpuram01

HRMS MCP Server

HR Management System (MCP Server)

⚠️ Work in progress. This project is still under active development and is not production-ready. The manager functions in HRMS/ are mock implementations that mimic the API calls of Keka HR software, using in-memory sample data instead of real Keka API integration.

An HR assistant exposed as an MCP (Model Context Protocol) server. It lets an MCP-compatible client (e.g. Claude Desktop) manage employees, tickets, leaves, and meetings, and send emails — backed by in-memory data that is seeded with sample employees on startup.

Features

The MCP server (server.py) exposes the following tools and prompt:

Tool

Description

add_employee

Add a new employee to the HRMS.

get_employee_details

Look up an employee's details by name.

create_ticket

Raise a ticket for equipment/items (laptop, ID card, etc.).

update_ticket_status

Update a ticket's status.

list_tickets

List tickets for an employee, optionally filtered by status.

send_email

Send an email via SMTP.

Prompt

Description

onboard_new_employee

Guided workflow to onboard a new hire end-to-end.

Additional domain logic lives in the HRMS/ package (employee, leave, meeting, and ticket managers plus Pydantic schemas.py). These managers currently mock Keka's HR API; sample data is loaded by utils.seed_services on server start.

Related MCP server: OCP AI Custom HR MCP Server

Requirements

  • Python >= 3.12

  • uv (recommended) for dependency management

Setup

  1. Clone the repository:

    git clone <your-repo-url>
    cd HR_Management_System
  2. Install dependencies:

    uv sync
  3. Configure environment variables. Copy the example file and fill in your SMTP credentials:

    cp .env.example .env

    Variable

    Description

    MS_EMAIL

    Sender email address / SMTP login.

    MS_EMAIL_PWD

    SMTP password or app password.

    For Gmail, generate an App Password rather than using your account password.

Running

Start the MCP server (uses stdio transport):

uv run server.py

To use it with an MCP client such as Claude Desktop, add an entry to the client's MCP server configuration pointing at this command, for example:

{
  "mcpServers": {
    "atliq-hr-assist": {
      "command": "uv",
      "args": ["run", "server.py"],
      "cwd": "/absolute/path/to/HR_Management_System"
    }
  }
}

You can also test the email sender directly:

uv run emails.py

Project structure

.
├── server.py          # MCP server entry point (tools & prompts)
├── emails.py          # SMTP email sender
├── utils.py           # Seeds the managers with sample data
├── main.py            # Hello-world placeholder
├── HRMS/              # Core domain package (mocks Keka HR API)
│   ├── employee_manager.py
│   ├── leave_manager.py
│   ├── meeting_manager.py
│   ├── ticket_manager.py
│   └── schemas.py     # Pydantic models
├── .env.example       # Template for required environment variables
└── pyproject.toml

Roadmap / TODO

  • Replace the mock HRMS/ managers with real Keka HR API integration.

  • Persist data instead of using in-memory seeded sample data.

  • Expand MCP tool coverage for leave and meeting management.

Notes

  • Data is stored in memory and re-seeded on every start; it is not persisted.

  • Never commit your .env file — it contains secrets and is git-ignored.

Available Tools

6 tools
add_employeeC
 Add a new employee to the HRMS system.
  :param emp_name: Employee name 
  :param manager_id : Manager ID (optional)
  :return Confirmation message
ParametersJSON Schema
NameRequiredDescriptionDefault
emp_nameYes
manager_idYes
emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description should disclose side effects, permissions, and return behavior. It only mentions adding an employee and returning a confirmation message, lacking details on idempotency, data validation, or system impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short but includes parameter docs inline, making it somewhat structured. However, it is not fully front-loaded and includes redundant return info (output schema exists).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 3 required parameters, an output schema, and sibling tools, the description lacks details on validation, duplicate handling, and system behavior. It is inadequate for a complete understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must explain parameters. It describes emp_name and manager_id but calls manager_id optional while schema lists it as required. The email parameter is not described at all, and the optional claim contradicts the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Add a new employee to the HRMS system', using a specific verb (add) and resource (employee). This distinguishes it well from siblings like create_ticket or get_employee_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives, prerequisites, or when not to use it. The description only states what it does, not usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_ticketA
Create a ticket for buying required items for an employee.
:param emp_id: Employee ID
:param item: Item requested (laptop, ID Card, etc.)
:param reason: Reason for the request
:return : Confirmation message
ParametersJSON Schema
NameRequiredDescriptionDefault
emp_idYes
itemYes
reasonYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior. It only states 'Create a ticket...' and mentions a return message. It does not describe any side effects, permissions, idempotency, or workflow implications beyond creation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with a clear purpose sentence followed by parameter documentation. No unnecessary words, and the structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple creation tool with 3 required parameters and an output schema, the description covers purpose and parameter meaning. However, it lacks context on ticket lifecycle, error conditions, or integration with other tools. With no annotations, more detail would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It provides explanatory text for each parameter: 'emp_id: Employee ID', 'item: Item requested (laptop, ID Card, etc.)', 'reason: Reason for the request'. This adds meaning beyond the schema's simple titles and types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Create a ticket for buying required items for an employee.' The verb 'Create' and resource 'ticket' are specific, and the context of buying items distinguishes it from siblings like 'add_employee' or 'list_tickets'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like 'update_ticket_status' or 'list_tickets'. The description implies a creation use case but does not provide any exclusions or comparisons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_employee_detailsA
Get employee details by name.
:param name: Name of the employee
:return Employee ID and manager ID
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries full burden. It states the return values (Employee ID and manager ID) but does not disclose side effects, prerequisites (e.g., employee existence), or error behavior. For a simple read operation, this is minimally adequate but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise (two lines) and to the point. However, it could include brief usage guidance without becoming verbose. It is efficient but slightly underdeveloped.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple lookup tool with one parameter and an output schema, the description covers the return structure and parameter purpose. Given the low complexity, it provides adequate context for invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (no property descriptions). The description adds a docstring for the 'name' parameter, clarifying that it is the employee's name. This adds value beyond the schema's minimal 'Name' title, though it remains brief.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'get' and resource 'employee details', clearly indicating retrieval. It distinguishes from sibling tools like add_employee or create_ticket which create records, and list_tickets which lists tickets. The scope 'by name' is explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. It does not mention that this is for looking up an existing employee by name, nor does it contrast with add_employee for creating. The agent must infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ticketsC
List tickets for an employee with optional status filter.
:param employee_id : employee_id 
:param status : status
: return : List of tickets
ParametersJSON Schema
NameRequiredDescriptionDefault
employee_idYes
statusYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It fails to mention that the tool likely reads data, any side effects, pagination, or limits. The contradiction between 'optional' and 'required' for status is a transparency issue.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, but the docstring format redundantly restates parameter names and types already in the schema. One sentence effectively conveys the core purpose, but lacks structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (2 required params) and no output schema details provided, the description is incomplete. It does not explain return values, filtering behavior, or the status parameter's allowed values. The contradiction between 'optional' and required further reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It repeats parameter names without explanation (e.g., 'employee_id' not defined, 'status' values not listed). The claim that status is optional contradicts the schema, making parameter semantics confusing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'List tickets for an employee with optional status filter', clearly indicating the verb and resource. However, the contradiction with the schema (which requires status) slightly muddles the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like get_employee_details or create_ticket. No context on prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_emailD
ParametersJSON Schema
NameRequiredDescriptionDefault
to_emailsYes
subjectYes
bodyYes
htmlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

D1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Tool has no description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tool has no description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has no description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has no description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

Tool has no description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tool has no description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_ticket_statusB
Update the status of a ticket.
:param ticket_id: Ticket ID
:param status: New status of the ticket
:return: Confirmation message
ParametersJSON Schema
NameRequiredDescriptionDefault
ticket_idYes
statusYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden of disclosure. It only states 'Update the status' without revealing side effects, validation, or behavior on invalid IDs. A mutation tool needs more detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and docstring-style, with no unnecessary words. It efficiently conveys the core action but could benefit from a cleaner non-docstring format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of parameter details, no annotations, and an output schema that is not described, the description is too minimal. It omits valid statuses, behavior on failure, and output structure, making it incomplete for confident agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description repeats parameter names ('Ticket ID', 'New status') but adds no meaningful constraints or allowed values. It provides minimal clarification beyond the schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Update the status of a ticket' with a specific verb and resource. It distinguishes from sibling tools like create_ticket and list_tickets, as none of them update ticket status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for updating status but provides no explicit guidance on when to use versus alternatives, nor does it mention prerequisites or when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 6 tool updatesv0.1.0
    • First observedadd_employee
    • First observedcreate_ticket
    • First observedget_employee_details
    • First observedlist_tickets
    • First observedsend_email
    • First observedupdate_ticket_status

TDQS

C2.8/5.0
Disambiguation4/5

Most tools have clear, distinct purposes (employee CRUD, ticket management). However, 'send_email' lacks a description, making its role ambiguous and potentially overlapping with ticket notifications.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (e.g., add_employee, create_ticket, list_tickets). No mixing of conventions.

Tool Count5/5

6 tools is a reasonable count for an HRMS server covering employee and ticket management. Not too few or too many.

Completeness3/5

Missing employee update/delete and ticket detail retrieval. Employee lookup only by name, not ID. Notable gaps in CRUD coverage for both domains.

Maintenance

ActivityStale
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lalithdabilpuram01/HRMS_MCP_Server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server