asanamcp

Efficient, fast-load MCP server for managing Asana tasks, projects and portfolios.

asanamcp

Crates.io docs.rs CI Coverage License

MCP server for the Asana API.

Quick Start

  1. Get an Asana Personal Access Token at https://app.asana.com/0/my-apps

  2. Install:

# Homebrew
brew install adlio/tap/asanamcp

# From crates.io
cargo install asanamcp

# From GitHub
cargo install --git https://github.com/adlio/asanamcp
  1. Add to Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
  "mcpServers": {
    "asana": {
      "command": "asanamcp",
      "env": {
        "ASANA_TOKEN": "your-personal-access-token",
        "ASANA_DEFAULT_WORKSPACE": "your-workspace-gid"
      }
    }
  }
}

The ASANA_DEFAULT_WORKSPACE is optional but recommended if you work primarily in one workspace. When set, workspace-based operations (search, list projects, list users, etc.) will use this default, reducing the need to specify workspace GID in every request.

Testing the Server

# Dump tool schemas (useful for debugging)
asanamcp --schema

# Dump a specific tool's schema
asanamcp --schema get

# Launch the MCP Inspector (interactive web UI)
make inspect

Tools

ToolDescription
asana_workspacesList all workspaces
asana_getFetch any resource (projects, tasks, portfolios, etc.)
asana_createCreate resources (tasks, comments, projects, etc.)
asana_updateUpdate existing resources
asana_deletePermanently delete resources (irreversible)
asana_linkManage relationships (task↔project, dependencies, etc.)
asana_task_searchSearch for tasks with rich filters (assignee, due date, etc.)
asana_resource_searchSearch for resources by name (projects, templates, users, teams, etc.)

asana_get

Fetch any Asana resource with recursive traversal support.

{"resource_type": "portfolio", "gid": "123", "depth": -1}
resource_typegidOptions
projectproject GID
portfolioportfolio GIDdepth: traversal depth
tasktask GIDinclude_subtasks, include_dependencies, include_comments
my_tasksworkspace GID*Tasks assigned to current user
workspace_favoritesworkspace GID*depth for portfolio traversal
workspace_projectsworkspace GID*All projects in workspace
workspace_templatesteam GID (optional)Empty = all accessible templates
workspace_tagsworkspace GID*
workspace_usersworkspace GID*
workspace_teamsworkspace GID*
project_tasksproject/portfolio GIDsubtask_depth
task_subtaskstask GID
task_commentstask GID
status_updatestatus update GIDSingle status update by GID
status_updatesparent GIDList status updates for a project/portfolio
all_workspaces(ignored)All accessible workspaces
workspaceworkspace GID
project_templatetemplate GID
project_sectionsproject GID
sectionsection GID
tagtag GID
me(ignored)Current authenticated user
useruser GID
teamteam GID
team_usersteam GID
project_custom_fieldsproject GID
project_briefbrief GIDProject brief (Key Resources on Overview tab, NOT the Note tab)
project_project_briefproject GIDGet project's brief via project GID

*Uses ASANA_DEFAULT_WORKSPACE if gid is empty.

Depth: -1 = unlimited, 0 = none, N = N levels.

asana_create

{"resource_type": "task", "project_gid": "123", "name": "New task", "assignee": "me"}
resource_typeRequired fields
taskproject_gid or workspace_gid*, name
subtasktask_gid, name
projectworkspace_gid or team_gid, name
project_from_templatetemplate_gid, name
portfolioworkspace_gid*, name
sectionproject_gid, name
commenttask_gid, text
status_updateparent_gid, status_type, text
tagworkspace_gid*, name
project_duplicatesource_gid, name
task_duplicatesource_gid, name
project_briefproject_gid, html_text (with <body> tags)

*Uses ASANA_DEFAULT_WORKSPACE if not provided.

asana_update

{"resource_type": "task", "gid": "123", "completed": true}

Supports: task, project, portfolio, section, tag, comment, status_update, project_brief (Key Resources on Overview tab, NOT the Note tab).

asana_delete

Permanently delete an Asana resource. This action is irreversible.

{"resource_type": "task", "gid": "123"}

Supports: task, project, portfolio, section, tag, comment, status_update, project_brief.

asana_link

{"action": "add", "relationship": "task_project", "target_gid": "task123", "item_gid": "proj456"}
relationshiptargetitem
task_projecttask GIDproject GID
task_tagtask GIDtag GID
task_parenttask GIDparent task GID
task_dependencytask GIDblocking task GID(s)
task_dependenttask GIDdependent task GID(s)
task_followertask GIDuser GID(s)
portfolio_itemportfolio GIDproject GID
portfolio_memberportfolio GIDuser GID(s)
project_memberproject GIDuser GID(s)
project_followerproject GIDuser GID(s)

Use item_gid for single items or item_gids for bulk operations.

asana_task_search

Search for tasks with rich filtering options.

{"workspace_gid": "123", "text": "bug", "completed": false, "assignee": "me"}
FilterDescription
workspace_gidWorkspace to search (uses default if not provided)
textSearch in task name and notes
assigneeUser GID, me, or null for unassigned
projectsFilter by project GID(s)
tagsFilter by tag GID(s)
sectionsFilter by section GID(s)
completedtrue or false
due_on, due_on_before, due_on_afterDate filters (YYYY-MM-DD)
sort_bydue_date, created_at, completed_at, likes, modified_at
sort_ascendingtrue or false

asana_resource_search

Search for any Asana resource by name using typeahead. Use this to find projects, templates, users, teams, and more.

{"query": "CloudSmith", "resource_type": "project_template"}
ParameterDescription
querySearch text (required)
resource_typeproject, project_template, portfolio, user, team, tag, or goal
workspace_gidWorkspace to search (uses default if not provided)
countMax results (default 20, max 100)

Library Usage

use asanamcp::{AsanaClient, Resource};

#[tokio::main]
async fn main() -> Result<(), asanamcp::Error> {
    let client = AsanaClient::from_env()?;

    let workspaces: Vec<Resource> = client
        .get_all("/workspaces", &[("opt_fields", "gid,name")])
        .await?;

    for ws in workspaces {
        println!("{}: {:?}", ws.gid, ws.fields.get("name"));
    }
    Ok(())
}

Development

make ci         # Run all checks (fmt, lint, build, docs, test)
make test       # Run tests
make coverage   # Coverage report
make fmt        # Format code
make lint       # Run clippy
make inspect    # Open MCP Inspector web UI
make schema     # Dump tool schemas to stdout

License

MIT

Related Servers