HR-ASSIST
Allows sending automated emails via Gmail SMTP for HR communications such as welcome emails and credential delivery.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@HR-ASSISTOnboard Ruchitha as a Data Analyst"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
HR-ASSIST: Agentic AI for HR Automation
An Agentic AI system that automates end-to-end HR workflows, from onboarding to scheduling, using the Model Context Protocol (MCP).
Overview
HR-ASSIST is an intelligent automation system built as part of the Codebasics Gen AI Bootcamp.
It transforms the Claude Desktop App into a powerful HR assistant capable of interacting with local databases, sending real emails, and managing calendars.
Unlike standard chatbots, HR-ASSIST uses Agentic Workflows to execute complex, multi-step tasks autonomously.
The Problem
HR managers spend hours toggling between HRMS software, email clients, and ticketing systems to onboard a single employee.
The Solution
A unified interface where natural language turns into action.
Input: "Onboard Ruchitha as a Data Analyst."
Output: Employee record created + Welcome email sent + IT ticket raised + Orientation meeting scheduled.
Related MCP server: HR-ASSIST
See it in Action
1. Agentic Scheduling | 2. Pre-built Prompt Templates |
|
|
The Agent intelligently parses dates to schedule meetings. | Custom UI forms for structured data entry. |
Key Features
Feature | Description |
MCP Prompts | Pre-configured templates (UI forms) for complex tasks like onboarding. |
HRMS Integration | Custom Tool execution to search, add, and update employee records. |
Email Automation | automated SMTP integration to send secure credentials via Gmail. |
Ticket Management | Auto-generation of support tickets for IT equipment. |
Intelligent Calendar | Natural language date parsing for meeting management. |
Technical Architecture
graph TD
User[HR Manager] -->|Selects Template| UI[Claude Desktop UI]
UI -->|MCP Protocol| Server[HR-Assist Python Server]
Server -->|Write| DB[(Local HR Database)]
Server -->|Send| SMTP[Gmail API]
Server -->|Create| Ticket[Ticket System]
Tech Stack
Language: Python 3.10+
Protocol: Model Context Protocol (MCP) by Anthropic
Dependency Management:
uvLibraries:
fastmcp,pydantic,python-dotenv
Repository Structure
atliq-hr-assist/
├── hrms/ # Core Business Logic Package
│ ├── __init__.py # Package initialization
│ ├── employee_manager.py # Employee CRUD operations
│ ├── leave_manager.py # Leave balance logic
│ ├── meeting_manager.py # Calendar scheduling
│ ├── ticket_manager.py # IT support ticketing
│ └── schemas.py # Pydantic data models
├── images/ # Documentation screenshots
│ ├── demo_onboard.png
│ └── demo_schedule.png
├── server.py # Main MCP Server Entry Point
├── emails.py # SMTP Email Handler
├── utils.py # Helper functions (Data seeding)
├── .env # Email and Passwords (Excluded from repo)
├── .gitignore # Git ignore rules
├── pyproject.toml # Project dependencies configuration
└── uv.lock # Dependency lock file (ensures reproducibility)Setup & Installation
Clone the Repository
git clone [https://github.com/YOUR_USERNAME/hr-assist-mcp-agent.git](https://github.com/YOUR_USERNAME/hr-assist-mcp-agent.git)
cd hr-assist-mcp-agent
Install Dependencies
uv init
uv add "mcp[cli]" python-dotenv
Configure Environment Create a
.envfile for your credentials:
CB_EMAIL=your_email@gmail.com
CB_EMAIL_PWD=your_app_password
Connect to Claude Add the server path to your
claude_desktop_config.json:
{
"mcpServers": {
"hr-assist": {
"command": "uv",
"args": ["--directory", "ABSOLUTE_PATH", "run", "server.py"],
"env": { "CB_EMAIL": "...", "CB_EMAIL_PWD": "..." }
}
}
}
Usage Guide
Method 1: Natural Language
Simply type in the chat bar:
"Schedule a meeting for employee E001 tomorrow at 10 AM regarding Project Kickoff."
Method 2: MCP Prompt Templates (Recommended)
Click the Attach button or type
/in Claude.Select
onboard_new_employee.Fill in the form fields:
Employee Name:
RuchithaManager Name:
Dhaval
Hit Run. The Agent will execute the entire workflow automatically.
Future Improvements
Database: Migrate from in-memory storage to SQLite/PostgreSQL.
Frontend: Build a Streamlit dashboard to view the generated tickets.
Auth: Add Role-Based Access Control (RBAC) for manager approvals.
📄 License
Developed as part of the Codebasics Gen AI Bootcamp.
Copyright © Codebasics Inc.
Available Tools
12 toolsadd_employeeC
Add a new employee to the HRMS system.
:param emp_name: Employee name
:param manager_id: Manager ID (optional)
:return: Confirmation message
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | |||
| emp_name | Yes | ||
| manager_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears the full burden of behavioral disclosure, yet it says nothing about permissions, duplicate-email handling, validation failures, or side effects like credential/notification creation. Worse, it asserts manager_id is optional when the schema lists it as required, so the description actively misleads about how the write behaves, even though this is a schema rather than annotation conflict.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is front-loaded and tight, but the docstring scaffolding (:param:, :return:) is boilerplate that earns little value, particularly the return note since an output schema already documents the confirmation response. Size is acceptable; information density is low.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter required-write tool with no annotations, the description should at minimum cover every required parameter and basic behavioral expectations. It instead misses email, misstates manager_id's optionality, and supplies only a return line that the output schema already renders redundant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does not: it documents emp_name and manager_id only in tautological terms ("Employee name", "Manager ID") and omits the required email parameter entirely. The optionality claim on manager_id also contradicts the required list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line gives a specific verb and resource ("Add a new employee to the HRMS system"), which is unambiguous against siblings like get_employee_details. It does not explicitly differentiate from other mutation tools (create_ticket, apply_leave), but the resource is distinct enough that no confusion is likely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as get_employee_details or send_email, and no prerequisites (e.g. pre-existing manager record) are mentioned. The only context is the implicit name of the tool itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_leaveC
Apply for leave for an employee.
:param emp_id: Employee ID
:param leave_dates: List of leave dates
:return: Leave application status message
| Name | Required | Description | Default |
|---|---|---|---|
| emp_id | Yes | ||
| leave_dates | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It conveys only that a status message is returned; it does not say whether validation against leave balance occurs, whether dates must be future-dated, how duplicate or overlapping requests behave, or what permissions/authorization are required for a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the action, and free of padding. The param/return lines are slightly redundant given the structured schema, but they cost little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and an output schema, the description should at minimum document date format, validation behavior, and error cases. It covers only the barest purpose and return summary, leaving gaps an agent must guess at to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for two required parameters. The description only restates the parameter names as 'Employee ID' and 'List of leave dates', adding no format details (e.g., emp_id format, date string format, or whether leave_dates are individual days or a range). It does not compensate for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Apply for leave for an employee.' This clearly separates it from read-oriented siblings like get_leave_history and get_employee_leave_balance. However, it never names those siblings or explains the boundary, so it stops at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no alternatives named. Given siblings such as get_employee_leave_balance and get_leave_history, an agent would benefit from knowing whether to check balance or history first, but the description is silent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_meetingC
Cancel a scheduled meeting for an employee.
:param employee_id: Employee ID
:param meeting_datetime: Date and time in ISO format (YYYY-MM-DD HH:MM:SS)
:param topic: Topic of the meeting (optional)
:return: Confirmation message
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| employee_id | Yes | ||
| meeting_datetime | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says only ':return: Confirmation message' and never discloses whether cancellation is reversible, what permissions are required, or what happens when the employee or meeting cannot be found. For a destructive mutation tool this is a substantial gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line and the rest is compact. The raw ':param'/':return' docstring markers are mildly noisy but each line carries parameter information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not strictly needed. However, for a destructive tool with no annotations and a required/optional mismatch between text and schema, the description leaves an agent unsure about failure behavior and permissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the text must compensate. It adds a real format detail for meeting_datetime (ISO format YYYY-MM-DD HH:MM:SS) that the schema lacks, but 'Employee ID' adds nothing, and its claim that topic is optional directly conflicts with the schema, which lists topic as required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancel a scheduled meeting for an employee'), so an agent immediately knows what the tool does. It does not, however, distinguish itself from siblings like schedule_meeting or get_meetings, and gives no hint about the effect (does the meeting disappear from get_meetings?).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus schedule_meeting, get_meetings, or rescheduling. No prerequisites, no mention of what happens if the meeting does not exist, and no exclusion conditions. Usage is only implied by the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ticketC
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
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | ||
| emp_id | Yes | ||
| reason | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It only mentions that a confirmation message is returned; it says nothing about required permissions, whether the ticket can be modified or cancelled afterward, or any side effects on the employee record.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the core purpose in the first sentence. The Sphinx-style :param: lines partially duplicate the schema but are justified given the 0% schema coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. Parameters are minimally covered, but for a mutation tool with no annotations the description leaves behavioral gaps (permissions, reversibility, downstream effects on the ticket lifecycle).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description's param notes are the only semantics available, and they do add value — especially 'item' with examples like Laptop and ID Card. However, emp_id and reason are restated almost verbatim from their titles, so the added meaning is thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a ticket') plus the domain scope ('for buying required items for an employee'). It does not differentiate from siblings like list_tickets or update_ticket_status, but the creation intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus list_tickets or update_ticket_status, and no prerequisites (e.g., must the employee already exist). Usage must be inferred purely from the purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_employee_detailsC
Get employee details by name.
:param name: Name of the employee
:return: Employee ID and manager ID
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions return fields (Employee ID and manager ID), but an output schema already exists, and it omits auth requirements, error behavior, handling of duplicate names, and explicit confirmation that the operation is read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the main purpose, but the param and return lines are largely redundant given the input schema and output schema. The leading newline and docstring-style formatting are also not ideal for a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with an output schema, the description covers the basic purpose and return fields. However, it lacks prerequisites, error behavior, and safety context, making it only minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter. The description adds only ':param name: Name of the employee', which essentially restates the parameter name and title without specifying format, case sensitivity, or how to disambiguate duplicate names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get employee details') with a scope ('by name'), so the agent knows exactly what the tool does. It does not explicitly distinguish from siblings like add_employee or get_employee_leave_balance, but the resource scope is clear enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no when-to-use guidance, no alternatives, and no exclusions. Usage is only implied by the tool name and 'by name' phrase.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_employee_leave_balanceC
Get the leave balance of an employee.
:param emp_id: Employee ID
:return: Leave balance message
| Name | Required | Description | Default |
|---|---|---|---|
| emp_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It does not disclose permissions, rate limits, data freshness, or whether the operation is read-only, beyond the weak implication from the verb 'Get'. The ':return:' line mentions a message but adds no behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the main purpose, and free of filler. The docstring-style ':param' and ':return' lines are compact, though somewhat redundant given the input and output schemas.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter with one parameter and an output schema, the description covers the basic purpose, parameter meaning, and return nature. However, it omits usage guidance and behavioral details, and the parameter documentation is minimal, leaving gaps in a no-annotation context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the only parameter description is ':param emp_id: Employee ID', which merely restates the schema title 'Emp Id' without adding format, source, or validation details. With low coverage, the description fails to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('leave balance of an employee'), which clearly distinguishes it from siblings like apply_leave and get_leave_history. However, it does not explicitly name or contrast with those alternatives, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as get_leave_history or apply_leave. It only states what the tool does, with no context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_leave_historyC
Get the leave history of an employee.
:param emp_id: Employee ID
:return: Leave history message
| Name | Required | Description | Default |
|---|---|---|---|
| emp_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not say whether this is a read-only query, what the history includes (leave types, date ranges, statuses), whether it is scoped to the current user or requires elevated permissions, or how results are ordered. The 'read' nature is only implied by the verb 'Get'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core sentence is front-loaded and short, but the definition leaks raw docstring artifacts (':param', ':return') that add noise rather than value. It is adequately sized but not cleanly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still spends its budget on a vague ':return: Leave history message'. Combined with zero annotation coverage and an undocumented parameter, the definition leaves meaningful gaps for even a simple single-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% with one required parameter, so the description must compensate, and it barely does: the ':param emp_id: Employee ID' line only restates the parameter name. There is no format, source, or lookup guidance for obtaining a valid employee ID.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the leave history of an employee'), which is unambiguous on its own. However, it offers no differentiation from the closely related sibling get_employee_leave_balance, leaving the agent to guess which one answers a balance versus a history question.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus get_employee_leave_balance or apply_leave, and no prerequisites or preconditions are stated. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meetingsC
Get the list of meetings scheduled for an employee.
:param employee_id: Employee ID
:return: List of meetings
| Name | Required | Description | Default |
|---|---|---|---|
| employee_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read-only lookup but discloses nothing about permissions, whether only upcoming meetings are returned, ordering, or pagination; it also fails to say what happens for an unknown employee_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and short, but the ':param'/':return' docstring boilerplate duplicates structured data the agent already receives. It is compact but not optimized for tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the operation is a simple single-parameter read. Still, nothing addresses scoping (time window, active vs. past meetings) or error behavior, leaving gaps for a list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the tool takes one parameter. The ':param employee_id: Employee ID' line merely restates the schema title 'Employee Id', adding no format, source, or constraint information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb (get) and resource (list of meetings) scoped to an employee, which is clear enough to act on. It does not differentiate itself from the sibling tools that touch the same domain (schedule_meeting, cancel_meeting), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus schedule_meeting, cancel_meeting, or any other sibling, and no preconditions or exclusions. Usage is only inferable from the tool name.
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: Ticket status (optional)
:return: List of tickets
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| employee_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, yet it discloses only that a list is returned. It says nothing about permissions, ordering, pagination, or result caps for what could be an unbounded list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is front-loaded and useful, but the :param/:return lines duplicate schema information without adding meaning, so the space is not fully earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but with 0% parameter coverage and no annotations the description leaves the agent without format, ordering, or permission context. The required/optional mismatch with the schema is an additional gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but ':param employee_id: Employee ID' and ':param status: Ticket status (optional)' are bare restatements with no format or allowed values. It also calls status optional while the schema marks it required, which will mislead an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List tickets') and scopes it to an employee with an optional status filter, which clearly distinguishes it from create_ticket and update_ticket_status. It does not name any sibling explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'With optional status filter' implies when the parameter is useful, but there is no explicit when-to-use or when-not-to-use guidance relative to siblings like get_employee_details. Usage is inferable but never stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_meetingB
Schedule a meeting for an employee.
:param employee_id: Employee ID
:param meeting_datetime: Date and time in ISO format (YYYY-MM-DD HH:MM:SS)
:param topic: Topic of the meeting
:return: Confirmation message
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| employee_id | Yes | ||
| meeting_datetime | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses only that a confirmation message is returned, saying nothing about whether invites/notifications are sent, permission requirements, conflict handling, or reversibility — all material for a scheduling mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Docstring-style and front-loaded, with the action stated first and params listed compactly. The ':return: Confirmation message' line is redundant since an output schema already exists, but the overall size is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with zero annotation coverage, the description omits essential context: permissions, whether attendees are notified, conflict behavior, and how the meeting relates to get_meetings/cancel_meeting. The output schema covers the return value, but the behavioral picture is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only source of parameter meaning, and it delivers the critical datetime format (ISO YYYY-MM-DD HH:MM:SS) along with the fields' intent. 'Employee ID' is thin, but overall it compensates well for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Schedule a meeting for an employee'), so the core action is unambiguous. However, it never distinguishes itself from siblings like get_meetings or cancel_meeting, so an agent must infer placement from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites (e.g., does the employee need to exist?), and no mention of any alternative tool. The agent gets no routing help against get_meetings, cancel_meeting, or send_email.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailC
Send an email to one or more recipients.
:param to_emails: List of email addresses
:param subject: Email subject
:param body: Email body content
:return: Success message
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| html | No | ||
| subject | Yes | ||
| to_emails | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. Beyond the fact that this sends an email, it discloses nothing about authentication requirements, rate limits, whether the send is irreversible, or what the success/failure response looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The prose sentence is appropriately brief and front-loaded. The subsequent :param/:return lines are boilerplate docstring fragments that add little value, pulling the structure down from efficient to merely adequate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters at 0% schema coverage and no annotations, the description is too thin. It omits the undocumented 'html' parameter entirely and provides no behavioral context; the output schema partly offsets this by covering return values, but the core gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema does not document any of the 4 parameters. The description names three parameters but adds no meaning beyond their names and gives no explanation for the undocumented 'html' parameter, leaving a clear gap it should have filled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Send an email') that is distinct from siblings like schedule_meeting or create_ticket. The audience ('one or more recipients') adds a scoping detail. It lacks explicit sibling differentiation, which is minor given no sibling also sends email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no mention of alternatives. The description gives no context about prerequisites such as whether the recipient must be a known employee or how it relates to other communication tools.
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
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| ticket_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
12 tool updates
v0.1.0- First observed
add_employee - First observed
apply_leave - First observed
cancel_meeting - First observed
create_ticket - First observed
get_employee_details - First observed
get_employee_leave_balance - First observed
get_leave_history - First observed
get_meetings - First observed
list_tickets - First observed
schedule_meeting - First observed
send_email - First observed
update_ticket_status
TDQS
Scored across 12 tools
Each tool has a distinct purpose, and there is no significant overlap between them. The only minor potential confusion is between 'get_employee_details' and 'get_employee_leave_balance' or 'get_leave_history', but these are clearly differentiated by their output focus.
All tool names follow a consistent verb_noun pattern (e.g., add_employee, get_employee_details, send_email), with no deviations. The naming is predictable and easy to understand.
12 tools is a well-scoped number for an HR assistant, covering key operations without being overwhelming. Each tool appears to earn its place by addressing a specific need.
While core operations like employee management, ticketing, meetings, and leave are present, there are notable gaps: no update or delete for employees, no meeting update, and no way to list all employees or get details by ID. These missing operations could cause agent failures in common workflows.
Maintenance
Related MCP Connectors
- agentpmtOAuthcom.agentpmt
AI agent marketplace for automated employees, workflows, skills, and tool orchestration.
Let AI agents query data and act across all your business apps via MCP.
Work management where AI agents are first-class members: tasks, projects, memory over hosted MCP
Human-in-the-loop review and approval for AI agents. Audit trail, approval policies, native MCP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP-powered HR management system that automates employee onboarding, leave tracking, meeting scheduling, and IT ticketing. It allows users to manage organizational workflows and administrative tasks through natural language interactions with Claude.2-
- FlicenseBqualityCmaintenanceAgentic AI system that automates HR workflows like employee onboarding, enabling HR teams to streamline tasks through natural language interactions with Claude Desktop.12-
- FlicenseDqualityCmaintenanceAn AI-powered HR assistant that automates employee management, leave handling, ticket creation, meeting scheduling, and email notifications through natural language conversations using the Model Context Protocol.11-
- FlicenseCqualityCmaintenanceAgentic HR assistant providing employee, leave, meeting, ticket, and email tools over the Model Context Protocol, designed to automate onboarding workflows via an MCP client such as Claude Desktop.14-

