# com.teamwork/mcp (oci · docker.io/teamwork/mcp:v1.43.2)

The Teamwork.com official MCP server helps teams efficiently manage client projects with AI.

- Trust score: 38/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- remote · `mcp.ai.teamwork.com`: 86/100, [markdown](https://verifymcp.io/servers/com-teamwork-mcp/mcp.md), [page](https://verifymcp.io/servers/com-teamwork-mcp/mcp)
- remote · `mcp.ai.teamwork.com`: 18/100, [markdown](https://verifymcp.io/servers/com-teamwork-mcp/mcp-2.md), [page](https://verifymcp.io/servers/com-teamwork-mcp/mcp-2)
- oci · `docker.io/teamwork/mcp:v1.43.2`: 38/100 (this document), [markdown](https://verifymcp.io/servers/com-teamwork-mcp/docker-io-teamwork-mcp-v1-43-2.md), [page](https://verifymcp.io/servers/com-teamwork-mcp/docker-io-teamwork-mcp-v1-43-2)

## Channel facts

- Registry: `oci`
- Package: `docker.io/teamwork/mcp:v1.43.2`
- 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-09-20.

- **Supply Chain Security**: 0/100
  - Malware scan not yet available for this package.
  - Known CVEs could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.
- **Provenance & Transparency**: 35/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 4 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 73/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 39357 tokens (~183/item across 214 items; 213 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 96/100
  - 93% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (33% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 214 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).
  - Supports UI / widget rendering.

**Unverified: 2 categories.** Categories scored 0 because we could not verify them: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the com.teamwork/mcp server?

com.teamwork/mcp runs locally as a container image, launched with docker run --rm -i docker.io/teamwork/mcp:v1.43.2. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add com-teamwork-mcp -- docker run --rm -i docker.io/teamwork/mcp:v1.43.2
```

### Cursor

```json
{
  "mcpServers": {
    "com-teamwork-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "docker.io/teamwork/mcp:v1.43.2"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-teamwork-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "docker.io/teamwork/mcp:v1.43.2"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add com-teamwork-mcp -- docker run --rm -i docker.io/teamwork/mcp:v1.43.2
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-teamwork-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "docker.io/teamwork/mcp:v1.43.2"
      ],
      "enabled": true
    }
  }
}
```

### Hermes

```yaml
mcp_servers:
  com-teamwork-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "docker.io/teamwork/mcp:v1.43.2"]
```

### Netclaw

```json
{
  "McpServers": {
    "com-teamwork-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "docker.io/teamwork/mcp:v1.43.2"
      ]
    }
  }
}
```

### Other

```json
{
  "mcpServers": {
    "com-teamwork-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "docker.io/teamwork/mcp:v1.43.2"
      ]
    }
  }
}
```

## 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-09-15 (score 38)

First indexed and scored.

## MCP tools (213)

### `twprojects-get_task` (~46 tokens)

Get task.

Input parameters:

- `fields` (array): The attributes to return for each task, from the listed names.
- `id` (integer, required): The ID of the task to get.

Output parameters:

- `included` (object)
- `task` (object)

### `twprojects-list_tasks` (~1488 tokens)

List tasks with structured filters (tasklist_id, project_id, or site-wide). For keyword search use search. Completed tasks and tasks in completed tasklists are excluded unless show_completed is true, so an empty result may mean the matching work is already done rather than missing. Ask for "late", "overdue", "due today", "started" or "upcoming" work through date_filter, and leave people out through exclude_assignee_user_ids, rather than reading rows and filtering them yourself.

Input parameters:

- `assignee_user_ids` (array): Filter tasks by assignee.
- `completed_after`: Only include tasks completed at or after this moment; the boundary itself matches. Setting it narrows the result to completed tasks. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YY…
- `completed_before`: Only include tasks completed at or before this moment; the boundary itself matches. Setting it narrows the result to completed tasks. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain Y…
- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching tasks, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `created_after`: Only include tasks created at or after this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole…
- `created_before`: Only include tasks created at or before this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole…
- `created_by_user_ids` (array): Filter tasks by creator.
- `date_filter` (string): Where the task's dates fall relative to today, in your own timezone. This is the filter for "late", "overdue", "due today", "started" and "upcoming"; omit it for no date restriction. overdue: due bef…
- `due_after` (string): Only include tasks due after this date, excluding the day itself — unless due_before is set too, which makes both bounds inclusive. A task with no due date is matched on its milestone's.
- `due_before` (string): Only include tasks due before this date, excluding the day itself — unless due_after is set too, which makes both bounds inclusive. A task with no due date is matched on its milestone's.
- `exclude_assignee_user_ids` (array): Leave out tasks assigned to any of these users. A task is dropped when any one of the listed users is assigned to it, even when it also carries assignees you did not exclude. A user reached only thro…
- `fields` (array): The attributes to return for each task, from the listed names.
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `only_completed` (boolean): If true, return only completed tasks. It combines with every other filter, date_filter included — except date_filter=overdue, which never matches a completed task and so returns nothing. Tasks in com…
- `only_unassigned` (boolean): If true, only return tasks that have no assignee.
- `only_unplanned` (boolean): If true, only return tasks that are unplanned, meaning they are missing an assignee, a due date, or estimated time.
- `order_by` (string): The field to sort the tasks by. Omit to keep the ordering the API applies by default.
- `order_by_custom_field_id` (integer): The custom field to sort the tasks by. Required when order_by is "customfield", and ignored otherwise.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project from which to retrieve tasks. Omit to list tasks across all projects.
- `search_term` (string): A search term to filter tasks by name.
- `show_completed` (boolean): If true, include completed tasks and tasks belonging to completed tasklists; both excluded by default.
- `start_after` (string): Only include tasks whose own start date falls on or after this date; the day itself matches. A task with no start date never matches — there is no milestone fallback. There is no upper bound on the s…
- `tag_ids` (array): A list of tag IDs to filter tasks by tags.
- `tasklist_id` (integer): The ID of the tasklist from which to retrieve tasks. Takes precedence over project_id.
- `updated_after`: Only include tasks updated strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers t…
- `updated_before`: Only include tasks updated strictly before this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers…
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `included` (object)
- `meta` (object)
- `suggestions` (array): Present only when search_term was supplied and the result list came back empty. Entities whose name matches the term, most relevant first, so the term can be recognised instead of treated as unknown.…
- `tasks` (null|array)

### `twprojects-create_task` (~588 tokens)

Create task in a tasklist.

Input parameters:

- `assignees` (object): Assignees for the task.
- `attachment_file_ids` (array): IDs of files already in a project's files area to attach to the task, as returned by twprojects-add_project_file. Unlike a reference these can be used repeatedly, so this is how one file reaches seve…
- `attachment_refs` (array): References of files to attach to the task, as returned by twprojects-create_upload_url or twprojects-create_file. Each is "tf_" followed by a UUID and the file extension, and can only be used once, s…
- `change_followers` (object): Followers of any task changes.
- `comment_followers` (object): Followers of any task comments.
- `complete_followers` (object): Followers of any task completions.
- `description` (string): The description of the task. Support for plain text and Markdown formatting.
- `due_date` (string): The due date of the task. If omitted, falls back to the milestone due date when one is set.
- `estimated_minutes` (integer): The estimated time to complete the task in minutes.
- `name` (string, required): The name of the task.
- `notify` (boolean): Whether to notify the task's assignees and followers, which sends them an email. Defaults to true. Set it to false for bulk or housekeeping changes nobody needs to hear about.
- `parent_task_id` (integer): The ID of the parent task if creating a subtask.
- `predecessors` (array): Task dependencies that must be completed before this task can start.
- `priority` (string): The priority of the task.
- `progress` (integer): The progress of the task, as a percentage (0-100). Only whole numbers are allowed.
- `stage_id` (integer): The ID of the workflow stage to place the new task in. Required together with workflow_id. Omit both to leave the task in the workflow's backlog. Use twprojects-list_workflow_stages to find one.
- `start_date` (string): The start date of the task.
- `tag_ids` (array): A list of tag IDs to associate with the task.
- `tasklist_id` (integer, required): Tasklist ID. Use twprojects-list_tasklists to find one.
- `workflow_id` (integer): The ID of the workflow to place the new task in a stage of. Required together with stage_id, and must be a workflow attached to the task's own project: another one is ignored and the task lands in th…

### `twprojects-list_comments` (~474 tokens)

List comments. Scope by one of task_id, milestone_id, notebook_id, link_id, or file_version_id; omit all for site-wide. Comment bodies are truncated at 500 characters and marked where they are cut; use twprojects-get_comment for the full text.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching comments, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each comment, from the listed names.
- `file_version_id` (integer): The ID of the file version to retrieve comments for. Each file can have multiple versions, and comments can be associated with specific versions.
- `link_id` (integer): The ID of the link to retrieve comments for. Provide this to scope comments to a link.
- `milestone_id` (integer): The ID of the milestone to retrieve comments for. Provide this to scope comments to a milestone.
- `notebook_id` (integer): The ID of the notebook to retrieve comments for. Provide this to scope comments to a notebook.
- `order_by` (string): The field to sort the comments by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `search_term` (string): A search term to filter comments by name.
- `task_id` (integer): The ID of the task to retrieve comments for. Provide this to scope comments to a task.
- `updated_after`: Only include comments edited strictly after this moment; the boundary itself does not match. Defaults to the last 3 months. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD…
- `user_ids` (array): A list of user IDs to filter comments by
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `comments` (null|array)
- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)

### `twprojects-update_task` (~637 tokens)

Update task.

Input parameters:

- `assignees` (object): Assignees for the task. To remove all assignees, use clear_assignees instead.
- `attachment_file_ids` (array): IDs of files already in a project's files area to attach to the task, as returned by twprojects-add_project_file. Unlike a reference these can be used repeatedly, so this is how one file reaches seve…
- `attachment_refs` (array): References of files to attach to the task, as returned by twprojects-create_upload_url or twprojects-create_file. Each is "tf_" followed by a UUID and the file extension, and can only be used once, s…
- `change_followers` (object): Followers of any task changes.
- `clear_assignees` (boolean): If true, removes all assignees from the task, leaving it unassigned. Cannot be combined with a non-empty assignees value.
- `clear_parent_task` (boolean): If true, detaches the task from its parent, promoting it to a top-level task. Cannot be combined with parent_task_id.
- `comment_followers` (object): Followers of any task comments.
- `complete_followers` (object): Followers of any task completions.
- `description` (string): The description of the task. Support for plain text and Markdown formatting.
- `due_date` (string): The due date of the task. If omitted, falls back to the milestone due date when one is set.
- `estimated_minutes` (integer): The estimated time to complete the task in minutes.
- `id` (integer, required): The ID of the task to update.
- `name` (string): The name/title of the task.
- `notify` (boolean): Whether to notify the task's assignees and followers, which sends them an email. Defaults to true. Set it to false for bulk or housekeeping changes nobody needs to hear about.
- `parent_task_id` (integer): The ID of the parent task, making this task a subtask. A subtask must live in the same tasklist as its parent, so moving one with tasklist_id fails until the parent has moved or the link is cleared.…
- `predecessors` (array): Task dependencies that must be completed before this task can start.
- `priority` (string): The priority of the task.
- `progress` (integer): The progress of the task, as a percentage (0-100). Only whole numbers are allowed.
- `start_date` (string): The start date of the task.
- `tag_ids` (array): A list of tag IDs to associate with the task.
- `tasklist_id` (integer): The ID of the tasklist. Moving the task carries its subtasks along and detaches it from any parent staying behind. Use twprojects-move_tasks to move several tasks at once.

### `twprojects-list_projects` (~794 tokens)

List projects with structured filters (membership, progress state, health, category, tag, company, owner). For "my projects" pass user_ids with the ID from twprojects-get_user_me, or only_starred. For projects that have slipped pass project_statuses=["late"] — a project row carries no late flag, so this filter is the only way to ask.

Input parameters:

- `company_ids` (array): Filter projects by the company that owns them.
- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching projects, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each project, from the listed names.
- `hide_observed` (boolean): If true, leave out the projects the calling user only observes, keeping the ones they actually work on.
- `include_archived` (boolean): If true, return archived projects alongside the active ones; excluded by default.
- `include_subcategories` (boolean): If true, project_category_ids also matches the categories nested under the ones given.
- `include_tentative` (boolean): If true, return tentative projects alongside the normal ones; excluded by default.
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `only_admin_access` (boolean): If true, only return the projects the calling user administers.
- `only_archived` (boolean): If true, only return archived projects.
- `only_starred` (boolean): If true, only return the projects the calling user has starred.
- `order_by` (string): The field to sort the projects by. Omit to keep the ordering the API applies by default.
- `order_by_custom_field_id` (integer): The custom field to sort the projects by. Required when order_by is "customfield", and ignored otherwise.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_category_ids` (array): Filter projects by category.
- `project_healths` (array): Filter projects by the health rating set on them, matching any of the values given. "not_set" matches the projects nobody has rated.
- `project_owner_ids` (array): Filter projects by the user who owns them.
- `project_statuses` (array): Filter projects by progress state, matching any of the values given. "late" is past its end date and not yet completed, "upcoming" has not started yet, "current" is running now, and "active" is every…
- `search_term` (string): A search term to filter projects by name or description.
- `tag_ids` (array): A list of tag IDs to filter projects by tags.
- `team_ids` (array): Filter projects by team, matching the projects any member of those teams belongs to.
- `updated_after`: Only include projects whose last activity is strictly after this moment; the boundary itself does not match. Any activity in the project counts, not just edits to the project record. Accepts an RFC 3…
- `user_ids` (array): Filter projects by the users holding an explicit membership of them. For "my projects", pass the ID returned by twprojects-get_user_me.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `included` (object)
- `meta` (object)
- `projects` (null|array)
- `suggestions` (array): Present only when search_term was supplied and the result list came back empty. Entities whose name matches the term, most relevant first, so the term can be recognised instead of treated as unknown.…

### `twprojects-create_timelog` (~242 tokens)

Create timelog entry against a project or task.

Input parameters:

- `billable` (boolean): If true, the timelog is billable.
- `date` (string, required): The date of the timelog.
- `description` (string): A description of the timelog.
- `hours` (integer, required): The number of hours spent on the timelog. Must be a positive integer.
- `is_utc` (boolean): If true, the time is in UTC.
- `minutes` (integer, required): Minutes spent on the timelog. Must be a positive integer less than 60; otherwise increment hours instead.
- `project_id` (integer): Project the timelog is logged against. Provide exactly one of project_id or task_id.
- `tag_ids` (array): A list of tag IDs to associate with the timelog.
- `task_id` (integer): Task the timelog is logged against. Provide exactly one of project_id or task_id.
- `time` (string, required): The time of the timelog in the format HH:MM:SS.
- `user_id` (integer): User the timelog is logged for. Defaults to the authenticated user.

### `twprojects-list_timelogs` (~636 tokens)

List timelogs. Scope by project_id or task_id, or omit for site-wide.

Input parameters:

- `assigned_company_ids` (array): Filter timelogs by assigned company.
- `assigned_team_ids` (array): Filter timelogs by assigned team.
- `assigned_user_ids` (array): Filter timelogs by assigned user.
- `billable_type` (string): Restrict the results to billable or non-billable timelogs. Omit, or pass all, to include both. For billable hours rather than the entries themselves, twprojects-summarize_timelogs reports them withou…
- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching timelogs, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `end_date`: End of the timelog window; the boundary itself is included, and a plain date covers that whole day. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which…
- `fields` (array): The attributes to return for each timelog, from the listed names.
- `invoiced_type` (string): Restrict the results to timelogs that have or have not been added to an invoice. Omit, or pass all, to include both. Invoiced is not the same as billed: noninvoiced answers "what is still to be invoi…
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `order_by` (string): The field to sort the timelogs by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project from which to retrieve timelogs. Omit to list timelogs across all projects.
- `start_date`: Start of the timelog window; the boundary itself is included. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.
- `tag_ids` (array): A list of tag IDs to filter timelogs by tags.
- `task_id` (integer): The ID of the task from which to retrieve timelogs. Omit to list timelogs across all tasks.
- `ticketIds` (array): Filter timelogs by associated desk ticket.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `timelogs` (null|array)

### `twprojects-search` (~415 tokens)

Cross-entity keyword search across projects, tasks, messages, comments, users and more; restrict which entity types are searched with types. Long content fields in the sideloaded records are truncated at 500 characters and marked where they are cut; the marker names the tool that returns the full record. Completed items are excluded unless include_completed_items is true, so an empty result may mean the matching work is already done rather than missing.

Input parameters:

- `cursor` (string): Cursor for pagination of results.
- `extended_search` (boolean): Whether to perform an extended search, which includes items updated more than 5 years ago.
- `include_completed_items` (boolean): Whether to include completed items in the search results. Excluded by default.
- `include_highlights` (boolean): Whether to return why each result matched, as fragments under its meta.highlights. Unavailable on an extended search.
- `limit` (integer): Number of results per page for pagination.
- `project_id` (integer): The ID of the project to limit the search to.
- `search_term` (string): A search term to to look for items.
- `sideload` (array): Which of the matched records are expanded into full records under the response's included section. It never changes which records are found — use types for that. Defaults to every type listed; a hit…
- `types` (array): Entity types to search. Only records of these types are found. Omit it to search every type.
- `updated_after`: Only include items updated strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers t…
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `included` (object)
- `meta` (object)
- `search` (null|array)

### `twprojects-list_tasklists` (~255 tokens)

List tasklists. Scope by project_id or omit for site-wide.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching tasklists, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each tasklist, from the listed names.
- `order_by` (string): The field to sort the task lists by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project from which to retrieve tasklists. Omit to list tasklists across all projects.
- `search_term` (string): A search term to filter tasklists by name.
- `show_completed` (boolean): If true, include completed tasklists; excluded by default.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `suggestions` (array): Present only when search_term was supplied and the result list came back empty. Entities whose name matches the term, most relevant first, so the term can be recognised instead of treated as unknown.…
- `tasklists` (null|array)

### `twprojects-create_comment` (~335 tokens)

Create comment on a task, milestone, notebook, file, or link.

Input parameters:

- `attachment_refs` (array): References of files to attach to the comment, as returned by twprojects-create_upload_url or twprojects-create_file. Each is "tf_" followed by a UUID and the file extension, and can only be used once…
- `body` (string, required): The content of the comment. The content can be added as text or HTML.
- `content_type` (string): The content type of the comment. It can be either 'TEXT' or 'HTML'.
- `notify`: Who to notify of the new comment. Omit it unless the user named who to notify: the default notifies every follower of the related entity, and a value here replaces that set rather than adding to it,…
- `notify_current_user` (boolean): Whether the current user should be notified about the new comment.
- `object` (object, required): The object to create the comment for. It can be a tasks, milestones, files or notebooks.

### `twprojects-get_tasklist` (~50 tokens)

Get tasklist.

Input parameters:

- `fields` (array): The attributes to return for each tasklist, from the listed names.
- `id` (integer, required): The ID of the tasklist to get.

Output parameters:

- `tasklist` (object)

### `twprojects-get_project` (~46 tokens)

Get project.

Input parameters:

- `fields` (array): The attributes to return for each project, from the listed names.
- `id` (integer, required): The ID of the project to get.

Output parameters:

- `included` (object)
- `project` (object)

### `twdesk-get_ticket` (~57 tokens)

Get ticket.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the ticket to retrieve.

### `twprojects-update_timelog` (~317 tokens)

Update timelog. It can also be moved to another project or task.

Input parameters:

- `billable` (boolean): If true, the timelog is billable.
- `clear_task` (boolean): Set to true to detach the timelog from its task, leaving it logged against the project. Cannot be combined with task_id.
- `date` (string): The date of the timelog.
- `description` (string): A description of the timelog.
- `hours` (integer): The number of hours spent on the timelog. Must be a positive integer.
- `id` (integer, required): The ID of the timelog to update.
- `is_utc` (boolean): If true, the time is in UTC.
- `minutes` (integer): Minutes spent on the timelog. Must be a positive integer less than 60; otherwise increment hours instead.
- `project_id` (integer): Move the timelog to this project. The API takes the project from the task whenever the timelog is logged against one, so pass clear_task alongside it to move a timelog off its task.
- `tag_ids` (array): A list of tag IDs to associate with the timelog.
- `task_id` (integer): Move the timelog to this task, and with it to the task's own project.
- `time` (string): The time of the timelog in the format HH:MM:SS.
- `user_id` (integer): User the timelog is logged for. Defaults to the authenticated user.

### `twprojects-list_activities` (~468 tokens)

List recent activity events. Scope by project_id or omit for site-wide.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching activities, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `end_date`: End of the activity window; the boundary itself is included, and a plain date covers that whole day. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), whic…
- `exclude_user_ids` (array): Exclude activities created by these users. Pass the current user's ID to drop their own activity from the feed.
- `fields` (array): The attributes to return for each activity, from the listed names.
- `item_ids` (array): Filter activities by the IDs of the items they refer to, such as task, milestone or message IDs. Item IDs are only unique within an item type, so combine this with log_item_types to avoid matching ac…
- `log_item_types` (array): Filter activities by item types.
- `order_by` (string): The field to sort the activities by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project to retrieve activities from. Omit to list activities across all projects.
- `start_date`: Start of the activity window; the boundary itself is included. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.
- `user_ids` (array): Filter activities by the users who created them.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `activities` (null|array)
- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)

### `twprojects-move_task_to_workflow_stage` (~110 tokens)

Move one or more tasks to a workflow stage.

Input parameters:

- `stage_id` (integer, required): The ID of the workflow stage to move the tasks to.
- `task_ids` (array): The IDs of the tasks to move. At least one is needed; each is appended to the end of the stage in the order given. The workflow must be attached to the project the task belongs to.
- `workflow_id` (integer, required): The ID of the workflow that contains the target stage.

### `twprojects-complete_task` (~31 tokens)

Mark task complete.

Input parameters:

- `id` (integer, required): The ID of the task to mark as complete.

### `twdesk-search_tickets` (~659 tokens)

Search tickets. Filter by inbox, customer, company, tag, status, priority, user, or creation date range. Name the attributes you need in fields: a ticket returned whole carries every activity, message, file and timelog identifier it has, and a full page of those is large enough to be truncated in transit. The record and page totals saturate at 10000: a search reporting exactly that many has 10000 or more, and asking for a page past the 10000th result is rejected rather than answered empty, so narrow the filters instead of paging deeper.

Input parameters:

- `companyIDs` (array): Filter by company. Use twdesk-list_companies to discover.
- `createdAfter`: Filter by ticket creation date: only tickets created on or after this day. This search filters by whole days, so a time of day is ignored. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a pl…
- `createdBefore`: Filter by ticket creation date: only tickets created on or before this day. This search filters by whole days, so a time of day is ignored. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a p…
- `customerIDs` (array): Filter by customer. Use twdesk-list_customers to discover.
- `fields` (array): The attributes to return for each ticket, from the listed names. Omit to receive the whole record, which carries every activity, message, file and timelog identifier the ticket has and is large enoug…
- `inboxIDs` (array): Filter by inbox. Use twdesk-list_inboxes to discover.
- `omitMerged` (boolean): If true, exclude tickets that have been merged into another ticket. Merged tickets are not a status, so they cannot be filtered out with statusIDs. Defaults to false, which returns them alongside the…
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-200). The API silently reduces anything above 200, so a larger value returns fewer results rather than more.
- `priorityIDs` (array): Filter by priority. Use twdesk-list_priorities to discover.
- `search` (string): Search term matched against subject, body, and other ticket fields.
- `statusIDs` (array): Filter by status. Use twdesk-list_statuses to discover.
- `tagIDs` (array): Filter by tag. Use twdesk-list_tags to discover.
- `userIDs` (array): Filter by user. Use twdesk-list_users to discover.

### `twprojects-list_users` (~298 tokens)

List users. Scope by project_id or filter by type (account/collaborator/contact).

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching users, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each user, from the listed names.
- `order_by` (string): The field to sort the users by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project from which to retrieve users. Omit to list users across all projects.
- `search_term` (string): A search term to filter users by first or last names, or e-mail. The user will be selected if each word of the term matches the first or last name, or e-mail, not requiring that the word matches are…
- `type` (string): Type of user to filter by. The available options are account, collaborator or contact.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `people` (null|array)

### `twchat-get_conversation` (~36 tokens)

Get a single Teamwork Chat conversation by ID.

Input parameters:

- `conversation_id` (integer, required): The ID of the conversation to retrieve.

### `twchat-get_current_user` (~35 tokens)

Get the current authenticated Teamwork Chat user, including identity, counts (unread conversations/messages, mentions), and settings.

### `twchat-get_or_create_dm` (~103 tokens)

Get the 1:1 direct-message conversation with a person, creating it if it does not exist yet. Returns the conversation (use its id with send_message). Use list_people to find user_id. The authenticated user cannot be the target: naming your own user id is rejected.

Input parameters:

- `user_id` (integer, required): The ID of the person to get the direct-message conversation with. Must be somebody other than the authenticated user; see get_current_user.

### `twchat-list_conversations` (~148 tokens)

List Teamwork Chat conversations the current user is a member of.

Input parameters:

- `include_message_data` (boolean): Include the latest message in each conversation.
- `page_limit` (integer): Number of conversations to return (max 10).
- `page_offset` (integer): The index position to start retrieving results from (not a page number).
- `search_term` (string): A search term to filter conversations by title.
- `sort` (string): Sort order for the returned conversations.
- `status` (string): Filter by conversation status.
- `type` (string): Filter by conversation type: "rooms" for group/channel conversations, "pair" for 1:1 direct messages.

### `twchat-list_messages` (~242 tokens)

List messages within a Teamwork Chat conversation. Requires conversation_id.

Input parameters:

- `after_message_id` (integer): Return messages newer than this message ID (cursor).
- `before_message_id` (integer): Return messages older than this message ID (cursor).
- `conversation_id` (integer, required): The ID of the conversation to read messages from.
- `created_after`: Return messages created after this time. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.
- `created_before`: Return messages created before this time. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of messages per page (1-200).
- `search_term` (string): A search term to filter messages by text content.

### `twchat-list_people` (~79 tokens)

List people in the Teamwork Chat installation. Useful for resolving names to user IDs.

Input parameters:

- `page_limit` (integer): Number of people to return.
- `page_offset` (integer): The index position to start retrieving results from (not a page number).
- `search_term` (string): A search term to filter people by name or email.

### `twchat-send_dm` (~125 tokens)

Send a direct message to a person, resolving (or creating) the 1:1 conversation automatically. Requires user_id and body. Use list_people to find user_id. The authenticated user cannot be the recipient: naming your own user id is rejected and nothing is sent, so report a summary in the conversation instead of messaging yourself in chat.

Input parameters:

- `body` (string, required): The message text. Supports Markdown.
- `user_id` (integer, required): The ID of the person to send the direct message to. Must be somebody other than the authenticated user; see get_current_user.

### `twchat-send_message` (~57 tokens)

Send a message to a Teamwork Chat conversation. Requires conversation_id and body.

Input parameters:

- `body` (string, required): The message text. Supports Markdown.
- `conversation_id` (integer, required): The ID of the conversation to post the message to.

### `twdesk-create_company` (~123 tokens)

Create Desk company.

Input parameters:

- `description` (string): The description of the company.
- `details` (string): The details of the company.
- `domains` (array): The domains for the company.
- `industry` (string): The industry of the company.
- `kind` (string): The kind of the company.
- `name` (string, required): The name of the company.
- `note` (string): The note for the company.
- `permission` (string): The permission level of the company.
- `website` (string): The website of the company.

### `twdesk-create_customer` (~186 tokens)

Create customer.

Input parameters:

- `address` (string): The address of the customer.
- `email` (string): The email of the customer.
- `extraData` (string): The extra data of the customer.
- `facebookURL` (string): The Facebook URL of the customer.
- `firstName` (string): The first name of the customer.
- `jobTitle` (string): The job title of the customer.
- `lastName` (string): The last name of the customer.
- `linkedinURL` (string): The LinkedIn URL of the customer.
- `mobile` (string): The mobile number of the customer.
- `notes` (string): The notes of the customer.
- `organization` (string): The organization of the customer.
- `phone` (string): The phone number of the customer.
- `twitterHandle` (string): The Twitter handle of the customer.

### `twdesk-create_file` (~79 tokens)

Upload file. Attach the returned ID to tickets or messages.

Input parameters:

- `data` (string, required): The content of the file as a base64-encoded string.
- `disposition` (string): The disposition of the file.
- `mimeType` (string, required): The MIME type of the file.
- `name` (string, required): The name of the file.

### `twdesk-create_helpdoc_article` (~126 tokens)

Create a new help doc article.

Input parameters:

- `contents` (string): The body content of the article.
- `description` (string): A short description / summary of the article.
- `isPrivate` (boolean): Set to true to make the article private.
- `siteID` (integer, required): The ID of the help doc site to create the article in. Use twdesk-list_helpdoc_sites to discover.
- `status` (string): Publication status of the article (e.g. "published", "draft").
- `title` (string, required): The title of the article.

### `twdesk-create_priority` (~38 tokens)

Create ticket priority.

Input parameters:

- `color` (string): The color of the priority.
- `name` (string, required): The name of the priority.

### `twdesk-create_status` (~52 tokens)

Create ticket status.

Input parameters:

- `color` (string): The color of the status.
- `displayOrder` (integer): The display order of the status.
- `name` (string, required): The name of the status.

### `twdesk-create_tag` (~38 tokens)

Create Desk tag.

Input parameters:

- `color` (string): The color of the tag.
- `name` (string, required): The name of the tag.

### `twdesk-create_ticket` (~278 tokens)

Create ticket.

Input parameters:

- `agentId` (integer): Agent the ticket is assigned to. Use twdesk-list_users to discover.
- `bcc` (array): Email addresses to BCC.
- `body` (string, required): The body of the ticket.
- `cc` (array): Email addresses to CC.
- `customerEmail` (string): Customer email; required when customerId is not given. Existing customers are matched, otherwise a new customer is created.
- `customerId` (integer): Customer of the ticket. Use twdesk-list_customers to discover.
- `files` (array): File IDs to attach. Use twdesk-create_file to upload.
- `inboxId` (integer, required): Inbox of the ticket. Use twdesk-list_inboxes to discover.
- `notifyCustomer` (boolean): Set to true if the customer should be sent a copy of the ticket.
- `priorityId` (integer): Priority of the ticket. Use twdesk-list_priorities to discover.
- `statusId` (integer): Status of the ticket. Use twdesk-list_statuses to discover.
- `subject` (string, required): The subject of the ticket.
- `tags` (array): Tags to associate with the ticket. Use twdesk-list_tags to discover.
- `typeId` (integer): Ticket type. Use twdesk-list_ticket_types to discover.

### `twdesk-create_ticket_type` (~62 tokens)

Create ticket type.

Input parameters:

- `displayOrder` (integer): The display order of the type.
- `enabledForFutureInboxes` (boolean): Whether the type is enabled for future inboxes.
- `name` (string, required): The name of the ticket type.

### `twdesk-get_company` (~61 tokens)

Get Desk company (customer organization).

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the company to retrieve.

### `twdesk-get_customer` (~57 tokens)

Get customer.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the customer to retrieve.

### `twdesk-get_helpdoc_article` (~66 tokens)

Get a help doc article by ID.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the help doc article to retrieve.

### `twdesk-get_helpdoc_site` (~80 tokens)

Get a help doc site (knowledge base) by ID, including its subdomain, branding and article counts.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the help doc site to retrieve.

### `twdesk-get_inbox` (~58 tokens)

Get inbox.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the inbox to retrieve.

### `twdesk-get_priority` (~58 tokens)

Get ticket priority.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the priority to retrieve.

### `twdesk-get_status` (~58 tokens)

Get ticket status.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the status to retrieve.

### `twdesk-get_tag` (~58 tokens)

Get Desk tag.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the tag to retrieve.

### `twdesk-get_ticket_type` (~60 tokens)

Get ticket type.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the ticket type to retrieve.

### `twdesk-get_user` (~58 tokens)

Get support agent.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `id` (integer, required): The ID of the user to retrieve.

### `twdesk-link_task_to_ticket` (~85 tokens)

Link a Teamwork Projects task to a Desk ticket, so the ticket shows the work tracked by that task.

Input parameters:

- `taskId` (integer, required): The ID of the Teamwork Projects task. Use twprojects-list_tasks or twprojects-search to discover.
- `ticketId` (integer, required): The ID of the Desk ticket. Use twdesk-search_tickets to discover.

### `twdesk-list_companies` (~188 tokens)

List Desk companies. Filter by name, domains, or kind.

Input parameters:

- `domains` (array): The domains of the company to filter by.
- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `kind` (string): The kind of the company to filter by.
- `name` (string): The name of the company to filter by.
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.

### `twdesk-list_customers` (~186 tokens)

List customers. Filter by company or email.

Input parameters:

- `companyIDs` (array): The IDs of the companies to filter by.
- `companyNames` (array): The names of the companies to filter by.
- `emails` (array): The emails of the customers to filter by.
- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.

### `twdesk-list_helpdoc_sites` (~197 tokens)

List help doc sites (knowledge bases). Filter by name or subdomain. Use this to discover the site ID required by the help doc article tools.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `name` (array): The name of the help doc site to filter by.
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.
- `subdomain` (array): The subdomain of the help doc site to filter by.

### `twdesk-list_inboxes` (~170 tokens)

List inboxes. Filter by name or email.

Input parameters:

- `email` (array): The email of the inbox to filter by.
- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `name` (array): The name of the inbox to filter by.
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.

### `twdesk-list_priorities` (~170 tokens)

List ticket priorities. Filter by name or color.

Input parameters:

- `color` (array): The color of the priority to filter by.
- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `name` (array): The name of the priority to filter by.
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.

### `twdesk-list_statuses` (~188 tokens)

List ticket statuses. Filter by name, color, or code.

Input parameters:

- `code` (array): The code of the status to filter by.
- `color` (array): The color of the status to filter by.
- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `name` (array): The name of the status to filter by.
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.

### `twdesk-list_tags` (~189 tokens)

List Desk tags. Filter by name, color, or inbox.

Input parameters:

- `color` (string): The color of the tag to filter by.
- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `inboxIDs` (array): The IDs of the inboxes to filter by.
- `name` (string): The name of the tag to filter by.
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.

### `twdesk-list_ticket_types` (~175 tokens)

List ticket types. Filter by name or inbox.

Input parameters:

- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `inboxIDs` (array): Filter by inbox. Use twdesk-list_inboxes to discover.
- `name` (array): The name of the type to filter by.
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.

### `twdesk-list_users` (~228 tokens)

List support agents. For customers, use twdesk-list_customers.

Input parameters:

- `email` (array): The email addresses of the users to filter by.
- `fields` (array): Sparse fieldset: field names to include (e.g. ["id","name"]). Omit to receive all fields.
- `firstName` (array): The first names of the users to filter by.
- `inboxIDs` (array): The IDs of the inboxes to filter by.
- `isPartTime` (boolean): Whether to include part-time users in the results.
- `lastName` (array): The last names of the users to filter by.
- `orderBy` (string): The field to order the results by.
- `orderDirection` (string): The direction to order the results by (asc, desc).
- `page` (integer): Page number for pagination of results (1-based).
- `pageSize` (integer): Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.

### `twdesk-reply_ticket` (~107 tokens)

Reply to a ticket. Use threadType=note for internal agent notes.

Input parameters:

- `bcc` (array): Email addresses to BCC.
- `body` (string, required): The body of the message.
- `cc` (array): Email addresses to CC.
- `threadType` (string): 'message' is a customer-facing reply; 'note' is an internal agent note.
- `ticketID` (integer, required): The ID of the ticket that the message will be sent to.

### `twdesk-search_helpdoc_articles` (~129 tokens)

Search help doc articles. Filter by search term, status, site, or category.

Input parameters:

- `categoryID` (integer): Filter by help doc category ID.
- `page` (integer): Page number (1-based).
- `pageSize` (integer): Number of results per page.
- `search` (string): Free-text search term matched against article title and content.
- `siteID` (integer): Filter by help doc site ID. Use twdesk-list_helpdoc_sites to discover.
- `status` (string): Filter by article status (e.g. "published", "draft").

### `twdesk-unlink_task_from_ticket` (~85 tokens)

Unlink a Teamwork Projects task from a Desk ticket. The task and the ticket themselves are kept.

Input parameters:

- `taskId` (integer, required): The ID of the Teamwork Projects task. Use twprojects-list_tasks or twprojects-search to discover.
- `ticketId` (integer, required): The ID of the Desk ticket. Use twdesk-search_tickets to discover.

### `twdesk-update_company` (~146 tokens)

Update Desk company.

Input parameters:

- `description` (string): The new description of the company.
- `details` (string): The new details of the company.
- `domains` (array): The new domains for the company.
- `id` (integer, required): The ID of the company to update.
- `industry` (string): The new industry of the company.
- `kind` (string): The new kind of the company.
- `name` (string): The new name of the company.
- `note` (string): The new note for the company.
- `permission` (string): The new permission level of the company.
- `website` (string): The new website of the company.

### `twdesk-update_customer` (~213 tokens)

Update customer.

Input parameters:

- `address` (string): The new address of the customer.
- `email` (string): The new email of the customer.
- `extraData` (string): The new extra data of the customer.
- `facebookURL` (string): The new Facebook URL of the customer.
- `firstName` (string): The new first name of the customer.
- `id` (integer, required): The ID of the customer to update.
- `jobTitle` (string): The new job title of the customer.
- `lastName` (string): The new last name of the customer.
- `linkedinURL` (string): The new LinkedIn URL of the customer.
- `mobile` (string): The new mobile number of the customer.
- `notes` (string): The new notes of the customer.
- `organization` (string): The new organization of the customer.
- `phone` (string): The new phone number of the customer.
- `twitterHandle` (string): The new Twitter handle of the customer.

### `twdesk-update_helpdoc_article` (~111 tokens)

Update an existing help doc article.

Input parameters:

- `contents` (string): The new body content of the article.
- `description` (string): A short description / summary of the article.
- `id` (integer, required): The ID of the help doc article to update.
- `isPrivate` (boolean): Set to true to make the article private.
- `status` (string): Publication status (e.g. "published", "draft").
- `title` (string): The new title of the article.

### `twdesk-update_priority` (~53 tokens)

Update ticket priority.

Input parameters:

- `color` (string): The color of the priority.
- `id` (integer, required): The ID of the priority to update.
- `name` (string): The new name of the priority.

### `twdesk-update_status` (~67 tokens)

Update ticket status.

Input parameters:

- `color` (string): The color of the status.
- `displayOrder` (integer): The display order of the status.
- `id` (integer, required): The ID of the status to update.
- `name` (string): The new name of the status.

### `twdesk-update_tag` (~53 tokens)

Update Desk tag.

Input parameters:

- `color` (string): The color of the tag.
- `id` (integer, required): The ID of the tag to update.
- `name` (string): The new name of the tag.

### `twdesk-update_ticket` (~222 tokens)

Update ticket.

Input parameters:

- `agentId` (integer): Agent the ticket is assigned to. Use twdesk-list_users to discover.
- `bcc` (array): Email addresses to BCC.
- `body` (string): The body of the ticket.
- `cc` (array): Email addresses to CC.
- `deleteTags` (array): Tags to remove from the ticket. Use twdesk-list_tags to discover.
- `id` (integer, required): The ID of the ticket to update.
- `inboxId` (integer): Inbox of the ticket. Use twdesk-list_inboxes to discover.
- `priorityId` (integer): Priority of the ticket. Use twdesk-list_priorities to discover.
- `statusId` (integer): Status of the ticket. Use twdesk-list_statuses to discover.
- `subject` (string): The subject of the ticket.
- `tags` (array): Tags to associate with the ticket. Use twdesk-list_tags to discover.
- `typeId` (integer): Ticket type. Use twdesk-list_ticket_types to discover.

### `twdesk-update_ticket_type` (~77 tokens)

Update ticket type.

Input parameters:

- `displayOrder` (integer): The display order of the type.
- `enabledForFutureInboxes` (boolean): Whether the type is enabled for future inboxes.
- `id` (integer, required): The ID of the ticket type to update.
- `name` (string): The new name of the type.

### `twprojects-add_project_file` (~371 tokens)

Store an uploaded file in a project's files area, where people find it outside any one task or comment. Upload it first with twprojects-create_upload_url, then pass the reference here. Returns a numeric file ID which, unlike a reference, survives being used: pass it in attachment_file_ids on twprojects-create_task or twprojects-update_task to attach the same file to as many tasks as needed. Attaching a reference to a task, comment or message already files it here, so use this tool to store a file on its own, to describe or categorise it, or when it has to reach more than one place.

Input parameters:

- `auto_new_version` (boolean): Store it as a new version of an existing file with the same name in the project, rather than as a separate file.
- `category_id` (integer): File it under an existing file category. Wins over category_name.
- `category_name` (string): File it under a category with this name, creating one when the project has none. Ignored when category_id is given.
- `description` (string): A description of the file.
- `name` (string): Override the name the file was uploaded with, including its extension.
- `notify_current_user` (boolean): Notify the user adding the file. Defaults to false.
- `private` (boolean): Hide the file from client users.
- `project_id` (integer, required): The ID of the project whose files area will hold the file.
- `reference` (string, required): The reference of an uploaded file, as returned by twprojects-create_upload_url or twprojects-create_file. It is "tf_" followed by a UUID and the file extension, and can only be used once.
- `tag_ids` (array): A list of tag IDs to associate with the file.

### `twprojects-add_project_member` (~47 tokens)

Add a user to a project.

Input parameters:

- `project_id` (integer, required): The ID of the project to add the member to.
- `user_ids` (array): Users to add.

### `twprojects-clone_project` (~345 tokens)

Clone/copy an existing project or instantiate one from a template.

Input parameters:

- `company_id` (integer): The ID of the company associated with the new cloned project. If not provided, the company of the original project will be used.
- `days_offset` (integer): DaysOffset is the number of days to shift all scheduled dates in the cloned project relative to the base date. When cloning from a template, it defines the project duration span. When copying an exis…
- `description` (string): The description of the new cloned project. If not provided, the description of the original project will be used.
- `id` (integer, required): The ID of the project to clone.
- `name` (string): The name of the new cloned project. If not provided, the name of the original project will be used with an incremental suffix (e.g., 'Project Name (1)').
- `new_from_template` (boolean): Indicates whether the new project should be a regular one created from a template.
- `target_date` (string): Desired start or end date for the cloned project (chosen by template_date_target). Only applies when new_from_template=true. Format: YYYYMMDD. Defaults to today.
- `template_date_target` (string): Specifies whether target_date represents the project's start or end date. When 'end', the start date is calculated by subtracting the template project's duration from target_date. Only applicable whe…
- `to_template` (boolean): Indicates whether the new project should be set as a template.

### `twprojects-complete_timer` (~45 tokens)

Stop a timer permanently and convert it to a timelog. Use pause_timer to pause without converting.

Input parameters:

- `id` (integer, required): The ID of the timer to complete.

### `twprojects-count_milestones` (~272 tokens)

Exact milestone count for any filter set: one call, one number, no rows. Use for "how many milestones" questions (per project, per tag, matching a term) instead of paging twprojects-list_milestones to count rows. Use twprojects-list_milestones when the rows are needed.

Input parameters:

- `due_after` (string): Only include milestones with a deadline on or after this date.
- `due_before` (string): Only include milestones with a deadline on or before this date.
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `project_id` (integer): The ID of the project from which to retrieve milestones. Omit to list milestones across all projects.
- `search_term` (string): A search term to filter milestones by name. Each word from the search term is used to match against the milestone name and description. The milestone will be selected if each word of the term matches…
- `show_completed` (boolean): If false, only return milestones that are not completed yet. Included by default, unlike the task and tasklist lists.
- `tag_ids` (array): A list of tag IDs to filter milestones by tags.

Output parameters:

- `count` (integer)

### `twprojects-count_projects` (~593 tokens)

Exact project count for any filter set: one call, one number, no rows. Use for "how many projects" questions (mine, late, per category, per tag, per company, per owner, matching a term) instead of paging twprojects-list_projects to count rows. Use twprojects-list_projects when the rows are needed.

Input parameters:

- `company_ids` (array): Filter projects by the company that owns them.
- `hide_observed` (boolean): If true, leave out the projects the calling user only observes, keeping the ones they actually work on.
- `include_archived` (boolean): If true, return archived projects alongside the active ones; excluded by default.
- `include_subcategories` (boolean): If true, project_category_ids also matches the categories nested under the ones given.
- `include_tentative` (boolean): If true, return tentative projects alongside the normal ones; excluded by default.
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `only_admin_access` (boolean): If true, only return the projects the calling user administers.
- `only_archived` (boolean): If true, only return archived projects.
- `only_starred` (boolean): If true, only return the projects the calling user has starred.
- `project_category_ids` (array): Filter projects by category.
- `project_healths` (array): Filter projects by the health rating set on them, matching any of the values given. "not_set" matches the projects nobody has rated.
- `project_owner_ids` (array): Filter projects by the user who owns them.
- `project_statuses` (array): Filter projects by progress state, matching any of the values given. "late" is past its end date and not yet completed, "upcoming" has not started yet, "current" is running now, and "active" is every…
- `search_term` (string): A search term to filter projects by name or description.
- `tag_ids` (array): A list of tag IDs to filter projects by tags.
- `team_ids` (array): Filter projects by team, matching the projects any member of those teams belongs to.
- `updated_after`: Only include projects whose last activity is strictly after this moment; the boundary itself does not match. Any activity in the project counts, not just edits to the project record. Accepts an RFC 3…
- `user_ids` (array): Filter projects by the users holding an explicit membership of them. For "my projects", pass the ID returned by twprojects-get_user_me.

Output parameters:

- `count` (integer)

### `twprojects-count_tasks` (~1277 tokens)

Exact task count for any filter set: one call, one number, no rows. Use for "how many" questions (totals, late, per person, per project, per tag, completed in a window) instead of paging twprojects-list_tasks to count rows. Note due_before excludes tasks with no due date, unless a related milestone due date matches. Use twprojects-list_tasks when the rows are needed.

Input parameters:

- `assignee_user_ids` (array): Filter tasks by assignee.
- `completed_after`: Only include tasks completed at or after this moment; the boundary itself matches. Setting it narrows the result to completed tasks. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YY…
- `completed_before`: Only include tasks completed at or before this moment; the boundary itself matches. Setting it narrows the result to completed tasks. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain Y…
- `created_after`: Only include tasks created at or after this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole…
- `created_before`: Only include tasks created at or before this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole…
- `created_by_user_ids` (array): Filter tasks by creator.
- `date_filter` (string): Where the task's dates fall relative to today, in your own timezone. This is the filter for "late", "overdue", "due today", "started" and "upcoming"; omit it for no date restriction. overdue: due bef…
- `due_after` (string): Only include tasks due after this date, excluding the day itself — unless due_before is set too, which makes both bounds inclusive. A task with no due date is matched on its milestone's.
- `due_before` (string): Only include tasks due before this date, excluding the day itself — unless due_after is set too, which makes both bounds inclusive. A task with no due date is matched on its milestone's.
- `exclude_assignee_user_ids` (array): Leave out tasks assigned to any of these users. A task is dropped when any one of the listed users is assigned to it, even when it also carries assignees you did not exclude. A user reached only thro…
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `only_completed` (boolean): If true, return only completed tasks. It combines with every other filter, date_filter included — except date_filter=overdue, which never matches a completed task and so returns nothing. Tasks in com…
- `only_unassigned` (boolean): If true, only return tasks that have no assignee.
- `only_unplanned` (boolean): If true, only return tasks that are unplanned, meaning they are missing an assignee, a due date, or estimated time.
- `project_id` (integer): The ID of the project from which to retrieve tasks. Omit to list tasks across all projects.
- `search_term` (string): A search term to filter tasks by name.
- `show_completed` (boolean): If true, include completed tasks and tasks belonging to completed tasklists; both excluded by default.
- `start_after` (string): Only include tasks whose own start date falls on or after this date; the day itself matches. A task with no start date never matches — there is no milestone fallback. There is no upper bound on the s…
- `tag_ids` (array): A list of tag IDs to filter tasks by tags.
- `tasklist_id` (integer): The ID of the tasklist from which to retrieve tasks. Takes precedence over project_id.
- `updated_after`: Only include tasks updated strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers t…
- `updated_before`: Only include tasks updated strictly before this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers…

Output parameters:

- `count` (integer)

### `twprojects-count_timelogs` (~532 tokens)

Exact count of time entries for any filter set: one call, one number, no rows. This counts entries, not hours — for logged, billable or billed time totals use twprojects-summarize_timelogs. Use for "how many time entries" questions (per project, per task, per person, in a date window) instead of paging twprojects-list_timelogs to count rows.

Input parameters:

- `assigned_company_ids` (array): Filter timelogs by assigned company.
- `assigned_team_ids` (array): Filter timelogs by assigned team.
- `assigned_user_ids` (array): Filter timelogs by assigned user.
- `billable_type` (string): Restrict the results to billable or non-billable timelogs. Omit, or pass all, to include both. For billable hours rather than the entries themselves, twprojects-summarize_timelogs reports them withou…
- `end_date`: End of the timelog window; the boundary itself is included, and a plain date covers that whole day. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which…
- `invoiced_type` (string): Restrict the results to timelogs that have or have not been added to an invoice. Omit, or pass all, to include both. Invoiced is not the same as billed: noninvoiced answers "what is still to be invoi…
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `project_id` (integer): The ID of the project from which to retrieve timelogs. Omit to list timelogs across all projects.
- `start_date`: Start of the timelog window; the boundary itself is included. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.
- `tag_ids` (array): A list of tag IDs to filter timelogs by tags.
- `task_id` (integer): The ID of the task from which to retrieve timelogs. Omit to list timelogs across all tasks.
- `ticketIds` (array): Filter timelogs by associated desk ticket.

Output parameters:

- `count` (integer)

### `twprojects-create_allocation` (~563 tokens)

Commit a user's time to a project over a date range (a scheduler allocation). This is planned time, a separate plane from task estimates and logged time.

Input parameters:

- `assigned_user_id` (integer, required): The ID of the user whose time is committed. Accepts a real person or a placeholder user — a stand-in used to plan work before the person who will do it is known. Nothing in the response distinguishes…
- `color` (string, required): The allocation's colour as six hexadecimal digits, with or without a leading '#'.
- `description` (string): An optional description of the allocation, at most 255 characters.
- `end_date` (string, required): The last day of the allocation (format: YYYY-MM-DD). Must not precede start_date. Extending it ADDS committed time rather than spreading the existing total: the per-day rate is what is held constant,…
- `ignore_collisions` (boolean): Skip the capacity check altogether. Prefer inform_of_over_allocation: this one also lets the change through, but suppresses the over-allocation report with it, so nobody is told the person is over-bo…
- `inform_of_over_allocation` (boolean): Accept a change that puts the user over their capacity and report it, rather than rejecting it. Defaults to true, and the result says so when it happens. Turning it off means an over-allocating chang…
- `is_billable` (boolean): Whether the allocated time can be charged to a client.
- `linked_task_ids` (array): The tasks to associate with the allocation. This REPLACES the whole set of linked tasks, so send every task that should stay linked. To add or remove one task without touching the rest, use twproject…
- `project_id` (integer, required): The ID of the project to commit the time to.
- `seconds_per_day` (integer, required): The time committed on each working day of the range, in SECONDS — 4 hours a day is 14400. Must be between 60 (one minute) and 86400 (24 hours). Seconds rather than hours because the hours form is a f…
- `start_date` (string, required): The first day of the allocation (format: YYYY-MM-DD).
- `title` (string, required): The name of the allocation, at most 100 characters.

### `twprojects-create_company` (~274 tokens)

Create company (aka client).

Input parameters:

- `address_one` (string): The first line of the address of the company.
- `address_two` (string): The second line of the address of the company.
- `city` (string): The city of the company.
- `country_code` (string): The country code of the company, e.g., 'US' for the United States.
- `email_one` (string): The primary email address of the company.
- `email_three` (string): The tertiary email address of the company.
- `email_two` (string): The secondary email address of the company.
- `fax` (string): The fax number of the company.
- `industry_id` (integer): The ID of the industry the company belongs to.
- `manager_id` (integer): The ID of the user who manages the company.
- `name` (string, required): The name of the company.
- `phone` (string): The phone number of the company.
- `profile` (string): A profile description for the company.
- `state` (string): The state of the company.
- `tag_ids` (array): A list of tag IDs to associate with the company.
- `website` (string): The website of the company.
- `zip` (string): The ZIP or postal code of the company.

### `twprojects-create_custom_field` (~285 tokens)

Create custom field.

Input parameters:

- `currency_code` (string): The ISO currency code for 'currency' or 'financial' type custom fields.
- `description` (string): An optional description for the custom field.
- `entity` (string, required): The type of entity this custom field can be applied to. Use 'all' for installation-level custom fields that are available across the workspace.
- `formula` (string): The formula expression for 'formula' type custom fields.
- `name` (string, required): The display name of the custom field.
- `options`: Type-specific options for the custom field. For 'dropdown' and 'multiselect' types, provide {"choices": [{"value": "...", "color": "#rrggbb"}, ...]}. For 'rating' type, provide {"icon": "star|heart|.…
- `project_id` (integer): The ID of the project to scope the custom field to. When omitted, the custom field is created at the installation level.
- `required` (boolean): Whether the custom field must have a value when set on an entity.
- `type` (string, required): The data type of the custom field.
- `unit` (string): The unit associated with the custom field, when applicable.

### `twprojects-create_custom_field_value` (~181 tokens)

Set a custom field value on a task, project or company. The custom field must already exist and be applicable to the target entity.

Input parameters:

- `country_code` (string): The country code for currency-type custom field values.
- `currency_code` (string): The ISO currency code for currency-type custom field values.
- `custom_field_id` (integer, required): The ID of the custom field the value belongs to.
- `entity` (string, required): The type of entity the custom field value is attached to.
- `entity_id` (integer, required): The ID of the task, project or company the custom field value is attached to.
- `value`: The value to assign, typed per the field: string (text), number (number), boolean (checkbox), choice value string (dropdown/status; array for multiselect), ISO-8601 string (date).

### `twprojects-create_custom_item` (~244 tokens)

Create a new custom item type (e.g. Contracts, Leads, Deals) on a project. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `description` (string): An optional human-readable description for the custom item type.
- `display_name` (string, required): The display name of the custom item type (e.g. "Contracts").
- `label_plural` (string): Plural label for many records (e.g. "Contracts"). Defaults to the display name when omitted.
- `label_singular` (string): Singular label for one record (e.g. "Contract"). Defaults to the display name when omitted.
- `project_id` (integer, required): Project ID that will own the new custom item type.

### `twprojects-create_custom_item_field` (~342 tokens)

Add a field (column) to a custom item type. Field types include text, number, dropdown, multiselect, checkbox, url, user, date, time and datetime. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `custom_item_id` (integer, required): Custom item type ID that will own the new field.
- `definition` (object): Optional type-specific configuration as a JSON object. Examples: for number-decimal fields {"precision": "2", "unit": {"type": "currency"}}; for user fields {"limit": 1, "source": "workspace"}. See t…
- `display_name` (string, required): Human-readable name of the field (e.g. "Status").
- `options` (array): Choices for dropdown/multiselect fields. Each option is {label: "Active", color: "#22c55e"}.
- `position_after_id` (integer): Place this field after the given field ID. Null appends to the end.
- `tw_type` (string): Optional sub-classification for dropdown fields. Use "status" for a Status field.
- `type` (string, required): Field data type.

### `twprojects-create_custom_item_record` (~345 tokens)

Create a record (row) on a custom item type. For example, add a Contract on the Contracts type. Pass field values by name; the tool resolves names to the API's internal IDs. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `custom_item_id` (integer, required): Custom item type ID that will own the new record.
- `field_values` (array): Field values to set on the record. Each entry is {field_name, value}. Field names are matched case-insensitively against the custom item type's fields. Values are coerced by field type: dropdown/mult…
- `name` (string, required): Display name of the record (e.g. "Acme Inc Contract").
- `position_after_id` (integer): Place the record after the given record ID. Null appends to the end.
- `section_id` (integer): Optional section ID to place the record in.

### `twprojects-create_file` (~224 tokens)

Upload short text you are generating yourself, such as a plan, a spec or a CSV, so it can be attached to a task, comment or message. Returns a single-use reference; pass it in attachment_refs on twprojects-create_task, twprojects-update_task, twprojects-create_comment or twprojects-create_message. Content is sent inline as base64, which means you have to emit the whole file as text, so use twprojects-create_upload_url instead for anything that already exists as a file — it hands back a URL to send the bytes to directly, and is the only safe option for a document that must stay byte-for-byte identical.

Input parameters:

- `data` (string, required): The file content, base64-encoded with the standard alphabet. It must decode to between 1 byte and 5242880 bytes.
- `name` (string, required): The file name, including its extension, for example "plan.md". Teamwork.com works out how to display the file from the extension, so a name without one is harder to open. Any directory part is remove…

### `twprojects-create_jobrole` (~28 tokens)

Create job role.

Input parameters:

- `name` (string, required): The name of the job role.

### `twprojects-create_link` (~275 tokens)

Create link.

Input parameters:

- `code` (string, required): The URL of the link. This is the actual web address that the link points to.
- `description` (string): The description of the link. Longer text that provides detailed information about the link.
- `notify`: Who to notify of the new link. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one si…
- `notify_current_user` (boolean): Whether the current user should be notified about the new link.
- `project_id` (integer, required): The ID of the project to create the link in.
- `tag_ids` (array): A list of tag IDs to associate with the link.
- `title` (string): The title of the link, which provides a brief summary of the purpose of the link.

### `twprojects-create_message` (~290 tokens)

Create message in a project.

Input parameters:

- `attachment_refs` (array): References of files to attach to the message, as returned by twprojects-create_upload_url or twprojects-create_file. Each is "tf_" followed by a UUID and the file extension, and can only be used once…
- `body` (string, required): The body of the message.
- `notify`: Who to notify of the new message. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one…
- `notify_current_user` (boolean): Whether the current user should be notified about the new message.
- `project_id` (integer, required): The ID of the project to create the message in.
- `title` (string, required): The title of the message.

### `twprojects-create_message_reply` (~203 tokens)

Create message reply.

Input parameters:

- `body` (string, required): The body of the message reply.
- `message_id` (integer, required): The ID of the message to create the reply in.
- `notify`: Who to notify of the new reply. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one s…
- `notify_current_user` (boolean): Whether the current user should be notified about the new message reply.

### `twprojects-create_milestone` (~139 tokens)

Create milestone in a project.

Input parameters:

- `assignees` (object, required): Assignees for the milestone.
- `description` (string): A description of the milestone.
- `due_date` (string, required): The due date of the milestone (format: YYYYMMDD). Used for related tasks without their own due date.
- `name` (string, required): The name of the milestone.
- `project_id` (integer, required): The ID of the project to create the milestone in.
- `tag_ids` (array): A list of tag IDs to associate with the milestone.
- `tasklist_ids` (array): Tasklists to associate with the milestone.

### `twprojects-create_notebook` (~101 tokens)

Create notebook in a project.

Input parameters:

- `contents` (string, required): The contents of the notebook.
- `description` (string): A description of the notebook.
- `name` (string, required): The name of the notebook.
- `project_id` (integer, required): The ID of the project to create the notebook in.
- `tag_ids` (array): A list of tag IDs to associate with the notebook.
- `type` (string, required): The type of the notebook.

### `twprojects-create_project` (~145 tokens)

Create project.

Input parameters:

- `category_id` (integer): The ID of the category to which the project belongs.
- `company_id` (integer): The ID of the company associated with the project.
- `description` (string): The description of the project.
- `end_at` (string): End date of the project (format: YYYYMMDD).
- `name` (string, required): The name of the project.
- `owned_id` (integer): The ID of the user who owns the project.
- `start_at` (string): Start date of the project (format: YYYYMMDD).
- `tag_ids` (array): A list of tag IDs to associate with the project.

### `twprojects-create_project_category` (~76 tokens)

Create project category.

Input parameters:

- `color` (string): The color of the project category in hex format (e.g., #FF5733).
- `name` (string, required): The name of the project category.
- `parent_id` (integer): The ID of the parent project category, if any. This allows for nested categories.

### `twprojects-create_project_template` (~155 tokens)

Create project template.

Input parameters:

- `category_id` (integer): The ID of the category to which the project template belongs.
- `company_id` (integer): The ID of the company associated with the project template.
- `description` (string): The description of the project template.
- `end_at` (string): End date of the project template (format: YYYYMMDD).
- `name` (string, required): The name of the project template.
- `owned_id` (integer): The ID of the user who owns the project template.
- `start_at` (string): Start date of the project template (format: YYYYMMDD).
- `tag_ids` (array): A list of tag IDs to associate with the project template.

### `twprojects-create_skill` (~40 tokens)

Create skill.

Input parameters:

- `name` (string, required): The name of the skill.
- `user_ids` (array): The user IDs associated with the skill.

### `twprojects-create_tag` (~81 tokens)

Create tag.

Input parameters:

- `color` (string): The color of the tag. It must be a valid hex color code.
- `name` (string, required): The name of the tag. It must have less than 50 characters.
- `project_id` (integer): The ID of the project to associate the tag with. This is for project-scoped tags.

### `twprojects-create_tasklist` (~82 tokens)

Create tasklist in a project.

Input parameters:

- `description` (string): The description of the tasklist.
- `milestone_id` (integer): The ID of the milestone to associate with the tasklist.
- `name` (string, required): The name of the tasklist.
- `project_id` (integer, required): The ID of the project to create the tasklist in.

### `twprojects-create_team` (~158 tokens)

Create team.

Input parameters:

- `company_id` (integer): The ID of the company. This is used to create a team scoped for a specific company.
- `description` (string): The description of the team.
- `handle` (string): The handle of the team. It is a unique identifier for the team. It must not have spaces or special characters.
- `name` (string, required): The name of the team.
- `parent_team_id` (integer): The ID of the parent team. This is used to create a hierarchy of teams.
- `project_id` (integer): The ID of the project. This is used to create a team scoped for a specific project.
- `user_ids` (array): Users to add to the team.

### `twprojects-create_timer` (~137 tokens)

Create and start a timer.

Input parameters:

- `billable` (boolean): If true, the timer is billable.
- `description` (string): A description of the timer.
- `project_id` (integer, required): The ID of the project to associate the timer with.
- `running` (boolean): If true, the timer will start running immediately.
- `seconds` (integer): The number of seconds to set the timer for.
- `stop_running_timers` (boolean): If true, any other running timers will be stopped when this timer is created.
- `task_id` (integer): The ID of the task to associate the timer with.

### `twprojects-create_upload_url` (~219 tokens)

Reserve an upload for a file and get back a short-lived URL to send its bytes to, plus a single-use reference. Use this for any file that already exists — a PDF, an image, a signed document — because the bytes go straight from you to storage and are never read into the conversation. Send the file with the returned method and URL, setting exactly the headers returned and no authorization of your own. Then pass the reference in attachment_refs on twprojects-create_task, twprojects-update_task, twprojects-create_comment or twprojects-create_message. Prefer twprojects-create_file only for short text you are generating yourself.

Input parameters:

- `name` (string, required): The file name, including its extension, for example "contract.pdf". Teamwork.com works out how to display the file from the extension, so a name without one is harder to open. Any directory part is r…
- `size` (integer, required): The exact size of the file in bytes. The reservation is signed against this number, so an upload of any other length is rejected.

### `twprojects-create_user` (~137 tokens)

Create user.

Input parameters:

- `admin` (boolean): Indicates whether the user is an administrator.
- `company_id` (integer): The ID of the client/company to which the user belongs.
- `email` (string, required): The email address of the user.
- `first_name` (string, required): The first name of the user.
- `last_name` (string, required): The last name of the user.
- `title` (string): The job title of the user, such as 'Project Manager' or 'Senior Software Developer'.
- `type` (string): The type of user, such as 'account', 'collaborator', or 'contact'.

### `twprojects-create_workflow` (~26 tokens)

Create workflow.

Input parameters:

- `name` (string, required): The name of the workflow.

### `twprojects-create_workflow_stage` (~47 tokens)

Create workflow stage.

Input parameters:

- `name` (string, required): The name of the workflow stage.
- `workflow_id` (integer, required): The ID of the workflow to add the stage to.

### `twprojects-download_file` (~141 tokens)

Read the content of a file stored in Teamwork.com: text files come back as text, images as an image, and anything else as a base64 resource with its media type. Files over 10 MB are refused; point the user at the file's downloadURL from twprojects-get_file instead. The file ID is in a task's or message reply's attachments and a comment's files (each {id, type: "files"}), or comes from twprojects-list_files.

Input parameters:

- `id` (integer, required): The ID of the file to download.
- `version` (integer): The version number to download. Omit for the latest version.

Output parameters:

- `mimeType` (string)
- `name` (string)
- `size` (integer)

### `twprojects-get_allocation` (~141 tokens)

Get an allocation. linkedTaskEstimatedTime counts each linked task whole, and a task can sit behind more than one allocation, so it must not be summed across allocations.

Input parameters:

- `fields` (array): The attributes to return for each allocation, from the listed names.
- `id` (integer, required): The ID of the allocation to get.
- `include_financial_details` (boolean): Include forecasted revenue and cost for the allocated time. Requires the scheduler rates entitlement and financial permission on the project; without either, the request still succeeds but the figure…

Output parameters:

- `allocation` (object)
- `included` (object)

### `twprojects-get_comment` (~46 tokens)

Get comment.

Input parameters:

- `fields` (array): The attributes to return for each comment, from the listed names.
- `id` (integer, required): The ID of the comment to get.

Output parameters:

- `comments` (object)

### `twprojects-get_company` (~49 tokens)

Get company (aka client).

Input parameters:

- `fields` (array): The attributes to return for each company, from the listed names.
- `id` (integer, required): The ID of the company to get.

Output parameters:

- `company` (object)
- `included` (object)

### `twprojects-get_custom_field` (~30 tokens)

Get custom field.

Input parameters:

- `id` (integer, required): The ID of the custom field to get.

Output parameters:

- `customfield` (object)

### `twprojects-get_custom_field_value` (~85 tokens)

Get a single custom field value from a task, project or company.

Input parameters:

- `entity` (string, required): The type of entity the custom field value is attached to.
- `entity_id` (integer, required): The ID of the task, project or company the custom field value belongs to.
- `value_id` (integer, required): The ID of the custom field value entry to retrieve.

Output parameters:

- `customfieldValue` (object)

### `twprojects-get_custom_item` (~148 tokens)

Get a custom item type with its fields and sections inline, so you can see its schema before creating or updating records. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `id` (integer, required): Custom item type ID to retrieve.

Output parameters:

- `customItem` (object)
- `included` (object)

### `twprojects-get_custom_item_field` (~148 tokens)

Get a single field on a custom item type. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `custom_item_id` (integer, required): Custom item type ID the field belongs to.
- `id` (integer, required): Field ID.

Output parameters:

- `customItemField` (object)

### `twprojects-get_custom_item_record` (~161 tokens)

Get a single record. Field values come back keyed by display name with dropdown values translated to their human-readable labels. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `custom_item_id` (integer, required): Custom item type ID the record belongs to.
- `id` (integer, required): Record ID.

Output parameters:

- `customItemRecord` (object)

### `twprojects-get_file` (~159 tokens)

Get a file's details: name, size, uploader, version history, the tasks, messages and comments it is attached to, and its downloadURL. The downloadURL needs the caller's own Teamwork session, so hand it to a signed-in user rather than fetching it; use twprojects-download_file to read the content here.

Input parameters:

- `fields` (array): The attributes to return for each file, from the listed names.
- `id` (integer, required): The ID of the file to get.
- `include_versions` (boolean): Whether to include the file's whole version history under versions. Defaults to false.
- `version` (integer): The version number whose details, size and downloadURL are returned. Omit for the latest version.

Output parameters:

- `file` (object)
- `included` (object)

### `twprojects-get_jobrole` (~84 tokens)

Get job role. The people assigned to the role come back under users, and those holding it as their primary role under primaryUsers; both are references, resolved to names under included.users.

Input parameters:

- `fields` (array): The attributes to return for each job role, from the listed names.
- `id` (integer, required): The ID of the job role to get.

Output parameters:

- `included` (object)
- `jobRole` (object)

### `twprojects-get_link` (~27 tokens)

Get link.

Input parameters:

- `id` (integer, required): The ID of the link to get.

Output parameters:

- `link` (object)

### `twprojects-get_message` (~46 tokens)

Get message.

Input parameters:

- `fields` (array): The attributes to return for each message, from the listed names.
- `id` (integer, required): The ID of the message to get.

Output parameters:

- `message` (object)

### `twprojects-get_message_reply` (~50 tokens)

Get message reply.

Input parameters:

- `fields` (array): The attributes to return for each message reply, from the listed names.
- `id` (integer, required): The ID of the message reply to get.

Output parameters:

- `messageReply` (object)

### `twprojects-get_milestone` (~48 tokens)

Get milestone.

Input parameters:

- `fields` (array): The attributes to return for each milestone, from the listed names.
- `id` (integer, required): The ID of the milestone to get.

Output parameters:

- `milestone` (object)

### `twprojects-get_notebook` (~47 tokens)

Get notebook.

Input parameters:

- `fields` (array): The attributes to return for each notebook, from the listed names.
- `id` (integer, required): The ID of the notebook to get.

Output parameters:

- `notebook` (object)

### `twprojects-get_project_category` (~50 tokens)

Get project category.

Input parameters:

- `fields` (array): The attributes to return for each project category, from the listed names.
- `id` (integer, required): The ID of the project category to get.

Output parameters:

- `projectCategory` (object)

### `twprojects-get_skill` (~27 tokens)

Get skill.

Input parameters:

- `id` (integer, required): The ID of the skill to get.

Output parameters:

- `skill` (object)

### `twprojects-get_tag` (~27 tokens)

Get tag.

Input parameters:

- `id` (integer, required): The ID of the tag to get.

Output parameters:

- `tag` (object)

### `twprojects-get_team` (~27 tokens)

Get team.

Input parameters:

- `id` (integer, required): The ID of the team to get.

Output parameters:

- `team` (object)

### `twprojects-get_timelog` (~50 tokens)

Get timelog.

Input parameters:

- `fields` (array): The attributes to return for each timelog, from the listed names.
- `id` (integer, required): The ID of the timelog to get.

Output parameters:

- `timelog` (object)

### `twprojects-get_timer` (~46 tokens)

Get timer.

Input parameters:

- `fields` (array): The attributes to return for each timer, from the listed names.
- `id` (integer, required): The ID of the timer to get.

Output parameters:

- `timer` (object)

### `twprojects-get_user` (~46 tokens)

Get user.

Input parameters:

- `fields` (array): The attributes to return for each user, from the listed names.
- `id` (integer, required): The ID of the user to get.

Output parameters:

- `person` (object)

### `twprojects-get_user_me` (~17 tokens)

Get the currently authenticated user.

Output parameters:

- `person` (object)

### `twprojects-get_workflow` (~47 tokens)

Get workflow.

Input parameters:

- `fields` (array): The attributes to return for each workflow, from the listed names.
- `id` (integer, required): The ID of the workflow to get.

Output parameters:

- `workflow` (object)

### `twprojects-get_workflow_stage` (~68 tokens)

Get workflow stage.

Input parameters:

- `fields` (array): The attributes to return for each workflow stage, from the listed names.
- `id` (integer, required): The ID of the workflow stage to get.
- `workflow_id` (integer, required): The ID of the workflow that owns the stage.

Output parameters:

- `stage` (object)

### `twprojects-link_project_to_workflow` (~63 tokens)

Link a project to a workflow so its tasks track through workflow stages.

Input parameters:

- `project_id` (integer, required): The ID of the project to link to the workflow.
- `workflow_id` (integer, required): The ID of the workflow to link the project to.

### `twprojects-link_task_to_allocation` (~109 tokens)

Link one task to an allocation, showing what task work sits behind the committed time. The task and the allocation must be in the same project. This adds a single link and leaves the allocation's other links alone, unlike linked_task_ids on twprojects-update_allocation, which replaces the whole set.

Input parameters:

- `allocation_id` (integer, required): The ID of the allocation.
- `task_id` (integer, required): The ID of the task to link. Must belong to the allocation's project.

### `twprojects-list_allocations` (~803 tokens)

List scheduler allocations — who is committed to which project, and when. ALWAYS pass start_date and end_date: with neither set the endpoint returns only today through 30 days from today, and says nothing about having narrowed the range, so an unbounded call silently answers a question about a wider period with one month of data. Allocations are planned time and a separate plane from task estimates and logged time; the two are not summed. linkedTaskEstimatedTime counts each linked task whole and must not be summed across allocations.

Input parameters:

- `assigned_user_ids` (array): Only return allocations assigned to these users. Accepts real people and placeholder users alike.
- `assigned_user_team_ids` (array): Only return allocations whose assigned user belongs to one of these teams.
- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching allocations, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `deleted_after`: Only return allocations deleted at or after this moment; the boundary itself matches, unlike updated_after. Pair it with show_deleted, which is what switches the results to deleted allocations. Accep…
- `end_date` (string): Return allocations overlapping up to and including this day (format: YYYY-MM-DD). Defaults to 30 days from today when omitted.
- `fields` (array): The attributes to return for each allocation, from the listed names.
- `include_financial_details` (boolean): Include forecasted revenue and cost for the allocated time. Requires the scheduler rates entitlement and financial permission on the project; without either, the request still succeeds but the figure…
- `match_all_project_tags` (boolean): Require a project to carry every tag in project_tag_ids rather than any of them.
- `order_by` (string): The field to sort the allocations by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_category_ids` (array): Only return allocations on projects in these categories.
- `project_company_ids` (array): Only return allocations on projects belonging to these companies.
- `project_ids` (array): Only return allocations on these projects.
- `project_owner_ids` (array): Only return allocations on projects owned by these users.
- `project_status` (string): Only return allocations on projects with this status.
- `project_tag_ids` (array): Only return allocations on projects carrying these tags.
- `search_term` (string): A search term to filter allocations by title.
- `show_deleted` (boolean): Return ONLY deleted allocations instead of the active ones — this replaces the result set rather than adding to it, so a call with this set says nothing about what is currently scheduled. Deleting an…
- `start_date` (string): Return allocations overlapping this day onwards (format: YYYY-MM-DD). Defaults to today when omitted.
- `updated_after`: Only return allocations updated strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which cov…
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `allocations` (null|array)
- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `included` (object)
- `meta` (object)

### `twprojects-list_calendar_events` (~328 tokens)

List events from a calendar, including time-blocking events that link a calendar slot to a Teamwork project, task or timelog. Omit calendar_id to read the calling user's own calendar. Use twprojects-list_calendars to name a different one; the calendar of type 'blocked_time' holds the account's time-blocking events.

Input parameters:

- `calendar_id` (integer): The ID of the calendar to list events from. Omit it for the calling user's own calendar: the connected Google or Outlook calendar when there is one, otherwise the calendar of type 'blocked_time'. Eve…
- `cursor` (string): Cursor for fetching the next page of results.
- `ended_before_date` (string): Only include events ending before this day starts, so the day named here is itself excluded — pass the day after the last one you want (format: YYYY-MM-DD). Note the asymmetry with started_after_date.
- `fields` (array): The attributes to return for each calendar event, from the listed names.
- `limit` (integer): Maximum number of events to return.
- `order_by` (string): The field to sort the calendar events by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `started_after_date` (string): Only include events starting on or after this day, which is itself included (format: YYYY-MM-DD).
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `events` (null|array)
- `included` (object)
- `meta` (object)

### `twprojects-list_calendars` (~212 tokens)

List calendars. Calendars hold events such as meetings, out-of-office periods and time-blocking entries; the calendar of type 'blocked_time' holds the account's time-blocking events.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching calendars, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each calendar, from the listed names.
- `order_by` (string): The field to sort the calendars by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `calendars` (null|array)
- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)

### `twprojects-list_companies` (~281 tokens)

List companies (aka clients).

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching companies, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each company, from the listed names.
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `order_by` (string): The field to sort the companies by. Omit to keep the ordering the API applies by default.
- `order_by_custom_field_id` (integer): The custom field to sort the companies by. Required when order_by is "customfield", and ignored otherwise.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `search_term` (string): A search term to filter companies by name. Each word from the search term is used to match against the company name.
- `tag_ids` (array): A list of tag IDs to filter companies by tags.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `companies` (null|array)
- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `included` (object)
- `meta` (object)

### `twprojects-list_custom_field_values` (~202 tokens)

List the custom field values of a task, project or company.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching custom field values, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `custom_field_ids` (array): Filter by custom field.
- `entity` (string, required): The type of entity to list custom field values for.
- `entity_id` (integer, required): The ID of the task, project or company to list custom field values for.
- `fields` (array): The attributes to return for each custom field value, from the listed names.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `customfieldValues` (null|array)
- `meta` (object)

### `twprojects-list_custom_fields` (~307 tokens)

List custom fields.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching custom fields, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `entities` (array): Filter custom fields by entity type.
- `fields` (array): The attributes to return for each custom field, from the listed names.
- `ids` (array): Custom field IDs to retrieve.
- `include_site_level` (boolean): Whether to also include installation-level custom fields when filtering by project.
- `only_project_level` (boolean): Whether to return only project-level custom fields.
- `only_site_level` (boolean): Whether to return only installation-level custom fields.
- `order_by` (string): The field to sort the custom fields by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_ids` (array): Filter custom fields by project.
- `search_term` (string): A search term to filter custom fields by name.
- `show_deleted` (boolean): Whether to include deleted custom fields in the results.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `customfields` (null|array)
- `meta` (object)

### `twprojects-list_custom_item_fields` (~290 tokens)

List fields on a custom item type. Each entry includes the twId you need when writing record values. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching custom item fields, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `custom_item_id` (integer, required): Custom item type ID to list fields for.
- `ids` (array): Restrict to these field IDs.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `search_term` (string): A search term to filter custom item fields by display name.
- `show_deleted` (boolean): Include deleted fields.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `customItemFields` (null|array)
- `meta` (object)

### `twprojects-list_custom_item_records` (~375 tokens)

List records on a custom item type. Returns each record with field values keyed by display name. Use the section_ids filter to scope to a specific section. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching custom item records, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `custom_item_id` (integer, required): Custom item type ID to list records for.
- `ids` (array): Restrict to these record IDs.
- `order_by` (string): The field to sort the custom item records by. Omit to keep the ordering the API applies by default.
- `order_by_field_id` (integer): The custom field to sort the records by. Required when order_by is "customitemfield", and ignored otherwise.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `search_term` (string): A search term to filter custom item records by name.
- `section_ids` (array): Restrict to records in these sections.
- `show_deleted` (boolean): Include deleted records.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `customItemRecords` (null|array)
- `meta` (object)

### `twprojects-list_custom_items` (~333 tokens)

List the custom item types defined on a project. Returns each type's id, display name and labels — call get_custom_item to see a type's fields and sections. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching custom items, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `ids` (array): Restrict to these custom item type IDs.
- `order_by` (string): The field to sort the custom items by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer, required): Project ID to list custom item types for.
- `search_term` (string): A search term to filter custom items by display name or labels.
- `show_deleted` (boolean): Include deleted custom item types.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `customItems` (null|array)
- `included` (object)
- `meta` (object)

### `twprojects-list_files` (~646 tokens)

List the files in a project's files area, or across every project when no project_id is given. Files attached to tasks, comments and messages live there too, so task_id answers "what is attached to this task". Deleted files are left out unless show_deleted is true. Each row carries a downloadURL that needs the caller's own Teamwork session; use twprojects-download_file to read the content here.

Input parameters:

- `category_id` (integer): Only files in this file category.
- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching files, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each file, from the listed names.
- `ids` (array): Only files with these IDs.
- `order_by` (string): The field to sort the files by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project whose files area to list. Omit to list files across every project the caller can access.
- `search_all_fields` (boolean): Whether search_term also matches the file extension, the file category, the original file name and the name of the latest uploader. Defaults to false.
- `search_term` (string): Only files whose name contains this term. Set search_all_fields to also match the extension, the category, the original name and the uploader's name.
- `show_deleted` (boolean): Whether to also list deleted files. Defaults to false.
- `skip_external_files` (boolean): Whether to leave out files that live in a linked cloud storage provider (Google Drive, Dropbox, Box, OneDrive, SharePoint) and list uploads only. Defaults to false. A row's fileSource tells the two a…
- `tag_ids` (array): Only files carrying any of these tags.
- `task_id` (integer): Only files attached to this task.
- `updated_after`: Only files changed strictly after this instant, on the file or on its selected version. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that…
- `uploaded_after` (string): Only files whose selected version was uploaded on or after this day (YYYY-MM-DD). The day itself is included.
- `uploaded_before` (string): Only files whose selected version was uploaded before this day (YYYY-MM-DD). The bound is the first instant of the day, so files uploaded during it are excluded; name the following day to include it.
- `user_ids` (array): Only files uploaded by these users.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `files` (null|array)
- `included` (object)
- `meta` (object)

### `twprojects-list_industries` (~21 tokens)

List supported company (aka client) industries.

Output parameters:

- `industries` (null|array)

### `twprojects-list_jobroles` (~245 tokens)

List job roles. A verbose row carries the people assigned to the role under users, and those holding it as their primary role under primaryUsers; both are references, resolved to names under included.users.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching job roles, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each job role, from the listed names.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `search_term` (string): A search term to filter job roles by name, or assigned users. The job role will be selected if each word of the term matches the name, or assigned user first or last name, not requiring that the word…
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `included` (object)
- `jobRoles` (null|array)
- `meta` (object)

### `twprojects-list_links` (~209 tokens)

List links.

Input parameters:

- `fields` (array): The attributes to return for each link, from the listed names.
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project to filter links by.
- `search_term` (string): A search term to filter links by title or description. Each word from the search term is used to match against the link title or description. The link will be selected if each word of the term matche…
- `tag_ids` (array): A list of tag IDs to filter links by tags.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `links` (null|array)

### `twprojects-list_message_replies` (~283 tokens)

List replies under a message thread. Filter by message_ids or project_ids.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching message replies, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each message reply, from the listed names.
- `message_ids` (array): Filter by message.
- `order_by` (string): The field to sort the message replies by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_ids` (array): Filter by project.
- `search_term` (string): A search term to filter message replies by body or title. Each word from the search term is used to match against the message reply body or title. The message reply will be selected if each word of t…
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `messageReplies` (null|array)
- `meta` (object)

### `twprojects-list_messages` (~307 tokens)

List project messages (top-level posts). Use twprojects-list_message_replies for thread replies.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching messages, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each message, from the listed names.
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `order_by` (string): The field to sort the messages by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_ids` (array): Filter messages by project.
- `search_term` (string): A search term to filter messages by body or title. Each word from the search term is used to match against the message body or title. The message will be selected if each word of the term matches the…
- `tag_ids` (array): A list of tag IDs to filter messages by tags.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `messages` (null|array)
- `meta` (object)

### `twprojects-list_milestones` (~421 tokens)

List milestones. Scope by project_id or omit for site-wide. Completed milestones are included by default; pass show_completed false to see only the outstanding ones. Use due_after and due_before to bound the deadline instead of listing everything and filtering afterwards.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching milestones, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `due_after` (string): Only include milestones with a deadline on or after this date.
- `due_before` (string): Only include milestones with a deadline on or before this date.
- `fields` (array): The attributes to return for each milestone, from the listed names.
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `order_by` (string): The field to sort the milestones by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project from which to retrieve milestones. Omit to list milestones across all projects.
- `search_term` (string): A search term to filter milestones by name. Each word from the search term is used to match against the milestone name and description. The milestone will be selected if each word of the term matches…
- `show_completed` (boolean): If false, only return milestones that are not completed yet. Included by default, unlike the task and tasklist lists.
- `tag_ids` (array): A list of tag IDs to filter milestones by tags.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `milestones` (null|array)

### `twprojects-list_notebooks` (~292 tokens)

List notebooks.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching notebooks, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each notebook, from the listed names.
- `include_contents` (boolean): If true, include notebook contents in the response.
- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `order_by` (string): The field to sort the notebooks by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_ids` (array): Filter notebooks by project.
- `search_term` (string): A search term to filter notebooks by name or description. The notebook will be selected if each word of the term matches the notebook name or description, not requiring that the word matches are in t…
- `tag_ids` (array): A list of tag IDs to filter notebooks by tags.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `notebooks` (null|array)

### `twprojects-list_project_budgets` (~287 tokens)

Lists top-level project budgets. Filters: project_ids, status.Returns only budgeted projects (diff with twprojects-list_projects for budgetless).Filter server-side via project_ids when known. 1-based page pagination (pageOffset = page - 1)

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching project budgets, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `cursor` (string): Opaque cursor from a previous response, for cursor pagination. This is not an offset or a page number — never construct one. Setting it makes the endpoint ignore page and page_size. To walk pages, us…
- `fields` (array): The attributes to return for each project budget, from the listed names.
- `limit` (integer): Maximum number of budgets to return. Only applies alongside cursor; ignored when paging with page/page_size.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_ids` (array): Filter budgets by project.
- `status` (string): Filter budgets by status.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `budgets` (null|array)
- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `included` (object)
- `meta` (object)

### `twprojects-list_project_categories` (~154 tokens)

List project categories.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching project categories, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each project category, from the listed names.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `search_term` (string): A search term to filter project categories by name.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `projectCategories` (null|array)

### `twprojects-list_project_templates` (~123 tokens)

List project templates.

Input parameters:

- `match_all_tags` (boolean): If true, match all tags; if false, match any.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_category_ids` (array): Filter project templates by category.
- `search_term` (string): A search term to filter project templates by name or description.
- `tag_ids` (array): A list of tag IDs to filter project templates by tags.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `included` (object)
- `meta` (object)
- `projects` (null|array)
- `suggestions` (array): Present only when search_term was supplied and the result list came back empty. Entities whose name matches the term, most relevant first, so the term can be recognised instead of treated as unknown.…

### `twprojects-list_project_updates` (~663 tokens)

List project updates: the Markdown text on a project's dashboard and the health it reports. Nothing else returns either — a project row carries no health, and the activity log holds a preview of the text, not the text. Newest first. Only each project's current update is returned unless active_only is false, so an unfiltered call is not the whole history. Rows carry text (Markdown, in full, emoji codes already converted to characters), health (0 not set, 1 bad, 2 ok, 3 good), healthLabel (the name this installation gives that rating — read it, never build one from health) and color (hex, empty when the health is not set). The author and the project are bare IDs, sideloaded under included when verbose is true. Keep a response small with fields and page_size; verbose=false drops the text and returns the ratings.

Input parameters:

- `active_only` (boolean): If true (the default), return only each project's current update. Set it to false to read the update history, which returns every past update in full.
- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching project updates, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `created_after`: Only include updates posted at or after this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole…
- `fields` (array): The attributes to return for each project update, from the listed names.
- `include_archived` (boolean): If true, return the updates of archived projects alongside those of the active ones; excluded by default. Ignored when project_ids is set.
- `order_by` (string): The field to sort the project updates by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_healths` (array): Only return the updates reporting these health ratings, matching any of the values given. "not_set" matches an update that rates nothing. Ignored when project_ids is set.
- `project_ids` (array): Only return the updates of these projects. Naming any project makes the endpoint ignore every other project filter, including project_healths and include_archived.
- `show_deleted` (boolean): If true, return deleted updates alongside the live ones; excluded by default.
- `updated_after`: Only include updates last edited strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which co…
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `included` (object)
- `meta` (object)
- `projectUpdates` (null|array)

### `twprojects-list_skills` (~204 tokens)

List skills.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching skills, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each skill, from the listed names.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `search_term` (string): A search term to filter skills by name, or assigned users. The skill will be selected if each word of the term matches the name, or assigned user first or last name, not requiring that the word match…
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `skills` (null|array)

### `twprojects-list_tags` (~230 tokens)

List tags.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching tags, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each tag, from the listed names.
- `item_type` (string): Filter tags by item type.
- `order_by` (string): The field to sort the tags by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_ids` (array): Filter by project.
- `search_term` (string): A search term to filter tags by name. Each word from the search term is used to match against the tag name.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `tags` (null|array)

### `twprojects-list_tasklist_budgets` (~218 tokens)

List tasklist budgets nested under a project budget. Requires project_budget_id.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching tasklist budgets, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each tasklist budget, from the listed names.
- `order_by` (string): The field to sort the task list budgets by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_budget_id` (integer, required): The ID of the project budget to list tasklist budgets for.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `included` (object)
- `meta` (object)
- `tasklistBudgets` (null|array)

### `twprojects-list_teams` (~217 tokens)

List teams. Scope by company_id or project_id, or omit for site-wide.

Input parameters:

- `company_id` (integer): The ID of the company from which to retrieve teams. Omit to list teams across all companies.
- `fields` (array): The attributes to return for each team, from the listed names.
- `order_by` (string): The field to sort the teams by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project from which to retrieve teams. Omit to list teams across all projects.
- `search_term` (string): A search term to filter teams by name or handle.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `teams` (null|array)

### `twprojects-list_timers` (~233 tokens)

List timers.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching timers, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each timer, from the listed names.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_id` (integer): The ID of the project to filter timers by. Only timers associated with this project will be returned.
- `running_timers_only` (boolean): If true, only running timers are returned.
- `task_id` (integer): The ID of the task to filter timers by. Only timers associated with this task will be returned.
- `user_id` (integer): The ID of the user to filter timers by. Only timers associated with this user will be returned.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `timers` (null|array)

### `twprojects-list_workflow_stages` (~199 tokens)

List workflow stages.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching workflow stages, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each workflow stage, from the listed names.
- `order_by` (string): The field to sort the workflow stages by. Omit to keep the ordering the API applies by default.
- `order_mode` (string): The direction to sort the results in.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.
- `workflow_id` (integer, required): The ID of the workflow whose stages to list.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `stages` (null|array)

### `twprojects-list_workflows` (~150 tokens)

List workflows.

Input parameters:

- `count_only` (boolean): If true, return only {"count": N}: the exact number of matching workflows, no rows — use for "how many". Ignores page, page_size, verbose, fields.
- `fields` (array): The attributes to return for each workflow, from the listed names.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `search_term` (string): A search term to filter workflows by name.
- `verbose` (boolean): If false, returns id + name only — useful when scanning many results.

Output parameters:

- `count` (integer): Exact number of matches across every page. Returned instead of the rows when count_only.
- `meta` (object)
- `workflows` (null|array)

### `twprojects-move_tasks` (~113 tokens)

Move tasks and all their subtasks to another tasklist, preserving the parent/child structure. Subtasks move with their parent automatically, so only the topmost task of each subtree needs to be listed. A task whose parent is not part of the move is detached from it, becoming a top-level task in the destination.

Input parameters:

- `task_ids` (array, required): The IDs of the tasks to move. Subtasks are moved automatically.
- `tasklist_id` (integer, required): The ID of the destination tasklist.

### `twprojects-pause_timer` (~42 tokens)

Pause a running timer; can be resumed later. Use complete_timer to stop permanently.

Input parameters:

- `id` (integer, required): The ID of the timer to pause.

### `twprojects-restore_allocation` (~55 tokens)

Restore a deleted allocation. Find the ID first with twprojects-list_allocations and show_deleted set, since a deleted allocation is otherwise not returned.

Input parameters:

- `id` (integer, required): The ID of the allocation to restore.

### `twprojects-resume_timer` (~33 tokens)

Resume a paused timer back to running.

Input parameters:

- `id` (integer, required): The ID of the timer to resume.

### `twprojects-summarize_timelogs` (~486 tokens)

Complete time totals for a date window, grouped by user, project or task (rows in groups) or by day, week or month (rows in periods). One call returns every row, in exact minutes and hours to 2 decimals. Prefer it over twprojects-list_timelogs for any total, sum or breakdown; list_timelogs is for individual entries. Minutes are authoritative, unbilledBillable = billable − billed, and rows sum to totals. One dimension per call: for hours per user per week, call once per user with user_ids. Task rows omit project-level and subtask time, so never add totals across group_by values. Period rows cover every period in order, zeros included, first and last clipped to the window; weeks follow the caller's start-of-week setting, so buckets can differ per user, and a weekend-only week with no time is dropped.

Input parameters:

- `company_ids` (array): Filter to timelogs on projects of these companies/clients.
- `end_date` (string, required): Inclusive end of the report window (YYYY-MM-DD).
- `group_by` (string): Dimension to group by. Defaults to user. user, project and task fill groups; day, week and month fill periods. Filter a task grouping on a busy account.
- `include_archived_projects` (boolean): Include time from archived projects. Defaults to false.
- `order_by` (string): The field to sort the summary rows by. Omit to keep the ordering the API applies by default. Rejected for day, week and month: period rows are chronological.
- `order_mode` (string): The direction to sort the results in. Rejected for day, week and month: period rows are chronological.
- `project_ids` (array): Filter to timelogs on these projects.
- `start_date` (string, required): Inclusive start of the report window (YYYY-MM-DD).
- `task_ids` (array): Filter to timelogs on these tasks.
- `tasklist_ids` (array): Filter to timelogs on these task lists.
- `team_ids` (array): Filter to timelogs logged by members of these teams.
- `timelog_tag_ids` (array): Filter to timelogs carrying these tags.
- `user_ids` (array): Filter to timelogs logged for these users.

Output parameters:

- `groups` (null|array): Entity rows; empty for a day, week or month grouping.
- `periods` (null|array): Period rows, chronological; empty for an entity grouping.
- `scope` (object)
- `totals` (object)

### `twprojects-unlink_task_from_allocation` (~83 tokens)

Remove the link between one task and an allocation. Only the association is removed: both the task and the allocation are left in place. This removes a single link and leaves the allocation's other links alone.

Input parameters:

- `allocation_id` (integer, required): The ID of the allocation.
- `task_id` (integer, required): The ID of the task to unlink.

### `twprojects-update_allocation` (~578 tokens)

Update an allocation. Changing end_date ADDS or REMOVES committed time rather than redistributing it, because the per-day rate is what is held constant.

Input parameters:

- `assigned_user_id` (integer): The ID of the user whose time is committed. Accepts a real person or a placeholder user — a stand-in used to plan work before the person who will do it is known. Nothing in the response distinguishes…
- `color` (string): The allocation's colour as six hexadecimal digits, with or without a leading '#'.
- `description` (string): An optional description of the allocation, at most 255 characters.
- `end_date` (string): The last day of the allocation (format: YYYY-MM-DD). Must not precede start_date. Extending it ADDS committed time rather than spreading the existing total: the per-day rate is what is held constant,…
- `id` (integer, required): The ID of the allocation to update.
- `ignore_collisions` (boolean): Skip the capacity check altogether. Prefer inform_of_over_allocation: this one also lets the change through, but suppresses the over-allocation report with it, so nobody is told the person is over-bo…
- `inform_of_over_allocation` (boolean): Accept a change that puts the user over their capacity and report it, rather than rejecting it. Defaults to true, and the result says so when it happens. Turning it off means an over-allocating chang…
- `is_billable` (boolean): Whether the allocated time can be charged to a client.
- `linked_task_ids` (array): The tasks to associate with the allocation. This REPLACES the whole set of linked tasks, so send every task that should stay linked. To add or remove one task without touching the rest, use twproject…
- `project_id` (integer): The ID of the project to commit the time to.
- `seconds_per_day` (integer): The time committed on each working day of the range, in SECONDS — 4 hours a day is 14400. Must be between 60 (one minute) and 86400 (24 hours). Seconds rather than hours because the hours form is a f…
- `start_date` (string): The first day of the allocation (format: YYYY-MM-DD).
- `title` (string): The name of the allocation, at most 100 characters.

### `twprojects-update_comment` (~235 tokens)

Update comment.

Input parameters:

- `body` (string, required): The content of the comment. The content can be added as text or HTML.
- `content_type` (string): The content type of the comment. It can be either 'TEXT' or 'HTML'.
- `id` (integer, required): The ID of the comment to update.
- `notify`: Who to notify of the comment change. Omit it unless the user named who to notify: the default notifies every follower of the related entity, and a value here replaces that set rather than adding to i…
- `notify_current_user` (boolean): Whether the current user should be notified about the comment change.

### `twprojects-update_company` (~288 tokens)

Update company (aka client).

Input parameters:

- `address_one` (string): The first line of the address of the company.
- `address_two` (string): The second line of the address of the company.
- `city` (string): The city of the company.
- `country_code` (string): The country code of the company, e.g., 'US' for the United States.
- `email_one` (string): The primary email address of the company.
- `email_three` (string): The tertiary email address of the company.
- `email_two` (string): The secondary email address of the company.
- `fax` (string): The fax number of the company.
- `id` (integer, required): The ID of the company to update.
- `industry_id` (integer): The ID of the industry the company belongs to.
- `manager_id` (integer): The ID of the user who manages the company.
- `name` (string): The name of the company.
- `phone` (string): The phone number of the company.
- `profile` (string): A profile description for the company.
- `state` (string): The state of the company.
- `tag_ids` (array): A list of tag IDs to associate with the company.
- `website` (string): The website of the company.
- `zip` (string): The ZIP or postal code of the company.

### `twprojects-update_custom_field` (~220 tokens)

Update custom field.

Input parameters:

- `currency_code` (string): The ISO currency code for 'currency' or 'financial' type custom fields.
- `description` (string): An optional description for the custom field.
- `formula` (string): The formula expression for 'formula' type custom fields.
- `id` (integer, required): The ID of the custom field to update.
- `name` (string): The display name of the custom field.
- `options`: Type-specific options for the custom field. For 'dropdown' and 'multiselect' types, provide {"choices": [{"value": "...", "color": "#rrggbb"}, ...]}. For 'rating' type, provide {"icon": "star|heart|.…
- `required` (boolean): Whether the custom field must have a value when set on an entity.
- `unit` (string): The unit associated with the custom field, when applicable.

### `twprojects-update_custom_field_value` (~184 tokens)

Update a custom field value on a task, project or company.

Input parameters:

- `country_code` (string): The country code for currency-type custom field values.
- `currency_code` (string): The ISO currency code for currency-type custom field values.
- `custom_field_id` (integer, required): The ID of the custom field the value belongs to.
- `entity` (string, required): The type of entity the custom field value is attached to.
- `entity_id` (integer, required): The ID of the task, project or company the custom field value belongs to.
- `value`: The value to assign, typed per the field: string (text), number (number), boolean (checkbox), choice value string (dropdown/status; array for multiselect), ISO-8601 string (date).
- `value_id` (integer, required): The ID of the custom field value entry to update.

### `twprojects-update_custom_item` (~191 tokens)

Update a custom item type's display name, description, or labels. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `description` (string): New description for the custom item type.
- `display_name` (string): New display name for the custom item type.
- `id` (integer, required): Custom item type ID to update.
- `label_plural` (string): New plural label.
- `label_singular` (string): New singular label.

### `twprojects-update_custom_item_field` (~192 tokens)

Update a field on a custom item type. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `custom_item_id` (integer, required): Custom item type ID the field belongs to.
- `definition` (object): Replacement type-specific configuration as a JSON object.
- `display_name` (string): New display name.
- `id` (integer, required): Field ID to update.
- `position_after_id` (integer): Move this field after the given field ID.

### `twprojects-update_custom_item_record` (~370 tokens)

Update a record on a custom item type. Only the fields you supply are changed; others are left as-is. Set section_id to null to remove the record from any section. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.

Input parameters:

- `clear_section` (boolean): Set to true to explicitly clear the record's section. Use this instead of section_id when you want null semantics.
- `custom_item_id` (integer, required): Custom item type ID the record belongs to.
- `field_values` (array): Field values to set on the record. Each entry is {field_name, value}. Field names are matched case-insensitively against the custom item type's fields. Values are coerced by field type: dropdown/mult…
- `id` (integer, required): Record ID to update.
- `name` (string): New display name for the record.
- `position_after_id` (integer): Move the record after the given record ID.
- `section_id` (integer): New section ID, or null to remove the record from any section.

### `twprojects-update_jobrole` (~43 tokens)

Update job role.

Input parameters:

- `id` (integer, required): The ID of the job role to update.
- `name` (string): The name of the job role.

### `twprojects-update_link` (~271 tokens)

Update link.

Input parameters:

- `code` (string): The URL of the link. This is the actual web address that the link points to.
- `description` (string): The description of the link. Longer text that provides detailed information about the link.
- `id` (integer, required): The ID of the link to update.
- `notify`: Who to notify of the link update. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one…
- `notify_current_user` (boolean): Whether the current user should be notified about the new link.
- `tag_ids` (array): A list of tag IDs to associate with the link.
- `title` (string): The title of the link, which provides a brief summary of the purpose of the link.

### `twprojects-update_message` (~207 tokens)

Update message.

Input parameters:

- `body` (string): The body of the message.
- `id` (integer, required): The ID of the message to update.
- `notify`: Who to notify of the message update. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower…
- `notify_current_user` (boolean): Whether the current user should be notified about the new message.
- `title` (string): The title of the message.

### `twprojects-update_message_reply` (~200 tokens)

Update message reply.

Input parameters:

- `body` (string): The body of the message reply.
- `id` (integer, required): The ID of the message reply to update.
- `notify`: Who to notify of the reply update. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower on…
- `notify_current_user` (boolean): Whether the current user should be notified about the new messageReply.

### `twprojects-update_milestone` (~132 tokens)

Update milestone.

Input parameters:

- `assignees` (object): Assignees for the milestone.
- `description` (string): A description of the milestone.
- `due_date` (string): The due date of the milestone (format: YYYYMMDD). Used for related tasks without their own due date.
- `id` (integer, required): The ID of the milestone to update.
- `name` (string): The name of the milestone.
- `tag_ids` (array): A list of tag IDs to associate with the milestone.
- `tasklist_ids` (array): Tasklists to associate with the milestone.

### `twprojects-update_notebook` (~94 tokens)

Update notebook.

Input parameters:

- `contents` (string): The contents of the notebook.
- `description` (string): A description of the notebook.
- `id` (integer, required): The ID of the notebook to update.
- `name` (string): The name of the notebook.
- `tag_ids` (array): A list of tag IDs to associate with the notebook.
- `type` (string): The type of the notebook.

### `twprojects-update_project` (~171 tokens)

Update project.

Input parameters:

- `category_id` (integer): The ID of the category to which the project belongs.
- `company_id` (integer): The ID of the company associated with the project.
- `description` (string): The description of the project.
- `end_at` (string): End date of the project (format: YYYYMMDD).
- `id` (integer, required): The ID of the project to update.
- `name` (string): The name of the project.
- `owned_id` (integer): The ID of the user who owns the project.
- `start_at` (string): Start date of the project (format: YYYYMMDD).
- `status` (string): The status of the project.
- `tag_ids` (array): A list of tag IDs to associate with the project.

### `twprojects-update_project_category` (~91 tokens)

Update project category.

Input parameters:

- `color` (string): The color of the project category in hex format (e.g., #FF5733).
- `id` (integer, required): The ID of the project category to update.
- `name` (string): The name of the project category.
- `parent_id` (integer): The ID of the parent project category, if any. This allows for nested categories.

### `twprojects-update_skill` (~54 tokens)

Update skill.

Input parameters:

- `id` (integer, required): The ID of the skill to update.
- `name` (string): The name of the skill.
- `user_ids` (array): The user IDs associated with the skill.

### `twprojects-update_tag` (~95 tokens)

Update tag.

Input parameters:

- `color` (string): The color of the tag. It must be a valid hex color code.
- `id` (integer, required): The ID of the tag to update.
- `name` (string): The name of the tag. It must have less than 50 characters.
- `project_id` (integer): The ID of the project to associate the tag with. This is for project-scoped tags.

### `twprojects-update_tasklist` (~75 tokens)

Update tasklist.

Input parameters:

- `description` (string): The description of the tasklist.
- `id` (integer, required): The ID of the tasklist to update.
- `milestone_id` (integer): The ID of the milestone to associate with the tasklist.
- `name` (string): The name of the tasklist.

### `twprojects-update_team` (~183 tokens)

Update team.

Input parameters:

- `company_id` (integer): The ID of the company. This is used to create a team scoped for a specific company.
- `description` (string): The description of the team.
- `handle` (string): The handle of the team. It is a unique identifier for the team. It must not have spaces or special characters.
- `id` (integer, required): The ID of the team to update.
- `name` (string): The name of the team.
- `parent_team_id` (integer): The ID of the parent team, which places this team in a hierarchy. Pass 0 to move the team back to the top level.
- `project_id` (integer): The ID of the project. This is used to create a team scoped for a specific project.
- `user_ids` (array): Users to add to the team.

### `twprojects-update_timer` (~107 tokens)

Update timer.

Input parameters:

- `billable` (boolean): If true, the timer is billable.
- `description` (string): A description of the timer.
- `id` (integer, required): The ID of the timer to update.
- `project_id` (integer): The ID of the project to associate the timer with.
- `running` (boolean): If true, the timer will start running immediately.
- `task_id` (integer): The ID of the task to associate the timer with.

### `twprojects-update_user` (~151 tokens)

Update user.

Input parameters:

- `admin` (boolean): Indicates whether the user is an administrator.
- `company_id` (integer): The ID of the client/company to which the user belongs.
- `email` (string): The email address of the user.
- `first_name` (string): The first name of the user.
- `id` (integer, required): The ID of the user to update.
- `last_name` (string): The last name of the user.
- `title` (string): The job title of the user, such as 'Project Manager' or 'Senior Software Developer'.
- `type` (string): The type of user, such as 'account', 'collaborator', or 'contact'.

### `twprojects-update_workflow` (~41 tokens)

Update workflow.

Input parameters:

- `id` (integer, required): The ID of the workflow to update.
- `name` (string): The new name of the workflow.

### `twprojects-update_workflow_stage` (~62 tokens)

Update workflow stage.

Input parameters:

- `id` (integer, required): The ID of the workflow stage to update.
- `name` (string): The new name of the workflow stage.
- `workflow_id` (integer, required): The ID of the workflow that owns the stage.

### `twprojects-users_workload` (~157 tokens)

Get task allocation across users for a date range. (workload of users)

Input parameters:

- `end_date` (string, required): End of the workload period; the boundary day itself is included.
- `page` (integer): Page number for pagination of results (1-based).
- `page_size` (integer): Number of results per page for pagination (1-500).
- `project_ids` (array): Filter workload by project.
- `start_date` (string, required): Start of the workload period; the boundary day itself is included.
- `user_company_ids` (array): Filter workload by users' client/company.
- `user_ids` (array): Filter workload by user.
- `user_team_ids` (array): Filter workload by users' team.

Output parameters:

- `included` (object)
- `meta` (object)
- `workload` (object)

### `twspaces-create_category` (~48 tokens)

Create space category.

Input parameters:

- `color` (string): A hex color code for the category (e.g. "#FF5733").
- `name` (string, required): The name of the category.

### `twspaces-create_comment` (~106 tokens)

Create comment on a page. Use parentId for replies.

Input parameters:

- `content` (string, required): The content of the comment.
- `isPrivate` (boolean): Set to true to create a private comment visible only to space members.
- `pageId` (integer, required): The ID of the page to comment on.
- `parentId` (integer): The ID of the parent comment (for creating a reply).
- `spaceId` (integer, required): The ID of the space containing the page.

### `twspaces-create_page` (~183 tokens)

Create page in a space.

Input parameters:

- `changeMessage` (string): A message describing the changes made in this version.
- `content` (string): The HTML content of the page.
- `isFullWidth` (boolean): Display the page in full-width layout.
- `isPublish` (boolean): Set to true to publish the page immediately (default: draft).
- `isRequiredReading` (boolean): Mark this page as required reading for space members.
- `parentId` (integer): The ID of the parent page (for creating a sub-page).
- `readerInlineCommentsEnabled` (boolean): Allow readers to add inline comments on this page.
- `slug` (string): A URL-friendly slug for the page.
- `spaceId` (integer, required): The ID of the space to create the page in.
- `title` (string, required): The title of the page.

### `twspaces-create_space` (~141 tokens)

Create space.

Input parameters:

- `categoryId` (integer): Category to assign. Use twspaces-list_categories to discover.
- `code` (string, required): A short unique code/identifier for the space (e.g. "ENG", "DOCS").
- `icon` (string): An icon identifier for the space.
- `projectId` (integer): The ID of a Teamwork project to link to this space.
- `purpose` (string): A brief description of the space's purpose.
- `spaceColor` (string): A hex color code for the space (e.g. "#FF5733").
- `title` (string, required): The title of the space.

### `twspaces-create_tags` (~31 tokens)

Create one or more Spaces tags in a single request.

Input parameters:

- `tags` (array, required): Tags to create.

### `twspaces-duplicate_page` (~99 tokens)

Duplicate page with a new title.

Input parameters:

- `pageId` (integer, required): The ID of the page to duplicate.
- `parentId` (integer): The ID of the parent page for the duplicate (defaults to same parent).
- `slug` (string): A URL-friendly slug for the duplicated page.
- `spaceId` (integer, required): The ID of the space containing the page.
- `title` (string, required): The title for the duplicated page.

### `twspaces-get_category` (~28 tokens)

Get space category.

Input parameters:

- `id` (integer, required): The ID of the category to retrieve.

### `twspaces-get_comment` (~61 tokens)

Get page comment.

Input parameters:

- `commentId` (integer, required): The ID of the comment to retrieve.
- `pageId` (integer, required): The ID of the page containing the comment.
- `spaceId` (integer, required): The ID of the space containing the page.

### `twspaces-get_homepage` (~35 tokens)

Get a space's homepage.

Input parameters:

- `spaceId` (integer, required): The ID of the space to retrieve the homepage for.

### `twspaces-get_page` (~55 tokens)

Get page. Returns content, metadata, tags, and revision info.

Input parameters:

- `pageId` (integer, required): The ID of the page to retrieve.
- `spaceId` (integer, required): The ID of the space containing the page.

### `twspaces-get_space` (~27 tokens)

Get space.

Input parameters:

- `id` (integer, required): The ID of the space to retrieve.

### `twspaces-get_tag` (~28 tokens)

Get Spaces tag.

Input parameters:

- `id` (integer, required): The ID of the tag to retrieve.

### `twspaces-list_categories` (~54 tokens)

List space categories.

Input parameters:

- `pageOffset` (integer): The index position to start retrieving results from (not a page number).
- `pageSize` (integer): Number of results per page for pagination (1-500).

### `twspaces-list_comments` (~96 tokens)

List comments on a page. Returns top-level comments with replies.

Input parameters:

- `pageId` (integer, required): The ID of the page to list comments for.
- `pageOffset` (integer): The index position to start retrieving results from (not a page number).
- `pageSize` (integer): Number of results per page for pagination (1-500).
- `spaceId` (integer, required): The ID of the space containing the page.

### `twspaces-list_pages` (~288 tokens)

List pages in a space as a hierarchical tree. Returns the space's open pages under `pages`; set includePrivate to also receive, under a sibling `private` key, the restricted pages the calling user has access to. Returns at most 100 pages per call by default, up to 500 with pageSize, counted across both trees. A space with more pages than that is cut in depth-first order and the response carries a `truncated` marker naming the total page count, the pageOffset that returns the next set, and twspaces-get_page for a single page in full.

Input parameters:

- `includePrivate` (boolean): Return the restricted pages the calling user has access to as well, under a `private` key beside `pages`. Defaults to false, so an unfiltered call answers with the open pages only and a private page…
- `pageOffset` (integer): Number of pages to skip, counted in depth-first order (not a page number), across the open tree and then the private one. Use the value the `truncated` marker names to read the next set.
- `pageSize` (integer): Maximum number of pages to return (1-500). Defaults to 100.
- `spaceId` (integer, required): The ID of the space to list pages for.

### `twspaces-list_space_collaborators` (~37 tokens)

List space collaborators (users and teams).

Input parameters:

- `id` (integer, required): The ID of the space to retrieve collaborators for.

### `twspaces-list_spaces` (~53 tokens)

List spaces.

Input parameters:

- `pageOffset` (integer): The index position to start retrieving results from (not a page number).
- `pageSize` (integer): Number of results per page for pagination (1-500).

### `twspaces-list_tags` (~54 tokens)

List Spaces tags.

Input parameters:

- `pageOffset` (integer): The index position to start retrieving results from (not a page number).
- `pageSize` (integer): Number of results per page for pagination (1-500).

### `twspaces-search` (~105 tokens)

Full-text search across pages. Filter by space.

Input parameters:

- `includeDeleted` (boolean): Include deleted pages in search results.
- `pageOffset` (integer): The index position to start retrieving results from (not a page number).
- `pageSize` (integer): Number of results per page for pagination (1-500).
- `query` (string, required): The search query string.
- `spaceIds` (array): Limit search to specific spaces. Use twspaces-list_spaces to discover.

### `twspaces-update_category` (~56 tokens)

Update space category.

Input parameters:

- `color` (string): A new hex color code for the category.
- `id` (integer, required): The ID of the category to update.
- `name` (string): The new name for the category.

### `twspaces-update_comment` (~111 tokens)

Update page comment.

Input parameters:

- `commentId` (integer, required): The ID of the comment to update.
- `content` (string): The new content of the comment.
- `isPrivate` (boolean): Change the privacy setting of the comment.
- `pageId` (integer, required): The ID of the page containing the comment.
- `spaceId` (integer, required): The ID of the space containing the page.
- `state` (string): The new state of the comment (e.g. "active", "resolved").

### `twspaces-update_page` (~313 tokens)

Update page. Note: content and publish changes update the published page only, not the live collaborative editor draft; if the page has an active editor draft, re-publishing from the Spaces web editor can overwrite these changes (known Spaces limitation).

Input parameters:

- `changeMessage` (string): A message describing the changes made in this version.
- `content` (string): The new HTML content of the page.
- `draftVersion` (integer): Optimistic concurrency token for the page's draft content. Required when updating `content`; optional otherwise. Obtain the current value from the `draftVersion` field with twspaces-get_page or twspa…
- `isFullWidth` (boolean): Toggle full-width layout for this page.
- `isMinorChange` (boolean): Mark this update as a minor change (won't notify watchers).
- `isPublish` (boolean): Set to true to publish the page, false to revert to draft.
- `isRequiredReading` (boolean): Mark or unmark this page as required reading.
- `pageId` (integer, required): The ID of the page to update.
- `parentId` (integer): The ID of the new parent page (to move the page).
- `readerInlineCommentsEnabled` (boolean): Allow or disallow readers from adding inline comments.
- `slug` (string): A new URL-friendly slug for the page.
- `spaceId` (integer, required): The ID of the space containing the page.
- `title` (string): The new title of the page.

### `twspaces-update_space` (~164 tokens)

Update space.

Input parameters:

- `categoryId` (integer): Category to assign. Use twspaces-list_categories to discover.
- `code` (string): A new short unique code/identifier for the space.
- `icon` (string): A new icon identifier for the space.
- `id` (integer, required): The ID of the space to update.
- `projectId` (integer): The ID of a Teamwork project to link to this space.
- `purpose` (string): A new brief description of the space's purpose.
- `spaceColor` (string): A new hex color code for the space.
- `state` (string): The state of the space (e.g. "active", "archived").
- `title` (string): The new title of the space.

### `twspaces-update_tag` (~56 tokens)

Update Spaces tag.

Input parameters:

- `color` (string): A new hex color code for the tag.
- `id` (integer, required): The ID of the tag to update.
- `name` (string): The new name for the tag.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/com-teamwork-mcp/docker-io-teamwork-mcp-v1-43-2#diagnostics

## Score history

- 2026-09-20: 38
- 2026-09-19: 38
- 2026-09-18: 38
- 2026-09-17: 38
- 2026-09-16: 38
- 2026-09-15: 38

## Common questions

### What is the com.teamwork/mcp server?

com.teamwork/mcp is listed in the public MCP registry as com.teamwork/mcp. The Teamwork.com official MCP server helps teams efficiently manage client projects with AI. This page covers its container image (docker.io/teamwork/mcp:v1.43.2).

### Is the com.teamwork/mcp server safe to use?

com.teamwork/mcp scores 38 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the com.teamwork/mcp server expose?

com.teamwork/mcp exposes 213 tools: twprojects-get_task, twprojects-list_tasks, twprojects-create_task, twprojects-list_comments, twprojects-update_task, and 208 more. Their descriptions and schemas cost roughly 39,338 tokens of context every time the server is loaded.

### Is the com.teamwork/mcp server still maintained?

com.teamwork/mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Repository: https://github.com/teamwork/mcp
- Changelog RSS feed: https://verifymcp.io/servers/com-teamwork-mcp/docker-io-teamwork-mcp-v1-43-2.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-teamwork-mcp/docker-io-teamwork-mcp-v1-43-2.json
- HTML version of this page: https://verifymcp.io/servers/com-teamwork-mcp/docker-io-teamwork-mcp-v1-43-2
