asanamcp

Servidor MCP eficiente e de carregamento rápido para gerenciar tarefas, projetos e portfólios do Asana.

Documentação

asanamcp

Crates.io docs.rs CI Coverage License

Servidor MCP para a API do Asana.

Início Rápido

  1. Obtenha um Token de Acesso Pessoal do Asana em https://app.asana.com/0/my-apps

  2. Instale:

# Homebrew
brew install adlio/tap/asanamcp

# From crates.io
cargo install asanamcp

# From GitHub
cargo install --git https://github.com/adlio/asanamcp
  1. 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

FerramentaDescrição
asana_workspacesListar todos os workspaces
asana_getBuscar qualquer recurso (projetos, tarefas, portfólios, etc.)
asana_createCriar recursos (tarefas, comentários, projetos, etc.)
asana_updateAtualizar recursos existentes
asana_deleteExcluir recursos permanentemente (irreversível)
asana_linkGerenciar relacionamentos (tarefa↔projeto, dependências, etc.)
asana_task_searchBuscar tarefas com filtros avançados (responsável, data de vencimento, etc.)
asana_resource_searchBuscar 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_typegidOpções
projectGID do projeto
portfolioGID do portfóliodepth: profundidade da travessia
taskGID da tarefainclude_subtasks, include_dependencies, include_comments
my_tasksGID do workspace*Tarefas atribuídas ao usuário atual
workspace_favoritesGID do workspace*depth para travessia de portfólio
workspace_projectsGID do workspace*Todos os projetos no workspace
workspace_templatesGID da equipe (opcional)Vazio = todos os modelos acessíveis
workspace_tagsGID do workspace*
workspace_usersGID do workspace*
workspace_teamsGID do workspace*
project_tasksGID do projeto/portfóliosubtask_depth
task_subtasksGID da tarefa
task_commentsGID da tarefa
status_updateGID da atualização de statusAtualização de status única por GID
status_updatesGID do paiListar atualizações de status de um projeto/portfólio
all_workspaces(ignorado)Todos os workspaces acessíveis
workspaceGID do workspace
project_templateGID do modelo
project_sectionsGID do projeto
sectionGID da seção
tagGID da tag
me(ignorado)Usuário autenticado atual
userGID do usuário
teamGID da equipe
team_usersGID da equipe
project_custom_fieldsGID do projeto
project_briefGID do briefBrief do projeto (Recursos-chave na aba Visão Geral, NÃO na aba Notas)
project_project_briefGID do projetoObter 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_typeCampos obrigatórios
taskproject_gid ou workspace_gid*, name
subtasktask_gid, name
projectworkspace_gid ou 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 (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"}
relacionamentoalvoitem
task_projectGID da tarefaGID do projeto
task_tagGID da tarefaGID da tag
task_parentGID da tarefaGID da tarefa pai
task_dependencyGID da tarefaGID(s) da(s) tarefa(s) bloqueadora(s)
task_dependentGID da tarefaGID(s) da(s) tarefa(s) dependente(s)
task_followerGID da tarefaGID(s) do(s) usuário(s)
portfolio_itemGID do portfólioGID do projeto
portfolio_memberGID do portfólioGID(s) do(s) usuário(s)
project_memberGID do projetoGID(s) do(s) usuário(s)
project_followerGID do projetoGID(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"}
FiltroDescrição
workspace_gidWorkspace para buscar (usa o padrão se não for fornecido)
textBuscar no nome e nas notas da tarefa
assigneeGID do usuário, me, ou null para não atribuídas
projectsFiltrar por GID(s) de projeto
tagsFiltrar por GID(s) de tag
sectionsFiltrar por GID(s) de seção
completedtrue ou false
due_on, due_on_before, due_on_afterFiltros de data (AAAA-MM-DD)
sort_bydue_date, created_at, completed_at, likes, modified_at
sort_ascendingtrue 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âmetroDescrição
queryTexto de busca (obrigatório)
resource_typeproject, project_template, portfolio, user, team, tag, ou goal
workspace_gidWorkspace para buscar (usa o padrão se não for fornecido)
countMá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