Leave Manager MCP Server
Click on "Install 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., "@Leave Manager MCP ServerHow many casual leaves do I have left?"
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.
Leave Manager MCP Server
A custom Model Context Protocol (MCP) server built with TypeScript for managing employee leave-related operations through AI clients such as Claude Desktop.
This project is currently designed for internal development and testing and uses a dummy/in-memory database instead of a production database.
The architecture is designed so that the dummy database can later be replaced with a real database or internal Leave Management API without changing the MCP tool interface.
Table of Contents
Overview
The Leave Manager MCP Server exposes leave-management functionality as MCP tools that can be used by AI clients.
For example, instead of manually calling an API, a user can ask Claude:
How many casual leaves do I have?
Claude can identify the appropriate MCP tool and invoke:
get_leave_balanceThe MCP server processes the request and returns structured information that Claude can use to generate a natural-language response.
Example
User
│
│ "How many leaves do I have?"
▼
Claude Desktop
│
│ MCP Tool Call
▼
Leave Manager MCP Server
│
▼
Dummy Database
│
▼
Leave Balance
│
▼
Claude Desktop
│
▼
Natural Language ResponseFeatures
The current version provides the following MCP tools:
Get employee leave balance
Get employee leave history
Get available leave types
Apply for leave
Cancel leave
Input validation using Zod
Dummy/in-memory database
TypeScript implementation
stdio-based MCP transport
MCP Inspector support
Claude Desktop integration
Architecture
The current architecture is:
┌──────────────────────┐
│ Claude Desktop │
│ │
│ User Interaction │
└──────────┬───────────┘
│
│ MCP / stdio
▼
┌──────────────────────┐
│ Leave Manager MCP │
│ Server │
│ │
│ MCP Tool Layer │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Leave Service │
│ / Repository │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Dummy DB │
│ │
│ employees[] │
│ leaveBalances[] │
│ leaveRequests[] │
└──────────────────────┘The server uses stdio because Claude Desktop can launch the MCP server as a local process and communicate with it through standard input/output. The MCP TypeScript SDK provides serveStdio() for this use case.
Technology Stack
Technology | Purpose |
TypeScript | Application development |
Node.js | Runtime |
npm | Dependency management |
MCP TypeScript SDK | MCP server implementation |
Zod | Input validation |
Claude Desktop | MCP client |
MCP Inspector | Local MCP testing |
Dummy DB | Temporary data storage |
The current MCP TypeScript SDK v2 is the stable SDK line and uses @modelcontextprotocol/server.
Prerequisites
Before starting, make sure the following are installed.
Related MCP server: Enterprise Data MCP Server
Node.js
Node.js 20 or later is required.
Check the installed version:
node --versionExample:
v22.9.0Check npm:
npm --versionClaude Desktop
Install Claude Desktop on your machine.
Claude Desktop will act as the MCP client and will launch the Leave Manager MCP server locally.
Installation
1. Clone the repository
git clone <YOUR_REPOSITORY_URL>Navigate into the project:
cd leave-manager-mcp2. Install dependencies
Run:
npm installThe project uses the MCP TypeScript server package:
npm install @modelcontextprotocol/serverZod is used for validating tool input:
npm install zodFor TypeScript development:
npm install -D typescript tsx @types/nodeThe official MCP server setup currently uses Node.js 20+, ES modules, @modelcontextprotocol/server, Zod, and tsx.
Project Structure
Recommended project structure:
leave-manager-mcp/
│
├── src/
│ │
│ ├── index.ts
│ │
│ ├── data/
│ │ └── dummy-db.ts
│ │
│ ├── models/
│ │ └── leave.ts
│ │
│ ├── repositories/
│ │ └── leave-repository.ts
│ │
│ └── tools/
│ └── leave-tools.ts
│
├── dist/
│
├── package.json
├── package-lock.json
├── tsconfig.json
└── README.mdResponsibilities
src/index.ts
Creates and starts the MCP server.
src/models/leave.ts
Contains TypeScript models/interfaces related to employees and leave.
src/data/dummy-db.ts
Contains temporary in-memory test data.
src/repositories/leave-repository.ts
Provides data-access operations.
src/tools/leave-tools.ts
Registers MCP tools that Claude can invoke.
Configuration
package.json
A typical configuration:
{
"name": "leave-manager-mcp",
"version": "1.0.0",
"description": "Leave Manager MCP Server",
"type": "module",
"scripts": {
"dev": "tsx src/index.ts",
"build": "tsc",
"start": "node dist/index.js"
},
"dependencies": {
"@modelcontextprotocol/server": "^2.0.0",
"zod": "^4.0.0"
},
"devDependencies": {
"@types/node": "^24.0.0",
"tsx": "^4.0.0",
"typescript": "^6.0.0"
}
}Dependency versions may differ depending on when
npm installis executed. Always prefer the versions generated by npm.
TypeScript Configuration
Create tsconfig.json:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"types": ["node"],
"outDir": "dist"
},
"include": [
"src/**/*.ts"
]
}The Node types entry is important with current TypeScript versions because the MCP SDK's published type definitions reference Node APIs.
Available MCP Tools
The current Leave Manager MCP server exposes the following tools.
1. get_leave_balance
Returns the current leave balance for an employee.
Input
{
"employeeId": "EMP001"
}Example result
{
"employeeId": "EMP001",
"casual": 8,
"sick": 5,
"earned": 12,
"unpaid": 0
}2. get_leave_history
Returns the leave history for an employee.
Input
{
"employeeId": "EMP001"
}Example result
[
{
"id": "LR001",
"employeeId": "EMP001",
"leaveType": "CASUAL",
"startDate": "2026-08-20",
"endDate": "2026-08-21",
"reason": "Personal work",
"status": "APPROVED"
}
]3. get_leave_types
Returns available leave types.
Example result
[
{
"type": "CASUAL",
"description": "Casual leave"
},
{
"type": "SICK",
"description": "Sick leave"
},
{
"type": "EARNED",
"description": "Earned leave"
},
{
"type": "UNPAID",
"description": "Unpaid leave"
}
]4. apply_leave
Creates a new leave request.
Input
{
"employeeId": "EMP001",
"leaveType": "CASUAL",
"startDate": "2026-09-10",
"endDate": "2026-09-11",
"reason": "Family function"
}Example result
{
"id": "LR002",
"employeeId": "EMP001",
"leaveType": "CASUAL",
"startDate": "2026-09-10",
"endDate": "2026-09-11",
"reason": "Family function",
"status": "PENDING"
}5. cancel_leave
Cancels an existing leave request.
Input
{
"leaveId": "LR002"
}Example result
{
"id": "LR002",
"status": "CANCELLED"
}Run the MCP Server
There are two ways to run the server during development.
Option 1: Run directly with tsx
This is recommended during development.
npm run devInternally this executes:
tsx src/index.tsYou should see:
Leave Manager MCP server running...The process will continue running because an stdio MCP server waits for a client to communicate with it.
Stop the server using:
Ctrl + CBuild the Project
Before using the compiled version, run:
npm run buildThis executes:
tscThe compiled JavaScript files will be generated inside:
dist/Expected structure:
dist/
├── index.js
├── data/
│ └── dummy-db.js
├── models/
│ └── leave.js
├── repositories/
│ └── leave-repository.js
└── tools/
└── leave-tools.jsRun the Production Build
After building:
npm startThis executes:
node dist/index.jsThe MCP server will start using the compiled JavaScript.
Test with MCP Inspector
Before connecting the server to Claude Desktop, it is recommended to test it with the MCP Inspector.
The MCP Inspector provides a local UI for connecting to an MCP server and directly invoking its tools.
Start Inspector
From the project root:
npx @modelcontextprotocol/inspector npm run devAlternatively:
npx @modelcontextprotocol/inspector npx tsx src/index.tsThe Inspector will provide a browser URL.
Open that URL in your browser.
Test Tools in MCP Inspector
After connecting the server, open the:
Toolssection.
You should see:
get_leave_balance
get_leave_history
get_leave_types
apply_leave
cancel_leaveTest get_leave_balance
Select:
get_leave_balanceProvide:
{
"employeeId": "EMP001"
}Expected response:
{
"employeeId": "EMP001",
"casual": 8,
"sick": 5,
"earned": 12,
"unpaid": 0
}Test get_leave_history
Input:
{
"employeeId": "EMP001"
}Test get_leave_types
This tool does not require any input.
Test apply_leave
Input:
{
"employeeId": "EMP001",
"leaveType": "CASUAL",
"startDate": "2026-09-10",
"endDate": "2026-09-11",
"reason": "Family function"
}Test cancel_leave
Input:
{
"leaveId": "LR002"
}Connect with Claude Desktop
Once the server works correctly in MCP Inspector, connect it to Claude Desktop.
The MCP server should be configured as a local stdio server because Claude Desktop launches the process and communicates through stdin/stdout.
1. Build the project
First run:
npm run buildMake sure this file exists:
dist/index.js2. Get the absolute project path
From the project root:
pwdExample:
/Users/ashish/projects/leave-manager-mcpYour server path will therefore be:
/Users/ashish/projects/leave-manager-mcp/dist/index.jsUse an absolute path in the Claude Desktop configuration.
Claude Desktop Configuration
Add the Leave Manager MCP server to Claude Desktop's MCP configuration.
Example:
{
"mcpServers": {
"leave-manager": {
"command": "node",
"args": [
"/ABSOLUTE/PATH/TO/leave-manager-mcp/dist/index.js"
]
}
}
}For example, on macOS:
{
"mcpServers": {
"leave-manager": {
"command": "node",
"args": [
"/Users/ashish/projects/leave-manager-mcp/dist/index.js"
]
}
}
}Replace the path with the actual absolute path on your machine.
Important: Restart Claude Desktop
After changing the MCP configuration:
Save the configuration.
Completely quit Claude Desktop.
Start Claude Desktop again.
Open a new conversation.
Check the available MCP tools.
You should see the Leave Manager server and its tools.
Test Leave Manager with Claude
Once connected, you don't need to manually invoke the MCP tools.
You can simply ask Claude natural-language questions.
Example 1 — Leave Balance
Ask:
How many leaves does EMP001 have?Claude should use:
get_leave_balancewith:
{
"employeeId": "EMP001"
}Example 2 — Leave History
Ask:
Show me the leave history of EMP001.Claude should use:
get_leave_historyExample 3 — Available Leave Types
Ask:
What types of leaves are available?Claude should use:
get_leave_typesExample 4 — Apply Leave
Ask:
Apply casual leave for EMP001 from September 10 to September 11 because of a family function.Claude should use:
apply_leavewith the appropriate parameters.
Example 5 — Cancel Leave
Ask:
Cancel leave request LR002.Claude should use:
cancel_leaveDummy Database
The current implementation uses an in-memory database.
Example:
export const employees = [
{
id: "EMP001",
name: "Ashish Kushwaha",
email: "ashish@example.com",
department: "Engineering"
}
];Leave balance:
export const leaveBalances = [
{
employeeId: "EMP001",
casual: 8,
sick: 5,
earned: 12,
unpaid: 0
}
];Leave requests:
export const leaveRequests = [
{
id: "LR001",
employeeId: "EMP001",
leaveType: "CASUAL",
startDate: "2026-08-20",
endDate: "2026-08-21",
reason: "Personal work",
status: "APPROVED",
createdAt: "2026-08-10"
}
];Important Dummy DB Limitation
The current database is stored in application memory.
Therefore:
Server starts
↓
Dummy data loaded
↓
Apply leave
↓
New request added
↓
Server stops
↓
Data is lostThis is expected.
The dummy database is only intended for development and MCP testing.
Development Workflow
Recommended development workflow:
1. Modify TypeScript
↓
2. Run npm run build
↓
3. Run MCP Inspector
↓
4. Test MCP tools
↓
5. Fix issues
↓
6. Test with Claude Desktop
↓
7. Commit changesDuring development you can also use:
npm run devinstead of building after every change.
Logging
Because the server uses stdio, do not use console.log() for normal server logging.
Avoid:
console.log("Server started");Use:
console.error("Server started");The reason is that stdout is used by MCP for protocol communication. Writing normal logs to stdout can corrupt the JSON-RPC/MCP communication stream.
Troubleshooting
Problem: Cannot find module
Run:
rm -rf node_modules
rm -f package-lock.json
npm installThen:
npm run buildProblem: TypeScript build error
Run:
npx tsc --noEmitThis will show TypeScript errors without generating files.
Problem: dist/index.js does not exist
Run:
npm run buildThen verify:
ls distProblem: Claude Desktop does not show the MCP server
Check:
The MCP configuration is valid JSON.
The path to
dist/index.jsis absolute.npm run buildcompleted successfully.dist/index.jsexists.Node.js is installed.
Claude Desktop was completely restarted.
The MCP server works in MCP Inspector.
Problem: MCP Inspector cannot connect
First run:
npm run devIf the server starts successfully, stop it and then run:
npx @modelcontextprotocol/inspector npm run devCheck the terminal for errors.
Problem: Server starts but tools are not visible
Check:
src/index.tsand make sure your tools are registered:
registerLeaveTools(
server,
repository
);Also make sure serveStdio() is called:
void serveStdio(createServer);Problem: JSON-RPC/MCP protocol errors
Check the code for:
console.log(...)Replace normal logging with:
console.error(...)stdout must remain available for MCP protocol communication.
Future Enhancements
The current version is a prototype. The following improvements are recommended.
Database
Replace the dummy database with:
PostgreSQL
MySQL
MongoDBor an existing internal Leave Management API.
Authentication
Add employee authentication so that the user doesn't have to provide:
employeeIdmanually.
Future architecture:
Claude
↓
MCP Server
↓
Authentication
↓
Employee Context
↓
Leave ServiceLeave Validation
Add business rules:
Validate leave dates
Validate leave balance
Prevent overlapping leave
Check company holidays
Check weekends
Validate minimum/maximum leave duration
Validate employee status
Validate leave type
Prevent cancellation after approval, if applicable
Manager Approval
Add tools such as:
get_pending_leave_requests
approve_leave
reject_leaveTeam Calendar
Add:
get_team_leave_calendarExample user request:
Who from my team is on leave next week?Notifications
Integrate with:
Email
Slack
Microsoft Teamsto notify employees and managers.
Recommended Production Architecture
The long-term architecture should separate MCP from business logic:
Claude Desktop
│
│ MCP
▼
┌───────────────────┐
│ MCP Server │
│ │
│ Tool Definitions │
│ Input Validation │
└─────────┬─────────┘
│
▼
┌───────────────────┐
│ Leave Service │
│ │
│ Business Rules │
│ Validation │
│ Authorization │
└─────────┬─────────┘
│
▼
┌───────────────────┐
│ Leave Repository │
└─────────┬─────────┘
│
┌────────┴────────┐
▼ ▼
Internal Leave API DatabaseThis makes it possible to replace the dummy database without changing the tools exposed to Claude.
Security Considerations
The current project is intended for development/testing only.
Before using it with real employee data:
Add authentication.
Add authorization.
Do not trust
employeeIdsupplied by the model.Validate all tool inputs.
Protect employee information.
Avoid exposing unnecessary employee data.
Add audit logging.
Implement role-based access control.
Protect manager-only operations.
Add rate limiting where applicable.
Do not store secrets in source code.
Use environment variables for credentials.
Secure connections to internal APIs/databases.
The MCP server should enforce business permissions rather than relying on Claude to make security decisions.
Environment Variables
When connecting to real services, use environment variables.
Example .env:
LEAVE_API_URL=https://internal.example.com/api
LEAVE_API_KEY=your-api-keyDo not commit .env to Git.
Add:
.envto .gitignore.
Git Ignore
Recommended .gitignore:
node_modules/
dist/
.env
.DS_Store
*.logUseful Commands
Install dependencies
npm installDevelopment
npm run devBuild
npm run buildRun compiled server
npm startType check
npx tsc --noEmitRun MCP Inspector
npx @modelcontextprotocol/inspector npm run devCheck Node version
node --versionCheck npm version
npm --versionMCP Development Checklist
Before considering the MCP server ready for internal testing:
Node.js 20+ installed
Dependencies installed
TypeScript build succeeds
Dummy database configured
MCP server starts successfully
MCP Inspector connects successfully
get_leave_balancetestedget_leave_historytestedget_leave_typestestedapply_leavetestedcancel_leavetestedClaude Desktop configuration added
Claude Desktop restarted
Leave Manager tools visible in Claude
Natural-language requests tested
Error scenarios tested
Example User Queries
Once connected to Claude Desktop, users should be able to ask questions such as:
How many casual leaves do I have?Show my leave history.What leave types are available?Apply casual leave from September 10 to September 11.Cancel my leave request LR002.Future examples:
Do I have enough leave for next Monday?Who from my team is on leave next week?Show all pending leave requests.Approve Rahul's leave request.MCP Resources
Official MCP TypeScript SDK:
https://ts.sdk.modelcontextprotocol.io/v2/
Official first-server guide:
https://ts.sdk.modelcontextprotocol.io/v2/get-started/first-server
Official server API:
https://ts.sdk.modelcontextprotocol.io/v2/api/@modelcontextprotocol/server/
The project currently follows the MCP TypeScript SDK v2 architecture and the modern 2026-07-28 protocol line.
License
This project is intended for internal development and testing.
Add your organization's license and usage policy here.
Maintainer
Ashish Kushwaha
Leave Manager MCP Server TypeScript + MCP + Claude Desktop
Quick Start
For experienced developers, the complete setup can be summarized as:
# Clone
git clone <YOUR_REPOSITORY_URL>
# Enter project
cd leave-manager-mcp
# Install
npm install
# Build
npm run build
# Run
npm start
# Development
npm run dev
# MCP Inspector
npx @modelcontextprotocol/inspector npm run devThen configure Claude Desktop to launch:
dist/index.jsusing:
{
"mcpServers": {
"leave-manager": {
"command": "node",
"args": [
"/ABSOLUTE/PATH/TO/leave-manager-mcp/dist/index.js"
]
}
}
}Restart Claude Desktop and start testing the Leave Manager MCP tools.
Available Tools
6 toolsapply_leaveC
Apply for leave for an employee.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | ||
| endDate | Yes | ||
| leaveType | Yes | ||
| startDate | Yes | ||
| employeeId | 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 burden of explaining behavior. It only states that leave is applied for, but does not disclose side effects, potential validations, approval implications, or return behavior. This is insufficient for a mutation tool.
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 one-line description is clear and front-loaded, with no filler or redundant phrasing. It is short and easy to parse, though its brevity sacrifices important operational details.
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 that this is a 5-required-parameter mutation tool with no annotations, output schema, or parameter explanations, the description is not sufficient to support correct invocation. It captures the core action but leaves critical operational context undocumented.
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?
With 0% schema description coverage and no mention of parameters in the description, the agent receives no additional semantic meaning. The schema provides names and types, but nothing explains date formats, reason expectations, or how the employeeId is resolved.
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 'Apply for leave for an employee' uses a specific verb and resource, clearly communicating what the tool does. It also distinguishes itself from the sibling read and cancel tools by indicating the creation/submission action.
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 explicit guidance on when to use this tool versus the sibling tools, nor does it mention prerequisites or exclusions. Usage can only be inferred from the action itself, making this a weak dimension.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_leaveC
Cancel an existing leave request.
| Name | Required | Description | Default |
|---|---|---|---|
| leaveId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must carry full burden. 'Cancel' implies a mutation, but it doesn't disclose side effects (e.g., whether the cancellation is irreversible, whether it requires special permissions, how it affects leave balance). Does not contradict any annotations since none exist.
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?
Single sentence, perfectly concise. No fluff, front-loaded action. It serves the purpose with minimal words.
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 a mutation tool with no annotations and no output schema, the description is lacking. It doesn't mention expected outcome, error conditions, or anything about the cancellation process. For a simple tool with one param, it is minimal but functional, yet incomplete in providing useful 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 coverage is 0%, meaning the description doesn't explain the leaveId parameter beyond its name from the schema. The description simply says 'an existing leave request' without adding meaning like what the ID format is or where to find it. With 0% coverage, the description must compensate, but it does not.
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?
Clear verb+resource: 'Cancel an existing leave request.' It specifies the action and object, and while it doesn't explicitly differentiate from siblings, the sibling tools like apply_leave and get_leave_history are distinct. It is direct and 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 tool versus alternatives. It doesn't mention any conditions for cancellation, such as approval status or time limitations. The context is implied but not stated, so no exclusions or alternative references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_employee_details_by_employeeIdC
Get employee details by employeeId.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | 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 does not disclose any behavioral traits such as whether it is read-only, side effects, authentication requirements, or error handling. For a get operation, it implies read-only but does not state it, and no output schema is provided, leaving behavior largely opaque.
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 extremely short (5 words), which could be considered concise, but it under-specifies rather than being efficiently informative. It is front-loaded with the purpose, but the brevity results in missing critical information, making it insufficient.
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?
The tool has one parameter, no output schema, and no annotations. Given this, the description should at least indicate what 'employee details' entails (e.g., which fields are returned) and any special cases. It does not, so it is incomplete for practical use.
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 parameter employeeId has no description in the schema. The tool description repeats 'by employeeId' but adds no additional meaning. Given low coverage, the description should compensate but does not clarify format (e.g., UUID, string) or any constraints.
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 it retrieves employee details by employeeId, which is a clear verb+resource+identifier. However, it lacks differentiation from sibling tools (e.g., get_leave_balance, apply_leave) which are about leave, not employee details, so there is some implicit distinction. It is not a tautology but is minimal.
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 usage guidelines are provided. The description does not specify when to use this tool versus alternatives, but since it is the only employee details tool among leave-focused siblings, the usage context is somewhat implied. Still, no explicit guidance for when-not-to-use or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_leave_balanceC
Get the current leave balance of an employee.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | 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 only states the action without explaining what the tool returns, whether it requires specific permissions, or any side effects. For a read operation, it doesn't mention the output format or any limitations.
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 a single, concise sentence that is front-loaded with the main action. It is appropriately brief, though it could add a bit more detail without becoming verbose.
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 tool's simplicity (one parameter, no output schema), the description is minimal but lacks important context such as what the balance includes (e.g., annual, sick, etc.) or any time-based considerations. It is adequate for a basic read but incomplete for an agent to fully understand the tool's behavior.
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?
The schema has 0% description coverage, and the description doesn't explain the 'employeeId' parameter beyond its name. However, with only one parameter and a clear name, the meaning is fairly obvious. The description adds no extra semantic value, but the parameter is self-explanatory.
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 clearly states the tool's purpose: to retrieve the current leave balance for an employee. It uses a specific verb ('get') and resource ('leave balance'), and it is distinct from sibling tools like get_leave_history and get_leave_types, though it doesn't explicitly differentiate itself.
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 guidance on when to use this tool versus alternatives. It doesn't mention any context, prerequisites, or exclusions. The sibling tools suggest related but different functions, but the description doesn't clarify when to choose this one.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations at all, so the description carries full burden. It only says 'get' implying a read, but does not disclose return format, whether it includes only approved leaves, date ranges, or any limits. It gives no behavioral details beyond the verb.
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 very short, one line, and front-loaded with the purpose. It is concise, but it is under-specified rather than efficiently concise. Since it avoids fluff, it at least earns a baseline for conciseness.
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 there is no output schema and no annotations, the description is insufficient. It does not explain what 'history' includes, whether there are any filters, pagination, or typical use cases. The complexity is moderate but the description is too thin to be complete.
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 employeeId. The description does not elaborate on what employeeId is or any format requirements. It merely repeats the parameter name implicitly. The description adds minimal value beyond the 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 'Get the leave history of an employee' which is a clear verb+resource. It distinguishes from siblings like get_leave_balance (which implies current balance) and apply_leave, but does not explicitly differentiate what 'history' includes (e.g., past applications, approved leaves, status over time). It is acceptable but lacks specifics.
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 tool vs alternatives. It doesn't mention that this is for historical records, nor does it contrast with get_leave_balance for current entitlements. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_leave_typesA
Get all available leave types.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 only states the action without mentioning side effects, authentication requirements, or whether it is a read-only operation. For a simple list tool, the lack of such disclosure is a gap, though the risk is low.
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?
A single, clear sentence that conveys the entire purpose without any filler or unnecessary details. Perfectly concise and front-loaded.
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 tool's simplicity (no parameters, no output schema, no nested objects), the description is adequate. It covers the core purpose and does not leave critical gaps, though it could mention the return format or any filtering options for completeness.
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?
The tool has zero parameters, so the schema provides all necessary context. Per the baseline rule, a score of 4 is appropriate; the description adds no parameter-specific information, but none is needed.
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 'Get all available leave types' uses a specific verb ('Get') and resource ('leave types'), and clearly distinguishes from sibling tools like get_leave_balance or get_leave_history which deal with specific aspects of leave. It is unambiguous about what it returns.
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 states what the tool does but provides no guidance on when to use it versus alternatives. However, since the tool is a simple list operation with a unique purpose, the intended usage is easily inferred, though not explicit.
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.
6 tool updates
v1.0.0- First observed
apply_leave - First observed
cancel_leave - First observed
get_employee_details_by_employeeId - First observed
get_leave_balance - First observed
get_leave_history - First observed
get_leave_types
TDQS
Scored across 6 tools
The tools are mostly distinct: balance, history, types, apply, cancel, and employee details each target a clear purpose. The only mild overlap is between leave balance and leave history, but their intent is sufficiently separated.
Most tools follow a get_/apply_/cancel_ pattern with snake_case. The outlier is get_employee_details_by_employeeId which mixes an 'employeeId' camelCase segment into an otherwise snake_case name, causing a minor inconsistency.
Six tools is well-scoped for a leave management server. Each tool covers an essential function without unnecessary bloat or significant redundancy.
The core employee self-service workflow is covered: view balance, history, types, apply, and cancel. Missing tools for approval/rejection or checking pending leave requests create notable gaps for a 'manager' context.
Maintenance
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
- mcp-serverOAuthio.klokin
MCP server exposing klokin time-tracking operations (employees, time entries, stores) to AI clients.
MCP server for public_holidays_mcp
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
MCP server providing attendance data queries via the CloudTime API.
Related MCP Servers
- FlicenseBqualityDmaintenanceA Model Context Protocol server that enables users to manage employee leave through natural language. It provides tools to check leave balances, apply for leave, and view leave history via Claude integration.3-
- AlicenseNot gradedqualityBmaintenanceMCP server providing natural-language tools for managing and querying an employee database, including user CRUD, search, and statistics.MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server for interacting with an HR database, enabling querying employee data and HR operations via natural language.-
- FlicenseNot gradedqualityCmaintenanceEnables natural-language-based employee leave management including leave balance checks, leave applications, approvals, and history retrieval through an MCP-compatible client.-