asanamcp

Servidor MCP eficiente y de carga rápida para gestionar tareas, proyectos y portafolios de Asana.

Documentación

asanamcp

Crates.io docs.rs CI Coverage License

Servidor MCP para la API de Asana.

Inicio Rápido

  1. Obtén un token de acceso personal de Asana en https://app.asana.com/0/my-apps

  2. Instala:

# Homebrew
brew install adlio/tap/asanamcp

# From crates.io
cargo install asanamcp

# From GitHub
cargo install --git https://github.com/adlio/asanamcp
  1. Añade a la configuración de 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"
      }
    }
  }
}

El ASANA_DEFAULT_WORKSPACE es opcional pero recomendado si trabajas principalmente en un espacio de trabajo. Cuando se establece, las operaciones basadas en el espacio de trabajo (búsqueda, listar proyectos, listar usuarios, etc.) usarán este valor predeterminado, reduciendo la necesidad de especificar el GID del espacio de trabajo en cada solicitud.

Probando el 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

Herramientas

HerramientaDescripción
asana_workspacesListar todos los espacios de trabajo
asana_getObtener cualquier recurso (proyectos, tareas, portafolios, etc.)
asana_createCrear recursos (tareas, comentarios, proyectos, etc.)
asana_updateActualizar recursos existentes
asana_deleteEliminar recursos permanentemente (irreversible)
asana_linkGestionar relaciones (tarea↔proyecto, dependencias, etc.)
asana_task_searchBuscar tareas con filtros avanzados (asignado, fecha de vencimiento, etc.)
asana_resource_searchBuscar recursos por nombre (proyectos, plantillas, usuarios, equipos, etc.)

asana_get

Obtener cualquier recurso de Asana con soporte de recorrido recursivo.

{"resource_type": "portfolio", "gid": "123", "depth": -1}
resource_typegidOpciones
projectGID del proyecto
portfolioGID del portafoliodepth: profundidad de recorrido
taskGID de la tareainclude_subtasks, include_dependencies, include_comments
my_tasksGID del espacio de trabajo*Tareas asignadas al usuario actual
workspace_favoritesGID del espacio de trabajo*depth para recorrido de portafolio
workspace_projectsGID del espacio de trabajo*Todos los proyectos en el espacio de trabajo
workspace_templatesGID del equipo (opcional)Vacío = todas las plantillas accesibles
workspace_tagsGID del espacio de trabajo*
workspace_usersGID del espacio de trabajo*
workspace_teamsGID del espacio de trabajo*
project_tasksGID del proyecto/portafoliosubtask_depth
task_subtasksGID de la tarea
task_commentsGID de la tarea
status_updateGID de actualización de estadoActualización de estado única por GID
status_updatesGID del padreListar actualizaciones de estado para un proyecto/portafolio
all_workspaces(ignorado)Todos los espacios de trabajo accesibles
workspaceGID del espacio de trabajo
project_templateGID de la plantilla
project_sectionsGID del proyecto
sectionGID de la sección
tagGID de la etiqueta
me(ignorado)Usuario autenticado actual
userGID del usuario
teamGID del equipo
team_usersGID del equipo
project_custom_fieldsGID del proyecto
project_briefGID del briefBrief del proyecto (Recursos clave en la pestaña Resumen, NO en la pestaña Notas)
project_project_briefGID del proyectoObtener el brief del proyecto mediante el GID del proyecto

*Usa ASANA_DEFAULT_WORKSPACE si el gid está vacío.

Profundidad: -1 = ilimitado, 0 = ninguno, N = N niveles.

asana_create

{"resource_type": "task", "project_gid": "123", "name": "New task", "assignee": "me"}
resource_typeCampos requeridos
taskproject_gid o workspace_gid*, name
subtasktask_gid, name
projectworkspace_gid o 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 (con etiquetas <body>)

*Usa ASANA_DEFAULT_WORKSPACE si no se proporciona.

asana_update

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

Soporta: task, project, portfolio, section, tag, comment, status_update, project_brief (Recursos clave en la pestaña Resumen, NO en la pestaña Notas).

asana_delete

Eliminar permanentemente un recurso de Asana. Esta acción es irreversible.

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

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

asana_link

{"action": "add", "relationship": "task_project", "target_gid": "task123", "item_gid": "proj456"}
relaciónobjetivoelemento
task_projectGID de la tareaGID del proyecto
task_tagGID de la tareaGID de la etiqueta
task_parentGID de la tareaGID de la tarea padre
task_dependencyGID de la tareaGID(s) de tarea bloqueante
task_dependentGID de la tareaGID(s) de tarea dependiente
task_followerGID de la tareaGID(s) de usuario
portfolio_itemGID del portafolioGID del proyecto
portfolio_memberGID del portafolioGID(s) de usuario
project_memberGID del proyectoGID(s) de usuario
project_followerGID del proyectoGID(s) de usuario

Usa item_gid para elementos individuales o item_gids para operaciones masivas.

asana_task_search

Buscar tareas con opciones de filtrado avanzadas.

{"workspace_gid": "123", "text": "bug", "completed": false, "assignee": "me"}
FiltroDescripción
workspace_gidEspacio de trabajo a buscar (usa el predeterminado si no se proporciona)
textBuscar en el nombre y notas de la tarea
assigneeGID de usuario, me, o null para no asignado
projectsFiltrar por GID(s) de proyecto
tagsFiltrar por GID(s) de etiqueta
sectionsFiltrar por GID(s) de sección
completedtrue o false
due_on, due_on_before, due_on_afterFiltros de fecha (AAAA-MM-DD)
sort_bydue_date, created_at, completed_at, likes, modified_at
sort_ascendingtrue o false

asana_resource_search

Buscar cualquier recurso de Asana por nombre usando autocompletado. Úsalo para encontrar proyectos, plantillas, usuarios, equipos y más.

{"query": "CloudSmith", "resource_type": "project_template"}
ParámetroDescripción
queryTexto de búsqueda (obligatorio)
resource_typeproject, project_template, portfolio, user, team, tag, o goal
workspace_gidEspacio de trabajo a buscar (usa el predeterminado si no se proporciona)
countMáximo de resultados (predeterminado 20, máximo 100)

Uso de la 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(())
}

Desarrollo

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

Licencia

MIT