> ## 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 プロンプトのスナップショット。パネルで変換し、パネル・スマートフォン・エージェントから実行し、公開レジストリへ公開します。

**アプリ** は、**キャンバスなし** でワンクリック実行できるようにパッケージしたワークフローです。
リグ上のディレクトリに 4 つ入ります:

| ファイル            | 何か                                                                  |
| --------------- | ------------------------------------------------------------------- |
| `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
```

アプリが独自の層として存在する理由: すでに信頼しているワークフローを *実行する* には、
キャンバスは間違ったインターフェースです。ラベル付き 5 フィールドのフォームが正しいもので、
スマートフォンやエージェントがそもそも操作できる唯一のインターフェースでもあります。

<Note>
  ストレージと実行の実装は **1 つ** — パネルパックの HTTP ルート
  （`/comfyui_mcp_panel/apps/*`）です。デスクトップパネル、モバイルの Apps タブ、
  `apps_*` MCP ツールはすべてそのクライアントなので、どこから起動してもアプリの挙動は同じです。
</Note>

## 要件

アプリは MCP サーバー単体ではなく、**パネルパック**（`comfyui-mcp-panel`）が提供します。
ComfyUI 上のパックがこの機能より古いと、`apps` の `action:"list"` は明示的な
*「この ComfyUI 上のパネルパックは Apps 機能より古い」* メッセージで失敗します —
パックを更新して ComfyUI を再起動してください。

## ワークフローをアプリに変換する

パネルで、Civitai の隣にある **Apps** ツールバーボタンがアプリグリッドを開きます。
開いているワークフローの変換は 3 つのことをします:

1. ワークフローがすでに持っていれば **ComfyUI の APP モード設定をインポート** し、
   そうでなければ入力と出力を **ヒューリスティック** に選びます（プロンプトウィジェット、
   シード、サンプラー設定。出力は `SaveImage` クラスのノード）。インポートした APP モード
   入力は **任意の** ノードタイプで尊重されるので、カスタムノードのエンドポイントも変換を
   生き延びます。
2. **依存をスキャン** — グラフが必要とするモデルとカスタムノードパック — して
   `manifest.deps` に入れます。
3. API 形式で **プロンプトをスナップショット** します。変換時点のウィジェット値が、
   各入力のフォーム `default` になります。

`appMode.inputs` の各入力は `nodeId`、`widget`、`label`、および `text`、`number`、`combo`、
`toggle`、`image`、`model` のいずれかの `kind` を持ちます。コンボは `choices` も持ちます。
実行フォームはそれだけから描画されます — デスクトップでもモバイルでも。

### ワークフローを隠す

`hideWorkflow` はバンドルから `workflow.json` を完全に落とすので、アプリを実行または
インストールする相手にグラフが渡りません。

<Warning>
  **`hideWorkflow` は難読化であり、セキュリティではありません。** API プロンプトは ComfyUI
  自身の `/history` 経由でアプリを実行する誰にでも見え、アプリがインストールするモデルと
  カスタムノードがグラフの依存を明らかにします。「ワークフローブラウザーを散らかさない」
  として扱い、漏らしてはいけないグラフの保護としては扱わないでください。
</Warning>

## アプリを実行する

実行はフォーム値を保存済みスナップショットにパッチし、結果をキューに入れます。
パッチキーは `"<nodeId>.<widget>"` です — 例: `{"6.text": "a cat",
"3.seed": 42}`。キーは **最初の** ドットだけで分割されるので、ドットを含むウィジェット名
（LoRA スタック、`lora_1.model`）はそのまま残ります。

パッチは **厳密** です: スナップショットに存在しないノードや入力を指すキーは、黙って飛ばす
のではなく即エラーです。ミスはマニフェストがスナップショットからずれていることを意味し、
古い値のまま走るより大きな声で失敗するほうがましです。省略した入力は変換時点の既定を保ちます。

実行は `prompt_id` を返します。ステータス（`pending` → `running` → `done`、ComfyUI が
聞いたことがなければ `unknown`）と、各出力ノードの下にまとめられた出力をポーリングします。

### RunPod ポッドで実行する

パネルの **RunPod で実行** 経路は、同じパッチエンジンを **dry** モードで再利用します:
パネルはパッチ済みプロンプトを *ローカルでキューせず* 求め、ピン留めした依存をポッドへ押し、
代わりにそこでプロンプトをキューします。

<Warning>
  **画像入力** のあるアプリはポッドでは実行を拒否します。アップロードは **ローカル** の
  ComfyUI に着地し、ポッドからは届きません — なのでパネルは、欠落ファイルで失敗する実行を
  キューするより正直に断ります。
</Warning>

## 公開と Explore

パネルの **Explore** タブは公開レジストリです（D1 + R2 を背後にした Cloudflare Worker）。
トレンド / 新着 / スター最多の一覧と検索があります。トレンドは 7 日間の
`stars * 3 + runs` です。公開はバンドル — マニフェスト、プロンプト、隠していなければ
ワークフロー、サムネイル — を sha256 キーの作者アイデンティティの下にアップロードします。

Explore からのインストールは、先に **依存の同意ダイアログ** を出します: アプリの `deps` は
*報告* され、黙ってインストールされることはありません。カードをタップしただけで、リグに
モデルやカスタムノードパックがインストールされることはありません。

<Note>
  `pricing_json` と `hosted_only` はマニフェストスキーマに存在し、そのまま通過しますが、
  読むものはありません。設計のみのマネタイズ段階の場所を予約しています — いま有料アプリの
  挙動はありません。
</Note>

## `apps` MCP ツール

1 つのツールに 5 つのアクション。すべてパネルの Apps API の薄いプロキシです。
**キャンバスなし** の面です: モバイルアプリと直接駆動されるエージェントが使います。
オーケストレーターの `call_tool` ホワイトリストに載っています — `list`/`get`/`run_status`
は読み取り専用で、`run` は `enqueue_workflow` と同じリスク姿勢です
（ユーザーが明示的にタップしたジョブをキューします）。

| アクション                 | 効果                                                                                                               |
| --------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `action:"list"`       | この ComfyUI に登録されたすべてのアプリを一覧 — 各項目は完全なマニフェストに加え `has_workflow` / `has_prompt` / `has_thumbnail`。他のパラメータなし。読み取り専用。 |
| `action:"get"`        | id による 1 アプリのマニフェスト + バンドル事実。`appMode.inputs` が実行フォーム。読み取り専用。                                                    |
| `action:"run"`        | `values` をスナップショットにパッチしてキューする。`prompt_id` を返す。                                                                   |
| `action:"run_status"` | `prompt_id` で 1 実行をポーリング: `status` と実行の出力（出力ノードごとの画像 / 動画ファイル参照、テキスト出力）。読み取り専用。                                  |
| `action:"import"`     | 公開レジストリからこの ComfyUI へアプリをインストールする。                                                                               |

### パラメータ

スキーマ必須のパラメータは `action` だけです — 各アクションが必要な部分集合は違うので、
残りはスキーマ上任意で、不足しているフィールド名をハンドラが言って強制します。

| アクション        | パラメータ          | 型                 | メモ                                      |
| ------------ | -------------- | ----------------- | --------------------------------------- |
| `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` の形の制約は **2 回** 強制されます — スキーマ境界と、ハンドラ内でもう一度 —
id が URL パスに補間されるからです。トラバーサル形の「プロンプト id」は、呼び出し元が
スキーマを迂回しても URL ビルダーに届いてはいけません。

生成されたツールごとのスキーマリファレンスは
[Apps ツール](/docs/docs/tools/apps) を参照してください。

### レジストリからのインポート

`action:"import"` はレジストリバンドルをサーバー側で取得し、ローカルアプリとして作ります。
**レジストリ id がローカル id になる** ので、すでに持っているアプリを再インポートすると
複製ではなく id 衝突を報告します。サムネイルは別のレジストリエンドポイントにあり、別に
取得して転送されるので、インストールしたアプリはカードアートを保ちます。

依存はインストール **されません**。ツールはマニフェストの `deps` を返すので、呼び出し元が
報告し、ユーザーが意図してインストールできます。

<Warning>
  `registry_url` は許可リストであり、自由な URL ではありません。取得は **サーバー上** で
  起きるので、任意 URL は SSRF のプリミティブになります — ループバックや LAN アドレス、
  あるいはそこにリダイレクトする公開 URL。既定の公開レジストリだけが受け付けられ、
  オペレーターが `COMFYUI_MCP_REGISTRY_URLS`（カンマ区切り、開発 / ステージング向け）で
  追加オリジンを許可しない限りそうです。リダイレクトは追わず、その場で拒否されます。
</Warning>

## 制限と検証

実際に当たるもの:

| 制限                | 値          | 場所                                              |
| ----------------- | ---------- | ----------------------------------------------- |
| バンドル / プロンプト JSON | 16 MB      | プロンプトが base64 画像を運べるので、素のグラフより広い                |
| サムネイル             | 5 MB       | 何かを書く **前に** デコードして検証するので、悪いサムネイルが半作成のバンドルを残せない |
| アプリ名              | 120 文字     | 切り詰め                                            |
| 説明                | 4000 文字    | 切り詰め                                            |
| コンボの `choices`    | 200 件      | 切り詰め                                            |
| レジストリ取得           | 16 MB、30 秒 | 宣言された `content-length` **と** 実際のバイトの両方で検査       |

気づく検証:

* **アプリ id は uuid でなければならない。** それ以外はパスが組まれる前に拒否され、
  解決されたバンドルパスはアプリルート配下に収まっているか再検査されます。
* **プロンプトは API 形式でなければならない** — 数値のノード id キー、各ノードは
  `{class_type, inputs}` オブジェクト。UI 形式のグラフは拒否されます。
* **UI ワークフローは `hideWorkflow` が立っていない限り必須。**
* **すでに存在するアプリの作成** は上書きではなく衝突です。
* **部分的なマニフェスト更新は本当に部分的。** アプリの公開や非表示は自分のフィールドだけを
  送り、名前、説明、`appMode` を消しません。
* **未知のマニフェストキーは落とされます**。予約済みの通過フィールドを除き、古いリグは
  理解できないフィールドを失敗せず無視します。

アプリルートは `COMFYUI_MCP_APPS_DIR` で上書きできます（主にテスト用）。既定では
ComfyUI 自身のユーザーディレクトリから導出されるので、ポータブルインストールも生き延びます。

## スマートフォンから

モバイルアプリは本物の **Apps** タブを出荷します — プレビューではありません。半分が 2 つあります:

* **マイアプリ** — リグにインストールされたアプリ。ブリッジ経由で `action:"list"` により
  一覧。タップすると生成された実行フォームが開き、`action:"run"` でキューし、出力が描画
  されるまで 2 秒ごと（上限 30 分）に `action:"run_status"` をポーリングします。
* **Explore** — 公開レジストリ。スマートフォンから **HTTPS で直接** 叩きます
  （ブリッジを経由しないので、ペアリング前でも閲覧できます）。インストールは逆方向:
  リグ自身が `action:"import"` でバンドルを取得します。

これが、チャットにはできずスマートフォンにできるいちばんはっきりしたことです — 本物の
ワークフローを、本物の入力で、どこにもキャンバスを見せずに実行する。

## 関連情報

* [Apps ツール](/docs/docs/tools/apps) — 生成されたツールごとのスキーマリファレンス
* [サイドバーパネル](/docs/docs/ja/panel) — アプリの変換、公開、探索が行われる場所
* [モバイルアプリ](/docs/docs/ja/mobile) — 文脈の中の Apps タブ
* [RunPod ポッド](/docs/docs/tools/runpod) — 「RunPod で実行」経路が対象にするポッド
* [ロードマップ](/docs/docs/ja/roadmap)
