Integrates with Asana's API to enable task management, project organization, and collaboration workflows through 30+ tools for searching, creating, and visualizing projects and tasks.
Content
Tools
MCP Server for Asana
This Model Context Protocol server implementation of Asana allows you
to talk to Asana API from MCP Client such as Anthropic's Claude
Desktop Application, and many more.
In the AI tool of your choice (ex: Claude Desktop) ask something about asana tasks, projects, workspaces, and/or comments. Mentioning the word "asana" will increase the chance of having the LLM pick the right tool.
Example:
How many unfinished asana tasks do we have in our Sprint 30 project?
Another example:
Working with Custom Fields
When updating or creating tasks with custom fields, use the following format:
asana_update_task({
task_id: "TASK_ID",
custom_fields: {
"custom_field_gid": value // The value format depends on the field type
}
})
The value format varies by field type:
Enum fields: Use the enum_option.gid of the option (NOT the display name)
Text fields: Use a string
Number fields: Use a number
Date fields: Use a string in YYYY-MM-DD format
Multi-enum fields: Use an array of enum option GIDs
Finding Custom Field GIDs
To find the GIDs of custom fields and their enum options:
Use asana_get_task with the opt_fields parameter set to include custom fields:
In the response, look for the custom_fields array. Each custom field will have:
gid: The unique identifier for the custom field
name: The display name of the custom field
resource_subtype: The type of custom field (text, number, enum, etc.)
For enum fields, examine the enum_options array to find the GID of each option
Example: Updating an Enum Custom Field
// First, get the task with custom fieldsconst taskDetails = asana_get_task({
task_id: "1234567890",
opt_fields: "custom_fields,custom_fields.enum_options"
});
// Find the custom field GID and enum option GIDconst priorityFieldGid = "11112222"; // From taskDetails.custom_fieldsconst highPriorityOptionGid = "33334444"; // From the enum_options of the priority field// Update the task with the custom fieldasana_update_task({
task_id: "1234567890",
custom_fields: {
[priorityFieldGid]: highPriorityOptionGid
}
});
Tools
asana_list_workspaces
List all available workspaces in Asana
Optional input:
opt_fields (string): Comma-separated list of optional fields to include
Returns: List of workspaces
Note: If DEFAULT_WORKSPACE_ID is set, this will only return that workspace instead of fetching all workspaces
asana_search_projects
Search for projects in Asana using name pattern matching
Required input:
name_pattern (string): Regular expression pattern to match project names
Optional input:
workspace (string): The workspace to search in (optional if DEFAULT_WORKSPACE_ID is set)
team (string): The team to filter projects on
archived (boolean): Only return archived projects (default: false)
limit (number): Results per page (1-100)
offset (string): Pagination offset token
opt_fields (string): Comma-separated list of optional fields to include
Returns: List of matching projects
Note: Either workspace or team must be specified if DEFAULT_WORKSPACE_ID is not set
asana_search_tasks
Search tasks in a workspace with advanced filtering options
Required input:
workspace (string): The workspace to search in (optional if DEFAULT_WORKSPACE_ID is set)
Optional input:
text (string): Text to search for in task names and descriptions
resource_subtype (string): Filter by task subtype (e.g. milestone)
completed (boolean): Filter for completed tasks
is_subtask (boolean): Filter for subtasks
has_attachment (boolean): Filter for tasks with attachments
is_blocked (boolean): Filter for tasks with incomplete dependencies
is_blocking (boolean): Filter for incomplete tasks with dependents
assignee, projects, sections, tags, teams, and many other advanced filters
Confirm the access token and configuration are correctly set in claude_desktop_config.json.
Contributing
Clone this repo and start hacking.
Test it locally with the MCP Inspector
If you want to test your changes, you can use the MCP Inspector like this:
npm run inspector
This will expose the client to port 5173 and server to port 3000.
If those ports are already used by something else, you can use:
CLIENT_PORT=5009 SERVER_PORT=3009 npm run inspector
License
This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository.
asana_list_workspaces
List all available workspaces in Asana. If DEFAULT_WORKSPACE_ID is set, only returns that workspace.
asana_search_projects
Search for projects in Asana using name pattern matching
asana_get_project
Get detailed information about a specific project
asana_get_project_task_counts
Get the number of tasks in a project
asana_get_project_sections
Get sections in a project
asana_create_section_for_project
Create a new section in a project
asana_create_project
Create a new project in a workspace
asana_update_project
Update details of an existing project
asana_reorder_sections
Reorder a section within a project by specifying its position relative to another section
asana_get_project_status
Get a project status update
asana_get_project_statuses
Get all status updates for a project
asana_create_project_status
Create a new status update for a project
asana_delete_project_status
Delete a project status update
asana_search_tasks
Search tasks in a workspace with advanced filtering options
asana_get_task
Get detailed information about a specific task
asana_create_task
Create a new task in a project
asana_update_task
Update an existing task's details
asana_create_subtask
Create a new subtask for an existing task
asana_get_multiple_tasks_by_gid
Get detailed information about multiple tasks by their GIDs (maximum 25 tasks)
asana_add_task_to_section
Add a task to a specific section in a project
asana_get_tasks_for_section
Get all tasks from a specific section in a project
asana_get_project_hierarchy
Get the complete hierarchical structure of an Asana project, including its sections, tasks, and subtasks. Supports both manual and automatic pagination.
PAGINATION GUIDE:
1. Get all data at once: Use auto_paginate=true
2. Manual pagination: First request with limit=N, then use the returned 'next_offset' tokens in subsequent requests
3. Tips for large projects: Specify only needed fields, set include_subtasks=false if subtasks aren't needed
EXAMPLES:
- For all data: {project_id:"123", auto_paginate:true}
- For first page: {project_id:"123", limit:10}
- For next page: {project_id:"123", limit:10, offset:"eyJ0a..."}
- For deep subtasks: {project_id:"123", include_subtasks:true, max_subtask_depth:3}
Note: offset must be a token from previous response (section.pagination_info.next_offset)
asana_get_subtasks_for_task
Get the list of subtasks for a specific task
asana_get_tasks_for_project
Get all tasks from a specific project with pagination support
asana_get_tasks_for_tag
Get tasks for a specific tag
asana_get_tags_for_workspace
Get tags in a workspace
asana_add_tags_to_task
Add one or more tags to a task for categorization purposes
asana_add_task_dependencies
Set dependencies for a task
asana_add_task_dependents
Set dependents for a task (tasks that depend on this task)
asana_set_parent_for_task
Set the parent of a task and position the subtask within the other subtasks of that parent
asana_add_followers_to_task
Add followers to a task
asana_get_task_stories
Get comments and stories for a specific task
asana_create_task_story
Create a comment or story on a task
asana_get_teams_for_user
Get teams to which the user has access
asana_get_teams_for_workspace
Get teams in a workspace
asana_add_members_for_project
Add members to a project
asana_add_followers_for_project
Add followers to a project
asana_list_workspace_users
Get users in a workspace
asana_get_attachments_for_object
List attachments for an object (task, project, etc)