長任務模式:start → poll → cancel 背景工作流
建置 (builds)、編譯、相依套件安裝、長時間測試套件、開發伺服器 (dev servers)——這些都是典型的長任務。CatDesk 刻意將長時間執行的指令與 MCP HTTP 請求的生命週期解耦 (decoupled):指令在背景跑,不會因為單次 MCP 請求結束而被中斷。你透過「啟動 → 輪詢 → 必要時取消」三段式流程掌控它們。
步驟 1:判斷任務類型,選對工具
CatDesk 提供兩條執行 shell 指令的路徑:
| 工具 | 類型 | 適用場景 |
|---|---|---|
run_command |
Shell | 執行短指令並等待完成,最長 120 秒逾時 (timeout) |
start_command |
Job | 啟動長任務,立即回傳 job ID |
判斷準則很簡單:
- 短指令:
ls、cat、git status、單檔搜尋 →run_command - 長任務:建置、編譯、相依套件安裝、長時間測試套件、開發伺服器 →
start_command
步驟 2:用 start_command 啟動背景工作
ChatGPT 呼叫 start_command 後會立即拿到一個 job ID,指令在背景執行。這代表你不用傻等建置跑完才繼續對話。
步驟 3:用 poll_command 進入輪詢迴圈
拿到 job ID 後,用 poll_command 讀取增量輸出 (incremental output) 與狀態。輪詢回應是有界 (bounded) 的,預設為 10 秒長輪詢 (long polling)。若回應中 hasMoreOutput 為 true,就帶著回傳的 nextCursor 繼續輪詢,把緩衝區裡剩餘的輸出排空 (drain)。
⚠️ 重點:即使指令已達終止狀態 (terminal state),只要
hasMoreOutput還是true,就必須繼續用nextCursor輪詢,否則會漏掉最後一段輸出。
步驟 4:判讀終止狀態
輪詢回應會攜帶任務狀態。當指令達到終止狀態(例如建置完成、測試跑完),且 hasMoreOutput 已排空為 false,本次背景工作即告結束,把結果回報給 ChatGPT 繼續下一步。
步驟 5:必要時用 cancel_command 中止
任務失控(無限迴圈、卡住的 dev server、想換方向)時,用 cancel_command 停止背景指令。它會一併終止子程序樹 (child process tree),不會留下孤兒程序 (orphan processes) 佔用 port 或資源。
步驟 6:在 ChatGPT Web 實際操作
以下是在 ChatGPT Web 中真實會用到的提示詞序列 (prompt sequences):
啟動 dev server 並盯著輸出直到就緒:
用 start_command 啟動 npm run dev,然後用 poll_command 看輸出直到 server ready。
跑長時間測試套件:
用 start_command 在背景執行 pnpm run build,完成後回報是否有錯誤。
中止失控任務:
這個 server 一直重啟失敗,用 cancel_command 把它停掉。
一圖看懂整條流程
start_command ──▶ job ID
│
▼
poll_command (10s long polling)
│
hasMoreOutput == true ──▶ 用 nextCursor 繼續輪詢
│
hasMoreOutput == false
│
▼
terminal state?── yes ──▶ 結束
│ no(任務失控)
▼
cancel_command(殺掉子程序樹)