Skip to main content
Glama
drytrix-timetracker-mcp

drytrix-timetracker-mcp

Official
by fzl-jeroen

drytrix-timetracker-mcp

A Model Context Protocol (MCP) server for DRYTRIX/TimeTracker — the self-hosted, open-source time-tracking app. It exposes your tracked hours, projects, and reports as MCP tools over TimeTracker's stable /api/v1 REST API, so any MCP client (OpenCode, Claude Desktop, …) can query your time data in natural language.

It is configured entirely through environment variables; nothing is baked in.

Requirements

  • Python 3.11+

  • A running TimeTracker instance (tested on v5.13.4; targets v5.13+)

  • An API token created in TimeTracker under Admin → Security & Access → Api-tokens

read:time_entries, read:projects, read:reports, read:clients, read:tasks — or simply read:* to grant all read access in one checkbox.

whoami and per-user scoping need read:users. On instances that do not list that scope, read:* covers it — the app treats read:* as matching any read:<resource>. Add write:time_entries only if you enable the write tools. Missing scopes degrade gracefully: a tool that lacks its scope returns a clear 403 naming the scope.

Related MCP server: Clockify Time Tracking

Install & run

uvx drytrix-timetracker-mcp

or install it:

uv tool install drytrix-timetracker-mcp

Configuration

Environment variables (a local .env in the working directory is also read):

Variable

Required

Default

Meaning

TT_BASE_URL

yes

—

Instance root, e.g. https://time.example.com

TIMETRACKER_API_KEY

yes

—

API token (tt_…); TT_API_TOKEN is an alias

TT_TIMEOUT

no

30

Per-request timeout (seconds)

TT_VERIFY_SSL

no

true

Verify TLS certificates

TT_ENABLE_WRITE

no

false

Register the write tools

TT_PER_PAGE

no

100

Page size for paginated reads

MCP client config

{
  "mcpServers": {
    "timetracker": {
      "command": "uvx",
      "args": ["drytrix-timetracker-mcp"],
      "env": {
        "TT_BASE_URL": "https://time.example.com",
        "TIMETRACKER_API_KEY": "tt_your_token_here"
      }
    }
  }
}

Tools

Read (always available)

Tool

Scope

What it does

api_info

—

API version, timezone, enabled modules

whoami

read:users

The user the token authenticates as

list_projects

read:projects

List projects

list_time_entries

read:time_entries

Time entries in a date range

get_hours_summary

read:reports

Total/billable hours + per-project breakdown

hours_by_day

read:time_entries

Per-day hours — the authoritative hours figure

list_clients

read:clients

List clients

list_tasks

read:tasks

List tasks

search

read:projects

Global search

timer_status

read:time_entries

The active timer

Write (only when TT_ENABLE_WRITE=true, scope write:time_entries)

start_timer, stop_timer, pause_timer, resume_timer, create_time_entry

Notes

  • hours_by_day is preferred over get_hours_summary. TimeTracker's /reports/summary treats a date-only end_date as midnight and silently drops the final day; this server normalizes ranges and computes hours_by_day directly from time entries, so the two can disagree. hours_by_day is right.

  • Aggregates are scoped to the token's own user. Without the read:users scope the user cannot be resolved, and the result carries a note that it may span users.

  • Endpoints that don't exist on your version return a clear error rather than a stack trace.

License

MIT

Available Tools

10 tools
api_infoA

Get the TimeTracker API version, timezone, and enabled modules (no auth).

NameRequiredDescriptionDefault

No parameters

get_hours_summaryC

Total and billable hours plus per-project breakdown (needs read:reports).

NameRequiredDescriptionDefault
user_idNo
end_dateYes
project_idNo
start_dateYes
hours_by_dayB

Per-day hours from time entries, the authoritative hours source (needs read:time_entries).

NameRequiredDescriptionDefault
user_idNo
end_dateYes
project_idNo
start_dateYes
list_clientsA

List clients (needs read:clients).

NameRequiredDescriptionDefault

No parameters

list_projectsC

List projects (needs read:projects).

NameRequiredDescriptionDefault
statusNo
client_idNo
list_tasksC

List tasks (needs read:tasks).

NameRequiredDescriptionDefault
statusNo
project_idNo
list_time_entriesC

List time entries in a date range (needs read:time_entries).

NameRequiredDescriptionDefault
user_idNo
billableNo
end_dateNo
project_idNo
start_dateNo
include_activeNo
timer_statusA

Get the active timer for the token's user (needs read:time_entries).

NameRequiredDescriptionDefault

No parameters

whoamiA

Get the user this token authenticates as (needs read:users).

NameRequiredDescriptionDefault

No parameters

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.1.0
    • First observedapi_info
    • First observedget_hours_summary
    • First observedhours_by_day
    • First observedlist_clients
    • First observedlist_projects
    • First observedlist_tasks
    • First observedlist_time_entries
    • First observedsearch
    • First observedtimer_status
    • First observedwhoami

TDQS

B3.1/5.0

Scored across 10 tools

Disambiguation4/5

Most tools target clearly distinct resources: clients, projects, tasks, users, timer status, and API metadata. The one genuine overlap is get_hours_summary vs hours_by_day, both reporting hours, though the descriptions clarify that one is a billable/total rollup and the other is the authoritative per-day source. search also lightly overlaps with the list_* tools but is framed as a cross-entity search.

Naming Consistency3/5

Five tools follow a clean list_noun pattern (list_projects, list_clients, list_tasks, list_time_entries), but the rest deviate: bare nouns (whoami, api_info, timer_status), a bare verb (search), a get_ prefix (get_hours_summary), and a noun_phrase (hours_by_day). The names are individually readable but there is no single predictable convention an agent can rely on.

Tool Count5/5

Ten tools is well within the sweet spot for a time-tracking server, and each covers a distinct slice of the domain (metadata, identity, projects, clients, tasks, entries, summaries, timer, search). Nothing feels padded or redundant in count.

Completeness2/5

The surface is entirely read-only: there is no way to start/stop a timer, log or edit a time entry, or create projects/tasks/clients, even though timer_status implies an active-timer lifecycle exists. For a time tracker, the inability to record time is a significant gap that will block common agent workflows.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers