Skip to main content
Glama
adityapatel143

Employee Leave Management MCP Server

Employee Leave Management — MCP Server

šŸ“Œ Check out GenAI and System Design videos

An MCP (Model Context Protocol) server built with FastMCP that connects to a Supabase PostgreSQL database and lets Claude Desktop manage employee leave — checking balances, applying for leave, approvals, history, and more.


Architecture

ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│  Claude Desktop (MCP Host)                            │
│                                                       │
│  "How many leaves does EMP001 have left this year?"   │
│                                                       │
│  Claude ──► get_leave_balance("EMP001", 2025)         │
│          ◄── [{Annual: 13 remaining}, {Sick: 8}, …]   │
│                                                       │
│  Claude: "Aditya has 13 Annual, 8 Sick, and 5 Casual  │
│           leave days remaining for 2025."             │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
          │ stdio (subprocess)
          ā–¼
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”        ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│  server.py          │        │  Supabase (Postgres)  │
│  FastMCP + tools    │◄──────►│  employees            │
│                     │  REST  │  leave_types          │
│                     │  API   │  leave_balances       │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜        │  leave_requests       │
                               ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜

Related MCP server: leave-management

Exposed Tools

Tool

What it does

list_leave_types

All leave categories (Annual, Sick, Casual, …) with default allocation

list_employees

Active employees, optional department filter

get_employee_info

Look up one employee by code or email

get_leave_balance

Remaining / used / total days by employee & year

apply_for_leave

Submit a leave request (validates balance & date overlaps)

get_leave_history

All requests for an employee, filterable by year/status

get_leave_request

Full details of a single request by ID

cancel_leave_request

Employee withdraws a pending request

approve_leave_request

Manager approves — auto-deducts days from balance

reject_leave_request

Manager rejects with optional note

Resources

  • leave://schema — full schema overview attachable as context

Prompts

  • leave_assistant — structured conversation starter for the HR assistant


Quick Start

Step 1 — Create a Supabase project

  1. Go to https://supabase.com and create a free project.

  2. After the project is ready, go to Project Settings → API and copy:

    • Project URL → SUPABASE_URL

    • Project API Keys → anon public key (or service_role key for full access) → SUPABASE_KEY

Step 2 — Set up the database

  1. In the Supabase Dashboard, open the SQL Editor → New Query.

  2. Paste the full contents of setup_database.sql and click Run.

This creates four tables (employees, leave_types, leave_balances, leave_requests) plus a convenience view (leave_balances_view) and seeds 8 employees with realistic 2025 balances.

Step 3 — Configure environment variables

cd demo_projects/mcp
cp .env.example .env
# Edit .env with your Supabase URL and Key

.env contents:

SUPABASE_URL=https://your-project-ref.supabase.co
SUPABASE_KEY=your-anon-or-service-role-key

Step 4 — Install dependencies

uv sync

Step 5 — Test interactively (without Claude Desktop)

#uv run fastmcp dev server.py
uv run python server.py
# Opens MCP Inspector at http://localhost:6274

Connect to Claude Desktop

Locate the config file

OS

Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

Add the server block

{
  "mcpServers": {
    "employee-leave": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/project_root",
        "run",
        "python",
        "server.py"
      ]
    }
  }
}

Important: Use the absolute path in --directory. You can get it by running pwd in the project folder.

Note: You may need to provide the full path to the uv executable in the command field. Run which uv (macOS/Linux) or where uv (Windows) to find it.

Restart Claude Desktop

Quit and reopen Claude Desktop. Click the + ("Add files, connectors, and more") icon in the chat input area, then hover over Connectors — you should see employee-leave listed there.

Note: Claude for Desktop is not yet available on Linux. Linux users can use the MCP Inspector or build a custom MCP client instead.


Connect to VS Code (GitHub Copilot)

VS Code supports MCP servers natively through GitHub Copilot agent mode. The config format is different from Claude Desktop.

Locate / create the config file

Scope

File

Workspace (team-shared)

.vscode/mcp.json in your project root

User profile (all workspaces)

Run MCP: Open User Configuration from the Command Palette

Add the server block

Create or edit .vscode/mcp.json:

{
  "servers": {
    "employee-leave": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/project_root",
        "run",
        "python",
        "server.py"
      ]
    }
  }
}

Note: VS Code uses "servers" (not "mcpServers") and requires the "type": "stdio" field. Use the absolute path in --directory.

Tip: You may need to provide the full path to uv in "command". Run which uv to find it.

Start the server

  1. Open the Command Palette (Ctrl+Shift+P) and run MCP: List Servers.

  2. Select employee-leave and choose Start.

  3. When prompted, confirm you trust the server.

  4. Open the Chat view (Ctrl+Alt+I), switch to Agent mode, and the employee-leave tools will be available.

Verify tools are loaded

In the Chat view, select Configure Tools (or the tools icon) to see all tools provided by the employee-leave server and toggle individual tools on/off.

Troubleshooting

If the server fails to start, run MCP: List Servers → select the server → Show Output to view logs.


Example Conversations with Claude

You: How many leaves does Aditya have left for 2025?

Claude: [calls get_employee_info("EMP001"), then get_leave_balance("EMP001", 2025)]
        Aditya Sharma (EMP001) has:
        • Annual leave  : 13 days remaining (5 used of 18)
        • Sick leave    :  8 days remaining (2 used of 10)
        • Casual leave  :  5 days remaining (1 used of 6)
You: Apply for annual leave for EMP002 from 10th July to 18th July 2025.

Claude: [calls apply_for_leave("EMP002", "Annual", "2025-07-10", "2025-07-18")]
        Leave request submitted!
        • Employee   : Priya Nair (EMP002)
        • Type       : Annual
        • Dates      : 10 Jul – 18 Jul 2025  (7 business days)
        • Status     : Pending
        • Remaining after approval: 8 Annual days
You: Approve request ID 3.

Claude: [calls approve_leave_request(3)]
        Leave request #3 has been approved. 7 days deducted from Priya's Annual balance.

Database Schema

employees          -- employee_code, full_name, email, department, position
leave_types        -- name, description, default_days
leave_balances     -- one row per (employee, leave_type, year)
leave_balances_view -- denormalised view with remaining_days computed
leave_requests     -- status: pending | approved | rejected | cancelled

Project Files

demo_projects/mcp/
ā”œā”€ā”€ server.py             ← FastMCP server (all tools, resources, prompts)
ā”œā”€ā”€ setup_database.sql    ← Run once in Supabase SQL Editor
ā”œā”€ā”€ pyproject.toml        ← Dependencies (fastmcp, supabase, python-dotenv)
ā”œā”€ā”€ .env.example          ← Copy to .env and fill in credentials
└── README.md             ← This file

Available Tools

10 tools
apply_for_leaveA

Submit a leave request on behalf of an employee.

Args: identifier: Employee code (e.g. "EMP001") or email. leave_type: Type of leave — use list_leave_types() for valid values (e.g. "Annual", "Sick", "Casual"). start_date: First day of leave in YYYY-MM-DD format. end_date: Last day of leave in YYYY-MM-DD format. reason: Optional reason for the leave request.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNo
end_dateYes
identifierYes
leave_typeYes
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior2/5

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

No annotations are provided, and the description does not disclose behavioral traits such as required authorization, side effects (e.g., triggers approval workflow), or idempotency. For a submission tool, this is a significant gap.

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 well-structured with a leading sentence and concise bullet points for each parameter. Every sentence adds value without redundancy.

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?

Given the tool's complexity (5 params, no enums) and the existence of an output schema, the description covers parameter details but lacks behavioral context (e.g., what happens after submission). It is minimally sufficient but incomplete.

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

Parameters5/5

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

The description compensates for 0% schema coverage by explaining each parameter's meaning and format. It gives examples for identifier (EMP001/email), references list_leave_types() for leave_type, and specifies YYYY-MM-DD format for dates.

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 'Submit a leave request' which is a specific verb and resource. It distinguishes from sibling tools like approve_leave_request, cancel_leave_request, etc., by focusing on submission.

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

Usage Guidelines4/5

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

The description provides clear guidance on when to use: to submit a leave request. It also directs users to list_leave_types() for valid leave_type values. However, it does not explicitly mention when not to use it or alternatives for other actions like approval.

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

approve_leave_requestA

Approve a pending leave request and deduct days from the employee's balance. Call this only when acting as an HR manager or team lead.

Args: request_id: Numeric ID of the leave request to approve. manager_note: Optional note from the manager (visible to the employee).

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYes
manager_noteNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses that the tool deducts days from balance (mutation) and that the manager_note is visible to the employee. With no annotations provided, the description carries the full burden. It could mention reversibility or error cases, but the key side effects are covered.

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 highly concise: two sentences plus bulleted parameter explanations. It front-loads the main action and role requirement, with no wasted words. Every sentence earns its place.

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

Completeness4/5

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

Given the tool's simplicity and the presence of an output schema, the description covers the role, effect, and parameters adequately. It could be more complete by mentioning potential error conditions (e.g., already approved, insufficient balance), but the core functionality is well-described.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must add meaning. It fully explains both parameters: 'request_id: Numeric ID of the leave request to approve' and 'manager_note: Optional note from the manager (visible to the employee).' This adds significant value beyond the schema's type-only definitions.

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 'Approve a pending leave request and deduct days from the employee's balance.' It specifies the action (approve), the resource (leave request), and the effect (deduct days), distinguishing it from siblings like reject_leave_request or cancel_leave_request.

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

Usage Guidelines4/5

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

The description provides explicit role context: 'Call this only when acting as an HR manager or team lead.' While it does not explicitly exclude other scenarios or name alternatives, the role guidance is clear and helpful for an AI agent to decide when to use this tool.

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

cancel_leave_requestA

Cancel a pending leave request. Only the employee who applied can cancel.

Args: request_id: Numeric ID of the leave request to cancel. identifier: Employee code or email of the requester (for authorisation).

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYes
request_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/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 mentions authorization (only employee can cancel) but omits side effects like notification, irreversibility, or actions on invalid states (e.g., already approved). The output schema exists but is not described, leaving agents uninformed about the response.

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 extremely concise: one main sentence, one sentence of scope, and a two-line bullet list for parameters. No fluff or repetition, front-loading the core action. Every sentence serves a purpose.

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?

Given the tool modifies state (cancel) and has an output schema, the description does not explain return values, error conditions (e.g., what if request not found?), or behavior on non-pending requests. It adequately differentiates from siblings but leaves gaps that an agent would need to infer.

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

Parameters5/5

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

The input schema has no property descriptions (0% coverage), so the tool description fully explains both parameters: 'request_id: Numeric ID of the leave request to cancel' and 'identifier: Employee code or email of the requester (for authorisation).' This adds meaning about types and purpose beyond the bare 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 opens with 'Cancel a pending leave request,' a clear verb+resource combination. It further specifies 'Only the employee who applied can cancel,' distinguishing this tool from sibling tools like 'approve_leave_request' or 'reject_leave_request' which involve different actors and actions.

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

Usage Guidelines4/5

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

The description implicitly guides usage by stating the tool is for pending requests and only by the requester. However, it does not explicitly state when not to use it (e.g., for approved/rejected requests) or compare with siblings. The context is clear but lacks explicit exclusions.

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

get_employee_infoB

Fetch details for a single employee.

Args: identifier: Employee code (e.g. "EMP001") or email address.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

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

No annotations provided. Description states 'fetch' implying read-only, but no further behavioral traits (e.g., permissions, data sensitivity).

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?

Extremely concise: two lines, front-loaded purpose, every sentence adds value.

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

Completeness4/5

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

Adequate for a simple fetch tool given output schema exists. Could mention potential errors or when it might return empty, but not necessary for typical use.

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?

Adds meaning beyond schema: specifies identifier can be employee code (with example) or email. Schema only says string.

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?

Specific verb 'fetch' and resource 'details for a single employee'. Clearly distinguishes from sibling list_employees and leave tools.

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 or not use, no alternatives mentioned. Implicit from name but not explicit.

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

get_leave_balanceA

Return the leave balance (total / used / remaining) for all leave types for the specified employee and year.

Args: identifier: Employee code or email. year: Calendar year (e.g. 2025). Defaults to the current year.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNo
identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/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 describes the return values but does not state that the operation is read-only (non-destructive) or mention permissions, rate limits, or error handling. The description is adequate but not explicit about side effects.

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 two sentences and a brief Args list. It is front-loaded and every sentence adds value without redundancy.

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

Completeness4/5

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

Given that an output schema exists, the description does not need to detail return structure. It adequately mentions that balance is returned for all leave types. However, it could clarify identifier format or error scenarios for 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?

With 0% schema description coverage, the description adds meaning: 'identifier' is clarified as employee code or email, 'year' as calendar year with default to current year. This adds value beyond the raw schema fields.

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 returns leave balance (total/used/remaining) for all leave types for a specified employee and year. It uses a specific verb 'Return' and resource 'leave balance', distinguishing it from siblings like get_leave_history or get_leave_request.

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 checking leave balances but does not provide explicit guidance on when to use this tool versus alternatives like get_leave_history or get_leave_request. No exclusions or context are given.

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

get_leave_historyA

Retrieve all leave requests for an employee, optionally filtered by year or status.

Args: identifier: Employee code or email. year: Filter by calendar year. 0 = all years. status: Filter by status: "pending", "approved", "rejected", "cancelled". Leave empty to return all statuses.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNo
statusNo
identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It discloses read-only behavior (retrieve) and optional filters, but does not mention what happens if identifier is invalid, rate limits, or data freshness. It is adequate but could provide 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.

Conciseness5/5

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

The description is concise with a clear purpose sentence followed by a bullet list of parameters. No redundant information; every sentence adds value. Front-loaded with the main purpose.

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

Completeness4/5

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

Given an output schema exists (external), the description does not need to detail return values. It covers input parameters well. Could mention ordering or default time range, but overall sufficient for a simple retrieval tool.

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

Parameters5/5

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

Input schema has 0% description coverage, but the description's Args section explicitly explains each parameter: identifier as employee code or email, year as calendar year with 0 meaning all, and status with enumerated filter values. This adds essential meaning beyond 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?

Description clearly states the tool retrieves all leave requests for an employee, with optional year and status filters. The verb 'retrieve' and resource 'leave requests' are specific, and it differentiates from sibling tools that handle apply, approve, cancel, etc.

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 states when to use (to get leave history) but does not explicitly mention when not to use or compare to alternatives like get_leave_request for a single request. Usage context is implied by naming but not elaborated.

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

get_leave_requestA

Fetch full details of a single leave request by its ID.

Args: request_id: The numeric ID of the leave request (returned by apply_for_leave or get_leave_history).

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/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 carry full behavioral disclosure. It only says 'Fetch', implying a read operation, but does not explicitly state that it is non-destructive, nor does it mention permissions, rate limits, or error behavior (e.g., invalid ID). This is insufficient for a tool with no annotations.

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 extremely concise: two lines with an Args section. Every sentence is necessary, no fluff. It front-loads the main purpose immediately.

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

Completeness4/5

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

Given that an output schema exists (not shown but indicated by context), the description does not need to explain return values. For a simple fetch tool, it covers the core functionality, parameter source, and purpose. Minor omission: no mention of error handling or non-existent IDs, but overall adequate.

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?

The input schema has 0% description coverage, but the tool's description explains the parameter 'request_id' as 'the numeric ID of the leave request (returned by apply_for_leave or get_leave_history)', adding valuable context beyond the schema type. This compensates for the lack of schema descriptions.

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 fetches full details of a single leave request by ID, using a specific verb and resource. It distinguishes itself from siblings like get_leave_history which lists requests, and apply_for_leave which creates them.

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 mentions where to get the request ID (from apply_for_leave or get_leave_history), implying usage context. However, it does not explicitly state when to use this tool versus alternatives (e.g., get_leave_history for multiple requests) or when not to use it.

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

list_employeesA

List all active employees, optionally filtered by department.

Args: department: Filter by department name (partial match, case-insensitive). Leave empty to return all employees.

ParametersJSON Schema
NameRequiredDescriptionDefault
departmentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

No annotations, but description covers key behavior: returns only active employees and optional filter. No side effects expected. Simple read tool.

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?

Two concise sentences plus param details. Front-loaded with core purpose. No extraneous information.

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?

Output schema existed, so return value description not needed. Covers all essential aspects for a list operation.

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

Parameters5/5

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

Sole parameter department is fully described with default behavior, partial matching, and case-insensitivity. Compensates for 0% schema description coverage.

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?

Clearly states verb 'list', resource 'active employees', and optional filter by department. Distinct from siblings like get_employee_info which retrieves a single employee.

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

Usage Guidelines4/5

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

Describes optional filter with partial matching behavior. Implicitly differentiates from get_employee_info, but could explicitly mention when to use list vs info.

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

list_leave_typesA

Return all available leave categories with their yearly default allocation. Call this to know valid leave_type values before applying for leave.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided; description implies a read-only operation (return all). It adds context that it returns yearly default allocation, but does not explicitly declare non-destructive behavior. Adequate but could be more explicit.

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?

Two sentences: first states purpose, second gives usage guidance. No filler, every sentence serves a distinct purpose.

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

Completeness4/5

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

Given no parameters and presence of output schema, description is sufficient. It covers purpose, output content, and usage context. Could mention lack of filtering but not necessary for a simple list.

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?

Input schema has no parameters, so description naturally adds meaning about the output (leave categories with allocation). Baseline for 0 parameters is 4.

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?

Description clearly states the tool returns all available leave categories with their yearly default allocation. It uses specific verb 'return' and resource 'leave categories'. Distinguishes from siblings like apply_for_leave by indicating it provides valid leave_type values.

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

Usage Guidelines4/5

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

Explicitly says to call this before applying for leave to know valid leave_type values. Provides clear context for when to use, though no explicit when-not-to-use is given.

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

reject_leave_requestA

Reject a pending leave request. Call this only when acting as an HR manager or team lead.

Args: request_id: Numeric ID of the leave request to reject. manager_note: Reason for rejection (recommended — visible to employee).

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYes
manager_noteNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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 that the manager_note is recommended and visible to the employee, but does not detail side effects such as notifications or status changes.

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 concise (6 lines) with a clear structure including an Args section. Every sentence adds value, though it could be slightly tighter by removing redundancy.

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

Completeness4/5

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

Given the tool's simplicity and the presence of an output schema, the description covers the main behavioral context (role requirement, parameter details). It could mention that the request must be pending, but this is implied by 'pending leave request' in the first sentence.

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

Parameters5/5

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

Schema description coverage is 0%, and the description adds full meaning: request_id is a numeric ID, manager_note is a reason for rejection that is recommended and visible to the employee. This compensates entirely for the schema's lack of documentation.

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 'Reject a pending leave request,' which specifies both the action (reject) and the resource (leave request). This distinguishes it from sibling tools like approve_leave_request and cancel_leave_request.

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

Usage Guidelines4/5

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

The description explicitly states 'Call this only when acting as an HR manager or team lead,' providing clear when-to-use guidance. It implies not to use as an employee, though it does not explicitly compare to alternatives like approve_leave_request.

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. 10 tool updatesv0.1.0
    • First observedapply_for_leave
    • First observedapprove_leave_request
    • First observedcancel_leave_request
    • First observedget_employee_info
    • First observedget_leave_balance
    • First observedget_leave_history
    • First observedget_leave_request
    • First observedlist_employees
    • First observedlist_leave_types
    • First observedreject_leave_request

TDQS

A4.1/5.0
Disambiguation5/5

Each tool targets a distinct action (apply, approve, cancel, reject, retrieve info/balance/history/requests, list employees/types) with no overlap. Clear boundaries between approval workflow and information retrieval.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern (e.g., apply_for_leave, get_leave_balance, list_employees). No deviations or mixing of styles.

Tool Count5/5

10 tools is well-scoped for an employee leave management domain. Each tool serves a necessary purpose without unnecessary duplication or bloat.

Completeness4/5

Covers the core lifecycle (apply, approve, reject, cancel) and read operations (balance, history, employee info). Minor gap: no tool to update a pending leave request (e.g., change dates or reason).

Maintenance

ActivityStale
ResponsivenessNo issues

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/adityapatel143/GenAi_Employee_Leave_Management-MCP_Server'

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