asanamcp
Servidor MCP eficiente e de carregamento rápido para gerenciar tarefas, projetos e portfólios do Asana.
Documentação
asanamcp
Servidor MCP para a API do Asana.
Início Rápido
-
Obtenha um Token de Acesso Pessoal do Asana em https://app.asana.com/0/my-apps
-
Instale:
# Homebrew
brew install adlio/tap/asanamcp
# From crates.io
cargo install asanamcp
# From GitHub
cargo install --git https://github.com/adlio/asanamcp
- Adicione à configuração do Claude Desktop (
~/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"
}
}
}
}
O ASANA_DEFAULT_WORKSPACE é opcional, mas recomendado se você trabalha principalmente em um único workspace. Quando definido, operações baseadas em workspace (busca, listar projetos, listar usuários, etc.) usarão esse padrão, reduzindo a necessidade de especificar o GID do workspace em cada requisição.
Testando o Servidor
# 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
Ferramentas
| Ferramenta | Descrição |
|---|---|
asana_workspaces | Listar todos os workspaces |
asana_get | Buscar qualquer recurso (projetos, tarefas, portfólios, etc.) |
asana_create | Criar recursos (tarefas, comentários, projetos, etc.) |
asana_update | Atualizar recursos existentes |
asana_delete | Excluir recursos permanentemente (irreversível) |
asana_link | Gerenciar relacionamentos (tarefa↔projeto, dependências, etc.) |
asana_task_search | Buscar tarefas com filtros avançados (responsável, data de vencimento, etc.) |
asana_resource_search | Buscar recursos por nome (projetos, modelos, usuários, equipes, etc.) |
asana_get
Busca qualquer recurso do Asana com suporte a travessia recursiva.
{"resource_type": "portfolio", "gid": "123", "depth": -1}
| resource_type | gid | Opções |
|---|---|---|
project | GID do projeto | |
portfolio | GID do portfólio | depth: profundidade da travessia |
task | GID da tarefa | include_subtasks, include_dependencies, include_comments |
my_tasks | GID do workspace* | Tarefas atribuídas ao usuário atual |
workspace_favorites | GID do workspace* | depth para travessia de portfólio |
workspace_projects | GID do workspace* | Todos os projetos no workspace |
workspace_templates | GID da equipe (opcional) | Vazio = todos os modelos acessíveis |
workspace_tags | GID do workspace* | |
workspace_users | GID do workspace* | |
workspace_teams | GID do workspace* | |
project_tasks | GID do projeto/portfólio | subtask_depth |
task_subtasks | GID da tarefa | |
task_comments | GID da tarefa | |
status_update | GID da atualização de status | Atualização de status única por GID |
status_updates | GID do pai | Listar atualizações de status de um projeto/portfólio |
all_workspaces | (ignorado) | Todos os workspaces acessíveis |
workspace | GID do workspace | |
project_template | GID do modelo | |
project_sections | GID do projeto | |
section | GID da seção | |
tag | GID da tag | |
me | (ignorado) | Usuário autenticado atual |
user | GID do usuário | |
team | GID da equipe | |
team_users | GID da equipe | |
project_custom_fields | GID do projeto | |
project_brief | GID do brief | Brief do projeto (Recursos-chave na aba Visão Geral, NÃO na aba Notas) |
project_project_brief | GID do projeto | Obter o brief do projeto via GID do projeto |
*Usa ASANA_DEFAULT_WORKSPACE se o gid estiver vazio.
Profundidade: -1 = ilimitada, 0 = nenhuma, N = N níveis.
asana_create
{"resource_type": "task", "project_gid": "123", "name": "New task", "assignee": "me"}
| resource_type | Campos obrigatórios |
|---|---|
task | project_gid ou workspace_gid*, name |
subtask | task_gid, name |
project | workspace_gid ou team_gid, name |
project_from_template | template_gid, name |
portfolio | workspace_gid*, name |
section | project_gid, name |
comment | task_gid, text |
status_update | parent_gid, status_type, text |
tag | workspace_gid*, name |
project_duplicate | source_gid, name |
task_duplicate | source_gid, name |
project_brief | project_gid, html_text (com tags <body>) |
*Usa ASANA_DEFAULT_WORKSPACE se não for fornecido.
asana_update
{"resource_type": "task", "gid": "123", "completed": true}
Suporta: task, project, portfolio, section, tag, comment, status_update, project_brief (Recursos-chave na aba Visão Geral, NÃO na aba Notas).
asana_delete
Exclui permanentemente um recurso do Asana. Esta ação é irreversível.
{"resource_type": "task", "gid": "123"}
Suporta: task, project, portfolio, section, tag, comment, status_update, project_brief.
asana_link
{"action": "add", "relationship": "task_project", "target_gid": "task123", "item_gid": "proj456"}
| relacionamento | alvo | item |
|---|---|---|
task_project | GID da tarefa | GID do projeto |
task_tag | GID da tarefa | GID da tag |
task_parent | GID da tarefa | GID da tarefa pai |
task_dependency | GID da tarefa | GID(s) da(s) tarefa(s) bloqueadora(s) |
task_dependent | GID da tarefa | GID(s) da(s) tarefa(s) dependente(s) |
task_follower | GID da tarefa | GID(s) do(s) usuário(s) |
portfolio_item | GID do portfólio | GID do projeto |
portfolio_member | GID do portfólio | GID(s) do(s) usuário(s) |
project_member | GID do projeto | GID(s) do(s) usuário(s) |
project_follower | GID do projeto | GID(s) do(s) usuário(s) |
Use item_gid para itens únicos ou item_gids para operações em lote.
asana_task_search
Busca tarefas com opções avançadas de filtragem.
{"workspace_gid": "123", "text": "bug", "completed": false, "assignee": "me"}
| Filtro | Descrição |
|---|---|
workspace_gid | Workspace para buscar (usa o padrão se não for fornecido) |
text | Buscar no nome e nas notas da tarefa |
assignee | GID do usuário, me, ou null para não atribuídas |
projects | Filtrar por GID(s) de projeto |
tags | Filtrar por GID(s) de tag |
sections | Filtrar por GID(s) de seção |
completed | true ou false |
due_on, due_on_before, due_on_after | Filtros de data (AAAA-MM-DD) |
sort_by | due_date, created_at, completed_at, likes, modified_at |
sort_ascending | true ou false |
asana_resource_search
Busca qualquer recurso do Asana por nome usando typeahead. Use para encontrar projetos, modelos, usuários, equipes e mais.
{"query": "CloudSmith", "resource_type": "project_template"}
| Parâmetro | Descrição |
|---|---|
query | Texto de busca (obrigatório) |
resource_type | project, project_template, portfolio, user, team, tag, ou goal |
workspace_gid | Workspace para buscar (usa o padrão se não for fornecido) |
count | Máximo de resultados (padrão 20, máximo 100) |
Uso como Biblioteca
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(())
}
Desenvolvimento
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
Licença
MIT