asanamcp
Servidor MCP eficiente y de carga rápida para gestionar tareas, proyectos y portafolios de Asana.
Documentación
asanamcp
Servidor MCP para la API de Asana.
Inicio Rápido
-
Obtén un token de acceso personal de Asana en https://app.asana.com/0/my-apps
-
Instala:
# Homebrew
brew install adlio/tap/asanamcp
# From crates.io
cargo install asanamcp
# From GitHub
cargo install --git https://github.com/adlio/asanamcp
- 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
| Herramienta | Descripción |
|---|---|
asana_workspaces | Listar todos los espacios de trabajo |
asana_get | Obtener cualquier recurso (proyectos, tareas, portafolios, etc.) |
asana_create | Crear recursos (tareas, comentarios, proyectos, etc.) |
asana_update | Actualizar recursos existentes |
asana_delete | Eliminar recursos permanentemente (irreversible) |
asana_link | Gestionar relaciones (tarea↔proyecto, dependencias, etc.) |
asana_task_search | Buscar tareas con filtros avanzados (asignado, fecha de vencimiento, etc.) |
asana_resource_search | Buscar 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_type | gid | Opciones |
|---|---|---|
project | GID del proyecto | |
portfolio | GID del portafolio | depth: profundidad de recorrido |
task | GID de la tarea | include_subtasks, include_dependencies, include_comments |
my_tasks | GID del espacio de trabajo* | Tareas asignadas al usuario actual |
workspace_favorites | GID del espacio de trabajo* | depth para recorrido de portafolio |
workspace_projects | GID del espacio de trabajo* | Todos los proyectos en el espacio de trabajo |
workspace_templates | GID del equipo (opcional) | Vacío = todas las plantillas accesibles |
workspace_tags | GID del espacio de trabajo* | |
workspace_users | GID del espacio de trabajo* | |
workspace_teams | GID del espacio de trabajo* | |
project_tasks | GID del proyecto/portafolio | subtask_depth |
task_subtasks | GID de la tarea | |
task_comments | GID de la tarea | |
status_update | GID de actualización de estado | Actualización de estado única por GID |
status_updates | GID del padre | Listar actualizaciones de estado para un proyecto/portafolio |
all_workspaces | (ignorado) | Todos los espacios de trabajo accesibles |
workspace | GID del espacio de trabajo | |
project_template | GID de la plantilla | |
project_sections | GID del proyecto | |
section | GID de la sección | |
tag | GID de la etiqueta | |
me | (ignorado) | Usuario autenticado actual |
user | GID del usuario | |
team | GID del equipo | |
team_users | GID del equipo | |
project_custom_fields | GID del proyecto | |
project_brief | GID del brief | Brief del proyecto (Recursos clave en la pestaña Resumen, NO en la pestaña Notas) |
project_project_brief | GID del proyecto | Obtener 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_type | Campos requeridos |
|---|---|
task | project_gid o workspace_gid*, name |
subtask | task_gid, name |
project | workspace_gid o 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 (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ón | objetivo | elemento |
|---|---|---|
task_project | GID de la tarea | GID del proyecto |
task_tag | GID de la tarea | GID de la etiqueta |
task_parent | GID de la tarea | GID de la tarea padre |
task_dependency | GID de la tarea | GID(s) de tarea bloqueante |
task_dependent | GID de la tarea | GID(s) de tarea dependiente |
task_follower | GID de la tarea | GID(s) de usuario |
portfolio_item | GID del portafolio | GID del proyecto |
portfolio_member | GID del portafolio | GID(s) de usuario |
project_member | GID del proyecto | GID(s) de usuario |
project_follower | GID del proyecto | GID(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"}
| Filtro | Descripción |
|---|---|
workspace_gid | Espacio de trabajo a buscar (usa el predeterminado si no se proporciona) |
text | Buscar en el nombre y notas de la tarea |
assignee | GID de usuario, me, o null para no asignado |
projects | Filtrar por GID(s) de proyecto |
tags | Filtrar por GID(s) de etiqueta |
sections | Filtrar por GID(s) de sección |
completed | true o false |
due_on, due_on_before, due_on_after | Filtros de fecha (AAAA-MM-DD) |
sort_by | due_date, created_at, completed_at, likes, modified_at |
sort_ascending | true 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ámetro | Descripción |
|---|---|
query | Texto de búsqueda (obligatorio) |
resource_type | project, project_template, portfolio, user, team, tag, o goal |
workspace_gid | Espacio de trabajo a buscar (usa el predeterminado si no se proporciona) |
count | Má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