The Asana MCP connector routes your AI agent's tool calls to Asana's own MCP server through Scalekit. Each user signs in to Asana once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 52 tools.
- Tools
- 52
- What they doRead · write · destructive
- 31 · 16 · 531 read16 write5 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Asana MCP connection
In AgentKit > Connections, create an Asana MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Asana, so you don't need to register an OAuth app. To show your own app on the consent screen, use your own credentials instead.
Use your own OAuth app
Register your Scalekit environment with the Asana MCP connector so Scalekit handles the OAuth flow and token lifecycle for your users. Asana MCP requires a dedicated MCP app — not an API app or a personal access token.
-
Copy the redirect URI from Scalekit
- In Scalekit dashboard, go to AgentKit > Connections > Create Connection.
- Search for Asana MCP and click Create.
- Copy the Redirect URI from the connection details panel. It looks like:
https://<YOUR_ENV>.scalekit.cloud/sso/v1/oauth/conn_<ID>/callback
-
Create an MCP app in Asana
- Go to app.asana.com/-/developer_console and sign in.
- Click Create new app.

- In the Create new app dialog:
- Enter an App name, for example
Agent Auth. - Under App type, select MCP app (“Connect LLMs to Asana”). Do not select API app.
- Check I agree to the Asana API Terms.
- Click Create app.
- Enter an App name, for example

-
Add the redirect URI to your app
- Inside your new MCP app, open the left menu and click OAuth.
- Under Redirect URLs, click Add redirect URL, paste the redirect URI from Scalekit, and click Add.
-
Copy your app credentials
- In the same OAuth section, copy your Client ID and Client Secret.
-
Add credentials in Scalekit
- In Scalekit dashboard, go to AgentKit > Connections and open the Asana MCP connection you created.
- Enter:
- Client ID — from your Asana MCP app
- Client Secret — from your Asana MCP app
- Click Save.
-
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'asanamcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Asana MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'asanamcp_get_me',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "asanamcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Asana MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="asanamcp_get_me",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolasanamcp_create_project_preview_v3Show a visual preview of a project structure before the project is created in Asana.Read-onlyCreate Project Preview V3
Show a visual preview of a project structure before the project is created in Asana. Do not use this tool for ordinary creation requests—use create_project instead when the user asks to create, set up, or add a project (with or without sections and tasks). Call this tool only when the user explicitly asks to preview first, see the plan before creating, review or confirm before creating, or postpone creation until they approve. Tasks in `sections` may include optional `subtasks` arrays (one level only; limit to no more than 5 per task unless necessary).
Inputs
project_namestringrequired- Name of the project to create. Example: 'Q4 Product Launch'
sectionsarrayrequired- Users will give you a request to create a project with a certain purpose. Use your own knowledge of project management and the principles and guidance below to design the best project structure possible. JSON array of section objects. Each section must have: - sectionName (string): Name of the section. - tasks (array): Array of task objects. Each task object must have: - taskName (string): Name of the task. - description (string | null): Task details as Markdown (not raw HTML), or null. Use real list lines (`- item` or `1. item`); avoid one line of middot bullets — they will not become lists. The preview rich-text supports headings **h1** and **h2**, marks **strong**, **em**, **u**, **s**, inline **code**, and lists **ul** / **ol** / **li** — use the same constructs in Markdown. The server normalizes Markdown to HTML for the preview and Asana `html_notes`. - isComplete (boolean): Whether the task is completed. Defaults to false if not provided. - startDate (string | null): Start date of the task in YYYY-MM-DD format, or null if the task has no start date. If the start date is provided, the due date must also be provided. If both the start date and due date are provided, the due date must be greater than or equal to the start date. Defaults to null if not provided. - dueDate (string | null): Due date of the task in YYYY-MM-DD format, or null if the task has no due date. If both the start date and due date are provided, the due date must be greater than or equal to the start date. Defaults to null if not provided. - assignee (string | null): Assignee of the task, or null if the task is unassigned. This can be "me", an email, or a user GID chosen among those found using asana_get_workspace_users. Defaults to null if not provided. - priority ("low" | "medium" | "high" | null): Priority level of the task. Must be one of 'low', 'medium', 'high', or null. Defaults to null if not provided. This is general guidance for creating good project structures. Follow these principles and guidance as closely as possible unless the user specifically asks you to do otherwise: Create the project structure in the same language as the user's request. - Project should have >=4 sections. - Limit the number of tasks to no more than 5 tasks per section. - Limit sections up to 6. - Every section should have at least one task. - If the user does not specifically give you tasks they want to include in their project, make tasks for the project that are aligned with the project's purpose. - Only mark tasks as complete (isComplete: true) if the user specifically mentioned they already completed that work. Otherwise, all tasks should be incomplete (isComplete: false). - When adding dates to tasks, always provide BOTH startDate and dueDate together as a date range. Never provide only dueDate without startDate. Add date ranges to several tasks so they will be useful for timeline and calendar views when the project is created. - All dates must be in the future (today or later), never in the past. - Create logical, sequential timelines that make sense for the project's purpose. Tasks should progress in a meaningful order (e.g., beginner tasks before advanced tasks, setup tasks before execution tasks). - Dates should form a coherent timeline, not be randomly scattered. - Prefer including the 'priority' custom field for every task (one of 'low', 'medium', or 'high'), unless the user has specifically instructed you not to. This helps users organize their work by importance. - Tasks may include an optional 'subtasks' array (one level only). Limit to no more than 5 subtasks per task unless necessary. Each subtask has taskName and optionally description. Example: [ { "sectionName": "Backlog", "tasks": [ { "taskName": "Design homepage", "description": "Create a modern and responsive homepage design", "isComplete": false, "startDate": "2025-01-10", "dueDate": "2025-01-15", "assignee": "123456789", "priority": "high" }, { "taskName": "Write documentation", "description": null, "isComplete": false, "startDate": "2025-01-15", "dueDate": "2025-01-20", "assignee": "987654321", "priority": "medium" } ] }, { "sectionName": "In Progress", "tasks": [ { "taskName": "Implement API endpoints", "description": "Build RESTful API endpoints for user management", "isComplete": false, "startDate": "2025-01-10", "dueDate": "2025-01-25", "assignee": "123456789", "priority": "high" }, { "taskName": "Code review", "description": null, "isComplete": false, "startDate": "2025-01-25", "dueDate": "2025-01-30", "assignee": null, "priority": "medium" }, { "taskName": "Deploy to staging", "description": "Deploy the latest version to staging environment", "isComplete": false, "startDate": "2025-01-05", "dueDate": "2025-01-08", "assignee": "987654321", "priority": "high" } ] } ]
asanamcp_create_task_preview_v4Generates a visual preview of a single task and asks for confirmation before creation.Read-onlyCreate Task Preview V4
Generates a visual preview of a single task and asks for confirmation before creation. NON-DEFAULT tool for task creation: Use only when the user explicitly opts in with visually previewing, reviewing, or confirming a task before creation, or when the user implies they want to check or verify before the task is saved. Do not use when the user wants to create multiple tasks (2 or more) - use create_task or create_tasks instead. When the user's request implies a project, suggest a project via project_gid. When you set project_gid, it is preferable to also set section_gid when you can reasonably resolve a section (e.g. call get_project with include_sections true to list section GIDs for that project and match the user's intent); omit section_gid when the section is unknown, not specified, or irrelevant. When the user wants subtasks on the new task, pass a subtasks array (one level only; at most 5 subtasks; entries are not added to any project).
Inputs
taskNamestringrequired- Name of the task.
assigneestring- Assignee of the task, or null if the task is unassigned. This can be "me", an email, or a user GID chosen among those found using asana_get_workspace_users. Defaults to null if not provided.
descriptionstring- Task details as Markdown (not raw HTML), or null. Use real list lines (`- item` or `1. item`); avoid one line of middot bullets â they will not become lists. The preview rich-text supports headings **h1** and **h2**, marks **strong**, **em**, **u**, **s**, inline **code**, and lists **ul** / **ol** / **li** â use the same constructs in Markdown. The server normalizes Markdown to HTML for the preview and Asana `html_notes`.
dueDatestring- Due date of the task in YYYY-MM-DD format, or null if the task has no due date. If both the start date and due date are provided, the due date must be greater than or equal to the start date. Defaults to null if not provided.
isCompleteboolean- Whether the task is completed. Defaults to false if not provided.
project_gidstring- GID of an existing project to add the task to, or null. When you set this, it is preferable to also pass section_gid when you can resolve a section for that project (call get_project with include_sections true to list section GIDs for that project); omitting section_gid is fine when placement is unclear or irrelevant.
section_gidstring- GID of an existing section to add the task to, or null. Project must also be set if section is provided, and the section must be in the project. Optional; omit when unknown or not specified. When project_gid is set, including section_gid is preferable if you can infer or look up a section (call get_project with include_sections true to list section GIDs for that project).
startDatestring- Start date of the task in YYYY-MM-DD format, or null if the task has no start date. If the start date is provided, the due date must also be provided. If both the start date and due date are provided, the due date must be greater than or equal to the start date. Defaults to null if not provided.
subtasksarray- Optional array of subtasks (one level only; subtasks are not added to any project). Limit to no more than 5 unless necessary. Each entry may include taskName (required), description, isComplete, startDate and dueDate (YYYY-MM-DD), and assignee (me, email, or user id).
asanamcp_get_agentReturns the full record for a single AI Teammate agent by GID.Read-onlyGet Agent
Returns the full record for a single AI Teammate agent by GID. Includes name, description, behavior_guidance, workspace, and photo URLs. Use get_workspace_agents first to discover agent GIDs, then call this tool for full details.
Inputs
agent_gidstringrequired- Globally unique identifier for the agent. Example: '1234567890123456'
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Available fields: gid, resource_type, resource_subtype, name, description, behavior_guidance, workspace, photo. Example: 'name,assignee,due_on,completed'
asanamcp_get_attachmentsList all attachments for a project, project brief, or task.Read-onlyGet Attachments
List all attachments for a project, project brief, or task. By default, returns attachment names, IDs, and URLs (download_url, permanent_url, view_url). To expose other attachment fields use opt_fields. Use for accessing files attached to Asana objects. Supports pagination for objects with many attachments.
Inputs
parentstringrequired- The GID of the parent project, project_brief, or task to retrieve attachments for. Must be a GID for a project, project_brief, or task. Example: '1234567890123456'
limitnumber- Results per page (1-100). Maximum number of results to return per page (1-100). Example: 50
offsetstring- Pagination offset token. Pagination token copied from a previous response. Leave blank to fetch the first page. Example: 'eyJ0eXAiOiJKV1Qi'
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
asanamcp_get_items_for_portfolioList projects, goals, and other items in a portfolio.Read-onlyGet Items for Portfolio
List projects, goals, and other items in a portfolio. Returns item names, IDs, and types. Use for portfolio content exploration and management. Supports pagination for portfolios with many items.
Inputs
portfolio_gidstringrequired- Globally unique identifier for the portfolio. Example: '1234567890123456'
limitnumber- Results per page (1-100). Maximum number of results to return per page (1-100). Example: 50
offsetstring- Pagination offset token. Pagination token copied from a previous response. Leave blank to fetch the first page. Example: 'eyJ0eXAiOiJKV1Qi'
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
asanamcp_get_meGet details of current authenticated user.Read-onlyGet Me
Get details of current authenticated user. Tools accept 'me' as a user identifier, so you rarely need to call this just to get the user's GID. Only call this when you need specific user details (e.g., name, email), when tools such as get_projects or search_objects require filtering results by user GID, or when tools do not accept 'me' as a user identifier.
Inputs
This tool takes no inputs.
asanamcp_get_my_tasksGet the current user's tasks.Read-onlyGet My Tasks
Get the current user's tasks. Shortcut for common "what's on my plate" queries. Returns tasks assigned to the user. Use when the user asks about their tasks, workload, or what they need to do. If the user's request includes words like 'preview', 'visualization', or 'rendered view' in reference to seeing their tasks, you MUST use search_tasks_preview with assignee_any='me' instead. Do not use this to answer questions about project membership or ownership. Use get_me plus get_projects or search_objects instead.
Inputs
completed_sincestring- Filter by completion. Use "now" for incomplete tasks only. Omit for all tasks. Use ISO datetime for tasks completed since a date.
limitnumber- Results per page (1-100). Default: 50. Maximum number of results to return per page (1-100).
offsetstring- Pagination offset token from the next_page field of a previous response. If omitted, returns the first page of results. Example: 'eyJ0eXAiOiJKV1Qi'
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Returns gid,name,assignee,due_on,completed by default.
asanamcp_get_notificationsList Inbox notifications for the authenticated user in a workspace.Read-onlyGet Notifications
List Inbox notifications for the authenticated user in a workspace. Use when the user asks things like "what needs my attention", "what happened while I was away", or "what did <person> say or ask". By default this already includes who triggered each notification (created_by.name) and what it relates to (work_objects.name, work_objects.resource_type). Request opt_fields for additional nested detail as needed, e.g. story.text for the underlying comment or activity text. story_resource_subtype names the underlying activity (e.g. assigned, at_mention, liked, added_to_project) and can help separate directly-actionable notifications (assignments, mentions) from passive ones (likes, status changes), but it is a free-form string with no fixed enum. When summarizing or explaining a notification, request story.text rather than pattern-matching the subtype alone. priority_classification is not yet differentiated (always unclassified); do not use it to infer urgency until that changes. Returns notification GIDs, which can be passed to update_notifications.
Inputs
limitnumber- Number of notifications to return per page (1-100). Defaults to 20.default
20 offsetstring- Pagination offset token from the next_page field of a previous response. If omitted, returns the first page of results.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. If omitted, the API already returns all top-level notification fields (created_at, created_by, is_read, story, story_resource_subtype, priority_classification, work_objects), including created_by.name and work_objects.name/work_objects.resource_type. `story` is the one nested object that stays compact by default (gid, resource_type only); request its subfields explicitly for more detail, e.g. story.text for the underlying comment or activity text.
asanamcp_get_portfolioGet detailed portfolio data by ID including name, owner, and projects.Read-onlyGet Portfolio
Get detailed portfolio data by ID including name, owner, and projects. Use after finding portfolio ID via search_objects. Returns complete portfolio configuration. Essential for understanding portfolio context and content.
Inputs
portfolio_gidstringrequired- Globally unique identifier for the portfolio. Example: '1234567890123456'
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
asanamcp_get_portfoliosList portfolios in workspace owned by the current user.Read-onlyGet Portfolios
List portfolios in workspace owned by the current user. REQUIRES workspace parameter. Returns portfolio names and IDs for portfolios you own. Use for portfolio discovery and management. Supports pagination for workspaces with many portfolios.
Inputs
limitnumber- Results per page (1-100). Maximum number of results to return per page (1-100). Example: 50
offsetstring- Pagination offset token. Pagination token copied from a previous response. Leave blank to fetch the first page. Example: 'eyJ0eXAiOiJKV1Qi'
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
asanamcp_get_projectGet detailed project data including name, description, owner, members, and current status.Read-onlyGet Project
Get detailed project data including name, description, owner, members, and current status. Also returns task counts (num_tasks, num_incomplete_tasks, num_completed_tasks) and optionally sections. A null task_counts or sections value means the data could not be retrieved and should not be interpreted as zero or empty.
Inputs
project_idstringrequired- Globally unique identifier for the project. Example: '1234567890123456'
include_sectionsboolean- Set to true to include the project's sections (up to 50) in the response.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
asanamcp_get_project_internalDEPRECATED; DO NOT USE.Read-onlyGet Project Internal
DEPRECATED; DO NOT USE. This tool must exist so that it can be invoked programmatically by widget UI, but it should not be called directly by the model.
Inputs
project_idstringrequired- Globally unique identifier for the project. Example: '1234567890123456'
widget_idstringrequired- ALWAYS USE A CONSTANT VALUE OF 'model-generated-widget-id' FOR THIS PARAMETER.
include_sectionsboolean- Set to true to include the project's sections (up to 50) in the response.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
asanamcp_get_projectsList projects in a workspace, optionally filtered by team.Read-onlyGet Projects
List projects in a workspace, optionally filtered by team. Returns project names, IDs, and task counts (num_tasks, num_incomplete_tasks, num_completed_tasks) by default. To expose other project fields, such as members or owner, use opt_fields. Prefer using search_objects with resource_type='project' for name-based searches instead of get_projects and filtering through the results. A null task_counts value means counts could not be retrieved and should not be interpreted as zero.
Inputs
archivedboolean- Include archived projects. Set to true to include archived projects in the results.
limitnumber- Number of projects to return per page (1-100). Defaults to 20. Example: 50
offsetstring- Pagination offset token from the next_page field of a previous response. If omitted, returns the first page of results. Example: 'eyJ0eXAiOiJKV1Qi'
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
teamstring- When passed in, filters projects on team GID. Example: '1234567890123456'
asanamcp_get_recordGet a single record by its GID.Read-onlyGet Record
Get a single record by its GID. Includes the record's comment/activity history by default, as a paginated comments object ({ data, next_page }); set include_comments to false to omit it. The most recent comments are returned first (up to comment_limit, default 10); use comment_offset to page through the rest.
Inputs
record_idstringrequired- Globally unique identifier for the record.
comment_limitnumber- Max comments to return per page (1-50). Default is 10. Only used when include_comments is true.default
10 comment_offsetstring- Pagination offset token from a previous response's comments.next_page. Only used when include_comments is true.
comment_opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported.
include_commentsboolean- Include the record's comments/activity, as a paginated comments object ({ data, next_page }). Set to false to omit them.default
true opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Returns gid,name,workspace,created_at,created_by,modified_at by default.
asanamcp_get_recordsList records in a table.Read-onlyGet Records
List records in a table. Requires the table GID â records are not listed across a whole workspace. Supports filtering by modified_since and sorting by created_at.
Inputs
tablestringrequired- Globally unique identifier for the table whose records to list.
limitnumber- Number of records to return per page (1-100).
modified_sincestring- Filter for records modified since this date in datetime format.
offsetstring- Pagination offset token from the next_page field of a previous response.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Returns gid,name,workspace,created_at,created_by,modified_at by default.
sort_bystring- Field to sort by. Only created_at is currently supported.one of
created_at
asanamcp_get_status_overviewGet status overview and progress reports for initiatives/projects.Read-onlyGet Status Overview
Get status overview and progress reports for initiatives/projects. Use this tool as a standalone when users ask for: status updates, status reports, project status, work overview, progress overview, initiative status, identified blockers, or any status-related queries. This tool searches projects and portfolios, extracts tasks and status updates, and returns aggregated project details, tasks, and status information. IMPORTANT: Call this tool directly with keywords - do NOT call other search tools first. This tool handles all searching and aggregation internally.
Inputs
keywordsstringrequired- Keywords to search for projects. Can be a single keyword (e.g., 'asana') or multiple comma-separated keywords (e.g., 'asana, chatgpt, integration'). The tool searches each keyword separately and combines results from all matching projects (OR logic - matches any keyword). Example: 'Q4 Launch'
opt_fieldsstring- Comma-separated list of optional fields to include in task data (e.g., 'name,notes,assignee,due_on,completed'). Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
asanamcp_get_tableGet a single table by its GID.Read-onlyGet Table
Get a single table by its GID. Set include_custom_field_settings to also return the table's current custom-field schema in one call, as a paginated custom_field_settings object ({ data, next_page }); use custom_field_settings_limit/custom_field_settings_offset to page through it.
Inputs
table_idstringrequired- Globally unique identifier for the table.
custom_field_settings_limitnumber- Page size for custom_field_settings (1-100). Only used when include_custom_field_settings is true.
custom_field_settings_offsetstring- Pagination offset token from a previous response's custom_field_settings.next_page. Only used when include_custom_field_settings is true.
include_custom_field_settingsboolean- Set to true to also include the table's custom field schema in the response, as a paginated custom_field_settings object ({ data, next_page }).default
false opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported.
asanamcp_get_tablesList tables in a workspace.Read-onlyGet Tables
List tables in a workspace.
Inputs
limitnumber- Number of tables to return per page (1-100).
offsetstring- Pagination offset token from the next_page field of a previous response.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported.
asanamcp_get_taskGet full task details by ID.Read-onlyGet Task
Get full task details by ID. Returns name, description, assignee, due dates, custom fields, projects, dependencies, followers, parent, memberships (project and section), and acknowledgements (hearts and likes). Essential before updating tasks. Use opt_fields for custom field values. Comments and subtasks are included by default. Set include_comments or include_subtasks to false to exclude them. The most recent comments are returned (up to comment_limit), in ascending chronological order so the thread reads oldest-to-newest. Required for understanding task context.
Inputs
task_idstringrequired- Globally unique identifier for the task. Example: '1234567890123456'
comment_limitnumber- Max comments to return (1-50). Default is 10.
include_commentsboolean- Include comments of task. Set to true to include the task's most recent comments in the response.
include_subtasksboolean- Include subtasks of task. Set to true to include the task's subtasks in the response.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
asanamcp_get_task_storiesGet the full activity feed (stories) for a task by ID.Read-onlyGet Task Stories
Get the full activity feed (stories) for a task by ID. Returns every story, not just comments: comments plus system activity such as assignments, status/completion changes, due date changes, and added-to-project events. Paginated via limit and offset so you can page through the entire history, unlike get_task which bundles only a small, comments-only preview. Stories are returned in the order the API provides them (chronological, oldest first). Use for auditing what happened on a task or summarizing its history.
Inputs
task_idstringrequired- Globally unique identifier for a single task. Use task_ids instead to read several tasks in one call.
created_afterstring- Only return stories created strictly after this ISO 8601 datetime. Applies to every story type; combine with resource_subtype='comment_added' for just the new comments.
limitnumber- Results per page (1-100). Applies per task when task_ids is used.
offsetstring- Pagination offset token. Only valid with task_id, not task_ids.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported.
resource_subtypestring- Only return stories of this subtype. Omit to return the full activity feed. Note sticker reactions are comment stories too, so they come back as well and report resource_subtype='sticker_added' -- check each story's own resource_subtype if you need text comments only.one of
comment_added sort_ascendingboolean- Creation-time order: true (the default) is oldest first, false is newest first. Pair false with limit to read only the latest activity.
task_idsarray- Globally unique identifiers for up to 50 tasks, read in a single call. Prefer this over calling the tool once per task.
asanamcp_get_tasksList tasks filtered by context (workspace/project/tag/section/user list).Read-onlyGet Tasks
List tasks filtered by context (workspace/project/tag/section/user list). One context required. Supports assignee, date filters. Returns task names and IDs. Use for filtered task views and bulk operations. If the user's request includes words like 'preview', 'visual', 'visualize', or 'render' in reference to seeing their tasks, you MUST use search_tasks_preview instead of this tool, even if the request is scoped to a specific project.
Inputs
assigneestring- User identifier to assign the task to. Can be "me", an email, or a user GID. Prefer using "me" for the current user rather than calling get_me to look up the GID of the current user.
completed_sincestring- Filter for tasks completed since this date in datetime format.
limitnumber- Number of sections to return per page (1-100).
modified_sincestring- Filter for tasks modified since this date in datetime format.
offsetstring- Pagination offset token.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported.
projectstring- Globally unique identifier for the project.
sectionstring- Globally unique identifier for the section.
tagstring- The tag GID to retrieve tasks for
user_task_liststring- Globally unique identifier for the user task list.
asanamcp_get_teamsList teams in workspace.Read-onlyGet Teams
List teams in workspace. Returns team names and GIDs. Optionally filter to only teams a specific user belongs to by providing a user GID. Use to discover teams for project context or check user team membership.
Inputs
limitnumber- Number of teams to return per page (1-100). Defaults to 20. Example: 50
offsetstring- Pagination offset token from the next_page field of a previous response. If omitted, returns the first page of results. Example: 'eyJ0eXAiOiJKV1Qi'
userstring- A user GID to filter teams to only those the user belongs to. When omitted, returns all teams in the workspace. Example: 'me or 1234567890123456'
asanamcp_get_userGet user details by ID, email, or "me".Read-onlyGet User
Get user details by ID, email, or "me". Returns name, email, workspaces. Use to find user IDs for task assignment. "me" returns authenticated user info. Essential before assigning tasks. When no user_id is provided, defaults to "me" (authenticated user) - equivalent to the former asana_get_user_info tool. Prefer using search_objects when searching for users/agents by name.
Inputs
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
user_idstring- A string identifying a user. This can be 'me', an email, or the gid of a user. When omitted, defaults to 'me' (authenticated user). Example: 'me or 1234567890123456'
asanamcp_get_usersList users, optionally filtered by team.Read-onlyGet Users
List users, optionally filtered by team. Prefer using search_objects when searching for users/agents by name. Returns paginated results with users array and next_page token.
Inputs
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Returns gid,name,email by default.
teamstring- Filter by team membership.
asanamcp_get_workspace_agentsReturns a list of AI Teammate agents (automated agents, not human users) configured in a workspace.Read-onlyGet Workspace Agents
Returns a list of AI Teammate agents (automated agents, not human users) configured in a workspace. AI Teammates are Asana-specific automation agents â they are distinct from human coworkers, teammates, or workspace members. Do NOT use this tool when the user asks about people, users, teammates, or team members; use get_users or search_objects instead. If you have a name or description to search against, use search_objects with resource_type='agent' instead. Each agent record includes GID, name, resource_type, and resource_subtype. Use to discover available AI Teammate agents before fetching full details with get_agent. Supports pagination for workspaces with many agents.
Inputs
limitnumber- Results per page (1-100). Maximum number of results to return per page (1-100). Example: 50
offsetstring- Pagination offset token from a previous response. Example: 'eyJ0eXAiOiJKV1Qi'
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Available fields: gid, resource_type, resource_subtype, name. Example: 'name,assignee,due_on,completed'
asanamcp_log_widget_eventDEPRECATED; DO NOT USE.Read-onlyLog Widget Event
DEPRECATED; DO NOT USE. This tool must exist so that it can be invoked programmatically by widget UI, but it should not be called directly by the model.
Inputs
actionstringrequired- The user action being logged for this widget, e.g. 'opened', 'clicked_confirm', or 'dismissed'.
widget_idstringrequired- ALWAYS USE A CONSTANT VALUE OF 'model-generated-widget-id' FOR THIS PARAMETER.
widget_typestringrequired- The kind of widget UI component that generated this event, e.g. 'task_preview' or 'project_preview'.
extra_event_attributes_jsonstring- Optional JSON-encoded string of additional key/value attributes to attach to this event. Example: '{"source": "task_preview"}'
asanamcp_search_objectsQuick search across Asana objects.Read-onlySearch Objects
Quick search across Asana objects. ALWAYS use this FIRST before specialized search. Returns most relevant items based on recency and usage. Faster than dedicated search tools for finding specific items. Use query to search by name or description/role. More efficient than listing all objects and scanning manually. If the user is not specific about which objects to search, use the following priority order: project + task > portfolio > goal + others (user, team, agent, actor, tag, custom_field).
Inputs
resource_typestringrequired- The type of resource to search for. Use 'user' for human workspace members. Use 'agent' for AI teammates (e.g. named assistants). Use 'actor' when searching for any entity that can be assigned work (humans + AI teammates). Example: 'task'one of
actoragentcustom_fieldgoalprojectproject_templateportfoliotagtaskteamuser countnumber- Number of results to return. Default is 20 if parameter is empty. Minimum 1, maximum 100.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
querystring- The search query. Can be empty to get default results for the resource type. Example: 'Q4 planning'
asanamcp_search_objects_internalDEPRECATED; DO NOT USE.Read-onlySearch Objects Internal
DEPRECATED; DO NOT USE. This tool must exist so that it can be invoked programmatically by widget UI, but it should not be called directly by the model.
Inputs
resource_typestringrequired- The type of resource to search for. Use 'user' for human workspace members. Use 'agent' for AI teammates (e.g. named assistants). Use 'actor' when searching for any entity that can be assigned work (humans + AI teammates). Example: 'task'one of
actoragentcustom_fieldgoalprojectproject_templateportfoliotagtaskteamuser widget_idstringrequired- ALWAYS USE A CONSTANT VALUE OF 'model-generated-widget-id' FOR THIS PARAMETER.
countnumber- Number of results to return. Default is 20 if parameter is empty. Minimum 1, maximum 100.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Example: 'name,assignee,due_on,completed'
querystring- The search query. Can be empty to get default results for the resource type. Example: 'Q4 planning'
asanamcp_search_recordsSearch for records in a workspace.Read-onlySearch Records
Search for records in a workspace. At least one filter besides sort options is required, or the request will be rejected. Scope to specific tables with tables_any/tables_not/tables_all; otherwise the search spans every table in the workspace.
Inputs
created_at_afterstring- ISO 8601 datetime string for creation datetime after filter.
created_at_beforestring- ISO 8601 datetime string for creation datetime before filter.
created_onstring- ISO 8601 date string for creation date filter.
created_on_afterstring- ISO 8601 date string for creation date after filter.
created_on_beforestring- ISO 8601 date string for creation date before filter.
custom_fieldsstring- JSON string of custom field filters for task search. Each key is a custom field GID followed by a search operator. Each value must be a string, number, or boolean only. Values become search query parameters, so nested objects and arrays are invalid. Use <gid>.value for an exact string or number match; for single-select fields, use the option GID as the value. Use <gid>.is_set with a boolean to test whether the field has any value. Other supported operators are not_value, starts_with, ends_with, contains, less_than, greater_than, before, and after. For compatibility, a bare GID defaults to value for strings and numbers or is_set for booleans. Examples: {"4578152156.value":"1200123456789012"}; {"5678904321.greater_than":42}; {"1200999999999999.is_set":true}.
followers_anystring- Comma-separated list of user identifiers.
followers_notstring- Comma-separated list of user identifiers to exclude.
limitnumber- Number of results to return (1-100).
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported.
sort_ascendingboolean- Sort in ascending order. Defaults to false.default
false sort_bystring- Field to sort by. Omit or pass modified_at to sort by last modified.one of
created_atmodified_at tables_allstring- Comma-separated list of table GIDs (records must be in all).
tables_anystring- Comma-separated list of table GIDs to scope the search to.
tables_notstring- Comma-separated list of table GIDs to exclude.
teams_anystring- Comma-separated list of team IDs.
textstring- Text to search for in the record's name.
asanamcp_search_tasksPremium accounts only.Read-onlySearch Tasks
Premium accounts only. Advanced task search with full-text and complex filters. DEFAULT tool for searching tasks: Use by default any time the user asks to search for tasks. Searches task names, descriptions, and comments. Returns tasks with gid, name, assignee, due_on, completed. When the user uses possessive language like 'my' (e.g., 'my tasks', 'my overdue tasks', 'my high-priority tasks'), you MUST always set assignee_any='me', in addition to any other applicable filters. Unless the user explicitly asks for completed tasks or all tasks, always set completed=false to filter to incomplete tasks only. Use get_tasks for non-Premium workspaces.
Inputs
assignee_anystring- Filter to tasks assigned to any of these users. Comma-separated list of user identifiers ("me", an email, or a user GID).
completedboolean- Filter for completed or incomplete tasks.
completed_at_afterstring- ISO 8601 datetime string for completion datetime after filter.
completed_at_beforestring- ISO 8601 datetime string for completion datetime before filter.
completed_on_afterstring- ISO 8601 date string for completion date after filter.
completed_on_beforestring- ISO 8601 date string for completion date before filter.
created_at_afterstring- ISO 8601 datetime string for creation datetime after filter.
created_at_beforestring- ISO 8601 datetime string for creation datetime before filter.
created_by_anystring- Filter to tasks created by any of these users. Comma-separated list of user identifiers ("me", an email, or a user GID).
created_on_afterstring- ISO 8601 date string for creation date after filter.
created_on_beforestring- ISO 8601 date string for creation date before filter.
custom_fieldsstring- JSON string of custom field filters for task search. Each key is a custom field GID followed by a search operator. Each value must be a string, number, or boolean only. Values become search query parameters, so nested objects and arrays are invalid. Use <gid>.value for an exact string or number match; for single-select fields, use the option GID as the value. Use <gid>.is_set with a boolean to test whether the field has any value. Other supported operators are not_value, starts_with, ends_with, contains, less_than, greater_than, before, and after. For compatibility, a bare GID defaults to value for strings and numbers or is_set for booleans. Examples: {"4578152156.value":"1200123456789012"}; {"5678904321.greater_than":42}; {"1200999999999999.is_set":true}.
due_onstring- ISO 8601 date string for due date filter.
due_on_afterstring- ISO 8601 date string for due date after filter.
due_on_beforestring- ISO 8601 date string for due date before filter.
followers_anystring- Filter to tasks followed by any of these users. Comma-separated list of user identifiers ("me", an email, or a user GID).
is_subtaskboolean- Filter to subtasks.
limitnumber- Maximum number of results to return (1-100). Default: 50.default
50 modified_at_afterstring- ISO 8601 datetime string for modified datetime after filter.
modified_on_afterstring- ISO 8601 date string for modified date after filter.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported.
projects_anystring- Filter to tasks in any of these projects. Comma-separated list of project GIDs.
resource_subtypestring- Filters results by the task's resource_subtype (e.g., milestone).one of
default_taskmilestoneapproval sections_anystring- Filter to tasks in any of these sections or columns. Comma-separated list of section GIDs.
sort_ascendingboolean- Sort in ascending order. Defaults to false.default
false sort_bystring- Field to sort by (e.g., 'due_date', 'created_at', 'completed_at', 'likes', 'modified_at'). Defaults to modified_at.one of
due_datecreated_atcompleted_atlikesmodified_atdefaultmodified_at tags_anystring- Filter to tasks with any of these tags. Comma-separated list of tag GIDs.
textstring- Text to search for in task name or description.
asanamcp_search_tasks_previewSearch for tasks in the workspace and render a preview of the results.Read-onlySearch Tasks Preview
Search for tasks in the workspace and render a preview of the results. Use this tool for all requests where the user explicitly opts in with rendering a preview or visual of the search results (e.g., 'show me a preview of my tasks', 'visualize my tasks', etc). All search filters are optional, but use at least one search filter to limit the results to a specific set of tasks. For example, use the 'completed' filter to show only completed tasks, 'projects_any' to show tasks in a specific project, or when the user uses possessive language like 'my' (e.g., 'my tasks', 'my overdue tasks', 'my high-priority tasks'), you MUST always set assignee_any='me', in addition to any other applicable filters. Use the 'text' filter as a freeform search term to find tasks that match the specified text (exactly) in the task name or description. After calling this tool, do not summarize, list, or mention specific task names in your response.
Inputs
assignee_anystring- Filter to tasks with assignees matching any of the comma-separated list of user identifiers. User identifiers can be "me", an email, or a user GID chosen among those found using asana_get_workspace_users. For example, if the user specifies "my tasks", set assignee_any to "me". Leave blank to show tasks assigned to any user.
completedboolean- Filter to either completed or incomplete tasks only. Leave blank to show both completed and incomplete tasks. Prefer filtering to incomplete tasks only, EXCEPT when the user specifically and EXPLICITLY asks for completed tasks only, or both completed and incomplete tasks.
completed_on_afterstring- Filter to tasks completed after the specified date. Date must be in YYYY-MM-DD format. Leave blank to show tasks completed after any date, including incomplete tasks. Example: '2024-01-01'
completed_on_beforestring- Filter to tasks completed before the specified date. Date must be in YYYY-MM-DD format. Leave blank to show tasks completed before any date, including incomplete tasks. Example: '2024-12-31'
created_by_anystring- Filter to tasks created by a user matching any of the comma-separated list of user identifiers. User identifiers can be "me", an email, or a user GID chosen among those found using asana_get_workspace_users. Leave blank to show tasks created by any user. Example: 'me,1234567890123456'
created_on_afterstring- Filter to tasks created after the specified date. Date must be in YYYY-MM-DD format. Leave blank to show tasks created after any date. Example: '2024-01-01'
created_on_beforestring- Filter to tasks created before the specified date. Date must be in YYYY-MM-DD format. Leave blank to show tasks created before any date. Example: '2024-12-31'
due_on_afterstring- Filter to tasks due after the specified date. Date must be in YYYY-MM-DD format. Leave blank to show tasks due after any date, including tasks with no due date. Example: '2024-01-01'
due_on_beforestring- Filter to tasks due before the specified date. Date must be in YYYY-MM-DD format. Leave blank to show tasks due before any date, including tasks with no due date. Example: '2024-12-31'
followers_anystring- Filter to tasks followed by any of the comma-separated list of user identifiers. User identifiers can be "me", an email, or a user GID chosen among those found using asana_get_workspace_users. Leave blank to show tasks followed by any user. Example: 'me,1234567890123456'
projects_anystring- Filter to tasks in any of the comma-separated list of project IDs (GIDs). Project IDs can be chosen among those found using asana_get_projects. Leave blank to show tasks in any project. Example: '1234567890123456,9876543210987654'
start_on_afterstring- Filter to tasks with a start date after the specified date. Date must be in YYYY-MM-DD format. Leave blank to show tasks with a start date after any date, including tasks with no start date. Example: '2024-01-01'
start_on_beforestring- Filter to tasks with a start date before the specified date. Date must be in YYYY-MM-DD format. Leave blank to show tasks with a start date before any date, including tasks with no start date. Example: '2024-12-31'
textstring- Freeform text to search for in task names and descriptions. Example: 'website redesign'
asanamcp_add_commentAdd a comment to a task.WriteAdd Comment
Add a comment to a task. Use ONLY for human-authored discussion, feedback, questions, or additional context. Exactly one of text or html_text must be provided. Do NOT use for actions that are automatically logged (assignments, status changes, completion, field updates). Returns the created story with ID, content, author, and timestamp.
Inputs
task_idstringrequired- Globally unique identifier for the task. Example: '1234567890123456'
html_textstring- Exactly one of text or html_text must be provided. Allowed elements only: <body>, <strong>, <em>, <u>, <s>, <code>, <ol>, <ul>, <li>, <a>, <blockquote>, <pre>. Do not use <h1>, <h2>, <hr/>, or <img> here. Must be well-formed XML with a single root <body>...</body>. Only <a> may have custom attributes; any attribute on any other element is invalid. Do not use elements outside the allowed list (400). . <a> links: For <a> tags specifically, to make it easier to create @-mentions through the API, we only require that you provide the GID of the object you wish to reference. If you have access to that object, the API will automatically generate the appropriate href and other attributes for you. For example, to create a link to a task with GID "123", you can send the tag <a data-asana-gid="123"/> which will then be expanded to <a href="https://app.asana.com/0/0/123/f" data-asana-accessible="true" data-asana-dynamic="true" data-asana-type="task" data-asana-gid="123">Task Name</a>. You can also generate a link to a task in a specific project or tag by including a data-asana-project or data-asana-tag attribute in the <a> tag. All other attributes, as well as the contents of the tag, are ignored. To keep the contents of your tag and make a custom vanity link, include the property data-asana-dynamic="false" when setting the contents of the tag. You would send <a data-asana-gid="123" data-asana-dynamic="false">This is some custom text!</a> and receive <a data-asana-accessible="true" data-asana-dynamic="false" data-asana-type="task" data-asana-gid="123">This is some custom text!</a> If you do not have access to the referenced object when you try to create a link, the API will not generate an href for you, but will instead look for an href you provide. This allows you to write back <a> tags unmodified even if you do not have access to the resource. If you do not have access to the referenced object and no href is provided, your request will be rejected with a 400 Bad Request error. Similarly, if you provide neither a GID nor a valid href, the request will be rejected with the same error.
is_pinnedboolean- Pinned comments stay at the top of the task's activity feed.
opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Returns gid,name,task,created_by,created_at,text,html_text,is_pinned by default. Example: 'name,assignee,due_on,completed'
textstring- Plain-text comment body. Exactly one of text or html_text must be provided. Example: 'This looks good, approved!'
asanamcp_add_record_commentAdd a comment to a record.WriteAdd Record Comment
Add a comment to a record.
Inputs
record_idstringrequired- Globally unique identifier for the record.
html_textstring- Exactly one of text or html_text must be provided. Allowed elements only: <body>, <strong>, <em>, <u>, <s>, <code>, <ol>, <ul>, <li>, <a>, <blockquote>, <pre>. Do not use <h1>, <h2>, <hr/>, or <img> here. Must be well-formed XML with a single root <body>...</body>. Only <a> may have custom attributes; any attribute on any other element is invalid. Do not use elements outside the allowed list (400). . <a> links: For <a> tags specifically, to make it easier to create @-mentions through the API, we only require that you provide the GID of the object you wish to reference. If you have access to that object, the API will automatically generate the appropriate href and other attributes for you. For example, to create a link to a task with GID "123", you can send the tag <a data-asana-gid="123"/> which will then be expanded to <a href="https://app.asana.com/0/0/123/f" data-asana-accessible="true" data-asana-dynamic="true" data-asana-type="task" data-asana-gid="123">Task Name</a>. You can also generate a link to a task in a specific project or tag by including a data-asana-project or data-asana-tag attribute in the <a> tag. All other attributes, as well as the contents of the tag, are ignored. To keep the contents of your tag and make a custom vanity link, include the property data-asana-dynamic="false" when setting the contents of the tag. You would send <a data-asana-gid="123" data-asana-dynamic="false">This is some custom text!</a> and receive <a data-asana-accessible="true" data-asana-dynamic="false" data-asana-type="task" data-asana-gid="123">This is some custom text!</a> If you do not have access to the referenced object when you try to create a link, the API will not generate an href for you, but will instead look for an href you provide. This allows you to write back <a> tags unmodified even if you do not have access to the resource. If you do not have access to the referenced object and no href is provided, your request will be rejected with a 400 Bad Request error. Similarly, if you provide neither a GID nor a valid href, the request will be rejected with the same error.
is_pinnedboolean- Pinned comments stay at the top of the record's activity feed.default
false opt_fieldsstring- Comma-separated list of optional fields to include in the response. Name each subfield explicitly as parent.child; wildcard and glob syntax such as parent.* is not supported. Returns gid,name,created_by,created_at,text,html_text,is_pinned by default.
textstring- Plain-text comment body. Exactly one of text or html_text must be provided.
asanamcp_create_projectCreate a new project with optional sections and tasks in a single operation.WriteCreate Project
Create a new project with optional sections and tasks in a single operation. Use this as the default whenever the user wants a project created or set up, including with sections and tasks. Do not choose create_project_preview unless the user explicitly asks to preview or confirm the plan before creation, or to delay creating the project until they approve. Optionally pass sections, each with a sectionName and an optional list of tasks (with name, assignee, due_on, etc.), to set up the full project structure at creation time. Tasks are nested within their sections and will be assigned to the corresponding section automatically. If a team is not provided, the new project will be associated with a default team. Returns the created project ID, permalink, and results for any sections and tasks created.
Inputs
namestringrequired- Name of the project. The display name for this project. Example: 'Q4 Product Launch'
colorstring- Color of the project (light-green, dark-green, light-blue, dark-blue, etc).one of
dark-pinkdark-greendark-bluedark-reddark-tealdark-browndark-orangedark-purpledark-warm-graylight-pinklight-greenlight-bluelight-redlight-teallight-brownlight-orangelight-purplelight-warm-graynone custom_fieldsobject- Custom field: each key is a custom field GID; each value matches that field's type in the Asana API. Use option GIDs for dropdown fields, not display names. Some tools expect a nested object; others expect one JSON string containing the same map. Examples: {"1200456789012345":"1200123456789012"} (single-select); {"1200456789012346":12.5} (number); {"1200456789012347":"Ship by Friday"} (text); {"1200456789012348":["1200111111111111","1200222222222222"]} (multi-select); {"1200456789012349":{"date":"2025-06-15"}} or {"1200456789012349":{"date_time":"2025-06-15T17:00:00.000Z"}} (date).
default_access_levelstring- The default access for users or teams who join or are added as members to the project. Example: 'editor'one of
admineditorcommenterviewer default_viewstring- The default view of the project (list, board, calendar, timeline).one of
listboardcalendartimeline due_onstring- Date on which this project is due (YYYY-MM-DD). Example: '2024-12-31'
html_notesstring- HTML-formatted project description. Use notes for plain text. Allowed elements only: <body>, <strong>, <em>, <u>, <s>, <code>, <ol>, <ul>, <li>, <a>, <blockquote>, <pre>. Must be well-formed XML with a single root <body>...</body>. Only <a> may have custom attributes; any attribute on any other element is invalid. Do not use elements outside the allowed list (400). . <a> links: For <a> tags specifically, to make it easier to create @-mentions through the API, we only require that you provide the GID of the object you wish to reference. If you have access to that object, the API will automatically generate the appropriate href and other attributes for you. For example, to create a link to a task with GID "123", you can send the tag <a data-asana-gid="123"/> which will then be expanded to <a href="https://app.asana.com/0/0/123/f" data-asana-accessible="true" data-asana-dynamic="true" data-asana-type="task" data-asana-gid="123">Task Name</a>. You can also generate a link to a task in a specific project or tag by including a data-asana-project or data-asana-tag attribute in the <a> tag. All other attributes, as well as the contents of the tag, are ignored. To keep the contents of your tag and make a custom vanity link, include the property data-asana-dynamic="false" when setting the contents of the tag. You would send <a data-asana-gid="123" data-asana-dynamic="false">This is some custom text!</a> and receive <a data-asana-accessible="true" data-asana-dynamic="false" data-asana-type="task" data-asana-gid="123">This is some custom text!</a> If you do not have access to the referenced object when you try to create a link, the API will not generate an href for you, but will instead look for an href you provide. This allows you to write back <a> tags unmodified even if you do not have access to the resource. If you do not have access to the referenced object and no href is provided, your request will be rejected with a 400 Bad Request error. Similarly, if you provide neither a GID nor a valid href, the request will be rejected with the same error.
membersstring- Comma-separated user GIDs to add as project members. Example: "123456,789012".
notesstring- Plain-text project description. Use html_notes for rich formatting or @-mentions. Example: 'Track all Q4 product launch tasks.'
ownerstring- User identifier for project owner. Can be "me", an email, or a user GID. Prefer using "me" for the current user rather than calling get_me to look up the GID of the current user.
privacy_settingstring- Privacy level for the project (public_to_workspace, private_to_team, private).one of
public_to_workspaceprivate_to_teamprivate sectionsarray- Users will give you a request to create a project with a certain purpose. JSON array of section objects. Each section must have: - sectionName (string): Name of the section. - tasks (array, optional): Array of task objects. Each task object must have: - name (string): Name of the task. Each task object can optionally have: - notes (string): Plain-text task description. Use html_notes for rich formatting or @-mentions. - html_notes (string): HTML-formatted task description. Use notes for plain text. - assignee (string): User identifier for task assignment. Can be 'me', an email, or a user GID. - due_on (string): Due date in YYYY-MM-DD format. - due_at (string): Due date and time in ISO 8601 format. - start_on (string): Start date in YYYY-MM-DD format. - start_at (string): Start date and time in ISO 8601 format. - completed (boolean): True if the task is initially marked complete. - followers (string): Comma-separated list of user identifiers. - custom_fields (string): Custom field: each key is a custom field GID; each value matches that field's type in the Asana API. Use option GIDs for dropdown fields, not display names. Some tools expect a nested object; others expect one JSON string containing the same map. Examples: {"1200456789012345":"1200123456789012"} (single-select); {"1200456789012346":12.5} (number); {"1200456789012347":"Ship by Friday"} (text); {"1200456789012348":["1200111111111111","1200222222222222"]} (multi-select); {"1200456789012349":{"date":"2025-06-15"}} or {"1200456789012349":{"date_time":"2025-06-15T17:00:00.000Z"}} (date). Example: [ { "sectionName": "Backlog", "tasks": [ { "name": "Design homepage", "notes": "Create a modern and responsive homepage design", "completed": false, "start_on": "2025-01-10", "due_on": "2025-01-15", "assignee": "123456789" }, { "name": "Write documentation", "completed": false, "start_on": "2025-01-15", "due_on": "2025-01-20", "assignee": "987654321" } ] }, { "sectionName": "In Progress", "tasks": [ { "name": "Implement API endpoints", "notes": "Build RESTful API endpoints for user management", "completed": false, "start_on": "2025-01-10", "due_on": "2025-01-25", "assignee": "123456789" }, { "name": "Code review", "completed": false, "start_on": "2025-01-25", "due_on": "2025-01-30" }, { "name": "Deploy to staging", "notes": "Deploy the latest version to staging environment", "completed": false, "start_on": "2025-01-05", "due_on": "2025-01-08", "assignee": "987654321" } ] } ]
start_onstring- Date on which this project is started (YYYY-MM-DD). Example: '2024-01-01'
teamstring- Globally unique identifier for the team. If not provided, default team will be used. Example: '1234567890123456'
asanamcp_create_project_confirmDEPRECATED; DO NOT USE.WriteCreate Project Confirm
DEPRECATED; DO NOT USE. This tool must exist so that it can be invoked programmatically by widget UI, but it should not be called directly by the model.
Inputs
projectNamestringrequired- Name of the project to create. Internal widget field: the project's name, as confirmed in the preview widget. Example: 'Q4 Product Launch'
sectionsarrayrequired- Array of section objects, each with sectionName and a tasks array, describing the full project structure confirmed by the user. Each task may include description, isComplete, startDate, dueDate, assignee, customFields (priority), and subtasks. Example: [{"sectionName": "Backlog", "tasks": [{"taskName": "Design homepage"}]}]
widget_idstringrequired- ALWAYS USE A CONSTANT VALUE OF 'model-generated-widget-id' FOR THIS PARAMETER.
workspacestringrequired- GID of the Asana workspace the project will be created in. Example: '1234567890123456'
asanamcp_create_project_confirm_populateDEPRECATED; DO NOT USE.WriteCreate Project Confirm Populate
DEPRECATED; DO NOT USE. This tool must exist so that it can be invoked programmatically by widget UI, but it should not be called directly by the model.
Inputs
projectstringrequired- GID of the existing (already-created) project to populate with the confirmed sections and tasks. Example: '1234567890123456'
sectionsarrayrequired- Array of section objects, each with sectionName and a tasks array, describing the structure to add to the project. Each task may include description, isComplete, startDate, dueDate, assignee, customFields (priority), and subtasks. Example: [{"sectionName": "Backlog", "tasks": [{"taskName": "Design homepage"}]}]
widget_idstringrequired- ALWAYS USE A CONSTANT VALUE OF 'model-generated-widget-id' FOR THIS PARAMETER.
workspacestringrequired- GID of the Asana workspace the project belongs to. Example: '1234567890123456'
useRichTextTaskDescriptionboolean- Whether task description values should be saved as Asana rich-text HTML rather than plain text.
asanamcp_create_project_from_templateCreate a project from a project template.WriteCreate Project From Template
Create a project from a project template. If the user provides a template name instead of a GID, first use search_objects with resource_type 'project_template' and query set to that name. If search_objects requires workspace_gid and the user did not specify a workspace, call get_me to discover their workspaces. Use the only workspace automatically. If there are multiple workspaces, ask the user to choose by name; never ask them for a workspace GID. If the user wants the project in the template's team, request team.gid from search_objects and pass it as team. Omitting team does not inherit the template's team and may create a teamless project. Project instantiation starts asynchronously. Tell the user it has started and may still be in progress. Use the returned new_project GID for follow-up work, such as adding tasks or editing the project, and ask what they want to do next.
Inputs
namestringrequired- Name of the new project. Must contain a non-whitespace character.
project_template_idstringrequired- Globally unique identifier for the project template. If the user provided a template name, resolve it with search_objects as described above.
is_strictboolean- When true, fail if a template date variable has no requested date. When false or omitted, use default dates for missing values.
privacy_settingstring- Privacy setting for the new project. private_to_team is deprecated; use POST /memberships to share a private project with a team after creation.one of
public_to_workspaceprivate_to_teamprivate requested_datesarray- Mappings from template date variables to calendar dates.
requested_rolesarray- Mappings from template roles to user identifiers.
teamstring- Globally unique identifier for the new project's team. Omitting this does not inherit the template's team and may create a teamless project. Pass the template's team GID explicitly when that placement is desired.
asanamcp_create_project_status_updatePost a status update to a project or portfolio.WriteCreate Project Status Update
Post a status update to a project or portfolio. Use for project health updates, milestone documentation, or blocker reporting. Returns created status with gid, parent, title, status_type, author, created_at, permalink_url. Exactly one of text or html_text must be provided (omit the other in the request).
Inputs
colorstringrequired- Status color: green (on track), yellow (at risk), red (off track), blue (on hold), completeone of
greenyellowredbluecomplete parentstringrequired- GID of the project or portfolio to post the status update to. Example: '1234567890123456'
titlestringrequired- Status title. Short title/headline for this item. Example: 'On track for Q4 launch'
html_textstring- Exactly one of text or html_text must be provided. Allowed elements only: <body>, <strong>, <em>, <u>, <s>, <code>, <ol>, <ul>, <li>, <a>, <blockquote>, <pre>. Do not use <h1>, <h2>, <hr/>, or <img> here. Must be well-formed XML with a single root <body>...</body>. Only <a> may have custom attributes; any attribute on any other element is invalid. Do not use elements outside the allowed list (400). . <a> links: For <a> tags specifically, to make it easier to create @-mentions through the API, we only require that you provide the GID of the object you wish to reference. If you have access to that object, the API will automatically generate the appropriate href and other attributes for you. For example, to create a link to a task with GID "123", you can send the tag <a data-asana-gid="123"/> which will then be expanded to <a href="https://app.asana.com/0/0/123/f" data-asana-accessible="true" data-asana-dynamic="true" data-asana-type="task" data-asana-gid="123">Task Name</a>. You can also generate a link to a task in a specific project or tag by including a data-asana-project or data-asana-tag attribute in the <a> tag. All other attributes, as well as the contents of the tag, are ignored. To keep the contents of your tag and make a custom vanity link, include the property data-asana-dynamic="false" when setting the contents of the tag. You would send <a data-asana-gid="123" data-asana-dynamic="false">This is some custom text!</a> and receive <a data-asana-accessible="true" data-asana-dynamic="false" data-asana-type="task" data-asana-gid="123">This is some custom text!</a> If you do not have access to the referenced object when you try to create a link, the API will not generate an href for you, but will instead look for an href you provide. This allows you to write back <a> tags unmodified even if you do not have access to the resource. If you do not have access to the referenced object and no href is provided, your request will be rejected with a 400 Bad Request error. Similarly, if you provide neither a GID nor a valid href, the request will be rejected with the same error.
textstring- Plain-text status body. Exactly one of text or html_text must be provided. Example: 'This looks good, approved!'
asanamcp_create_recordsCreate 1-50 records in one call.WriteCreate Records
Create 1-50 records in one call. Each requires name and table. Set unique_fingerprint on an item to prevent duplicates: that item fails rather than creating a duplicate if a record with that fingerprint already exists on its table. Other items still succeed.
Inputs
recordsarrayrequired- Array of record objects (1-50 records).
asanamcp_create_tableCreate a table in a workspace.WriteCreate Table
Create a table in a workspace. Requires name. Optionally set the table's initial custom field schema via custom_field_settings: the table is created first, then each entry is added with its own addCustomFieldSetting call, in order. The table is still created even if some entries fail; check the response's failed/custom_fields_added fields.
Inputs
namestringrequired- Name of the table.
custom_field_settingsarray- The table's initial custom field schema, in order. Either the GID of an existing custom field to add to the table, or an inline object ({ name, resource_subtype, ... }) to create a brand-new custom field at the same time. resource_subtype is one of text, number, date, enum, multi_enum, people, reference. Fields beyond name and resource_subtype vary by subtype (e.g. options for enum/multi_enum) and are passed through as-is.
asanamcp_create_task_confirmDEPRECATED; DO NOT USE.WriteCreate Task Confirm
DEPRECATED; DO NOT USE. This tool must exist so that it can be invoked programmatically by widget UI, but it should not be called directly by the model.
Inputs
assigneestringrequired- No description.
descriptionstringrequired- No description.
dueDatestringrequired- No description.
isCompletebooleanrequired- No description.
startDatestringrequired- No description.
taskNamestringrequired- No description.
widget_idstringrequired- ALWAYS USE A CONSTANT VALUE OF 'model-generated-widget-id' FOR THIS PARAMETER.
workspacestringrequired- No description.
projectstring- No description.
sectionstring- No description.
subtasksarray- Optional subtasks for the parent task (one level only; not added to any project). Limit to no more than 5 unless necessary.
useRichTextTaskDescriptionboolean- No description.
asanamcp_create_task_from_templateList a project's task templates or create a task from one.WriteCreate Task From Template
List a project's task templates or create a task from one. Provide project_id alone to return all templates without creating. To create, provide either task_template_id, or template_name with project_id. When given a name, this tool searches that project's task templates and creates only when one case-insensitive exact match exists. Task instantiation starts asynchronously. Tell the user it has started and may still be in progress, then ask what they want to do next.
Inputs
namestring- Name for the created task. When omitted, the task uses the template name.
project_idstring- Globally unique identifier for the project whose task templates to search or list. Required when task_template_id is omitted.
task_template_idstring- Globally unique identifier for the task template to instantiate. Provide this or template_name, but not both. Omit both to list every template in project_id without creating.
template_namestring- Exact task template name to find within project_id. Matching ignores letter case. Provide this or task_template_id to create, or omit both to list every template in project_id.
asanamcp_create_tasksCreates tasks immediately without visual preview or asking for confirmation.WriteCreate Tasks
Creates tasks immediately without visual preview or asking for confirmation. DEFAULT tool for task creation: Use by default any time the user asks to create any number of tasks. Do not use when the user explicitly opts in with visually previewing, reviewing, or confirming a task before creation, or when the user implies they want to check or verify before the task is saved. Requires default_project (for all tasks) or default_assignee for My Tasks. When the user indicates the task is for themselves â e.g. 'remind me', 'my', 'I need to', ALWAYS set assignee='me' (or default_assignee='me' when it applies to every task). If the user names a different assignee, use that person instead; resolve their GID with search_objects first. Each task can specify project_id, parent, section_id, assignee, notes, html_notes, due_on, start_on, followers, custom_fields; omitted fields use the defaults. Returns succeeded (created tasks), failed (with errors), and summary.
Inputs
tasksarrayrequired- Array of task objects (1-50 tasks). Array of 1-50 task objects to create. Each object needs at minimum a 'name'; see the field description for the full list of optional fields (project_id, parent, assignee, due_on, custom_fields, etc.). Example: [{"name": "Review Q4 report", "project_id": "1234567890123456", "assignee": "me"}]
default_assigneestring- Default assignee. Use "me" to assign the current authenticated user, an email, or a GID.
default_projectstring- Default project GID for all tasks. Omit when each task has project_id or parent, or when creating in My Tasks (use workspace+default_assignee). Example: '1234567890123456'
asanamcp_update_notificationsMark one or more Inbox notifications as read or unread for the authenticated user.WriteUpdate Notifications
Mark one or more Inbox notifications as read or unread for the authenticated user. Accepts 1-50 notification GIDs, typically obtained from get_notifications. is_read: true marks them read, false marks them unread. Useful for bulk-triaging the Inbox, e.g. marking passive notifications as read while leaving directly-actionable ones (assignments, mentions) unread.
Inputs
is_readbooleanrequired- true marks the notifications as read, false marks them as unread.
notification_gidsarrayrequired- Notification GIDs to act on (1-50), typically obtained from get_notifications.
asanamcp_update_projectUpdate one existing project.WriteUpdate Project
Update one existing project. Use get_project with include_sections=true first when changing sections or when the current project configuration is not already known. Supports project details, dates, ownership, appearance, access, archival, project custom-field values, sections, members, and custom-field settings for tasks in the project. Adding members, making the project public, and changing default access require explicit user confirmation. Call the tool without confirmation first to receive the exact effects, then retry with confirmation only after the user agrees. Returns whether every requested change succeeded and reports errors when a change fails. Some changes may still be applied when another requested change fails.
Inputs
project_idstringrequired- Globally unique identifier for the project to update.
add_custom_fieldsarray- Existing custom fields to make available on tasks in this project. This does not set values on the project itself.
add_membersarray- Users to add as project members after explicit user confirmation. They will gain access to the project and all tasks in it. Accepts "me", email addresses, or GIDs.
add_sectionsarray- Sections to add to the project.
archivedboolean- Whether the project should be archived.
colorstring- New project color. Use null to clear.
confirm_sensitive_changesboolean- Set to true only after the user explicitly confirms every sensitive effect returned by a prior update_project call. Never infer confirmation from the original update request.
default_access_levelstring- New default access for members added to the project. Requires explicit user confirmation.one of
admineditorcommenterviewer default_viewstring- New default project view.one of
listboardcalendartimeline due_onstring- New due date (YYYY-MM-DD). Use null to clear.
html_notesstring- HTML-formatted project description. Must be wrapped in <body></body> tags.
iconstring- New project icon. Use null to clear.
namestring- New project name.
notesstring- Plain-text project description. Use html_notes for rich formatting or @-mentions.
ownerstring- New project owner. Can be "me", an email, or a user GID. Use null to clear.
privacy_settingstring- New project privacy. Making the project public to the workspace requires explicit user confirmation.one of
public_to_workspaceprivate_to_teamprivate remove_custom_fieldsarray- Custom fields to remove from this project's task field settings. Existing values remain on tasks but may become disabled.
remove_membersarray- Users to remove from project membership. Accepts "me", email addresses, or GIDs.
remove_sectionsarray- Sections to delete. Asana only permits deleting empty sections that are not the project's last section; tasks are never deleted.
rename_sectionsarray- Existing sections to rename.
set_custom_field_valuesobject- Custom-field values to set on the project itself. This does not make fields available on the project's tasks. Custom field: each key is a custom field GID; each value matches that field's type in the Asana API. Use option GIDs for dropdown fields, not display names. Some tools expect a nested object; others expect one JSON string containing the same map. Examples: {"1200456789012345":"1200123456789012"} (single-select); {"1200456789012346":12.5} (number); {"1200456789012347":"Ship by Friday"} (text); {"1200456789012348":["1200111111111111","1200222222222222"]} (multi-select); {"1200456789012349":{"date":"2025-06-15"}} or {"1200456789012349":{"date_time":"2025-06-15T17:00:00.000Z"}} (date).
start_onstring- New start date (YYYY-MM-DD). due_on must also be provided when changing start_on. Use null to clear.
asanamcp_update_recordsUpdate 1-50 records in one call.WriteUpdate Records
Update 1-50 records in one call. Each requires record, plus name and/or custom_fields. Items with neither name nor custom_fields are skipped.
Inputs
recordsarrayrequired- Array of record update objects (1-50 records).
asanamcp_update_tableUpdate a table's name, and/or add or remove individual custom fields from its schema.WriteUpdate Table
Update a table's name, and/or add or remove individual custom fields from its schema. At least one of name, add_custom_fields, or remove_custom_fields must be provided. add_custom_fields and remove_custom_fields each change only the fields they name â unlike the table's underlying PUT endpoint, this never replaces the whole schema.
Inputs
table_idstringrequired- Globally unique identifier for the table to update.
add_custom_fieldsarray- Custom fields to add to the table. Each is added independently, without affecting any other fields already on the table.
namestring- New name for the table.
remove_custom_fieldsarray- Custom fields to remove from the table. Existing values on records are not deleted, but become disabled.
asanamcp_delete_recordPermanently delete (trash) a record.DestructiveDelete Record
Permanently delete (trash) a record. This cannot be undone through this tool.
Inputs
recordstringrequired- Globally unique identifier for the record to delete.
asanamcp_delete_taskDelete task from Asana.DestructiveDelete Task
Delete task from Asana. Use with extreme caution as recovery is challenging. Deletes the task and any subtasks that are not also in another project. Returns success confirmation. Requires task ID. Essential for removing duplicate or obsolete tasks.
- Idempotent
Inputs
taskstringrequired- Globally unique identifier for the task to delete. Example: '1234567890123456'
asanamcp_save_project_changes_confirmDEPRECATED; DO NOT USE.DestructiveSave Project Changes Confirm
DEPRECATED; DO NOT USE. This tool must exist so that it can be invoked programmatically by widget UI, but it should not be called directly by the model.
- Idempotent
Inputs
projectGidstringrequired- GID of the existing project whose changes are being saved. Example: '1234567890123456'
widget_idstringrequired- ALWAYS USE A CONSTANT VALUE OF 'model-generated-widget-id' FOR THIS PARAMETER.
customFieldInfosarray- Array of custom field metadata objects referenced by this update (internal widget bookkeeping); shape is opaque and provider-defined. Example: []
deletedSectionGidsarray- GIDs of existing sections the user removed from the project in the widget; these will be deleted. Example: ["1234567890123456"]
deletedTaskGidsarray- GIDs of existing tasks the user removed from the project in the widget; these will be deleted. Example: ["1234567890123456"]
newSectionsarray- Array of brand-new section objects (with sectionName and a tasks array) the user added to the project in the widget. Example: [{"sectionName": "Q1 Follow-up", "tasks": [{"taskName": "Plan kickoff"}]}]
newTasksarray- Array of brand-new top-level tasks the user added in the widget. Each entry has the target sectionGid (or null) and a task object to create. Example: [{"sectionGid": "1234567890123456", "task": {"taskName": "New task"}}]
orderedSectionGidsarray- Full ordered list of section GIDs reflecting the section order the user set in the widget. Example: ["1234567890123456", "9876543210987654"]
orderedTaskGidsBySectionGidobject- Map of section GID to the ordered list of task GIDs within that section, reflecting the task order the user set in the widget. Example: {"1234567890123456": ["9876543210987654"]}
taskMovesarray- Array of {taskGid, toSectionGid} pairs describing tasks the user moved to a different section in the widget. Example: [{"taskGid": "1234567890123456", "toSectionGid": "9876543210987654"}]
taskSubtaskOperationsarray- Array of per-task subtask operations. Each entry has taskGid plus updatedSubtasks, newSubtasks, and/or deletedSubtaskGids describing changes to that task's subtasks. Example: [{"taskGid": "1234567890123456", "newSubtasks": [{"taskName": "Follow up"}]}]
updatedProjectNamestring- New name for the project, if the user renamed it in the widget. Example: 'Q4 Product Launch (Revised)'
updatedSectionNamesarray- Array of {sectionGid, name} pairs for existing sections the user renamed in the widget. Example: [{"sectionGid": "1234567890123456", "name": "In Progress"}]
updatedTasksarray- Array of existing tasks the user edited in the widget. Each entry has taskGid plus optional nativeFields (built-in fields) and customFields (priority) objects with the changed values. Example: [{"taskGid": "1234567890123456", "nativeFields": {"taskName": "Updated"}}]
useRichTextTaskDescriptionboolean- Whether any updated task description values should be saved as Asana rich-text HTML rather than plain text.
asanamcp_save_task_changes_confirmDEPRECATED; DO NOT USE.DestructiveSave Task Changes Confirm
DEPRECATED; DO NOT USE. This tool must exist so that it can be invoked programmatically by widget UI, but it should not be called directly by the model.
- Idempotent
Inputs
taskGidstringrequired- GID of the existing task whose changes are being saved. Example: '1234567890123456'
widget_idstringrequired- ALWAYS USE A CONSTANT VALUE OF 'model-generated-widget-id' FOR THIS PARAMETER.
deletedSubtaskGidsarray- GIDs of existing subtasks the user removed in the widget; these will be deleted. Example: ["1234567890123456"]
newSubtasksarray- Array of brand-new subtasks the user added in the widget, to be created alongside saving the task. Example: [{"taskName": "Gather feedback"}]
updatedCustomFieldsobject- Map of custom field GID to the new {gid, value} pair for each custom field the user changed in the widget. Example: {"1200456789012345": {"gid": "1200456789012345", "value": "high"}}
updatedNativeFieldsobject- Object containing the built-in task fields (name, completion, dates, assignee, description, project, section) that changed in the widget, to be saved back to Asana. Example: {"taskName": "Updated name", "isComplete": true}
updatedSubtasksarray- Array of existing subtasks the user edited in the widget. Each entry has the subtask's gid and a fields object with the changed values. Example: [{"gid": "1234567890123456", "fields": {"taskName": "Updated"}}]
useRichTextTaskDescriptionboolean- Whether any updated description value should be saved as Asana rich-text HTML rather than plain text.
asanamcp_update_tasksUpdate one or more tasks in a single operation.DestructiveUpdate Tasks
Update one or more tasks in a single operation. Supports changing name, assignee, due_on, start_on, notes, html_notes, completed, parent, dependencies (add/remove), dependents (add/remove), followers (add/remove), and custom_fields. Returns succeeded (tasks where all updates applied), failed (at least one update failed; some updates may have succeeded), and summary. succeeded = all actions for that task succeeded; failed = partial or total failure, with errors array listing all failed actions for that task.
- Idempotent
Inputs
tasksarrayrequired- Array of task update objects (1-50). Each object requires 'task' (the task GID) and one or more optional fields to update: name, assignee (null to unassign), assignee_section (section GID in assignee's My Tasks, null to clear), due_on (YYYY-MM-DD or null), start_on (YYYY-MM-DD or null; due_on must be present), notes, html_notes, completed, approval_status (pending/approved/rejected/changes_requested), parent (null to convert to top-level task), add/remove_dependencies, add/remove_dependents, add/remove_projects, add/remove_followers, and custom_fields. Example: [{"task": "123", "name": "New name", "due_on": "2025-06-01", "completed": true}]
No tools match.