Collapsing Asana's surface into get, create, update, delete, link and two searches keeps the tool list small enough that a model picks correctly. The detail that makes it more than a thin wrapper is depth: one call can walk a portfolio down through its projects and their tasks, which is otherwise a dozen round trips. Just note that delete is irreversible and named plainly.
A single Rust binary for the Asana API. Rather than a tool per endpoint, it uses a resource type argument — so one fetch tool covers projects, tasks, portfolios, templates, sections, teams, tags and users, and one create tool covers everything you can make.
- asana_get — any resource by type and id, with a traversal depth for portfolios and options to pull a task's subtasks, dependencies and comments
- asana_create for tasks, subtasks, projects, projects from a template, portfolios, sections, comments, status updates, tags and duplicates
- asana_update and asana_delete, the latter permanent and irreversible
- asana_link for relationships: task to project, dependencies and the rest
- asana_task_search with filters on assignee, due date and more
- asana_resource_search to find a project, template, user or team by name
- asana_workspaces for what you have access to
- A default workspace setting, so workspace-scoped calls do not need the id every time
An Asana personal access token as ASANA_TOKEN. Set ASANA_DEFAULT_WORKSPACE if you mostly work in one, which removes the workspace id from most calls. Install from Homebrew or from crates.io. The delete tool is permanent, so scope the token to match how much you trust the assistant.
One command plus a key — brew install adlio/tap/asanamcp, then supply credentials
