MCP Server

Let AI assistants track time, manage projects and clients, run reports and draft invoices in your Tracking Tabs workspace, using the Model Context Protocol.

Before you start

  • A personal access token: open Settings → API Tokens, create a token and copy it (it starts with tta_ and is shown once). The assistant acts as you, with your role, in that token's workspace.
  • A Solo, Team or Business plan (the MCP server uses the API).

Option 1: remote server (recommended)

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 Code

claude mcp add --transport http tracking-tabs https://demo.trackingtabs.com/api/mcp \
  --header "Authorization: Bearer tta_YOUR_TOKEN"

Cursor

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

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.

Option 2: local server (stdio)

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.js

Environment: TRACKING_TABS_TOKEN (required) and TRACKING_TABS_URL (defaults to https://app.trackingtabs.com).

Claude Code

claude mcp add tracking-tabs \
  -e TRACKING_TABS_TOKEN=tta_YOUR_TOKEN \
  -- node /absolute/path/to/tt-app/mcp/dist/index.js

Claude Desktop / Cursor

{
  "mcpServers": {
    "tracking-tabs": {
      "command": "node",
      "args": ["/absolute/path/to/tt-app/mcp/dist/index.js"],
      "env": { "TRACKING_TABS_TOKEN": "tta_YOUR_TOKEN" }
    }
  }
}

Tools

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.

ParameterTypeDescription
descriptionstring
project_idstringProject id (takes precedence over project_name)
project_namestringProject name
task_idstringTask id
task_namestringTask name within the project
tagsstring[]Tag names; missing tags are created
billablebooleanDefaults 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.

ParameterTypeDescription
description*string
start*stringISO 8601 timestamp with offset, e.g. 2026-05-24T14:00:00-05:00
end*any
project_idstringProject id (takes precedence over project_name)
project_namestringProject name
task_idstringTask id
task_namestringTask name within the project
tagsstring[]
billableboolean

list_entriesread-only

List time entries, newest first. Members see their own; admins can pass user_id. Returns { data, total, limit, offset }.

ParameterTypeDescription
fromstringEntries starting at or after this time
toanyEntries starting before this time
project_idstringProject id (takes precedence over project_name)
project_namestringProject name
client_idstringClient id (takes precedence over client_name)
client_namestringClient name
task_idstring
tagstringTag name
billableboolean
runningbooleantrue = running timers only, false = completed only
user_idstringAdmins only
limitintegerDefault 50
offsetinteger

get_entryread-only

Fetch one time entry by id.

ParameterTypeDescription
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.

ParameterTypeDescription
id*string
descriptionstring
startstringISO 8601 timestamp with offset, e.g. 2026-05-24T14:00:00-05:00
endanyISO 8601 timestamp with offset, e.g. 2026-05-24T14:00:00-05:00
project_idstringProject id (takes precedence over project_name)
project_namestringProject name
clear_projectbooleanRemove the project (and task) from the entry
task_idstringTask id
task_namestringTask name within the project
tagsstring[]
billableboolean

delete_entrydestructive

Permanently delete a time entry. Confirm with the user first.

ParameterTypeDescription
id*string

list_projectsread-only

List projects visible to the user, optionally for one client.

ParameterTypeDescription
client_idstringClient id (takes precedence over client_name)
client_namestringClient name
include_archivedboolean

create_project

Create a project (admins and owners only).

ParameterTypeDescription
name*string
client_idstringClient id (takes precedence over client_name)
client_namestringClient name
colorstringHex color, e.g. #3B82F6
billableboolean
hourly_ratenumber
currencystring

update_project

Rename, re-rate, move to another client, or archive/unarchive a project (admins and owners only).

ParameterTypeDescription
project_idstringProject id (takes precedence over project_name)
project_namestringProject name
namestringNew name
new_client_namestring
new_client_idstring
clear_clientboolean
colorstring
billableboolean
hourly_rateany
archivedboolean

list_clientsread-only

List clients in the workspace.

ParameterTypeDescription
include_archivedboolean

create_client

Create a client (admins and owners only).

ParameterTypeDescription
name*string

update_client

Rename or archive/unarchive a client (admins and owners only).

ParameterTypeDescription
client_idstringClient id (takes precedence over client_name)
client_namestringClient name
namestringNew name
archivedboolean

list_tagsread-only

List all tags in the workspace.

No parameters.

create_tag

Create a tag (returns the existing tag if the name is taken).

ParameterTypeDescription
name*string

list_tasksread-only

List tasks, optionally for one project.

ParameterTypeDescription
project_idstringProject id (takes precedence over project_name)
project_namestringProject name
include_archivedboolean

create_task

Create a task under a project.

ParameterTypeDescription
project_idstringProject id (takes precedence over project_name)
project_namestringProject name
name*string
estimated_hoursnumber

update_task

Rename, re-estimate or archive/unarchive a task.

ParameterTypeDescription
id*string
namestring
estimated_hoursany
archivedboolean

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.

ParameterTypeDescription
from*stringStart of the range (date or timestamp)
to*stringEnd of the range; a date includes that whole day
timezonestringIANA timezone; defaults to the user's profile timezone
project_idsstring[]
project_namesstring[]
client_idsstring[]
client_namesstring[]
tag_namesstring[]
user_idsstring[]Admins only: limit to these users
billablebooleantrue = billable only, false = non-billable only
descriptionstringSubstring 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 }.

ParameterTypeDescription
from*stringStart of the range (date or timestamp)
to*stringEnd of the range; a date includes that whole day
timezonestringIANA timezone; defaults to the user's profile timezone
project_idsstring[]
project_namesstring[]
client_idsstring[]
client_namesstring[]
tag_namesstring[]
user_idsstring[]Admins only: limit to these users
billablebooleantrue = billable only, false = non-billable only
descriptionstringSubstring match on the description
limitintegerDefault 100
offsetinteger

weekly_reportread-only

Seconds per day for each project or user over a range of up to 92 days.

ParameterTypeDescription
from*stringStart of the range (date or timestamp)
to*stringEnd of the range; a date includes that whole day
timezonestringIANA timezone; defaults to the user's profile timezone
project_idsstring[]
project_namesstring[]
client_idsstring[]
client_namesstring[]
tag_namesstring[]
user_idsstring[]Admins only: limit to these users
billablebooleantrue = billable only, false = non-billable only
descriptionstringSubstring match on the description
group_by"project" | "user"

list_invoicesread-only

List invoices, optionally by status or client.

ParameterTypeDescription
status"draft" | "sent" | "paid" | "void"
client_idstringClient id (takes precedence over client_name)
client_namestringClient name
limitinteger
offsetinteger

get_invoiceread-only

Fetch one invoice with its line items and totals (amounts are in cents).

ParameterTypeDescription
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.

ParameterTypeDescription
client_idstringClient id (takes precedence over client_name)
client_namestringClient name
from*stringA date (YYYY-MM-DD, whole day in the report timezone) or an ISO 8601 timestamp
to*any
due_datestringYYYY-MM-DD; defaults to the workspace payment terms
notesstring

Resources

  • workspace://info — The signed-in user and workspace (plan, role, timezone).
  • timer://current — The running timer with elapsed seconds, or null.

Example prompts

  • "Start a timer on the Website project: homepage copy review."
  • "Log 90 minutes yesterday from 2pm on Acme / Design, billable, tagged meeting."
  • "How many hours did each person log last week? Group by user."
  • "Show this week as a timesheet by project."
  • "Draft an invoice for Acme for everything billable in September."
  • "Archive the Q2 Retainer project."

Troubleshooting

401 unauthorized
The token is wrong, revoked or expired, or you were removed from the workspace. Create a new token.
403 feature_gated
The workspace is on the Free plan; API and MCP access need Solo or higher.
403 forbidden on create/update project or client
Those actions need the admin or owner role in the workspace.
409 conflict when starting a timer
Your timer is running in another workspace. Stop it there first (one running timer per person).
Rate limited
Each token gets 600 API requests per hour; the remote server counts one request per MCP message.
Local server exits immediately
Set TRACKING_TABS_TOKEN; the error is printed to stderr (your client's MCP log).
MCP server | Tracking Tabs