Let AI assistants track time, manage projects and clients, run reports and draft invoices in your Tracking Tabs workspace, using the Model Context Protocol.
tta_ and is shown once). The assistant acts as you, with your role, in that token's workspace.Nothing to install. The app serves MCP over Streamable HTTP at https://demo.trackingtabs.com/api/mcp; send your token as a bearer header.
claude mcp add --transport http tracking-tabs https://demo.trackingtabs.com/api/mcp \
--header "Authorization: Bearer tta_YOUR_TOKEN"In ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
{
"mcpServers": {
"tracking-tabs": {
"url": "https://demo.trackingtabs.com/api/mcp",
"headers": { "Authorization": "Bearer tta_YOUR_TOKEN" }
}
}
}Claude Desktop's config file only launches local servers, so bridge to the remote one with mcp-remote (needs Node.js 18+). Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\) and restart Claude:
{
"mcpServers": {
"tracking-tabs": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://demo.trackingtabs.com/api/mcp",
"--header", "Authorization:${TRACKING_TABS_AUTH}"],
"env": { "TRACKING_TABS_AUTH": "Bearer tta_YOUR_TOKEN" }
}
}
}Any other client that supports remote MCP servers with custom headers works the same way.
The same tools as a local process, in the mcp/ folder of the app repository. It is not published to npm yet, so it has to be built from the source repository (Node.js 18+). Most people should use the remote server above.
git clone https://github.com/rebrandstack/tt-app.git
cd tt-app/mcp
pnpm install # or npm install
pnpm build # writes dist/index.jsEnvironment: TRACKING_TABS_TOKEN (required) and TRACKING_TABS_URL (defaults to https://app.trackingtabs.com).
claude mcp add tracking-tabs \
-e TRACKING_TABS_TOKEN=tta_YOUR_TOKEN \
-- node /absolute/path/to/tt-app/mcp/dist/index.js{
"mcpServers": {
"tracking-tabs": {
"command": "node",
"args": ["/absolute/path/to/tt-app/mcp/dist/index.js"],
"env": { "TRACKING_TABS_TOKEN": "tta_YOUR_TOKEN" }
}
}
}27 tools. Projects, clients and tasks can be passed by id or by name. Members see only their own time; admins and owners see the whole workspace. Destructive tools are marked so clients ask before running them.
whoamiread-only
Return the signed-in user (name, email, timezone) and workspace (name, plan, role, whether API access is on).
No parameters.
get_current_timerread-only
Return the running timer with elapsed seconds, or say that no timer is running.
No parameters.
start_timer
Start a timer now. A timer that is already running is stopped first.
| Parameter | Type | Description |
|---|---|---|
| description | string | |
| project_id | string | Project id (takes precedence over project_name) |
| project_name | string | Project name |
| task_id | string | Task id |
| task_name | string | Task name within the project |
| tags | string[] | Tag names; missing tags are created |
| billable | boolean | Defaults to the project's setting |
stop_timer
Stop the running timer and return the finished entry with its duration.
No parameters.
log_entry
Log a completed time entry for a past period. Fails if it overlaps another entry of the same user.
| Parameter | Type | Description |
|---|---|---|
| description* | string | |
| start* | string | ISO 8601 timestamp with offset, e.g. 2026-05-24T14:00:00-05:00 |
| end* | any | |
| project_id | string | Project id (takes precedence over project_name) |
| project_name | string | Project name |
| task_id | string | Task id |
| task_name | string | Task name within the project |
| tags | string[] | |
| billable | boolean |
list_entriesread-only
List time entries, newest first. Members see their own; admins can pass user_id. Returns { data, total, limit, offset }.
| Parameter | Type | Description |
|---|---|---|
| from | string | Entries starting at or after this time |
| to | any | Entries starting before this time |
| project_id | string | Project id (takes precedence over project_name) |
| project_name | string | Project name |
| client_id | string | Client id (takes precedence over client_name) |
| client_name | string | Client name |
| task_id | string | |
| tag | string | Tag name |
| billable | boolean | |
| running | boolean | true = running timers only, false = completed only |
| user_id | string | Admins only |
| limit | integer | Default 50 |
| offset | integer |
get_entryread-only
Fetch one time entry by id.
| Parameter | Type | Description |
|---|---|---|
| id* | string |
update_entry
Change a time entry. Only the fields you pass change; `tags` replaces all tags. Set project_name/project_id to move it, or clear_project to remove the project.
| Parameter | Type | Description |
|---|---|---|
| id* | string | |
| description | string | |
| start | string | ISO 8601 timestamp with offset, e.g. 2026-05-24T14:00:00-05:00 |
| end | any | ISO 8601 timestamp with offset, e.g. 2026-05-24T14:00:00-05:00 |
| project_id | string | Project id (takes precedence over project_name) |
| project_name | string | Project name |
| clear_project | boolean | Remove the project (and task) from the entry |
| task_id | string | Task id |
| task_name | string | Task name within the project |
| tags | string[] | |
| billable | boolean |
delete_entrydestructive
Permanently delete a time entry. Confirm with the user first.
| Parameter | Type | Description |
|---|---|---|
| id* | string |
list_projectsread-only
List projects visible to the user, optionally for one client.
| Parameter | Type | Description |
|---|---|---|
| client_id | string | Client id (takes precedence over client_name) |
| client_name | string | Client name |
| include_archived | boolean |
create_project
Create a project (admins and owners only).
| Parameter | Type | Description |
|---|---|---|
| name* | string | |
| client_id | string | Client id (takes precedence over client_name) |
| client_name | string | Client name |
| color | string | Hex color, e.g. #3B82F6 |
| billable | boolean | |
| hourly_rate | number | |
| currency | string |
update_project
Rename, re-rate, move to another client, or archive/unarchive a project (admins and owners only).
| Parameter | Type | Description |
|---|---|---|
| project_id | string | Project id (takes precedence over project_name) |
| project_name | string | Project name |
| name | string | New name |
| new_client_name | string | |
| new_client_id | string | |
| clear_client | boolean | |
| color | string | |
| billable | boolean | |
| hourly_rate | any | |
| archived | boolean |
list_clientsread-only
List clients in the workspace.
| Parameter | Type | Description |
|---|---|---|
| include_archived | boolean |
create_client
Create a client (admins and owners only).
| Parameter | Type | Description |
|---|---|---|
| name* | string |
update_client
Rename or archive/unarchive a client (admins and owners only).
| Parameter | Type | Description |
|---|---|---|
| client_id | string | Client id (takes precedence over client_name) |
| client_name | string | Client name |
| name | string | New name |
| archived | boolean |
create_tag
Create a tag (returns the existing tag if the name is taken).
| Parameter | Type | Description |
|---|---|---|
| name* | string |
list_tasksread-only
List tasks, optionally for one project.
| Parameter | Type | Description |
|---|---|---|
| project_id | string | Project id (takes precedence over project_name) |
| project_name | string | Project name |
| include_archived | boolean |
create_task
Create a task under a project.
| Parameter | Type | Description |
|---|---|---|
| project_id | string | Project id (takes precedence over project_name) |
| project_name | string | Project name |
| name* | string | |
| estimated_hours | number |
update_task
Rename, re-estimate or archive/unarchive a task.
| Parameter | Type | Description |
|---|---|---|
| id* | string | |
| name | string | |
| estimated_hours | any | |
| archived | boolean |
list_membersread-only
List workspace members with their role (hourly rates are shown to admins only).
No parameters.
generate_reportread-only
Totals (seconds, billable seconds, billable amount) for completed entries in a range, grouped by project, client, user, task, tag or description.
| Parameter | Type | Description |
|---|---|---|
| from* | string | Start of the range (date or timestamp) |
| to* | string | End of the range; a date includes that whole day |
| timezone | string | IANA timezone; defaults to the user's profile timezone |
| project_ids | string[] | |
| project_names | string[] | |
| client_ids | string[] | |
| client_names | string[] | |
| tag_names | string[] | |
| user_ids | string[] | Admins only: limit to these users |
| billable | boolean | true = billable only, false = non-billable only |
| description | string | Substring match on the description |
| group_by | "project" | "client" | "user" | "task" | "tag" | "description" |
detailed_reportread-only
Completed entries in a range with project, client, task, user and amount. Paginated: { data, total, total_seconds, limit, offset }.
| Parameter | Type | Description |
|---|---|---|
| from* | string | Start of the range (date or timestamp) |
| to* | string | End of the range; a date includes that whole day |
| timezone | string | IANA timezone; defaults to the user's profile timezone |
| project_ids | string[] | |
| project_names | string[] | |
| client_ids | string[] | |
| client_names | string[] | |
| tag_names | string[] | |
| user_ids | string[] | Admins only: limit to these users |
| billable | boolean | true = billable only, false = non-billable only |
| description | string | Substring match on the description |
| limit | integer | Default 100 |
| offset | integer |
weekly_reportread-only
Seconds per day for each project or user over a range of up to 92 days.
| Parameter | Type | Description |
|---|---|---|
| from* | string | Start of the range (date or timestamp) |
| to* | string | End of the range; a date includes that whole day |
| timezone | string | IANA timezone; defaults to the user's profile timezone |
| project_ids | string[] | |
| project_names | string[] | |
| client_ids | string[] | |
| client_names | string[] | |
| tag_names | string[] | |
| user_ids | string[] | Admins only: limit to these users |
| billable | boolean | true = billable only, false = non-billable only |
| description | string | Substring match on the description |
| group_by | "project" | "user" |
list_invoicesread-only
List invoices, optionally by status or client.
| Parameter | Type | Description |
|---|---|---|
| status | "draft" | "sent" | "paid" | "void" | |
| client_id | string | Client id (takes precedence over client_name) |
| client_name | string | Client name |
| limit | integer | |
| offset | integer |
get_invoiceread-only
Fetch one invoice with its line items and totals (amounts are in cents).
| Parameter | Type | Description |
|---|---|---|
| id* | string |
create_invoice_from_entries
Create a draft invoice from billable, completed time in a date range, one line per project and rate. Pass a client to limit it to that client's projects. Nothing is emailed.
| Parameter | Type | Description |
|---|---|---|
| client_id | string | Client id (takes precedence over client_name) |
| client_name | string | Client name |
| from* | string | A date (YYYY-MM-DD, whole day in the report timezone) or an ISO 8601 timestamp |
| to* | any | |
| due_date | string | YYYY-MM-DD; defaults to the workspace payment terms |
| notes | string |
workspace://info — The signed-in user and workspace (plan, role, timezone).timer://current — The running timer with elapsed seconds, or null.TRACKING_TABS_TOKEN; the error is printed to stderr (your client's MCP log).