Skip to main content
アプリ は、キャンバスなし でワンクリック実行できるようにパッケージしたワークフローです。 リグ上のディレクトリに 4 つ入ります: バンドルは ComfyUI のユーザーディレクトリ配下 <user>/comfyui-mcp-panel/apps/<app-id>/ に置きます — 意図的にワークフローディレクトリ ではない ので、隠したアプリがワークフローブラウザーに現れません。
アプリが独自の層として存在する理由: すでに信頼しているワークフローを 実行する には、 キャンバスは間違ったインターフェースです。ラベル付き 5 フィールドのフォームが正しいもので、 スマートフォンやエージェントがそもそも操作できる唯一のインターフェースでもあります。
ストレージと実行の実装は 1 つ — パネルパックの HTTP ルート (/comfyui_mcp_panel/apps/*)です。デスクトップパネル、モバイルの Apps タブ、 apps_* MCP ツールはすべてそのクライアントなので、どこから起動してもアプリの挙動は同じです。

要件

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

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

パネルで、Civitai の隣にある Apps ツールバーボタンがアプリグリッドを開きます。 開いているワークフローの変換は 3 つのことをします:
  1. ワークフローがすでに持っていれば ComfyUI の APP モード設定をインポート し、 そうでなければ入力と出力を ヒューリスティック に選びます(プロンプトウィジェット、 シード、サンプラー設定。出力は SaveImage クラスのノード)。インポートした APP モード 入力は 任意の ノードタイプで尊重されるので、カスタムノードのエンドポイントも変換を 生き延びます。
  2. 依存をスキャン — グラフが必要とするモデルとカスタムノードパック — して manifest.deps に入れます。
  3. API 形式で プロンプトをスナップショット します。変換時点のウィジェット値が、 各入力のフォーム default になります。
appMode.inputs の各入力は nodeIdwidgetlabel、および textnumbercombotoggleimagemodel のいずれかの kind を持ちます。コンボは choices も持ちます。 実行フォームはそれだけから描画されます — デスクトップでもモバイルでも。

ワークフローを隠す

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

アプリを実行する

実行はフォーム値を保存済みスナップショットにパッチし、結果をキューに入れます。 パッチキーは "<nodeId>.<widget>" です — 例: {"6.text": "a cat", "3.seed": 42}。キーは 最初の ドットだけで分割されるので、ドットを含むウィジェット名 (LoRA スタック、lora_1.model)はそのまま残ります。 パッチは 厳密 です: スナップショットに存在しないノードや入力を指すキーは、黙って飛ばす のではなく即エラーです。ミスはマニフェストがスナップショットからずれていることを意味し、 古い値のまま走るより大きな声で失敗するほうがましです。省略した入力は変換時点の既定を保ちます。 実行は prompt_id を返します。ステータス(pendingrunningdone、ComfyUI が 聞いたことがなければ unknown)と、各出力ノードの下にまとめられた出力をポーリングします。

RunPod ポッドで実行する

パネルの RunPod で実行 経路は、同じパッチエンジンを dry モードで再利用します: パネルはパッチ済みプロンプトを ローカルでキューせず 求め、ピン留めした依存をポッドへ押し、 代わりにそこでプロンプトをキューします。
画像入力 のあるアプリはポッドでは実行を拒否します。アップロードは ローカル の ComfyUI に着地し、ポッドからは届きません — なのでパネルは、欠落ファイルで失敗する実行を キューするより正直に断ります。

公開と Explore

パネルの Explore タブは公開レジストリです(D1 + R2 を背後にした Cloudflare Worker)。 トレンド / 新着 / スター最多の一覧と検索があります。トレンドは 7 日間の stars * 3 + runs です。公開はバンドル — マニフェスト、プロンプト、隠していなければ ワークフロー、サムネイル — を sha256 キーの作者アイデンティティの下にアップロードします。 Explore からのインストールは、先に 依存の同意ダイアログ を出します: アプリの deps報告 され、黙ってインストールされることはありません。カードをタップしただけで、リグに モデルやカスタムノードパックがインストールされることはありません。
pricing_jsonhosted_only はマニフェストスキーマに存在し、そのまま通過しますが、 読むものはありません。設計のみのマネタイズ段階の場所を予約しています — いま有料アプリの 挙動はありません。

apps MCP ツール

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

パラメータ

スキーマ必須のパラメータは action だけです — 各アクションが必要な部分集合は違うので、 残りはスキーマ上任意で、不足しているフィールド名をハンドラが言って強制します。 prompt_id の形の制約は 2 回 強制されます — スキーマ境界と、ハンドラ内でもう一度 — id が URL パスに補間されるからです。トラバーサル形の「プロンプト id」は、呼び出し元が スキーマを迂回しても URL ビルダーに届いてはいけません。 生成されたツールごとのスキーマリファレンスは Apps ツール を参照してください。

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

action:"import" はレジストリバンドルをサーバー側で取得し、ローカルアプリとして作ります。 レジストリ id がローカル id になる ので、すでに持っているアプリを再インポートすると 複製ではなく id 衝突を報告します。サムネイルは別のレジストリエンドポイントにあり、別に 取得して転送されるので、インストールしたアプリはカードアートを保ちます。 依存はインストール されません。ツールはマニフェストの deps を返すので、呼び出し元が 報告し、ユーザーが意図してインストールできます。
registry_url は許可リストであり、自由な URL ではありません。取得は サーバー上 で 起きるので、任意 URL は SSRF のプリミティブになります — ループバックや LAN アドレス、 あるいはそこにリダイレクトする公開 URL。既定の公開レジストリだけが受け付けられ、 オペレーターが COMFYUI_MCP_REGISTRY_URLS(カンマ区切り、開発 / ステージング向け)で 追加オリジンを許可しない限りそうです。リダイレクトは追わず、その場で拒否されます。

制限と検証

実際に当たるもの: 気づく検証:
  • アプリ 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" でバンドルを取得します。
これが、チャットにはできずスマートフォンにできるいちばんはっきりしたことです — 本物の ワークフローを、本物の入力で、どこにもキャンバスを見せずに実行する。

関連情報