Communitygithub.com

sincekmori/asana-gate

Opera Asana a través de asana-gate, la puerta de enlace de políticas que coloca una política declarativa YAML frente a la API REST de Asana para agentes de IA, como herramientas MCP (asana_*) y la línea de comandos asana-gate.

¿Qué es asana-gate?

asana-gate es una puerta de enlace de políticas que se interpone entre un agente de IA y la API REST de Asana. En lugar de permitir que el agente acceda directamente a Asana, una política YAML definida por el usuario especifica, por ámbito (workspace, equipo, portfolio, proyecto, sección, tarea), qué acciones están permitidas y cómo se deben moldear las solicitudes. Esto otorga control granular sobre el comportamiento del agente, previniendo acciones no autorizadas o limitando campos modificables. El agente interactúa con asana-gate ya sea a través de herramientas MCP (como `asana_search_tasks`, `asana_get_task`, `asana_create_task`) o mediante el comando `asana-gate` en la terminal. La puerta de enlace oculta objetos que la política no autoriza, devuelve errores específicos con el prefijo `asana-gate:` para acciones denegadas, y puede solicitar confirmación humana si la política lo requiere. Es útil para equipos que desean mantener un control de acceso fino y políticas de uso predecibles para agentes de IA que trabajan con Asana, especialmente en entornos donde se usa Claude Code, Cursor, Codex, o herramientas similares que soportan MCP.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/sincekmori/asana-gate/tree/HEAD/skills/asana-gate

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace asana-gate?

asana-gate es una puerta de enlace de políticas frente a la API REST de Asana. Una política YAML define, por ámbito (workspace, equipo, portfolio, proyecto, sección, tarea), qué acciones puede realizar un agente y cómo se moldean sus solicitudes; la puerta de enlace la aplica en cada solicitud, ya sea que llegue como una llamada a una herramienta MCP o como un comando asana-gate. Todo lo que puedas ver o hacer a través de ella está decidido por esa política, no por Asana: los objetos que la política oculta no existen para ti, y las denegaciones se devuelven como errores de estilo HTTP cuyo mensaje comienza con asana-gate:.

Lee primero las respuestas de la puerta de enlace

Cada objeto que devuelve la puerta de enlace lleva allowed_actions: las acciones <recurso>:<verbo> que la política permite sobre él en ese momento, como task:update o story:create. Compruébalo antes de escribir, porque una acción que falte será denegada: planifica en función de lo que esté listado, en lugar de intentar y fallar.

RespuestaSignificadoQué hacer
404 <tipo>: No es un ID reconocido: <gid>El objeto no existe, o la política lo oculta; la puerta de enlace hace deliberadamente indistinguibles ambas (el mismo 404 que envía Asana)No reintentes ni pruebes otros gid. Indica que el objeto no es visible bajo la política; su propietario puede ejecutar asana-gate explain <gid> para ver qué regla lo oculta
403 asana-gate: <acción> no está permitida en <tipo> <gid>El objeto es visible, pero la política no permite esta acción allíInfórmalo y ofrece una acción de allowed_actions; ampliar la política es decisión del propietario
403 asana-gate: la actualización de <recurso>.<miembro> no está permitida aquí (campos permitidos: …)La actualización tocó un miembro fuera de la lista de campos permitidos de la reglaReenvía solo con los miembros permitidos
400 asana-gate: el <recurso> no cumple la política: …Una restricción de la política: falta un miembro requerido o se ha limpiado, un prefijo o formato es incorrecto, un valor no está permitido, un miembro está prohibidoCorrige la solicitud exactamente como indica el mensaje y reenvía
428 asana-gate: <acción> necesita la confirmación de una personaLa política requiere que un humano apruebe esta acciónA través de MCP, responde a la pregunta que muestra el cliente; desde un shell, vuelve a ejecutar con --yes
429 asana-gate: <acción> está limitada a N por <período>Un límite de tasa que la política establece para esta acción en este ámbitoEspera a que pase el período; no hagas un bucle sobre él

Las listas (proyectos, tareas, búsqueda, autocompletado, eventos) se filtran en silencio: los objetos ocultos simplemente no aparecen, no se indica cuántos se eliminaron, y una página lleva next_page.offset para continuar con offset. Los errores propios de Asana pasan sin cambios, sin el prefijo asana-gate:: un 402 significa que el plan del workspace carece de la función (búsqueda, campos personalizados, portfolios y metas necesitan un plan de pago), un 400 simple es Asana rechazando el cuerpo, un 403 simple es el permiso del propio token (eventos de registro de auditoría, eventos del workspace y exportaciones de organización requieren una cuenta de servicio en un nivel Enterprise; los endpoints de Agents en acceso anticipado toman la marca ai_teammate_actors en la configuración asana.enable). Busca el prefijo: con él, la política decidió; sin él, lo hizo Asana.

Trabajar a través de MCP

El servidor expone las herramientas seleccionadas que la política podría permitir, más tres genéricas:

  • asana_create_tasks y asana_update_tasks toman hasta 50 tareas a la vez y responden con un status_code y body por tarea, en orden; algunas pueden fallar mientras otras tienen éxito.
  • asana_request llama a cualquier operación REST de Asana (method, path debajo de /api/1.0, query, body como el objeto data) a través de la misma política; un POST /batch a través de ella toma hasta 50 acciones.
  • asana_operations lista las operaciones con la acción de política que necesita cada una; asana_allowed_actions indica lo que puedes hacer con un objeto.
HerramientaLínea de comandosQué hace
asana_search_tasksasana-gate task searchBúsqueda de texto completo y filtrada de tareas en el workspace (API de Búsqueda de Asana; solo planes de pago). Los resultados se limitan a las tareas que la política hace visibles.
asana_list_tasksasana-gate task listLista tareas en un proyecto, una sección, con una etiqueta, o asignadas a un usuario (se requiere uno de: proyecto, sección, etiqueta o asignado). Cada tarea lleva allowed_actions.
asana_get_taskasana-gate task get <task_gid>Lee una tarea con todos sus campos y allowed_actions.
asana_create_taskasana-gate task createCrea una tarea en uno o más proyectos (opcionalmente en una sección), bajo una tarea padre, o sin hogar en el workspace.
asana_update_taskasana-gate task update <task_gid>Actualiza campos de una tarea. Completar necesita task:complete, asignar necesita task:assign; otros campos necesitan task:update (posiblemente limitado a una lista de campos permitidos).
asana_create_tasksasana-gate task create-manyCrea hasta 50 tareas en una sola llamada, cada una como lo haría asana_create_task. El resultado contiene un status_code y body por tarea, en orden; Asana puede fallar algunas mientras otras tienen éxito. Una denegación de política de cualquier tarea rechaza toda la llamada antes de ejecutarse, y su mensaje nombra la tarea (actions[i]).
asana_update_tasksasana-gate task update-manyActualiza hasta 50 tareas en una sola llamada, cada una como lo haría asana_update_task. El resultado contiene un status_code y body por tarea, en orden; Asana puede fallar algunas mientras otras tienen éxito. Una denegación de política de cualquier tarea rechaza toda la llamada antes de ejecutarse, y su mensaje nombra la tarea (actions[i]).
asana_delete_taskasana-gate task delete <task_gid>Elimina una tarea (se mueve a la papelera en Asana).
asana_list_subtasksasana-gate task subtasks <task_gid>Lista las subtareas directas de una tarea.
asana_create_subtask—Crea una subtarea debajo de una tarea; hereda el ámbito del padre a menos que se proporcionen proyectos.
asana_set_task_parentasana-gate task set-parent <task_gid>Convierte una tarea en subtarea de otra (o en tarea de nivel superior con padre null).
asana_add_task_to_projectasana-gate task add-project <task_gid>Agrega una tarea a varios proyectos, opcionalmente en una sección.
asana_remove_task_from_projectasana-gate task remove-project <task_gid>Elimina una tarea de uno de sus proyectos.
asana_move_task_to_sectionasana-gate task move <task_gid>Mueve una tarea a una sección de un proyecto al que pertenece (necesita task:move en ambos extremos).
asana_add_tag_to_taskasana-gate task tag <task_gid>Aplica una etiqueta a una tarea (necesita tag:apply en el ámbito de la tarea).
asana_remove_tag_from_taskasana-gate task untag <task_gid>Elimina una etiqueta de una tarea (necesita tag:apply en el ámbito de la tarea).
asana_add_task_dependenciesasana-gate task add-dependencies <task_gid>Marca tareas de las que esta tarea depende; cada tarea referenciada debe ser visible.
asana_remove_task_dependenciesasana-gate task remove-dependencies <task_gid>Elimina dependencias de una tarea.
asana_list_task_storiesasana-gate task comments <task_gid>Lista los comentarios y la actividad (historias) de una tarea.
asana_create_commentasana-gate task comment <task_gid>Agrega un comentario (historia) a una tarea.
asana_update_story

Skills relacionados