Tools in this category
| Tool | Mutating | Description |
|---|---|---|
list_time_entries |
no | List time-tracker entries with optional filters (status, taskDisplayId, projectDisplayId, date range, free-text search). |
aggregate_time_entries |
no | Aggregate total tracked time over a filter set. Returns { totalSeconds, entryCount } and an optional groups breakdown when groupBy is set. Each entry is counted exactly once in the headline totals, even when it links to multiple tasks. With groupBy=task, project or tag, an entry that links to N of them contributes its full duration to EACH bucket AND is counted in each bucket's entryCount, so BOTH groups[].totalSeconds and groups[].entryCount can legitimately sum to more than the headline figures. With groupBy=day, each bucket key is a YYYY-MM-DD calendar day in the USER's configured timezone, so the days match what they see in the tracker; a bare YYYY-MM-DD endDate covers that whole day, also in their timezone. This tool deliberately differs from GET /time-entries/insights over the same range, in two ways: it INCLUDES running entries, counted up to "now", and it clamps each entry to the requested window so one crossing a bound contributes only its in-window slice — insights covers finished entries only and attributes each one whole to its start day. Expect the two to disagree; neither is wrong. |
get_time_entry |
no | Fetch a single time entry by ID, including its start/end timestamps, status, linked tasks, and tags. |
create_time_entry |
yes | Log a time entry with an explicit start (and usually end) — the way to record work already done, or to import a timesheet. Omit endTime to create a RUNNING entry that began in the past; supply it for a completed one. A completed entry may not overlap another, including the live one. Use start_time_session instead to start tracking from now. |
start_time_session |
yes | Start a new RUNNING time session. Any other running session for this user is auto-stopped at the new session's start time. Optionally name it, link it to one or more tasks, or attach tags. A single entry counts once toward totals regardless of how many tasks it links. |
resume_last_time_session |
yes | Start a new RUNNING entry copying name, linked tasks, and tags from the most recent FINISHED entry. Throws if no prior entry exists. |
update_time_entry |
yes | Update a time entry. Only supplied fields change. Switching status to RUNNING auto-stops any other running entry for this user at the new entry’s start time, the same as start_time_session. |
bulk_update_time_entries |
yes | Apply per-id partial updates to many time entries in one call. Covers bulk rename (set name), bulk retag (set tags), task relinking (set taskDisplayId, or pass an empty string to detach) and startTime/endTime/status edits. |
delete_time_entry |
yes | Delete a time entry by ID. The original input is preserved in the MCP audit trail. |
bulk_delete_time_entries |
yes | Delete many time entries in one call. Prefer this over looping delete_time_entry; each id is logged separately in the audit trail. |
list_time_entries
Mutating: no
List time-tracker entries with optional filters (status, taskDisplayId, projectDisplayId, date range, free-text search).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
page |
integer | no | Page number (default: 1). |
limit |
integer | no | Items per page (default: 20, max: 50). |
status |
string (running | finished) |
no | Filter by status |
taskDisplayId |
string | no | Filter by task display ID |
projectDisplayId |
string | no | Filter by task's project display ID |
startDate |
string | no | ISO 8601 lower bound on startTime |
endDate |
string | no | ISO 8601 upper bound on startTime |
search |
string | no | Search in name, task name, project name, and tag names |
sortBy |
string (name | startTime | endTime | status | createdAt | updatedAt) |
no | Field to sort by |
sortOrder |
string (asc | desc) |
no | Sort direction; defaults to asc. |
aggregate_time_entries
Mutating: no
Aggregate total tracked time over a filter set. Returns { totalSeconds, entryCount } and an optional groups breakdown when groupBy is set. Each entry is counted exactly once in the headline totals, even when it links to multiple tasks. With groupBy=task, project or tag, an entry that links to N of them contributes its full duration to EACH bucket AND is counted in each bucket's entryCount, so BOTH groups[].totalSeconds and groups[].entryCount can legitimately sum to more than the headline figures. With groupBy=day, each bucket key is a YYYY-MM-DD calendar day in the USER's configured timezone, so the days match what they see in the tracker; a bare YYYY-MM-DD endDate covers that whole day, also in their timezone. This tool deliberately differs from GET /time-entries/insights over the same range, in two ways: it INCLUDES running entries, counted up to "now", and it clamps each entry to the requested window so one crossing a bound contributes only its in-window slice — insights covers finished entries only and attributes each one whole to its start day. Expect the two to disagree; neither is wrong.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
status |
string (running | finished) |
no | Filter by status (running or finished). |
taskDisplayId |
string | no | Filter by task display ID. |
projectDisplayId |
string | no | Filter by task's project display ID. |
startDate |
string | no | ISO 8601 lower bound on startTime |
endDate |
string | no | ISO 8601 upper bound on startTime |
search |
string | no | Search in name, task name, project name, tags. |
groupBy |
string (task | project | tag | day) |
no | Optional dimension to group totals by |
get_time_entry
Mutating: no
Fetch a single time entry by ID, including its start/end timestamps, status, linked tasks, and tags.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | Time entry ID |
create_time_entry
Mutating: yes
Log a time entry with an explicit start (and usually end) — the way to record work already done, or to import a timesheet. Omit endTime to create a RUNNING entry that began in the past; supply it for a completed one. A completed entry may not overlap another, including the live one. Use start_time_session instead to start tracking from now.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
startTime |
string | yes | ISO 8601 timestamp the work began. |
endTime |
string | no | ISO 8601 timestamp the work ended. Omit to leave the entry running from startTime. |
name |
string | no | Optional entry name. |
taskDisplayIds |
array | no | Optional task display IDs to associate (e.g. ["T-7", "T-9"]). A time entry can link to multiple tasks; the entry still counts once toward totals. |
tags |
array | no | Tag names to attach. |
start_time_session
Mutating: yes
Start a new RUNNING time session. Any other running session for this user is auto-stopped at the new session's start time. Optionally name it, link it to one or more tasks, or attach tags. A single entry counts once toward totals regardless of how many tasks it links.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
name |
string | no | Optional session name |
taskDisplayIds |
array | no | Optional task display IDs to associate (e.g. ["T-7", "T-9"]). A time entry can link to multiple tasks; the entry still counts once toward totals. |
tags |
array | no | Tag names to attach |
resume_last_time_session
Mutating: yes
Start a new RUNNING entry copying name, linked tasks, and tags from the most recent FINISHED entry. Throws if no prior entry exists.
Parameters
No parameters.
update_time_entry
Mutating: yes
Update a time entry. Only supplied fields change. Switching status to RUNNING auto-stops any other running entry for this user at the new entry’s start time, the same as start_time_session.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | Time entry ID |
name |
string | no | Display name for the session. |
taskDisplayIds |
array | no | Full set of task display IDs to link; replaces existing task links. Pass [] to unlink from all tasks. Use link_time_entry_to_tasks / unlink_time_entry_from_task for incremental changes. |
tags |
array | no | Full tag set; replaces existing tags. |
startTime |
string | no | ISO 8601 |
endTime |
string | no | ISO 8601 |
status |
string (running | finished) |
no | Entry status (running or finished). |
bulk_update_time_entries
Mutating: yes
Apply per-id partial updates to many time entries in one call. Covers bulk rename (set name), bulk retag (set tags), task relinking (set taskDisplayId, or pass an empty string to detach) and startTime/endTime/status edits.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
updates |
array | yes | Per-id patches |
Items of updates:
id(string) — Time entry ID to update.data(object) — Partial fields — same as update_time_entry input (minus id) for name/tags/startTime/endTime/status/taskDisplayId. Setting taskDisplayId REPLACES the entry's whole task link set; an empty string detaches every task. Use link_time_entry_to_tasks/unlink_time_entry_from_task to add or drop one link without touching the rest.
delete_time_entry
Mutating: yes
Delete a time entry by ID. The original input is preserved in the MCP audit trail.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
id |
string | yes | Time entry ID |
bulk_delete_time_entries
Mutating: yes
Delete many time entries in one call. Prefer this over looping delete_time_entry; each id is logged separately in the audit trail.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
ids |
array | yes | Time entry IDs to delete |