包住在 ComfyUI 使用者目錄下的
<user>/comfyui-mcp-panel/apps/<app-id>/ —— 故意不是工作流程目錄,這樣隱藏的應用
永遠不會出現在工作流程瀏覽器裡。
儲存和執行實作只有一份 —— 面板包的 HTTP 路由
(
/comfyui_mcp_panel/apps/*)。桌面面板、手機 Apps 分頁,以及 apps_* MCP
工具都是它的用戶端,所以無論從哪啟動,應用行為都一樣。要求
應用由面板包(comfyui-mcp-panel)提供,不是單靠 MCP 伺服器。如果你 ComfyUI 上的
包早於這項功能,apps 配合 action:"list" 會以明確的 「此 ComfyUI 上的面板包早於
Apps 功能」 訊息失敗 —— 更新包並重新啟動 ComfyUI。
把工作流程轉換成應用
在面板裡,Apps 工具列按鈕(Civitai 旁邊)開啟應用網格。轉換當前開啟的工作流程會做 三件事:- 如果工作流程已經帶著一份,就匯入 ComfyUI APP 模式設定,否則用啟發式挑選輸入
和輸出(提示控制項、種子、取樣器設定;
SaveImage類節點當輸出)。匯入的 APP 模式 輸入在任何節點型別上都會被尊重,所以自訂節點端點能熬過轉換。 - 掃描相依 —— 節點圖需要的模型和自訂節點包 —— 寫進
manifest.deps。 - 以 API 格式快照提示。轉換時的控制項值變成每個輸入的表單
default。
appMode.inputs 裡的每個輸入帶著 nodeId、widget、label,以及 text、number、
combo、toggle、image 或 model 的 kind;combo 還帶著 choices。執行表單就是
從這些算圖出來的 —— 桌面和手機都是。
隱藏工作流程
hideWorkflow 會把 workflow.json 從包裡完全拿掉,於是節點圖不會交給執行或安裝這個
應用的人。
執行應用
一次執行會把你的表單值打補丁進已存快照,再把結果排入佇列。補丁鍵是"<nodeId>.<widget>"
—— 例如 {"6.text": "a cat", "3.seed": 42}。鍵只在第一個點上切開,所以自己就
帶點的控制項名(LoRA 堆、lora_1.model)會保持完整。
打補丁是嚴格的:指向快照裡不存在的節點或輸入的鍵是硬錯誤,不是安靜跳過。對不上
意味著清單已經和快照脫節,大聲失敗比帶著過期值跑下去更好。你省略的輸入保留轉換時的
預設值。
執行回傳一個 prompt_id;輪詢它拿狀態(pending → running → done,如果 ComfyUI
從沒聽說過它則是 unknown),以及按每個輸出節點分組的輸出。
在 RunPod 執行個體上執行
面板的 Run on RunPod 路徑以幹跑模式重用同一套補丁引擎:面板要打好補丁的提示 但不在本機排入佇列,把釘死的相依推到執行個體上,再把提示排入佇列到那邊。發布與 Explore
面板的 Explore 分頁是一個公共登錄庫(Cloudflare Worker,後面是 D1 + R2),帶 熱門 / 最新 / 最多星清單和搜尋。熱門是 7 天stars * 3 + runs。發布會上傳整個包
—— 清單、提示、未隱藏時的工作流程、縮圖 —— 掛在以 sha256 為鍵的創作者身份下。
從 Explore 安裝時會先彈出相依同意對話框:應用的 deps 是報告的,從不靜默安裝。
你點一張卡片,不會因此在你機器上裝模型或自訂節點包。
pricing_json 和 hosted_only 存在於清單 schema 裡,並原樣透傳,但沒有東西讀它們。
它們給一份僅設計階段的變現預留空間 —— 今天沒有付費應用行為。apps MCP 工具
一個工具,五個動作,全是面板 Apps API 上的薄代理。它是無畫布的那一面:手機 App
和直接驅動的代理用的就是它。它在協調器的 call_tool 白名單上 —— list/get/
run_status 是隻讀的,run 帶著和 enqueue_workflow 一樣的風險姿態(它排入佇列的是使用者
顯式點過的任務)。
參數
action 是 schema 裡唯一必填的參數 —— 每個動作需要不同的子集,所以其餘在 schema 裡
都是選用的,是否存在由處理器強制,並點名它缺的欄位。
prompt_id 的形狀約束會強制兩次 —— 在 schema 邊界,以及在處理器內部再一次 ——
因為這個 id 會插進 URL 路徑。即使呼叫方繞過 schema,形狀像路徑穿越的「prompt id」也
絕不能到達 URL 構建器。
按工具生成的 schema 參考請看應用工具。
從登錄庫匯入
action:"import" 在服務端拉取登錄庫包,並把它建立成本機應用。登錄庫 id 變成本機
id,所以再匯入一個你已經有的應用會報告 id 衝突,而不是複製一份。縮圖住在單獨的
登錄庫端點,會分開拉取並轉發,於是裝好的應用還留著卡片圖。
相依不會被安裝。工具回傳清單裡的 deps,好讓呼叫方報告它們,並讓使用者故意去裝。
限制與校驗
你實際會撞上的東西:
你會注意到的校驗:
- 應用 id 必須是 uuid。 其他任何東西都會在路徑建好之前被拒絕,解析後的包路徑還會 再檢查是否落在應用根目錄之內。
- 提示必須是 API 格式 —— 數位元組點 id 鍵,每個節點是
{class_type, inputs}物件。 UI 格式的節點圖會被拒絕。 - 除非設定了
hideWorkflow,否則需要 UI 工作流程。 - 建立已存在的應用是衝突,不是覆寫。
- 部分清單更新真的是部分的。 發布或隱藏應用只發送它自己的欄位,不會抹掉你的名稱、
描述或
appMode。 - 未知清單鍵會被丟掉,除了保留的透傳欄位,這樣更舊的機器會忽略它不認識的欄位, 而不是失敗。
COMFYUI_MCP_APPS_DIR 覆寫(主要用於測試);預設從 ComfyUI 自己的
使用者目錄派生,所以便攜安裝也能熬過去。
在手機上
手機 App 帶了一個真正的 Apps 分頁 —— 不是預覽。它有兩半:- My Apps —— 裝在你機器上的應用,透過橋接用
action:"list"列出。點開一個會開啟 生成的執行表單,用action:"run"排入佇列,並每 2 秒輪詢action:"run_status"(上限 30 分鐘),直到輸出算圖出來。 - Explore —— 公共登錄庫,從手機直接走 HTTPS(沒有橋接那一跳,所以配對之前就能
瀏覽)。安裝走另一個方向:機器自己透過
action:"import"拉取包。
參見
- 應用工具 —— 按工具生成的 schema 參考
- 側邊欄面板 —— 應用在那裡轉換、發布和瀏覽
- 手機 App —— 上下文裡的 Apps 分頁
- RunPod 執行個體 —— 「Run on RunPod」路徑瞄準的執行個體
- 路線圖