asana-gate 是做什麼的?
asana-gate 是一個位於 Asana REST API 前方的策略閘道。
一個 YAML 策略針對每個範圍(工作區、團隊、投資組合、專案、區段、任務)指定代理可以採取的動作以及如何塑造其請求;閘道會在每個請求上強制執行該策略,無論請求是透過 MCP 工具呼叫還是 asana-gate 命令到達。
您能透過它看到或執行的所有內容都由該策略決定,而非由 Asana 決定:策略隱藏的物件對您來說不存在,且拒絕回應會以 HTTP 風格的錯誤返回,其訊息開頭為 asana-gate:。
首先閱讀閘道的回覆
閘道傳回的每個物件都帶有 allowed_actions:策略目前允許對其進行的 <resource>:<verb> 動作,例如 task:update 或 story:create。
在進行寫入操作前請檢查此清單,因為清單中缺少的動作將會被拒絕:請根據列出的項目進行規劃,而不是嘗試後失敗。
| 回覆 | 含義 | 應採取的動作 |
|---|---|---|
404 <type>: Not a recognized ID: <gid> | 物件不存在,或策略將其隱藏;閘道刻意使兩者無法區分(與 Asana 傳送的 404 相同) | 不要重試或嘗試其他 gid。說明該物件在目前策略下不可見;其擁有者可執行 asana-gate explain <gid> 來查看是哪條規則隱藏了它 |
403 asana-gate: <action> is not permitted on <type> <gid> | 物件可見,但策略不允許對其執行此動作 | 回報此情況,並提供 allowed_actions 中的一個動作;放寬策略是擁有者的決定 |
403 asana-gate: updating <resource>.<member> is not permitted here (allowed fields: …) | 更新觸及了規則 fields 允許清單之外的成員 | 僅使用允許的成員重新發送請求 |
400 asana-gate: the <resource> does not satisfy the policy: … | 策略的約束:必需的成員缺失或被清空,前綴或格式錯誤,值不被允許,或成員被禁止 | 完全按照訊息描述修正請求並重新發送 |
428 asana-gate: <action> needs a person's confirmation | 策略希望人工核准此動作 | 對於 MCP,回應客戶端顯示的提示;在 shell 中,使用 --yes 重新執行 |
429 asana-gate: <action> is limited to N per <period> | 策略對該範圍中的此動作設定的速率上限 | 等待該週期結束;不要對此進行迴圈 |
清單(專案、任務、搜尋、類型預測、事件)會被靜默過濾:隱藏的物件直接不存在,不會說明移除了多少個,且頁面會攜帶 next_page.offset 以使用 offset 繼續。
Asana 自身的錯誤會直接通過,不帶 asana-gate: 前綴:402 表示工作區的方案缺少該功能(搜尋、自訂欄位、投資組合和目標需要付費方案);純粹的 400 是 Asana 拒絕請求主體;純粹的 403 是權杖自身的權限(稽核日誌事件、工作區事件和組織匯出需要 Enterprise 層級的服務帳戶;早期存取 Agents 端點需要設定中 asana.enable 的 ai_teammate_actors 旗標)。
尋找前綴:帶有前綴表示是策略的決定,不帶前綴則表示是 Asana 的決定。
透過 MCP 運作
伺服器會公開策略可能允許的所有策展工具,以及三個通用工具:
asana_create_tasks和asana_update_tasks一次最多接受 50 個任務,並按順序為每個任務回傳一個status_code和body;部分可能失敗,而其餘成功。asana_request透過相同的策略呼叫任何 Asana REST 操作(method、path(在/api/1.0之下)、query、body(作為data物件));透過它進行的POST /batch最多接受 50 個動作。asana_operations列出每個操作所需的策略動作;asana_allowed_actions告訴您可以使用一個物件做什麼。
| 工具 | 命令列 | 功能 |
|---|---|---|
asana_search_tasks | asana-gate task search | 在工作區中進行全文和過濾任務搜尋(Asana Search API;僅限付費方案)。結果限制為策略可見的任務。 |
asana_list_tasks | asana-gate task list | 列出專案、區段、帶有標籤或分配給使用者的任務(需要 project、section、tag 或 assignee 其中之一)。每個任務都帶有 allowed_actions。 |
asana_get_task | asana-gate task get <task_gid> | 讀取一個任務及其完整欄位和 allowed_actions。 |
asana_create_task | asana-gate task create | 在一個或多個專案中(可選擇在區段中)、在父任務下、或在工作區中無歸屬地建立任務。 |
asana_update_task | asana-gate task update <task_gid> | 更新任務的欄位。完成需要 task:complete,指派需要 task:assign;其他欄位需要 task:update(可能受限於允許清單)。 |
asana_create_tasks | asana-gate task create-many | 一次呼叫最多建立 50 個任務,每個如同 asana_create_task 一樣。結果按順序包含每個任務的 status_code 和 body;Asana 可能使部分任務失敗而其他成功。任何任務的策略拒絕會在執行前拒絕整個呼叫,其訊息會指明任務(actions[i])。 |
asana_update_tasks | asana-gate task update-many | 一次呼叫最多更新 50 個任務,每個如同 asana_update_task 一樣。結果按順序包含每個任務的 status_code 和 body;Asana 可能使部分任務失敗而其他成功。任何任務的策略拒絕會在執行前拒絕整個呼叫,其訊息會指明任務(actions[i])。 |
asana_delete_task | asana-gate task delete <task_gid> | 刪除一個任務(在 Asana 中會移至垃圾桶)。 |
asana_list_subtasks | asana-gate task subtasks <task_gid> | 列出一個任務的直接子任務。 |
asana_create_subtask | — | 在一個任務下建立子任務;除非指定了 projects,否則會繼承父項目的範圍。 |
asana_set_task_parent | asana-gate task set-parent <task_gid> | 將一個任務設為另一個任務的子任務(或設為 parent null 的頂層任務)。 |
asana_add_task_to_project | asana-gate task add-project <task_gid> | 將任務多重歸屬到一個專案中,可選擇歸屬到區段。 |
asana_remove_task_from_project | asana-gate task remove-project <task_gid> | 從任務的其中一個專案中移除它。 |
asana_move_task_to_section | asana-gate task move <task_gid> | 將任務移到其所屬專案的一個區段中(需要在兩端都有 task:move)。 |
asana_add_tag_to_task | asana-gate task tag <task_gid> | 對任務套用標籤(需要在任務範圍內有 tag:apply)。 |
asana_remove_tag_from_task | asana-gate task untag <task_gid> | 從任務移除標籤(需要在任務範圍內有 tag:apply)。 |
asana_add_task_dependencies | asana-gate task add-dependencies <task_gid> | 標記此任務依賴的任務;每個引用的任務都必須可見。 |
asana_remove_task_dependencies | asana-gate task remove-dependencies <task_gid> | 移除任務的依賴關係。 |
asana_list_task_stories | asana-gate task comments <task_gid> | 列出任務的評論和活動(動態)。 |
asana_create_comment | asana-gate task comment <task_gid> | 為任務新增評論(動態)。 |
asana_update_story | … | 更新動態。 |
(由於原文被截斷,此處省略了完整表格的其餘部分。)