Asana MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ASANA_PAT | Yes | Personal Access Token for Asana. Create at https://app.asana.com/0/my-apps | |
| ASANA_MCP_TOOLS | No | Comma-separated list of tool categories to enable: read, write, or an explicit comma-list of tool names. Defaults to all. | |
| ASANA_WORKSPACE_GID | No | The GID of the Asana workspace to use. Only needed if the token has access to multiple workspaces; auto-detected otherwise. | |
| ASANA_MCP_FILE_ROOTS | No | Comma-separated list of directories allowed for local file attachment reads. Defaults to current directory. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| asana_add_to_projectA | Add a task to a project, optionally placing it in a specific section. Fixes: no MCP tool for addProject + section placement. |
| asana_move_sectionB | Move a task to a different section within its project. Fixes: no MCP tool for section moves. |
| asana_set_custom_fieldsA | Set custom fields on a task using correct type handling. Fixes: multi_enum arrays and date object wrappers that fail via official MCP. |
| asana_set_html_notesA | Set rich-text notes on a task using html_notes. Fixes: "XML is invalid" error from official MCP. |
| asana_set_datesA | Set start_on and/or due_on dates on a task. Fixes: start_on not exposed in official MCP schema, and due_on must be set first. |
| asana_batch_updateB | Update multiple task fields in a single REST call. Combines assignee, dates, custom fields, notes, name, and completion. |
| asana_attach_fileA | Attach a local file to an Asana task. Requires confirm:true and restricts reads to the current directory or ASANA_MCP_FILE_ROOTS. Max 100MB. |
| asana_batch_opsA | Execute up to 5 Asana API operations in a single HTTP call. ⚠ GET-with-default-fields ONLY — options (opt_fields/completed_since) + PUT data are dropped by the batch endpoint. For filtered reads use asana_search_tasks/asana_list_*; for writes use the dedicated tools. |
| asana_get_taskA | Fetch one task with rich fields (assignee, projects, section memberships, custom fields, notes, subtask count). Override opt_fields for more/less. |
| asana_search_tasksA | Advanced workspace task search with filters: text, assignee, project, section, tag, completed, due/created date ranges, custom-field filters (filters passthrough), sorting. Single page (search API caps at 100, no offset). |
| asana_list_tasksA | List tasks by project, section, tag, OR assignee (provide exactly one anchor). Paginated. assignee uses the workspace default. |
| asana_my_tasksA | List the TOKEN OWNER's My Tasks (user task list). NOTE: a personal PAT can only read its OWN My Tasks — passing another user returns 403. For other users use asana_search_tasks or asana_list_tasks with assignee=, or asana_user_queue. Paginated. |
| asana_list_projectsA | List projects in the workspace (or a team). Excludes archived by default; set include_archived=true for all. Paginated. |
| asana_get_projectA | Fetch one project with its custom_field_settings (field GIDs + enum option GIDs) AND its sections, merged into one response. |
| asana_list_sectionsA | List the sections of a project (name + GID), in board order. |
| asana_list_usersA | List workspace members (name → GID resolution). Paginated. |
| asana_get_userA | Fetch one user by GID (default "me" = token owner). Returns name, email, GID. |
| asana_list_teamsA | List teams the token owner belongs to in the workspace/organization. Paginated. |
| asana_list_tagsA | List tags in the workspace (name → GID). Paginated. |
| asana_list_storiesA | List a task's stories (comments + activity log). text field holds comment bodies. Paginated. |
| asana_list_subtasksB | List a task's subtasks with rich fields. Paginated. |
| asana_list_dependenciesA | Return a task's dependencies (what it waits on) AND dependents (what waits on it), in one call. |
| asana_list_attachmentsA | List a task's attachments with download/permanent URLs and sizes. |
| asana_list_project_statusesA | List a project's status updates (status_type, title, text, author). Paginated. |
| asana_list_portfoliosA | List portfolios owned by a user in the workspace. owner defaults to "me". Paginated. |
| asana_get_portfolioA | Fetch one portfolio; set include_items=true to also pull its member projects/portfolios. |
| asana_create_taskA | Create a general task. Provide either projects[] (workspace inferred) or it lands in the workspace default. Supports assignee, notes/html_notes, dates, followers, tags, custom_fields (dates auto-wrapped). |
| asana_add_commentA | Add a comment (story) to a task. Prefer text (plain, with real newlines; literal "\n" sequences are auto-converted) — the /stories endpoint escapes html_text into literal tags. Pass html_text only if you accept that. |
| asana_create_subtaskB | Create a subtask under a parent task. |
| asana_add_dependencyB | Mark a task as depending on one or more other tasks (this task waits on them). |
| asana_add_dependentA | Mark one or more tasks as dependent on this task (they wait on this one). |
| asana_add_tagA | Add a tag to a task. |
| asana_remove_tagB | Remove a tag from a task. |
| asana_add_followerB | Add follower(s) to a task. |
| asana_remove_followerA | Remove follower(s) from a task. |
| asana_complete_taskA | Mark a task complete (default) or incomplete (completed:false). |
| asana_create_sectionA | Create a new section in a project. Optionally position via insert_before/insert_after (section GIDs). |
| asana_create_projectA | Create a project. In an org workspace a team GID is required; otherwise the workspace default is used. |
| asana_create_project_statusC | Post a status update to a project. status_type ∈ on_track|at_risk|off_track|on_hold|complete. text required (html_text optional). |
| asana_duplicate_taskA | Duplicate a task (template instantiation). include = which fields to copy (array or comma string, e.g. ["notes","assignee","subtasks","dependencies"]). Returns an async job. |
| asana_delete_taskA | DESTRUCTIVE — permanently delete (trash) a task. Requires confirm:true (C13 gate). Without confirm it is a no-op that reports the gate. |
| asana_bulk_updateA | Apply the SAME field changes to MANY tasks in one call (assignee, dates, completed, notes/html_notes, custom_fields). Loops PUT per task, continues past individual failures, returns a per-task summary. |
| asana_bulk_move_sectionA | Move MANY tasks into one section in a single call (loops section addTask). Returns a per-task summary. Throughput multiplier for triaging a board column. |
| asana_set_notes_safeA | Set notes AND survive workspace automations that rewrite the task name / parse dates out of notes text (Rules and some integrations do this): write notes, wait settle_ms, then re-assert name + due_on. Use instead of raw notes edits on automated boards. |
| asana_list_task_templatesB | List a project's task templates (repeatable task blueprints). Paginated. |
| asana_instantiate_task_templateA | Create a new task from a task template (repeatable intake/ops task). Returns an async job whose new_task holds the created task. |
| asana_instantiate_project_templateA | Create a new project from a project template (repeatable board setup). Returns an async job whose new_project holds the created project. |
| asana_duplicate_projectA | Duplicate an existing project (clone a board with its structure). include = fields to copy (array or comma string, e.g. ["members","task_notes","task_assignee"]). Returns an async job. |
| asana_create_custom_fieldA | Create a workspace custom field (design the board schema). resource_subtype ∈ text|number|enum|multi_enum|date|people. For enum/multi_enum pass enum_options:[{name,color?}]. |
| asana_add_field_to_projectA | Attach an existing custom field to a project (addCustomFieldSetting), optionally important/positioned. Pairs with asana_create_custom_field to build a board. |
| asana_add_enum_optionA | Add an option to an existing enum/multi_enum custom field (extend a dropdown without recreating the field). |
| asana_add_project_membersA | Add member(s) to a project (e.g. add a teammate to a new board). |
| asana_reorder_sectionA | Reorder a section within its project (move a board column). Provide before_section or after_section (section GIDs). |
| asana_get_jobA | Poll an async job by GID (from duplicate_task/duplicate_project/instantiate_* tools). Returns status (not_started|in_progress|succeeded|failed) and the new_task/new_project GID once done. |
| asana_typeaheadA | Resolve a partial NAME → GID across the workspace for any resource type (task|project|user|tag|portfolio|project_template|goal). Fast lookup when you do not know the GID. |
| asana_remove_from_projectA | Remove a task from a project (un-add a board card). Symmetric with asana_add_to_project. |
| asana_set_parentA | Re-parent a task: make it a subtask of parent_gid, or detach to top level (parent_gid:null). Optional insert_before/insert_after sibling GIDs. |
| asana_update_projectC | Update a project: name, notes, color, archived, public, default_view, dates. |
| asana_update_sectionC | Rename a section. |
| asana_remove_field_from_projectA | Detach a custom field from a project (removeCustomFieldSetting). Symmetric with asana_add_field_to_project. |
| asana_get_custom_fieldA | Fetch one custom field by GID — type, precision, and full enum_options (name+GID) list. |
| asana_list_workspace_custom_fieldsA | List ALL custom fields defined in the workspace (design discovery — find a field GID to attach to a board). Paginated. |
| asana_create_portfolioC | Create a portfolio (group projects for North-Star-style tracking). |
| asana_add_to_portfolioB | Add a project/portfolio item to a portfolio. |
| asana_remove_from_portfolioC | Remove an item from a portfolio. |
| asana_get_workspaceA | Fetch workspace metadata (name, is_organization, email_domains). |
| asana_find_duplicatesA | Find TRUE duplicate tasks. Dedupes by GID FIRST — one task on N boards = multi_homed (shared membership, reported separately, NOT a dup; deleting it removes the real task from EVERY board) — then groups DISTINCT gids by name. Scan one project/section, or projects[] for cross-board. Returns {multi_homed, true_duplicate_clusters}. Read-only — reason before you delete. |
| asana_delete_projectA | DESTRUCTIVE — permanently delete a project. Requires confirm:true (C13 gate). No-op + gate message otherwise. |
| asana_delete_sectionA | DESTRUCTIVE — delete a section (Asana requires it be empty, or moves its tasks out). Requires confirm:true (C13 gate). |
| asana_get_custom_field_settingsA | Fetch a project's custom field settings — live field GIDs, types, and enum option GIDs. Use this to derive field/option GIDs live instead of trusting hand-coded maps that drift. |
| asana_morning_briefA | COMPOSITE: one-call daily brief — incomplete tasks bucketed into overdue / due_today / upcoming (within horizon_days) + blocked (due-window tasks waiting on an incomplete dependency), with a summary count. Defaults to "me"; pass user= for a teammate or user="all" for the whole workspace. Built on the search API (caps at 100 by due date). |
| asana_portfolio_rollupA | COMPOSITE: per-project health across a portfolio — incomplete, overdue, and completed-in-window counts + current status, sorted by overdue. Scope via projects:[gids] (best), portfolio_gid, or default to all non-archived workspace projects (capped at max_projects). One task-list call per project; caps are reported, never silent. |
| asana_triage_inboxA | COMPOSITE: bulk-create tasks from a triaged list in ONE call (fills the gap — no bulk CREATE existed). The model reads the inbox/note, extracts items, and passes them here. Per-item project/assignee/section/due override the defaults; default_assignee falls back to ASANA_DEFAULT_ASSIGNEE, else "me". Continues past individual failures; returns a per-item created/failed summary with permalinks. |
| asana_user_queueA | COMPOSITE: one person's FULL incomplete queue — paginated (NOT capped at 100 like the search API), bucketed by due (overdue / due_today / this_week / later / no_due) with a per-project count map. Default user = "me"; pass user= for a teammate (the PAT-owner-only restriction on My Tasks does not apply — this uses /tasks?assignee=). The right call for "what is X sitting on?" and hand-off reviews. |
| asana_board_rollupA | COMPOSITE: roll up ONE board (project) — active tasks grouped by section, an amount custom field summed per section and in total (e.g. "Deal $", "Claim $"), an optional secondary amount, and every task whose deadline (any named date custom fields + due_on) has passed, with days overdue and WHICH field fired. Ranked by amount descending. Fields may be given by GID or by exact name (resolved live via the project's custom_field_settings, so nothing is hard-coded). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jtalk22/asana-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server