バンドルは ComfyUI のユーザーディレクトリ配下
<user>/comfyui-mcp-panel/apps/<app-id>/ に置きます — 意図的にワークフローディレクトリ
ではない ので、隠したアプリがワークフローブラウザーに現れません。
ストレージと実行の実装は 1 つ — パネルパックの HTTP ルート
(
/comfyui_mcp_panel/apps/*)です。デスクトップパネル、モバイルの Apps タブ、
apps_* MCP ツールはすべてそのクライアントなので、どこから起動してもアプリの挙動は同じです。要件
アプリは MCP サーバー単体ではなく、パネルパック(comfyui-mcp-panel)が提供します。
ComfyUI 上のパックがこの機能より古いと、apps の action:"list" は明示的な
「この ComfyUI 上のパネルパックは Apps 機能より古い」 メッセージで失敗します —
パックを更新して ComfyUI を再起動してください。
ワークフローをアプリに変換する
パネルで、Civitai の隣にある Apps ツールバーボタンがアプリグリッドを開きます。 開いているワークフローの変換は 3 つのことをします:- ワークフローがすでに持っていれば ComfyUI の APP モード設定をインポート し、
そうでなければ入力と出力を ヒューリスティック に選びます(プロンプトウィジェット、
シード、サンプラー設定。出力は
SaveImageクラスのノード)。インポートした APP モード 入力は 任意の ノードタイプで尊重されるので、カスタムノードのエンドポイントも変換を 生き延びます。 - 依存をスキャン — グラフが必要とするモデルとカスタムノードパック — して
manifest.depsに入れます。 - API 形式で プロンプトをスナップショット します。変換時点のウィジェット値が、
各入力のフォーム
defaultになります。
appMode.inputs の各入力は nodeId、widget、label、および text、number、combo、
toggle、image、model のいずれかの kind を持ちます。コンボは 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 ポッドで実行する
パネルの RunPod で実行 経路は、同じパッチエンジンを dry モードで再利用します: パネルはパッチ済みプロンプトを ローカルでキューせず 求め、ピン留めした依存をポッドへ押し、 代わりにそこでプロンプトをキューします。公開と Explore
パネルの Explore タブは公開レジストリです(D1 + R2 を背後にした Cloudflare Worker)。 トレンド / 新着 / スター最多の一覧と検索があります。トレンドは 7 日間のstars * 3 + runs です。公開はバンドル — マニフェスト、プロンプト、隠していなければ
ワークフロー、サムネイル — を sha256 キーの作者アイデンティティの下にアップロードします。
Explore からのインストールは、先に 依存の同意ダイアログ を出します: アプリの deps は
報告 され、黙ってインストールされることはありません。カードをタップしただけで、リグに
モデルやカスタムノードパックがインストールされることはありません。
pricing_json と hosted_only はマニフェストスキーマに存在し、そのまま通過しますが、
読むものはありません。設計のみのマネタイズ段階の場所を予約しています — いま有料アプリの
挙動はありません。apps MCP ツール
1 つのツールに 5 つのアクション。すべてパネルの Apps API の薄いプロキシです。
キャンバスなし の面です: モバイルアプリと直接駆動されるエージェントが使います。
オーケストレーターの call_tool ホワイトリストに載っています — list/get/run_status
は読み取り専用で、run は enqueue_workflow と同じリスク姿勢です
(ユーザーが明示的にタップしたジョブをキューします)。
パラメータ
スキーマ必須のパラメータはaction だけです — 各アクションが必要な部分集合は違うので、
残りはスキーマ上任意で、不足しているフィールド名をハンドラが言って強制します。
prompt_id の形の制約は 2 回 強制されます — スキーマ境界と、ハンドラ内でもう一度 —
id が URL パスに補間されるからです。トラバーサル形の「プロンプト id」は、呼び出し元が
スキーマを迂回しても URL ビルダーに届いてはいけません。
生成されたツールごとのスキーマリファレンスは
Apps ツール を参照してください。
レジストリからのインポート
action:"import" はレジストリバンドルをサーバー側で取得し、ローカルアプリとして作ります。
レジストリ id がローカル id になる ので、すでに持っているアプリを再インポートすると
複製ではなく id 衝突を報告します。サムネイルは別のレジストリエンドポイントにあり、別に
取得して転送されるので、インストールしたアプリはカードアートを保ちます。
依存はインストール されません。ツールはマニフェストの deps を返すので、呼び出し元が
報告し、ユーザーが意図してインストールできます。
制限と検証
実際に当たるもの:
気づく検証:
- アプリ 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 ツール — 生成されたツールごとのスキーマリファレンス
- サイドバーパネル — アプリの変換、公開、探索が行われる場所
- モバイルアプリ — 文脈の中の Apps タブ
- RunPod ポッド — 「RunPod で実行」経路が対象にするポッド
- ロードマップ