Skip to main content
Glama
README.md
# Timetastic MCP

An unofficial [MCP](https://modelcontextprotocol.io) server for
[Timetastic](https://timetastic.co.uk), exposing the Timetastic API to
agentic clients so they can query and manage absence & leave data.

## Setup

You need an **admin** API token, generated at
<https://app.timetastic.co.uk/api>. The server reads it from the
`TIMETASTIC_API_TOKEN` environment variable.

The quickest way to run it is with [uv](https://docs.astral.sh/uv/)'s `uvx`,
which fetches and runs the published package without a manual install:

```bash
export TIMETASTIC_API_TOKEN="your-token-here"
uvx timetastic-mcp
```

Or install it as a tool so the `timetastic-mcp` command is on your `PATH`:

```bash
uv tool install timetastic-mcp   # or: pipx install timetastic-mcp
```

> [!IMPORTANT]
> Only admin users can generate API tokens on Timetastic. The above URL is only accessible to admin users.

## Client configuration

Add the server to your MCP client (e.g. Claude Desktop / Claude Code):

```json
{
  "mcpServers": {
    "timetastic": {
      "command": "uvx",
      "args": ["timetastic-mcp"],
      "env": { "TIMETASTIC_API_TOKEN": "your-token-here" }
    }
  }
}
```

Pin a version with `"args": ["timetastic-mcp@0.1.0"]`. If you installed the
command on your `PATH` instead, use `"command": "timetastic-mcp"` with
`"args": []`. In Claude Code you can also add it from the CLI:

```bash
claude mcp add timetastic --env TIMETASTIC_API_TOKEN=your-token -- uvx timetastic-mcp
```

## Tools

Tools are grouped by resource and named `<verb>_<resource>`.

| Group                         | Tools                                                                                                                                                      |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Absences**                  | `list_absences`                                                                                                                                            |
| **Holidays** (leave bookings) | `list_holidays`, `get_holiday`, `book_holiday`, `action_holiday`                                                                                           |
| **Users**                     | `list_users`, `get_user`, `get_user_contact`, `add_user`, `edit_user`, `archive_user`, `restore_user`, `assign_public_holidays_to_user`                    |
| **Departments**               | `list_departments`, `get_department`, `add_department`, `edit_department`, `delete_department`                                                             |
| **Leave types**               | `list_leave_types`, `get_leave_type`, `list_leave_type_colors`, `list_leave_type_icons`, `create_leave_type`, `update_leave_type`, `delete_leave_type`     |
| **Allowances**                | `list_all_allowances`, `get_user_allowance`, `update_user_allowance`, `update_user_carry_forward`, `add_user_toil`, `update_user_toil`, `delete_user_toil` |
| **Locked dates**              | `list_locked_dates`, `add_locked_date`, `delete_locked_date`                                                                                               |
| **Public holidays**           | `list_public_holidays`, `get_public_holiday`, `list_public_holiday_countries`                                                                              |
| **Webhooks**                  | `list_webhook_events`                                                                                                                                      |

> **Note:** Timetastic calls all leave bookings "holidays" for historical
> reasons — the _Holidays_ tools cover any kind of absence, not just annual
> leave.

## Layout

The package lives under [`src/timetastic_mcp/`](src/timetastic_mcp/):

- [`timetastic.py`](src/timetastic_mcp/timetastic.py) — async HTTP client (auth,
  base URL, rate-limit retries, error handling).
- [`server.py`](src/timetastic_mcp/server.py) — the shared `FastMCP` instance
  and `get_client()`, the lazily-created API client the tools call.
- [`tools/`](src/timetastic_mcp/tools/) — one module per resource area, each
  registering its tools on the shared server: `absences`, `holidays`, `users`,
  `departments`, `leave_types`, `allowances`, `locked_dates`,
  `public_holidays`, `webhooks`.
- [`main.py`](src/timetastic_mcp/main.py) — entry point (the `timetastic-mcp`
  console script); imports `tools` to register everything, then runs the server.

## Development

Requires Python 3.13+ and [uv](https://docs.astral.sh/uv/).

```bash
uv sync           # create the venv and install the package + dev deps
uv run pytest     # run the test suite
uv run timetastic-mcp   # run the server from your checkout
```

## Notes

- The API is rate limited to 5 requests/second per token (1/second for
  `list_absences`); the client retries once on a `429`.
- Write and admin operations require appropriate permissions on the token's
  user account.

TDQS

A3.6/5.0

Scored across 39 tools

Disambiguation5/5

Each tool targets a distinct resource and action (e.g., book vs approve vs list holidays, CRUD for users, departments, leave types, etc.). Descriptions are clear, and overlapping concepts are differentiated by purpose (e.g., list_absences vs list_holidays).

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (e.g., add_user, get_holiday, delete_leave_type). No mixing of conventions or irregular naming.

Tool Count4/5

At 39 tools, the set is larger than typical but justified by the comprehensive scope of leave management (users, departments, holidays, leave types, public holidays, TOIL, allowances, webhooks). Could be slightly consolidated but remains well-organized.

Completeness5/5

The tool set covers full lifecycle management: CRUD for all entities (users, departments, leave types, locked dates), booking and managing holidays, handling TOIL and allowances, public holidays, and even webhook events. No obvious gaps for the domain.

Maintenance

ActivityStale
ResponsivenessNo issues