<!-- Generated by `just docs` from catalog/toolkits/asana.yaml, catalog/expansions/asana.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# Asana

Work management. Create and track tasks, sort them into projects and sections, comment and tag, and look up who is on a team.

| Property | Value |
| --- | --- |
| Slug | `asana` |
| Definition version | `0.1.0` |
| Base URL | `https://app.asana.com/api/1.0` |
| Auth schemes | `oauth2` |
| Action tools | 33 |
| By class | 15 read, 14 write, 4 destructive |
| Triggers | 0 |
| Provider rate limit | not declared, so outbound calls are unpaced |

## Measured routing accuracy

65 golden cases replayed through the router over the whole index: measured over corpus `ea4f12ad2948` (65 toolkits, 2283 tools indexed and 13 declared uncallable), 33 cases written by hand and 32 cases from the paraphrase pass. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.

| Measure | Cases | Share |
| --- | --- | --- |
| top-1 | 10/65 | 15.4% |
| top-8 | 41/65 | 63.1% |

The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. `just eval-live` measures the same cases through the live reranker.

## Authentication

Connect an entity with `ConnectionsService.InitiateConnection`, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.

### `oauth2`

| Property | Value |
| --- | --- |
| Authorization URL | `https://app.asana.com/-/oauth_authorize` |
| Token URL | `https://app.asana.com/-/oauth_token` |
| Default scopes | `default` |
| Refresh tokens | yes, the refresh daemon renews ahead of expiry |

## Tools

33 action tools. The catalog-wide slug is `asana.<tool>`, which is what `search_tools` returns and `call_tool` takes.

### `asana.list_workspaces`

List every workspace or organization the connected account belongs to. Use first when a call below needs a workspace_gid and the user has not named one. For one workspace's own detail use get_workspace.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /workspaces`.

Takes no arguments.

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].gid` | string |  |
| `data[].is_organization` | boolean |  |
| `data[].name` | string |  |

Also retrieved by: "what workspaces do I have in asana", "show every organization I belong to", "which asana workspaces can I use", "list the places I have access to in asana".

### `asana.get_workspace`

Get one workspace or organization's own detail: name, whether it is an organization, and its email domains. Use when the user names a specific workspace. For the whole list use list_workspaces.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /workspaces/{{params.workspace_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `workspace_gid` | string | **yes** | Workspace gid, from list_workspaces. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.email_domains` | array of string |  |
| `data.gid` | string |  |
| `data.is_organization` | boolean |  |
| `data.name` | string |  |

Also retrieved by: "tell me about this workspace", "is this workspace an organization", "what domains are tied to this workspace", "pull up workspace details".

### `asana.list_teams`

List the teams in a workspace or organization. Use when the user asks what teams exist, or to find a team_gid for get_team or create_project. For one team's own detail use get_team.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /workspaces/{{params.workspace_gid}}/teams`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `workspace_gid` | string | **yes** | Workspace gid, from list_workspaces. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].gid` | string |  |
| `data[].name` | string |  |
| `next_page` | object |  |
| `next_page.offset` | string |  |
| `next_page.uri` | string |  |

Also retrieved by: "what teams exist in this organization", "show me every team in this workspace", "find the team id for design".

### `asana.get_team`

Get one team's own detail by id: name, description, and the organization it belongs to. Use when the user names a specific team. For the whole list use list_teams.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /teams/{{params.team_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `team_gid` | string | **yes** | Team gid, from list_teams. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.description` | string |  |
| `data.gid` | string |  |
| `data.name` | string |  |
| `data.organization` | object |  |
| `data.organization.gid` | string |  |
| `data.organization.name` | string |  |

Also retrieved by: "tell me about the design team", "who does this team belong to", "pull up team details".

### `asana.list_projects`

List projects in a workspace, optionally narrowed to one team or to only the ones still active. Use when the user asks what projects exist. For one project's own detail use get_project.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /projects`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `archived` | boolean | no | Restrict to archived (true) or active (false) projects. Omit for both. |
| `limit` | integer | no | Page size, default 50. |
| `offset` | string | no | Opaque cursor from a previous response's next_page.offset. |
| `team_gid` | string | no | Restrict to projects owned by this team. |
| `workspace_gid` | string | **yes** | Workspace gid, from list_workspaces. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].archived` | boolean |  |
| `data[].color` | string |  |
| `data[].due_on` | string |  |
| `data[].gid` | string |  |
| `data[].name` | string |  |
| `next_page` | object |  |
| `next_page.offset` | string |  |
| `next_page.uri` | string |  |

Also retrieved by: "what projects are we running right now", "show me every active project", "find the project id for a workstream", "what boards exist for this team".

### `asana.get_project`

Get one project's own detail by id: name, notes, owner, team, due date, color, and current status. Use when the user names a specific project. For the whole list use list_projects.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /projects/{{params.project_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `project_gid` | string | **yes** | Project gid, from list_projects. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.archived` | boolean |  |
| `data.color` | string |  |
| `data.current_status` | object |  |
| `data.current_status.text` | string |  |
| `data.due_on` | string |  |
| `data.gid` | string |  |
| `data.name` | string |  |
| `data.notes` | string |  |
| `data.owner` | object |  |
| `data.owner.gid` | string |  |
| `data.owner.name` | string |  |
| `data.team` | object |  |
| `data.team.gid` | string |  |
| `data.team.name` | string |  |
| `data.workspace` | object |  |
| `data.workspace.gid` | string |  |
| `data.workspace.name` | string |  |

Also retrieved by: "tell me about the Q3 launch project", "who owns this project", "what's the status update on this project", "pull up project details".

### `asana.create_project`

Create a new project in a workspace or under a team. Use when the user wants to start, set up, or spin up a new project. Requires a workspace and a name; team, notes, due date, and color are optional.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /projects`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `color` | string | no | Display color, e.g. "light-green", "dark-blue". |
| `due_on` | string (date) | no | Due date, YYYY-MM-DD. |
| `name` | string | **yes** | Project display name. |
| `notes` | string | no | Plain-text project description. |
| `public` | boolean | no | Visible to the whole team rather than invite-only. Default true. |
| `team_gid` | string | no | Team gid to own the project. Required inside an organization. |
| `workspace_gid` | string | **yes** | Workspace gid the project belongs to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.gid` | string |  |
| `data.name` | string |  |

Also retrieved by: "spin up a new project for the design team", "start a fresh project in asana", "set up a board to track this initiative", "kick off a new workstream".

### `asana.update_project`

Edit an existing project's name, notes, due date, color, or archived state. Use when the user wants to rename, edit, or archive a project's own details, not the tasks inside it.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /projects/{{params.project_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `archived` | boolean | no | Archive (true) or restore (false) the project. |
| `color` | string | no | New display color. |
| `due_on` | string (date) | no | New due date, YYYY-MM-DD. |
| `name` | string | no | New project display name. |
| `notes` | string | no | New plain-text project description. |
| `project_gid` | string | **yes** | Project gid to edit. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.archived` | boolean |  |
| `data.gid` | string |  |
| `data.name` | string |  |

Also retrieved by: "rename this project", "change the due date on this project", "archive this project", "edit the project description".

### `asana.delete_project`

Permanently delete a project and its membership, but not the tasks inside it (they stay, just no longer grouped under it). Use when the user explicitly asks to delete or remove a whole project. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /projects/{{params.project_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `project_gid` | string | **yes** | Project gid to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |

Also retrieved by: "remove this whole project", "get rid of this project for good", "wipe out a project entirely", "delete a board and its membership".

### `asana.list_project_sections`

List the sections (columns on a board, or headers on a list) inside a project. Use to find a section_gid for move_task_to_section, or when the user asks how a project is organized.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /projects/{{params.project_gid}}/sections`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `project_gid` | string | **yes** | Project gid, from list_projects. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].created_at` | string |  |
| `data[].gid` | string |  |
| `data[].name` | string |  |
| `next_page` | object |  |
| `next_page.offset` | string |  |
| `next_page.uri` | string |  |

Also retrieved by: "what columns does this board have", "show me the sections on this project", "how is this project organized".

### `asana.create_section`

Add a new section (a board column, or a list header) to a project. Use when the user wants to add, create, or set up a new grouping inside a project.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /projects/{{params.project_gid}}/sections`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `name` | string | **yes** | Section display name. |
| `project_gid` | string | **yes** | Project gid the section belongs to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.gid` | string |  |
| `data.name` | string |  |

Also retrieved by: "add a new column to this board", "set up a section for backlog items", "create a new group on this project".

### `asana.move_task_to_section`

Move a task into a section within its project, placing it before or after another task. Use when the user wants to shift, place, or drop a task into a different column or group.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /sections/{{params.section_gid}}/addTask`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `insert_after` | string | no | Place after this task gid within the section. Optional. |
| `insert_before` | string | no | Place before this task gid within the section. Optional. |
| `section_gid` | string | **yes** | Destination section gid, from list_project_sections. |
| `task_gid` | string | **yes** | Task gid to move. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |

Also retrieved by: "move this item into the in-progress column", "shift this to the done section", "drop this into a different group on the board".

### `asana.list_tasks`

List tasks in one project, or assigned to one person in a workspace. Use for what's on this project, or what's assigned to someone. For a free-text or multi-filter query across a whole workspace use search_tasks instead. For one known task use get_task.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tasks`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `assignee` | string | no | User gid, or "me" for the connected account. Requires workspace_gid. Combine with or use instead of project_gid. |
| `completed_since` | string | no | Only tasks incomplete, or completed after this timestamp (ISO 8601), or "now" for incomplete-only. |
| `limit` | integer | no | Page size, default 50. |
| `offset` | string | no | Opaque cursor from a previous response's next_page.offset. |
| `project_gid` | string | no | List tasks belonging to this project. |
| `workspace_gid` | string | no | Workspace to scope assignee to. Required together with assignee. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].assignee` | object |  |
| `data[].assignee.gid` | string |  |
| `data[].assignee.name` | string |  |
| `data[].completed` | boolean |  |
| `data[].due_on` | string |  |
| `data[].gid` | string |  |
| `data[].name` | string |  |
| `next_page` | object |  |
| `next_page.offset` | string |  |
| `next_page.uri` | string |  |

Also retrieved by: "what's assigned to me right now", "show every to-do in this project", "what does the design team have open", "list what's on this board".

### `asana.get_task`

Get one task's full detail by id: name, notes, completion state, due date, assignee, the projects and tags it carries, and its parent if it is a subtask. Use when the user names a specific task. For many tasks at once use list_tasks or search_tasks.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tasks/{{params.task_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `task_gid` | string | **yes** | Task gid. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.assignee` | object |  |
| `data.assignee.gid` | string |  |
| `data.assignee.name` | string |  |
| `data.completed` | boolean |  |
| `data.created_at` | string |  |
| `data.due_at` | string |  |
| `data.due_on` | string |  |
| `data.gid` | string |  |
| `data.modified_at` | string |  |
| `data.name` | string |  |
| `data.notes` | string |  |
| `data.parent` | object |  |
| `data.parent.gid` | string |  |
| `data.parent.name` | string |  |
| `data.projects` | array of object |  |
| `data.projects[].gid` | string |  |
| `data.projects[].name` | string |  |
| `data.tags` | array of object |  |
| `data.tags[].gid` | string |  |
| `data.tags[].name` | string |  |

Also retrieved by: "pull up the details on this to-do", "what does this item say", "show me one specific task", "what's the status of this card".

### `asana.create_task`

Create a new task in a workspace, optionally placed in one or more projects. Use when the user wants to add, file, or log something to do. Requires a workspace and a name; assignee, notes, due date, and tags are optional. For a task nested under another use create_subtask.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tasks`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `assignee` | string | no | User gid, or "me" for the connected account. |
| `due_at` | string | no | Due date and time, ISO 8601. Use instead of due_on for a time-of-day due date. |
| `due_on` | string (date) | no | Due date, YYYY-MM-DD. |
| `name` | string | **yes** | Task title. |
| `notes` | string | no | Plain-text task description. |
| `projects` | array of string | no | Project gids to add the task to. |
| `tags` | array of string | no | Tag gids to apply. |
| `workspace_gid` | string | **yes** | Workspace gid the task belongs to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.gid` | string |  |
| `data.name` | string |  |

Also retrieved by: "add a new to-do for the login flow bug", "file a new item under this project", "log something for someone to do", "open a new card on the board".

### `asana.update_task`

Edit an existing task's name, notes, assignee, due date, or mark it complete or incomplete. Use when the user wants to change, retitle, reassign, reschedule, check off, or reopen a task.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /tasks/{{params.task_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `assignee` | string | no | New assignee's user gid, or "me". |
| `completed` | boolean | no | Mark the task done (true) or reopen it (false). |
| `due_on` | string (date) | no | New due date, YYYY-MM-DD. |
| `name` | string | no | New task title. |
| `notes` | string | no | New plain-text task description. |
| `task_gid` | string | **yes** | Task gid to edit. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.completed` | boolean |  |
| `data.gid` | string |  |
| `data.name` | string |  |

Also retrieved by: "reschedule this to-do", "reassign this item to someone else", "mark this card done", "reopen a to-do that was closed".

### `asana.delete_task`

Permanently delete a task. Use when the user wants to delete or remove a task entirely, not just mark it done. Its subtasks are deleted with it. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /tasks/{{params.task_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `task_gid` | string | **yes** | Task gid to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |

Also retrieved by: "remove this to-do entirely", "get rid of this item for good", "wipe this card off the board".

### `asana.search_tasks`

Full-text and multi-filter search for tasks across a whole workspace: by free text, completion state, assignee, or project. Use for any query spanning more than one known location, like "find the task about the billing bug". For tasks in one known project use list_tasks; for one known task use get_task.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /workspaces/{{params.workspace_gid}}/tasks/search`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `assignee_any` | string | no | Comma-separated user gids; matches a task assigned to any of them. |
| `completed` | boolean | no | Restrict to completed (true) or incomplete (false) tasks. |
| `projects_any` | string | no | Comma-separated project gids; matches a task in any of them. |
| `sort_by` | string, one of due_date, created_at, completed_at, likes, modified_at | no | Sort field, default modified_at. |
| `text` | string | no | Free-text match against task name and notes. |
| `workspace_gid` | string | **yes** | Workspace gid to search within. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].assignee` | object |  |
| `data[].assignee.gid` | string |  |
| `data[].assignee.name` | string |  |
| `data[].completed` | boolean |  |
| `data[].due_on` | string |  |
| `data[].gid` | string |  |
| `data[].name` | string |  |

Also retrieved by: "find the item about the billing bug", "dig up anything mentioning the outage", "look through the whole workspace for open work".

### `asana.add_task_to_project`

Put an existing task into a project, optionally straight into a section. Use when the user wants to add or file a task under a project it is not already in. Does not remove it from any project it already belongs to; use remove_task_from_project for that.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tasks/{{params.task_gid}}/addProject`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `project_gid` | string | **yes** | Project gid to add it to. |
| `section_gid` | string | no | Section gid within the project to place it in. Optional. |
| `task_gid` | string | **yes** | Task gid to add. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |

Also retrieved by: "file this to-do under a different project", "put this card on another board", "add this item to the Q3 project".

### `asana.remove_task_from_project`

Take a task out of a project without deleting the task itself. Use when the user wants to pull a task off a project's list or board.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tasks/{{params.task_gid}}/removeProject`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `project_gid` | string | **yes** | Project gid to remove it from. |
| `task_gid` | string | **yes** | Task gid to remove. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |

Also retrieved by: "take this to-do off the board", "pull this item out of the project", "unlink this card from this workstream".

### `asana.list_subtasks`

List the subtasks nested under a task. Use when the user asks what subtasks, steps, or checklist items a task has.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tasks/{{params.task_gid}}/subtasks`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `task_gid` | string | **yes** | Parent task gid. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].assignee` | object |  |
| `data[].assignee.gid` | string |  |
| `data[].assignee.name` | string |  |
| `data[].completed` | boolean |  |
| `data[].gid` | string |  |
| `data[].name` | string |  |
| `next_page` | object |  |
| `next_page.offset` | string |  |
| `next_page.uri` | string |  |

Also retrieved by: "what steps does this to-do have", "show the checklist under this item", "list what's nested under this card".

### `asana.create_subtask`

Create a new subtask nested under an existing task. Use when the user wants to break a task into steps or add a checklist item under it. For a top-level task use create_task.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tasks/{{params.task_gid}}/subtasks`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `assignee` | string | no | User gid, or "me" for the connected account. |
| `due_on` | string (date) | no | Due date, YYYY-MM-DD. |
| `name` | string | **yes** | Subtask title. |
| `notes` | string | no | Plain-text subtask description. |
| `task_gid` | string | **yes** | Parent task gid. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.gid` | string |  |
| `data.name` | string |  |

Also retrieved by: "break this to-do into steps", "add a checklist item under this card", "nest a new step under this to-do".

### `asana.list_tags`

List the tags defined in a workspace, e.g. "urgent" or "blocked". Use when the user asks what labels or tags exist, or to find a tag_gid for add_tag_to_task.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tags`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `workspace_gid` | string | **yes** | Workspace gid, from list_workspaces. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].color` | string |  |
| `data[].gid` | string |  |
| `data[].name` | string |  |
| `next_page` | object |  |
| `next_page.offset` | string |  |
| `next_page.uri` | string |  |

Also retrieved by: "what labels exist in this workspace", "show me every tag we have set up", "find the tag id for urgent".

### `asana.create_tag`

Create a new tag in a workspace. Use when the user wants a new label that does not exist yet, before applying it with add_tag_to_task.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tags`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `color` | string | no | Display color, e.g. "light-green", "dark-red". |
| `name` | string | **yes** | Tag display name. |
| `workspace_gid` | string | **yes** | Workspace gid the tag belongs to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.gid` | string |  |
| `data.name` | string |  |

Also retrieved by: "make a new label called blocked", "set up a fresh tag in this workspace", "add a new marker we can apply to items".

### `asana.delete_tag`

Permanently delete a tag from the workspace, removing it from every task that carried it. Use when the user wants to delete or remove a tag itself, not just untag one task. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /tags/{{params.tag_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `tag_gid` | string | **yes** | Tag gid to delete, from list_tags. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |

Also retrieved by: "remove this label from the workspace entirely", "get rid of a tag for good", "wipe out a marker we no longer use".

### `asana.add_tag_to_task`

Apply an existing tag to a task. Use when the user wants to label, flag, or mark a task with a tag that already exists. To make a new tag first use create_tag.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tasks/{{params.task_gid}}/addTag`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `tag_gid` | string | **yes** | Tag gid to apply, from list_tags. |
| `task_gid` | string | **yes** | Task gid to tag. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |

Also retrieved by: "flag one asana task as urgent", "label this work item with the blocked marker", "put an existing tag onto a task in asana".

### `asana.remove_tag_from_task`

Remove a tag from one task without deleting the tag itself. Use when the user wants to untag, unflag, or unlabel a single task.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tasks/{{params.task_gid}}/removeTag`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `tag_gid` | string | **yes** | Tag gid to remove, from list_tags. |
| `task_gid` | string | **yes** | Task gid to untag. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |

Also retrieved by: "unflag one asana task", "take the urgent label off this work item", "clear a tag from a task in asana".

### `asana.list_comments`

List the comments and activity log on a task, oldest first. Use when the user wants to read the discussion or history on a task.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tasks/{{params.task_gid}}/stories`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `task_gid` | string | **yes** | Task gid. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].created_at` | string |  |
| `data[].created_by` | object |  |
| `data[].created_by.gid` | string |  |
| `data[].created_by.name` | string |  |
| `data[].gid` | string |  |
| `data[].text` | string |  |
| `data[].type` | string |  |
| `next_page` | object |  |
| `next_page.offset` | string |  |
| `next_page.uri` | string |  |

Also retrieved by: "what have people said on this to-do", "read the notes on this item", "show the conversation history on this card".

### `asana.add_comment`

Post a new comment on a task. Use when the user wants to comment, note, or leave an update on a task. To change a comment already posted use update_comment.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tasks/{{params.task_gid}}/stories`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `task_gid` | string | **yes** | Task gid to comment on. |
| `text` | string | **yes** | Comment body, plain text. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.created_at` | string |  |
| `data.gid` | string |  |
| `data.text` | string |  |

Also retrieved by: "leave a note on this to-do", "post an update for the team on this item", "tell them the fix shipped on this card".

### `asana.update_comment`

Edit the text of a comment already posted on a task. Use when the user wants to fix or correct something they wrote on a task. Only comments, not the task's other activity entries, can be edited.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /stories/{{params.story_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `story_gid` | string | **yes** | Comment (story) gid, from list_comments. |
| `text` | string | **yes** | Replacement comment body, plain text. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.gid` | string |  |
| `data.text` | string |  |

Also retrieved by: "fix a typo in my last note", "correct what I wrote on this to-do", "edit my earlier remark".

### `asana.delete_comment`

Permanently delete a comment from a task. Use when the user wants to delete or remove a comment, not the whole task. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /stories/{{params.story_gid}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `story_gid` | string | **yes** | Comment (story) gid to delete, from list_comments. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |

Also retrieved by: "remove that note", "take down what I posted by mistake", "delete a remark on this to-do".

### `asana.list_users`

List every person in a workspace, with name and email. Use when the user asks who is in the workspace, or to find a user gid for assigning a task.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /workspaces/{{params.workspace_gid}}/users`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `workspace_gid` | string | **yes** | Workspace gid, from list_workspaces. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].email` | string |  |
| `data[].gid` | string |  |
| `data[].name` | string |  |
| `next_page` | object |  |
| `next_page.offset` | string |  |
| `next_page.uri` | string |  |

Also retrieved by: "who is in this workspace", "show me every teammate here", "find someone's user id to assign work to".

### `asana.get_current_user`

Get the profile of the connected account itself: name, email, and the workspaces it belongs to. Use to answer "who am I" or to get the caller's own gid to assign a task to itself.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /users/me`.

Takes no arguments.

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | object |  |
| `data.email` | string |  |
| `data.gid` | string |  |
| `data.name` | string |  |
| `data.workspaces` | array of object |  |
| `data.workspaces[].gid` | string |  |
| `data.workspaces[].name` | string |  |

Also retrieved by: "who am I logged in as", "what's my own profile", "show my account info in asana".
