Skip to main content
Glama
TharushiDinushika

Employee Leave Manager MCP

README.md
# Employee Leave Manager — MCP

An MCP server that exposes employee leave management (balances, applying for
leave, history, etc.) as tools that Claude Desktop (or any MCP client) can
call. Data is stored in a local SQLite database.

## Prerequisites

- [uv](https://docs.astral.sh/uv/getting-started/installation/) — Python dependency manager
- [Claude Desktop](https://claude.ai/download)

## Setup

Clone the repo:

```bash
git clone https://github.com/TharushiDinushika/Employee-Leave-Manager-MCP.git
cd Employee-Leave-Manager-MCP
```

Create the project and install dependencies:

```bash
uv sync
```

Activate Virtual Environment

```bash
.venv\Scripts\activate 
``` 

## Initialize the database

Creates the SQLite schema and seeds it with sample employees, leave types,
and balances:

```bash
python init_db.py
```

Options:

```bash
python init_db.py --reset      # drop all tables and reseed from scratch
python init_db.py --no-seed    # create schema only, skip sample data
```

## Run the server

```bash
uv run mcp dev server.py
```

This opens the MCP Inspector, where you can list and test the available
tools directly before connecting a client.

## Connect to Claude Desktop

Open Claude Desktop and check whether the connector appears automatically.

![Demo screenshot](images/screenshot.png)

If it doesn't show up, add it manually:

1. Go to **File → Settings → Developer → Edit Config**
2. Add the following block to the config file (update the path to match
   where you cloned the project):

```json
{
  "mcpServers": {
    "EmployeeLeaveManager": {
      "command": "uv",
      "args": [
        "--directory",
        "C:\\path\\to\\Employee-Leave-Manager-MCP",
        "run",
        "server.py"
      ]
    }
  }
}
```

3. Restart Claude Desktop.
4. Open a new chat and try asking Claude about employee leave — e.g. *"What's
   E001's leave balance?"*

## Functionality

The server exposes the following tools:

| Tool | Description |
|---|---|
| `get_leave_balance(employee_id, leave_type)` | Check remaining leave balance for an employee. Returns balance for a specific leave type, or all types if omitted. |
| `apply_leave(employee_id, leave_dates, leave_type="annual", reason)` | Apply for leave on one or more specific dates. Validates date format, rejects past or duplicate dates, and checks balance before deducting. |
| `cancel_leave(employee_id, leave_dates)` | Cancel previously approved leave and refund the balance. |
| `get_leave_history(employee_id, leave_type)` | View an employee's leave history, optionally filtered by leave type. |
| `get_leave_types()` | List all available leave types (annual, sick, casual, unpaid) and their default annual allotment. |
| `list_employees(department)` | List all employees, optionally filtered by department. |
| `add_employee(employee_id, name, department, email, manager_id)` | Onboard a new employee with default leave balances. |
| `get_employee_details(employee_id)` | Get an employee's profile (name, department, email, manager). |

It also exposes two resources:

- `greeting://{name}` — a personalized greeting
- `employee://{employee_id}/summary` — a quick profile + balance summary for an employee

### Data model

Data lives in a local SQLite database (`leave_manager.db`), with four tables:
`employees`, `leave_types`, `leave_balances`, and `leave_requests`. Schema
creation and seeding are handled separately by `init_db.py`, so the server
itself never modifies the schema — it just reads/writes data.

## Project structure

```
mcp-server/
├── server.py         # MCP server: tools, resources, DB queries
├── init_db.py        # Database schema creation + seeding (run once)
├── leave_manager.db  # SQLite database (created after running init_db.py)
```