# Toggl 2.0 (npm · @togglhq/mcp)

Toggl 2.0 MCP server for tasks, projects, time entries, and workspace operations.

- Trust score: 20/100 (low)
- Change this week: −37
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `@togglhq/mcp`: 20/100 (this document), [markdown](https://verifymcp.io/servers/toggl-toggl-mcp/togglhq-mcp.md), [page](https://verifymcp.io/servers/toggl-toggl-mcp/togglhq-mcp)

## Channel facts

- Registry: `npm`
- Package: `@togglhq/mcp`
- Version: `1.5.72`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 63/100
  - No malware found by supply-chain analysis.
  - CVE data not yet available for this package.
  - No install/post-install scripts declared.
  - Dependency-health data not yet available.
- **Provenance & Transparency**: 6/100
  - Repository check failed: no source repository is declared.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: the license (UNLICENSED) isn't a recognized OSI-approved license.
  - Actively maintained (last published 0 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 0/100
  - Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet.
- **Capabilities**: 0/100
  - Protocol version not yet verified: we do not have a sandbox capture of the MCP handshake this version of the package performs yet.

**Unverified: 4 categories.** Categories scored 0 because our sandbox run of this package has not given us the schema these checks need to read. That is a gap on our side rather than a finding about the package, and we only credit what we can confirm, so the score stands at 0 until the capture succeeds. We are working through the fleet, so this normally clears without any action from you.

## Install

### Claude

```bash
claude mcp add toggl-toggl-mcp -- npx -y @togglhq/mcp
```

### Codex

```bash
codex mcp add toggl-toggl-mcp -- npx -y @togglhq/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "toggl-toggl-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@togglhq/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add toggl-toggl-mcp --command npx --arg -y --arg @togglhq/mcp
```

### Hermes

```yaml
mcp_servers:
  toggl-toggl-mcp:
    command: "npx"
    args: ["-y", "@togglhq/mcp"]
```

### Other

```json
{
  "mcpServers": {
    "toggl-toggl-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@togglhq/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 20, −33)

- [security regression] Known CVEs: pass → unverified
- [security regression] Stability: 0.20 → unverified
- [functional regression] Dependency health: 1.00 → 0.00
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Dependency health: 1.00 → unverified
- [functional] Package version: 1.5.71 → 1.5.72

### 2026-08-02 (score 53, +19)

- [security improvement] Malware scan: unverified → pass
- [functional improvement] Schema quality: unverified → fair

### 2026-08-01 (score 34, +18)

- [functional regression] Schema quality: fair → unverified
- [functional improvement] Stability: unverified → 0.17
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] Package version: 1.5.69 → 1.5.71

### 2026-07-31 (score 16, −23)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-28 (score 39, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-27 (score 57, +20)

- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Tool coverage: 65
- [functional] First check of Schema quality: fair
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: fail

### 2026-07-26 (score 37)

First indexed and scored.

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

## MCP tools (41)

### `workspace-list` (~41 tokens)

List Workspaces

List workspaces for the active MCP profile. Pass refresh: true to refetch from Accounts when a workspace is missing from cache.

Input parameters:

- `refresh` (boolean)

### `workspace-switch` (~44 tokens)

Switch Workspace

Switch the active workspace by updating the stored configuration. The new workspace takes effect on the next tool call. Use workspace-list to see available workspace IDs.

Input parameters:

- `workspace_id` (required)

### `profile-list` (~47 tokens)

List MCP profiles

List saved credential profiles from ~/.toggl/focus-tools.json. The row where active is true is the MCP active profile (active.mcp). Profiles may be shared with the Toggl CLI.

### `profile-switch` (~41 tokens)

Switch MCP profile

Set active.mcp to an existing profile name so subsequent entity calls use that credential row.

Input parameters:

- `profile_name` (string, required): Profile key as shown by profile-list

### `profile-remove` (~124 tokens)

Remove saved profile

Delete a profile row from ~/.toggl/focus-tools.json. If it was the MCP active profile, active.mcp moves to another remaining profile when possible. This affects both MCP and shared storage; removing a profile used by the CLI removes it for the CLI too. Destructive: call without confirm_token first to receive confirm_required + confirm_token, then repeat with the same profile_name and confirm_token (same pattern as entity mutations).

Input parameters:

- `confirm_token` (string): Mutation confirmation token from previous call
- `profile_name` (string, required): Profile key as shown by profile-list

### `auth` (~90 tokens)

Authenticate MCP

Authenticate this MCP server with Toggl 2.0 via OAuth. Opens browser login and stores credentials locally. Optionally pass workspace_id to pick a specific workspace when multiple are available.

Input parameters:

- `accounts_api_url` (string): Optional accounts API URL override (defaults from ENV or production)
- `focus_api_url` (string): Optional focus API URL override (defaults from ENV or production)
- `workspace_id`

### `logout` (~24 tokens)

Logout MCP

Clear local MCP authentication state. Removes stored credentials so subsequent tool calls require auth again.

### `alerts` (~233 tokens)

Alerts

Manage Focus alerts with the following actions:

\- **create**: Create Alerts. (data: payload*)
\- **delete**: Delete Alerts. (data: alert_id*)
\- **get**: Get Alerts. (data: alert_id*)
\- **list**: List Alerts. (data: rule_type, project_id, scope)
\- **partial-update**: Partial Update Alerts. (data: alert_id*, payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create, delete, get, list, partial-update
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `audit-log` (~154 tokens)

Audit-log

Manage Focus audit-log with the following actions:

\- **list**: List Audit Log. (data: action, entity_id, entity_type, export, export_, from*, page_number, page_size, to*, user_id)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (required)
- `confirm_token` (string): Mutation confirmation token from previous call
- `data` (object)
- `dry_run` (boolean)

### `capacities` (~162 tokens)

Capacities

Manage Focus capacities with the following actions:

\- **get-computations**: Compute user or ghost capacity for a date range. (data: end_date*, ghost_id*, group*, include_drafts*, private_*, start_date*, task_source*, unit*, user_id*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (required)
- `confirm_token` (string): Mutation confirmation token from previous call
- `data` (object)
- `dry_run` (boolean)

### `clients` (~266 tokens)

Clients

Manage Focus clients with the following actions:

\- **create**: Create Clients. (data: name*)
\- **delete**: Delete Clients. (data: client_id*)
\- **get**: Get Clients. (data: client_id*)
\- **list**: List Clients. Clients group billable work; projects can reference client_id. Filter projects with projects.list --client-id. (data: name, page, per_page)
\- **restore**: Restore Clients. (data: client_id*)
\- **update**: Update Clients. (data: client_id*, payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create, delete, get, list, restore, update
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `projects` (~1611 tokens)

Projects

Manage Focus projects with the following actions:

\- **create-project**: Create a project with related data such as members, milestones, rates, and billable rates. (data: payload*)
\- **add-project-members**: Add Project Members Projects. (data: payload*, project_id*)
\- **archive**: Archive Projects. (data: project_id*)
\- **attachments-bulk-create**: Attachments Bulk Create Projects. Uploads several local files in one call. names and display_orders are optional parallel arrays; they default to the file basenames and array positions. (data: project_id*, file_paths*, names, display_orders)
\- **attachments-create**: Attachments Create Projects. Uploads a local file (file_path) as an attachment. The mime type is inferred from the extension and the API rejects disallowed types; uploads are capped at 20 MB. (data: project_id*, file_path*, name, display_order)
\- **attachments-delete**: Attachments Delete Projects. (data: attachment_id*, project_id*)
\- **attachments-list**: Attachments List Projects. Lists attachment metadata. Upload files with attachments-create (file_path), download with attachments-view (save_to). (data: order_by, project_id*)
\- **attachments-update**: Attachments Update Projects. Full update (PUT): both name and display_order are required; the response body is empty, verify via attachments-list. (data: attachment_id*, payload*, project_id*)
\- **attachments-view**: Attachments View Projects. Downloads the attachment's binary content to a local path (save_to). Refuses to replace an existing file unless overwrite is true. (data: project_id*, attachment_id*, save_to*, overwrite)
\- **bulk-archive**: Bulk Archive Projects. (data: project_ids*)
\- **bulk-delete**: Bulk Delete Projects. Deletes all listed project IDs in one HTTP call. (data: ids*)
\- **bulk-patch**: Bulk Patch Projects. Prefer over many project updates: JSON array of { id: projectId, ...partial fields } matching single-project patch fields. (data: array payload)
\- **bulk-restore**: Bulk Restore P…

Input parameters:

- `action` (string, required): One of: create-project, add-project-members, archive, attachments-bulk-create, attachments-create, attachments-delete, attachments-list, attachments-update, attachments-view, bulk-archive, bulk-delet…
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `tasks` (~1824 tokens)

Tasks

Manage Focus tasks with the following actions:

\- **create-task**: Create a task with related data such as subtasks, time blocks, and an initial time entry. (data: payload*)
\- **archive**: Archive Tasks. (data: from_recurring_task_id, task_id*)
\- **attachments-bulk-create**: Attachments Bulk Create Tasks. Uploads several local files in one call. names and display_orders are optional parallel arrays; they default to the file basenames and array positions. (data: task_id*, file_paths*, names, display_orders)
\- **attachments-create**: Attachments Create Tasks. Uploads a local file (file_path) as an attachment. The mime type is inferred from the extension and the API rejects disallowed types; uploads are capped at 20 MB. (data: task_id*, file_path*, name, display_order)
\- **attachments-delete**: Attachments Delete Tasks. (data: attachment_id*, task_id*)
\- **attachments-list**: Attachments List Tasks. Lists attachment metadata. Upload files with attachments-create (file_path), download with attachments-view (save_to). (data: order_by, task_id*)
\- **attachments-update**: Attachments Update Tasks. Full update (PUT): both name and display_order are required; the response body is empty, verify via attachments-list. (data: attachment_id*, payload*, task_id*)
\- **attachments-view**: Attachments View Tasks. Downloads the attachment's binary content to a local path (save_to). Refuses to replace an existing file unless overwrite is true. (data: task_id*, attachment_id*, save_to*, overwrite)
\- **bulk-archive**: Bulk Archive Tasks. (data: task_ids*)
\- **bulk-create**: Bulk Create Tasks. (data: tasks*)
\- **bulk-delete**: Bulk Delete Tasks. Deletes all listed task IDs in one HTTP call. Requires confirm flow like single delete. (data: ids*, outbound_sync)
\- **bulk-duplicate**: Bulk Duplicate Tasks. (data: cascade_duplicate_children*, task_ids*)
\- **bulk-patch**: Bulk Patch Tasks. Prefer over many single updates: pass a JSON array of { id: taskId, ...partial fields }. Same field names…

Input parameters:

- `action` (string, required): One of: create-task, archive, attachments-bulk-create, attachments-create, attachments-delete, attachments-list, attachments-update, attachments-view, bulk-archive, bulk-create, bulk-delete, bulk-dup…
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `custom-fields` (~547 tokens)

Custom-fields

Manage Focus custom-fields with the following actions:

\- **create**: Create Custom Fields. Requires workspace admin (403 otherwise). field_type is one of select, multi_select, text, number, date, checkbox, users; select/multi_select fields can be seeded with options inline. (data: payload*)
\- **delete**: Delete Custom Fields. Requires workspace admin. Soft-deletes the field and removes it from entities; this also discards stored values. (data: custom_field_id*)
\- **get**: Get Custom Fields. (data: custom_field_id*)
\- **list**: List Custom Fields. Custom fields are workspace-level definitions attached to project or task entities. Reads work for all members; create/update/delete return 403 for non-admins. Reordering fields is not available through this tool yet. (data: entity_type, order_by, page, per_page)
\- **options-create**: Options Create Custom Fields. Requires workspace admin. Only valid for select and multi_select fields. (data: custom_field_id*, payload*)
\- **options-delete**: Options Delete Custom Fields. Requires workspace admin. Deleting an option clears it from entities that have it selected. (data: custom_field_id*, option_id*)
\- **options-list**: Options List Custom Fields. (data: custom_field_id*, name, order_by, page, per_page)
\- **options-update**: Options Update Custom Fields. Requires workspace admin. Full update (PUT) of the option's name/color/description. (data: custom_field_id*, option_id*, payload*)
\- **update**: Update Custom Fields. Requires workspace admin. Full update (PUT) of name/description only; field_type and entity_type are immutable. Manage options via the options-* actions. (data: custom_field_id*, payload*)
\- **update-order**: Update Order Custom Fields. (data: payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input…

Input parameters:

- `action` (string, required): One of: create, delete, get, list, options-create, options-delete, options-list, options-update, update, update-order
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `goals` (~224 tokens)

Goals

Manage Focus goals with the following actions:

\- **create**: Create Goals. (data: payload*)
\- **delete**: Delete Goals. (data: goal_id*)
\- **get**: Get Goals. (data: goal_id*)
\- **list**: List Goals. (data: none)
\- **update**: Update Goals. (data: goal_id*, payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create, delete, get, list, update
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `milestones` (~327 tokens)

Milestones

Manage Focus milestones with the following actions:

\- **create**: Create Milestones. (data: payload*)
\- **delete**: Delete Milestones. (data: milestone_id*)
\- **get**: Get Milestones. (data: milestone_id*)
\- **get-classic**: Get Classic Milestones. (data: due_date_from, due_date_to, order_by, page, per_page, project_id, team_id)
\- **get-stream**: Get Stream Milestones. (data: due_date_from, due_date_to, order_by, project_id, team_id)
\- **partial-update**: Partial Update Milestones. (data: milestone_id*, payload*)
\- **restore**: Restore Milestones. (data: milestone_id*)
\- **update**: Update Milestones. (data: milestone_id*, payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create, delete, get, get-classic, get-stream, partial-update, restore, update
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `organization` (~316 tokens)

Organization

Manage Focus organization with the following actions:

\- **create-group**: Create an organization group. (data: payload*)
\- **delete-group**: Delete an organization group. (data: group_id*)
\- **get-my-groups**: List organization groups for the current user. (data: none)
\- **get-roles**: List organization roles. (data: none)
\- **get-teams**: List organization teams. (data: filter*, group_ids*, organization_user_id*, page*, per_page*, sort_dir*, workspace_id*)
\- **update-group**: Update an organization group. (data: group_id*, payload*)
\- **update-group-user-role**: Update Group User Role Organization. (data: group_id*, payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create-group, delete-group, get-my-groups, get-roles, get-teams, update-group, update-group-user-role
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `public-holidays` (~148 tokens)

Public-holidays

Manage Focus public-holidays with the following actions:

\- **get-by-user-ids**: Get By User Ids Public Holidays. (data: end_date*, start_date*, user_id*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (required)
- `confirm_token` (string): Mutation confirmation token from previous call
- `data` (object)
- `dry_run` (boolean)

### `rates` (~1817 tokens)

Rates

Manage Focus rates with the following actions:

\- **billable-check-project-billable-rate-conflicts**: Billable Check Project Billable Rate Conflicts Rates. (data: payload*, project_id*)
\- **billable-check-project-user-billable-rate-conflicts**: Billable Check Project User Billable Rate Conflicts Rates. (data: payload*, project_id*, user_id*)
\- **billable-check-workspace-billable-rate-conflicts**: Billable Check Workspace Billable Rate Conflicts Rates. (data: payload*)
\- **billable-check-workspace-user-billable-rate-conflicts**: Billable Check Workspace User Billable Rate Conflicts Rates. (data: payload*, user_id*)
\- **billable-delete-by-id**: Billable Delete By Id Rates. (data: rate_id*)
\- **billable-delete-project-billable-rate-range**: Billable Delete Project Billable Rate Range Rates. (data: from*, project_id*, to)
\- **billable-delete-project-user-billable-rate-range**: Billable Delete Project User Billable Rate Range Rates. (data: from*, project_id*, to, user_id*)
\- **billable-delete-workspace-billable-rate-range**: Billable Delete Workspace Billable Rate Range Rates. (data: from*, to)
\- **billable-delete-workspace-user-billable-rate-range**: Billable Delete Workspace User Billable Rate Range Rates. (data: from*, to, user_id*)
\- **billable-get-all-project-user**: Billable Get All Project User Rates. (data: date, order_by, project_id, user_id)
\- **billable-get-all-workspace-user**: Billable Get All Workspace User Rates. (data: order_by, user_id)
\- **billable-get-project**: Billable Get Project Rates. (data: order_by, project_id*)
\- **billable-get-project-user**: Billable Get Project User Rates. (data: order_by, project_id*, user_id*)
\- **billable-get-projects**: Billable Get Projects Rates. (data: date*, project_id*)
\- **billable-get-workspace**: Billable Get Workspace Rates. (data: order_by)
\- **billable-get-workspace-user**: Billable Get Workspace User Rates. (data: order_by, user_id*)
\- **billable-upsert-project**: Billable Upsert Project Rates. (data: payloa…

Input parameters:

- `action` (string, required): One of: billable-check-project-billable-rate-conflicts, billable-check-project-user-billable-rate-conflicts, billable-check-workspace-billable-rate-conflicts, billable-check-workspace-user-billable-r…
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `reports` (~215 tokens)

Reports

Manage Focus reports with the following actions:

\- **get-flexq-data**: Get Flexq Data Reports. (data: payload*)
\- **get-flexq-dictionary**: Get Flexq Dictionary Reports. (data: payload*)
\- **get-workload**: Get Workload Reports. (data: payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: get-flexq-data, get-flexq-dictionary, get-workload
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `saved-views` (~419 tokens)

Saved-views

Manage Focus saved-views with the following actions:

\- **create**: Create Saved Views. Required: name, type, pinned, and params (the view's filter/layout state as an object, e.g. { project_id, filters }). Project-scoped types (project, project.tasks, project.board, project.timeline) expect the project context inside params. (data: payload*)
\- **delete**: Delete Saved Views. Deletes the authenticated user's saved view; it cannot be restored. (data: id*)
\- **get**: Get Saved Views. id is the saved view ID (number) from saved-views list. (data: id*)
\- **list**: List Saved Views. Saved views are per-user, so results belong to the authenticated user. Filter by type (inbox, archive, board, timeline, project, project.tasks, project.board, project.timeline, projects) or by partial name match. pinned=true entries are the user's starred views. (data: name, order_by, type)
\- **update**: Update Saved Views. The payload requires the full updatable set (name, type, pinned, params), so fetch the view first and resend it with your changes to avoid clobbering params. Toggling pinned is how views are starred/unstarred. (data: id*, payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create, delete, get, list, update
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `search` (~157 tokens)

Search

Manage Focus search with the following actions:

\- **search**: Search across Toggl 2.0 entities. (data: assignee_user_id*, exclude_calendar_events*, include_drafts*, keyword*, per_group*, project_id*, task_id*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (required)
- `confirm_token` (string): Mutation confirmation token from previous call
- `data` (object)
- `dry_run` (boolean)

### `statuses` (~300 tokens)

Statuses

Manage Focus statuses with the following actions:

\- **create-status**: Create a task status. (data: payload*)
\- **delete-status**: Delete a task status. (data: status_id*)
\- **get-status**: List task statuses with generated API filters. (data: status_id*)
\- **list**: List Statuses. Lists all task status options for the workspace. Use returned status IDs when creating or updating tasks via status_id. Statuses have types: todo, in_progress, done, blocked. (data: page, per_page)
\- **restore**: Restore Statuses. (data: status_id*)
\- **update-status**: Update a task status. (data: payload*, status_id*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create-status, delete-status, get-status, list, restore, update-status
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `subscriptions` (~243 tokens)

Subscriptions

Manage Focus subscriptions with the following actions:

\- **get-current**: Get Current Subscriptions. (data: none)
\- **get-current-trial**: Get Current Trial Subscriptions. (data: none)
\- **get-features-upsell**: Get Features Upsell Subscriptions. (data: none)
\- **upsert-forced-trial**: Upsert Forced Trial Subscriptions. (data: payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: get-current, get-current-trial, get-features-upsell, upsert-forced-trial
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `tags` (~295 tokens)

Tags

Manage Focus tags with the following actions:

\- **create**: Create Tags. Both name and color are required by the API (hex color, e.g. #FF5733). (data: color*, name*)
\- **delete**: Delete Tags. (data: tag_id*)
\- **get**: Get Tags. (data: tag_id*)
\- **list**: List Tags. Workspace tags label tasks and projects. Use tag IDs with tasks (tag_ids) and organization user filters (tag_ids on users.list). (data: name, page, per_page)
\- **restore**: Restore Tags. (data: tag_id*)
\- **update**: Update Tags. (data: tag_id*, payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create, delete, get, list, restore, update
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `time-blocks` (~699 tokens)

Time-blocks

Manage Focus time-blocks with the following actions:

\- **archive**: Archive Time Blocks. (data: task_id*, time_block_id*)
\- **bulk-create**: Bulk Create Time Blocks. Body shape: { time_blocks: [{ task_id, start, duration?, completed? }, ...] }. Creates many blocks in one request. (data: time_blocks*)
\- **bulk-delete**: Bulk Delete Time Blocks. Deletes time blocks by numeric id list in one HTTP call (not task_id/time_block_id pairs). (data: ids*, outbound_sync)
\- **bulk-patch**: Bulk Patch Time Blocks. JSON array of { id: timeBlockId, ...partial fields }; same fields as single time-block update. (data: array payload)
\- **create**: Create Time Blocks. Required: task_id and payload.start (ISO 8601 datetime). Optionally set payload.duration (minutes) and payload.completed. (data: task_id*, payload*)
\- **delete**: Delete Time Blocks. Permanently removes the scheduled time block from the task. (data: task_id*, time_block_id*)
\- **get**: Get Time Blocks. Fetch a single time block by task ID and time block ID. (data: task_id*, time_block_id*)
\- **get-range-stream**: Get Range Stream Time Blocks. (data: archived*, date_from*, date_to*, order_by*, status_id*, task_id*)
\- **get-task-time-blocks**: Get Task Time Blocks Time Blocks. (data: archived, order_by, page, per_page, task_id*)
\- **list**: List Time Blocks. Returns scheduled time blocks in a date range. Requires date_from and date_to. Accepts date-only strings (YYYY-MM-DD) or RFC3339 datetimes — date-only is automatically expanded: date_from to T00:00:00Z, date_to to T23:59:59Z. Results include associated task summaries. (data: date_from*, date_to*, task_id, page, per_page)
\- **restore**: Restore Time Blocks. (data: task_id*, time_block_id*)
\- **unarchive**: Unarchive Time Blocks. (data: task_id*, time_block_id*)
\- **update**: Update Time Blocks. Partial update — provide task_id, time_block_id, and fields to change in payload. (data: task_id*, time_block_id*, payload*)
\- **update-with-org**: Update With Org Time Blocks.…

Input parameters:

- `action` (string, required): One of: archive, bulk-create, bulk-delete, bulk-patch, create, delete, get, get-range-stream, get-task-time-blocks, list, restore, unarchive, update, update-with-org
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `time-entries` (~967 tokens)

Time-entries

Manage Focus time-entries with the following actions:

\- **archive**: Archive Time Entries. (data: time_entry_id*)
\- **bulk-create**: Bulk Create Time Entries. JSON array of entries with task_id, start, duration, type ('activity'|'break'). One HTTP request for many creates. (data: array payload)
\- **bulk-delete**: Bulk Delete Time Entries. Soft-delete multiple time entries by id in one request. (data: ids*)
\- **bulk-patch**: Bulk Patch Time Entries. JSON array of { id: timeEntryId, ...partial fields } for bulk partial update. (data: array payload)
\- **bulk-restore**: Bulk Restore Time Entries. Restore deleted time entries by id in one request. (data: ids*)
\- **bulk-set-day-duration**: Bulk Set Day Duration Time Entries. (data: payload*)
\- **constraints-list**: Constraints List Time Entries. (data: none)
\- **constraints-upsert**: Constraints Upsert Time Entries. (data: payload*)
\- **create**: Create Time Entries. (data: payload*, task_id*)
\- **create-taskless**: Create Taskless Time Entries. (data: payload*)
\- **delete**: Delete Time Entries. (data: time_entry_id*)
\- **get**: Get Time Entries. (data: time_entry_id*)
\- **get-stream-time-entries-range**: Get Stream Time Entries Range Time Entries. (data: archived*, date_from*, date_to*, include_taskless*, order_by*, status_id*, task_id*, type*)
\- **get-stream-time-entries-time-block-ids**: Get Stream Time Entries Time Block Ids Time Entries. (data: time_block_id*)
\- **get-task-time-entries**: Get Task Time Entries Time Entries. (data: archived, order_by, page, per_page, task_id*, time_block_id, type)
\- **list**: List Time Entries. Returns tracked time entries in a date range. Requires date_from and date_to. Accepts date-only strings (YYYY-MM-DD) or RFC3339 datetimes — date-only is automatically expanded: date_from to T00:00:00Z, date_to to T23:59:59Z. Includes task and project context. (data: date_from*, date_to*, task_id, time_block_id, type, page, per_page)
\- **partial-update**: Partial Update Time Entries. (data: p…

Input parameters:

- `action` (string, required): One of: archive, bulk-create, bulk-delete, bulk-patch, bulk-restore, bulk-set-day-duration, constraints-list, constraints-upsert, create, create-taskless, delete, get, get-stream-time-entries-range,…
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `time-log-suggestions` (~218 tokens)

Time-log-suggestions

Manage Focus time-log-suggestions with the following actions:

\- **get-for-acalendar-event-title**: Get For Acalendar Event Title Time Log Suggestions. (data: payload*)
\- **get-for-multiple-calendar-event-titles**: Get For Multiple Calendar Event Titles Time Log Suggestions. (data: payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: get-for-acalendar-event-title, get-for-multiple-calendar-event-titles
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `time-off` (~490 tokens)

Time-off

Manage Focus time-off with the following actions:

\- **create-timeoff-for-ghost**: Create Timeoff For Ghost Time Off. (data: ghost_id*, payload*)
\- **create-timeoff-for-user**: Create Timeoff For User Time Off. (data: payload*, user_id*)
\- **delete-timeoff-for-ghost**: Delete Timeoff For Ghost Time Off. (data: ghost_id*, payload*)
\- **delete-timeoff-for-user**: Delete Timeoff For User Time Off. (data: payload*, user_id*)
\- **get-timeoff-for-ghost**: Get Timeoff For Ghost Time Off. (data: from*, ghost_id*, to*)
\- **get-timeoff-for-user**: Get Timeoff For User Time Off. (data: from*, to*, user_id*)
\- **get-timeoffs-by-ghost-ids**: Get Timeoffs By Ghost Ids Time Off. (data: end_date*, ghost_ids*, start_date*)
\- **get-timeoffs-by-user-ids**: Get Timeoffs By User Ids Time Off. (data: end_date*, start_date*, user_id*)
\- **update-timeoff-for-ghost**: Update Timeoff For Ghost Time Off. (data: ghost_id*, payload*)
\- **update-timeoff-for-user**: Update Timeoff For User Time Off. (data: payload*, user_id*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create-timeoff-for-ghost, create-timeoff-for-user, delete-timeoff-for-ghost, delete-timeoff-for-user, get-timeoff-for-ghost, get-timeoff-for-user, get-timeoffs-by-ghost-ids, get-timeoffs-by-u…
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `timesheets` (~771 tokens)

Timesheets

Manage Focus timesheets with the following actions:

\- **add-timesheet-flag**: Add Timesheet Flag Timesheets. (data: payload*, setup_id*, start_date*, user_account_id*)
\- **approve**: Approve Timesheets. (data: setup_id*, start_date*, user_account_id*)
\- **bulk-approve**: Bulk Approve Timesheets. (data: payload*)
\- **bulk-request-changes**: Bulk Request Changes Timesheets. (data: payload*)
\- **get**: Get Timesheets. (data: approver_user_account_ids*, date_from*, date_to*, page*, per_page*, setup_id*, statuses*, team_ids*, user_account_ids*)
\- **get-approvers**: Get Approvers Timesheets. (data: none)
\- **get-details**: Get Details Timesheets. (data: setup_id*, start_date*, user_account_id*)
\- **get-flags**: Get Flags Timesheets. (data: setup_id*, start_date*, user_account_id*)
\- **get-history**: Get History Timesheets. (data: setup_id*, start_date*, user_account_id*)
\- **get-hours**: Get Hours Timesheets. (data: setup_id*, start_date*, user_account_id*)
\- **remove-timesheet-flag**: Remove Timesheet Flag Timesheets. (data: flag_id*)
\- **request-changes**: Request Changes Timesheets. (data: payload*, setup_id*, start_date*, user_account_id*)
\- **resubmit**: Resubmit Timesheets. (data: payload*, setup_id*, start_date*, user_account_id*)
\- **setups-create**: Setups Create Timesheets. (data: payload*)
\- **setups-delete**: Setups Delete Timesheets. (data: setup_id*)
\- **setups-discontinue**: Setups Discontinue Timesheets. (data: payload*, setup_id*)
\- **setups-get**: Setups Get Timesheets. (data: setup_id*)
\- **setups-get-approvers**: Setups Get Approvers Timesheets. (data: setup_id*)
\- **setups-get-members**: Setups Get Members Timesheets. (data: setup_id*)
\- **setups-list**: Setups List Timesheets. (data: approver_user_account_id, include_discontinued, user_account_id)
\- **setups-update**: Setups Update Timesheets. (data: payload*, setup_id*)
\- **submit**: Submit Timesheets. (data: setup_id*, start_date*, user_account_id*)
\- **withdraw**: Withdraw Timesheets. (data: set…

Input parameters:

- `action` (string, required): One of: add-timesheet-flag, approve, bulk-approve, bulk-request-changes, get, get-approvers, get-details, get-flags, get-history, get-hours, remove-timesheet-flag, request-changes, resubmit, setups-c…
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `users` (~286 tokens)

Users

Manage Focus users with the following actions:

\- **list**: List Users. Lists organization users (members). Use returned IDs for assignee_user_ids on tasks. Invite or provision new users from the Toggl Track/Focus web UI or billing admin — this API lists existing users only. (data: page, per_page, filter, sort_dir, only_admins, include_working_hours, include_rates, workspaces, tag_ids, roles, active_status, groups, pinned_ids, user_account_ids, org_user_ids)
\- **settings-list**: Settings List Users. (data: none)
\- **settings-partial-update**: Settings Partial Update Users. (data: payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: list, settings-list, settings-partial-update
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `workspace-settings` (~248 tokens)

Workspace-settings

Manage Focus workspace-settings with the following actions:

\- **workspace-settings-list**: List user workspace settings. (data: none)
\- **workspace-settings-partial-update**: Update user workspace settings. (data: payload*)
\- **get-user-permissions**: Get User Permissions Workspace Settings. (data: none)
\- **list**: List Workspace Settings. (data: none)
\- **update**: Update Workspace Settings. (data: payload*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: workspace-settings-list, workspace-settings-partial-update, get-user-permissions, list, update
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `version` (~128 tokens)

Version

Manage Focus version with the following actions:

\- **service**: Service Version. (data: none)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (required)
- `confirm_token` (string): Mutation confirmation token from previous call
- `data` (object)
- `dry_run` (boolean)

### `working-hours` (~350 tokens)

Working-hours

Manage Focus working-hours with the following actions:

\- **create-for-ghost**: Create For Ghost Working Hours. (data: ghost_id*, payload*)
\- **create-for-user**: Create For User Working Hours. (data: payload*, user_id*)
\- **delete-for-ghost**: Delete For Ghost Working Hours. (data: ghost_id*, payload*)
\- **delete-for-user**: Delete For User Working Hours. (data: payload*, user_id*)
\- **get-for-ghost**: Get For Ghost Working Hours. (data: ghost_id*)
\- **get-for-user**: Get For User Working Hours. (data: user_id*)
\- **update-for-ghost**: Update For Ghost Working Hours. (data: ghost_id*, payload*)
\- **update-for-user**: Update For User Working Hours. (data: payload*, user_id*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: create-for-ghost, create-for-user, delete-for-ghost, delete-for-user, get-for-ghost, get-for-user, update-for-ghost, update-for-user
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `org-invitations` (~246 tokens)

Org-invitations

Manage Focus org-invitations with the following actions:

\- **list**: List pending invitations for the current user account. (data: none)
\- **create**: Send organization invitations (uses organization ID from your workspace profile). (data: initiating_product*, invitations*, skip_email*)
\- **get**: Get an invitation by ID. (data: invitation_id*)
\- **resend**: Resend an invitation email for an organization user record. (data: organization_user_id*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: list, create, get, resend
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `org-members` (~223 tokens)

Org-members

Manage Focus org-members with the following actions:

\- **get**: Get an organization user by organization user ID. (data: organization_user_id*)
\- **update**: Replace organization user settings (roles, groups, tags, etc.). (data: organization_user_id*, payload*)
\- **set-active**: Activate or deactivate an organization member. (data: organization_user_id*, status*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: get, update, set-active
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `org-workspaces` (~326 tokens)

Org-workspaces

Manage Focus org-workspaces with the following actions:

\- **list**: List workspaces under the active organization. (data: none)
\- **my-roles**: Get your roles for a workspace (defaults to the CLI active workspace when omitted). (data: workspace_id)
\- **get-timezone**: Get the workspace-level default timezone (null when unset). Requires organization admin. Use when you need the org-wide default timezone for a workspace. When timezone is null, members use their personal timezones. (data: workspace_id)
\- **update-timezone**: Set or clear the workspace-level default timezone. Requires organization admin. Set timezone to an IANA name (e.g. Europe/London) or clear with clear: true / timezone: null so members fall back to personal timezones. (data: workspace_id, timezone, clear)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: list, my-roles, get-timezone, update-timezone
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `shared-status` (~135 tokens)

Shared-status

Manage Focus shared-status with the following actions:

\- **get**: Health check for the Shared Data API. (data: none)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (required)
- `confirm_token` (string): Mutation confirmation token from previous call
- `data` (object)
- `dry_run` (boolean)

### `shared-holidays` (~143 tokens)

Shared-holidays

Manage Focus shared-holidays with the following actions:

\- **list**: List public holidays for a year (optional ISO country code). (data: year*, country)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (required)
- `confirm_token` (string): Mutation confirmation token from previous call
- `data` (object)
- `dry_run` (boolean)

### `shared-working-hours` (~234 tokens)

Shared-working-hours

Manage Focus shared-working-hours with the following actions:

\- **list**: Get your working hours entries for the active organization. (data: none)
\- **put**: Replace working hours by ID (JSON array of updates). (data: array payload)
\- **create**: Create working hour rows (JSON array). (data: array payload)
\- **delete**: Delete working hour rows by ID. (data: ids*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: list, put, create, delete
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

### `org-time-off-me` (~241 tokens)

Org-time-off-me

Manage Focus org-time-off-me with the following actions:

\- **list**: List your time off entries between two dates (YYYY-MM-DD). (data: from*, to*)
\- **update**: Update your time off entries (JSON array). (data: array payload)
\- **create**: Create your time off entries (JSON array). (data: array payload)
\- **delete**: Delete your time off entries by ID. (data: ids*)

Pass the action-specific fields under `data` (required fields are marked with *).
Mutations require a confirm_token handshake: call without confirm_token first to receive a token, then call again with the token to confirm.
Optional dry_run: true validates input and returns { dry_run, operation, input } without calling the API.

Input parameters:

- `action` (string, required): One of: list, update, create, delete
- `confirm_token` (string): Mutation confirmation token from previous call
- `data`: Action-specific payload. See each action's parameters in this tool's description; pass dry_run: true to validate it without calling the API.
- `dry_run` (boolean)

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/toggl-toggl-mcp/togglhq-mcp#diagnostics

## Score history

- 2026-08-03: 20
- 2026-08-02: 53
- 2026-08-01: 34
- 2026-07-31: 16
- 2026-07-30: 39
- 2026-07-28: 39
- 2026-07-27: 57
- 2026-07-26: 37

## Links

- npm package: https://www.npmjs.com/package/@togglhq/mcp
- Socket report: https://socket.dev/npm/package/@togglhq/mcp
- Website: https://www.npmjs.com/package/@togglhq/mcp
- Changelog RSS feed: https://verifymcp.io/servers/toggl-toggl-mcp/togglhq-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/toggl-toggl-mcp/togglhq-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/toggl-toggl-mcp/togglhq-mcp
