> ## Documentation Index
> Fetch the complete documentation index at: https://comfyui-mcp.artokun.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 應用（微應用）

> 把工作流程變成一鍵應用：一份清單、一張暴露出來的執行表單，以及每次執行都會把值打補丁進去的 API 提示快照。在面板裡轉換，從面板、手機或代理執行，並發布到公共登錄庫。

**應用**是為**不帶畫布**的一鍵執行而打包的工作流程。它是你機器上的一個目錄，裡面放四樣
東西：

| 檔案              | 它是什麼                                                                |
| --------------- | ------------------------------------------------------------------- |
| `manifest.json` | 名稱、描述、`appMode {inputs, outputs}`、`deps`、`hideWorkflow`、`published` |
| `prompt.json`   | API 格式的提示**快照** —— 每次執行都會把值打補丁進去                                    |
| `workflow.json` | litegraph UI 節點圖 —— 設定了 `hideWorkflow` 時**不存在**                     |
| `thumbnail.png` | 選用的卡片圖                                                              |

包住在 ComfyUI 使用者目錄下的
`<user>/comfyui-mcp-panel/apps/<app-id>/` —— 故意**不是**工作流程目錄，這樣隱藏的應用
永遠不會出現在工作流程瀏覽器裡。

```
workflow ⇄ convert (panel) ⇄ app bundle on disk ⇄ run form ⇄ patch snapshot ⇄ ComfyUI queue
                                    ⇅
                        publish / install ⇄ public registry
```

應用自成一層的原因：畫布是*執行*你已經信任的工作流程的錯誤介面。帶五個帶標籤欄位的表單
才是對的，也是手機或代理根本能驅動的唯一介面。

<Note>
  儲存和執行實作只有**一份** —— 面板包的 HTTP 路由
  （`/comfyui_mcp_panel/apps/*`）。桌面面板、手機 Apps 分頁，以及 `apps_*` MCP
  工具都是它的用戶端，所以無論從哪啟動，應用行為都一樣。
</Note>

## 要求

應用由**面板包**（`comfyui-mcp-panel`）提供，不是單靠 MCP 伺服器。如果你 ComfyUI 上的
包早於這項功能，`apps` 配合 `action:"list"` 會以明確的 *「此 ComfyUI 上的面板包早於
Apps 功能」* 訊息失敗 —— 更新包並重新啟動 ComfyUI。

## 把工作流程轉換成應用

在面板裡，**Apps** 工具列按鈕（Civitai 旁邊）開啟應用網格。轉換當前開啟的工作流程會做
三件事：

1. 如果工作流程已經帶著一份，就**匯入 ComfyUI APP 模式設定**，否則用**啟發式**挑選輸入
   和輸出（提示控制項、種子、取樣器設定；`SaveImage` 類節點當輸出）。匯入的 APP 模式
   輸入在**任何**節點型別上都會被尊重，所以自訂節點端點能熬過轉換。
2. **掃描相依** —— 節點圖需要的模型和自訂節點包 —— 寫進 `manifest.deps`。
3. 以 API 格式**快照提示**。轉換時的控制項值變成每個輸入的表單 `default`。

`appMode.inputs` 裡的每個輸入帶著 `nodeId`、`widget`、`label`，以及 `text`、`number`、
`combo`、`toggle`、`image` 或 `model` 的 `kind`；combo 還帶著 `choices`。執行表單就是
從這些算圖出來的 —— 桌面和手機都是。

### 隱藏工作流程

`hideWorkflow` 會把 `workflow.json` 從包裡完全拿掉，於是節點圖不會交給執行或安裝這個
應用的人。

<Warning>
  **`hideWorkflow` 是混淆，從來不是安全。** 透過 ComfyUI 自己的 `/history` 執行應用的
  人仍然能看到 API 提示，應用安裝的模型和自訂節點也會暴露節點圖的相依。把它當成
  「別弄亂我的工作流程瀏覽器」，而不是保護一份你洩漏不起的節點圖。
</Warning>

## 執行應用

一次執行會把你的表單值打補丁進已存快照，再把結果排入佇列。補丁鍵是 `"<nodeId>.<widget>"`
—— 例如 `{"6.text": "a cat", "3.seed": 42}`。鍵只在**第一個**點上切開，所以自己就
帶點的控制項名（LoRA 堆、`lora_1.model`）會保持完整。

打補丁是**嚴格的**：指向快照裡不存在的節點或輸入的鍵是硬錯誤，不是安靜跳過。對不上
意味著清單已經和快照脫節，大聲失敗比帶著過期值跑下去更好。你省略的輸入保留轉換時的
預設值。

執行回傳一個 `prompt_id`；輪詢它拿狀態（`pending` → `running` → `done`，如果 ComfyUI
從沒聽說過它則是 `unknown`），以及按每個輸出節點分組的輸出。

### 在 RunPod 執行個體上執行

面板的 **Run on RunPod** 路徑以**幹跑**模式重用同一套補丁引擎：面板要打好補丁的提示
*但不*在本機排入佇列，把釘死的相依推到執行個體上，再把提示排入佇列到那邊。

<Warning>
  帶**影像輸入**的應用拒絕在執行個體上跑。上傳落在**本機** ComfyUI 上，執行個體夠不到 ——
  所以面板會誠實拒絕，而不是排入佇列一次會因缺檔案失敗的執行。
</Warning>

## 發布與 Explore

面板的 **Explore** 分頁是一個公共登錄庫（Cloudflare Worker，後面是 D1 + R2），帶
熱門 / 最新 / 最多星清單和搜尋。熱門是 7 天 `stars * 3 + runs`。發布會上傳整個包
—— 清單、提示、未隱藏時的工作流程、縮圖 —— 掛在以 sha256 為鍵的創作者身份下。

從 Explore 安裝時會先彈出**相依同意對話框**：應用的 `deps` 是*報告*的，從不靜默安裝。
你點一張卡片，不會因此在你機器上裝模型或自訂節點包。

<Note>
  `pricing_json` 和 `hosted_only` 存在於清單 schema 裡，並原樣透傳，但沒有東西讀它們。
  它們給一份僅設計階段的變現預留空間 —— 今天沒有付費應用行為。
</Note>

## `apps` MCP 工具

一個工具，五個動作，全是面板 Apps API 上的薄代理。它是**無畫布**的那一面：手機 App
和直接驅動的代理用的就是它。它在協調器的 `call_tool` 白名單上 —— `list`/`get`/
`run_status` 是隻讀的，`run` 帶著和 `enqueue_workflow` 一樣的風險姿態（它排入佇列的是使用者
顯式點過的任務）。

| 動作                    | 效果                                                                                            |
| --------------------- | --------------------------------------------------------------------------------------------- |
| `action:"list"`       | 列出這台 ComfyUI 上登記的每個應用 —— 每條是完整清單加上 `has_workflow` / `has_prompt` / `has_thumbnail`。沒有其他參數。只讀。 |
| `action:"get"`        | 按 id 取一個應用的清單 + 包事實。`appMode.inputs` 就是執行表單。只讀。                                               |
| `action:"run"`        | 把 `values` 打補丁進快照併排入佇列。回傳 `prompt_id`。                                                        |
| `action:"run_status"` | 按 `prompt_id` 輪詢一次執行：`status` 加上這次執行的輸出（每個輸出節點的影像 / 影片檔案引用、文本輸出）。只讀。                          |
| `action:"import"`     | 從公共登錄庫把一個應用安裝到這台 ComfyUI。                                                                     |

### 參數

`action` 是 schema 裡唯一必填的參數 —— 每個動作需要不同的子集，所以其餘在 schema 裡
都是選用的，是否存在由處理器強制，並點名它缺的欄位。

| 動作           | 參數             | 型別                | 說明                                |
| ------------ | -------------- | ----------------- | --------------------------------- |
| `get`        | `app_id`       | `string`（uuid），必填 | 來自 `action:"list"`                |
| `run`        | `app_id`       | `string`（uuid），必填 |                                   |
|              | `values`       | `object`，選用       | 鍵為 `"<nodeId>.<widget>"`；未知鍵會大聲失敗 |
| `run_status` | `app_id`       | `string`（uuid），必填 |                                   |
|              | `prompt_id`    | `string`，必填       | 必須匹配 `^[0-9a-zA-Z-]{1,64}$`       |
| `import`     | `registry_url` | `string`（URL），必填  | 必須是預設登錄庫或已加入允許清單的源                |
|              | `app_id`       | `string`（uuid），必填 | **登錄庫**應用的 uuid                   |
|              | `slug`         | `string`，選用       | 記入本機中繼資料                          |
|              | `version`      | `integer`，選用      | 記入本機中繼資料                          |

`prompt_id` 的形狀約束會強制**兩次** —— 在 schema 邊界，以及在處理器內部再一次 ——
因為這個 id 會插進 URL 路徑。即使呼叫方繞過 schema，形狀像路徑穿越的「prompt id」也
絕不能到達 URL 構建器。

按工具生成的 schema 參考請看[應用工具](/docs/docs/tools/apps)。

### 從登錄庫匯入

`action:"import"` 在服務端拉取登錄庫包，並把它建立成本機應用。**登錄庫 id 變成本機
id**，所以再匯入一個你已經有的應用會報告 id 衝突，而不是複製一份。縮圖住在單獨的
登錄庫端點，會分開拉取並轉發，於是裝好的應用還留著卡片圖。

相依**不會**被安裝。工具回傳清單裡的 `deps`，好讓呼叫方報告它們，並讓使用者故意去裝。

<Warning>
  `registry_url` 是允許清單，不是隨便一個 URL。拉取發生在**伺服器上**，所以任意 URL
  會是 SSRF 原語 —— 回送或區域網地址，或重定向進其中一個的公網 URL。除非操作員透過
  `COMFYUI_MCP_REGISTRY_URLS`（逗號分隔，給開發 / 預發用）把額外源加入允許清單，否則
  只接受預設公共登錄庫。重定向會被直接拒絕，而不是跟隨。
</Warning>

## 限制與校驗

你實際會撞上的東西：

| 限制              | 值          | 在哪                                  |
| --------------- | ---------- | ----------------------------------- |
| 包 / 提示 JSON     | 16 MB      | 比普通節點圖更寬，因為提示可能帶著 base64 影像         |
| 縮圖              | 5 MB       | 在寫任何東西**之前**解碼並校驗，這樣壞縮圖不能留下半成品包     |
| 應用名             | 120 字元     | 截斷                                  |
| 描述              | 4000 字元    | 截斷                                  |
| Combo `choices` | 200 條      | 截斷                                  |
| 登錄庫拉取           | 16 MB，30 秒 | 同時檢查宣告的 `content-length` **和**實際位元組 |

你會注意到的校驗：

* **應用 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"` 拉取包。

這是手機能做、聊天做不到的最清楚的一件事 —— 跑一條真實工作流程，帶真實輸入，視野裡
完全沒有畫布。

## 參見

* [應用工具](/docs/docs/tools/apps) —— 按工具生成的 schema 參考
* [側邊欄面板](/docs/docs/zh-TW/panel) —— 應用在那裡轉換、發布和瀏覽
* [手機 App](/docs/docs/zh-TW/mobile) —— 上下文裡的 Apps 分頁
* [RunPod 執行個體](/docs/docs/tools/runpod) —— 「Run on RunPod」路徑瞄準的執行個體
* [路線圖](/docs/docs/zh-TW/roadmap)
