Os bundles vivem no diretório de usuário do ComfyUI em
<user>/comfyui-mcp-panel/apps/<app-id>/ — de propósito não o
diretório de workflows, para um app escondido nunca aparecer no navegador
de workflows.
Há uma implementação de armazenamento e execução — as rotas HTTP do
pacote do painel (
/comfyui_mcp_panel/apps/*). O painel do desktop, a
aba Apps do celular e as ferramentas MCP apps_* são todos clientes
dela, então um app se comporta de forma idêntica de onde você o lançar.Requisitos
Os apps são servidos pelo pacote do painel (comfyui-mcp-panel), não
pelo servidor MCP sozinho. Se o pacote no seu ComfyUI é anterior ao
recurso, apps com action:"list" falha com uma mensagem explícita
“the panel pack on this ComfyUI predates the Apps
feature” — atualize o pacote e reinicie o ComfyUI.
Converter um workflow num app
No painel, o botão Apps da barra de ferramentas (ao lado do Civitai) abre a grade de apps. Converter o workflow aberto faz três coisas:- Importa a config APP-mode do ComfyUI se o workflow já carrega uma,
e caso contrário escolhe entradas e saídas heuristicamente (widgets
de prompt, seeds, configurações de sampler; nós da classe
SaveImagecomo saídas). Entradas APP-mode importadas são honradas em qualquer tipo de nó, então endpoints de nós personalizados sobrevivem à conversão. - Varre as dependências — os modelos e pacotes de nós personalizados
de que o grafo precisa — para
manifest.deps. - Tira um snapshot do prompt no formato API. Os valores dos widgets
no momento da conversão viram o
defaultde formulário de cada entrada.
appMode.inputs carrega nodeId, widget, label, e um
kind de text, number, combo, toggle, image ou model; combos
também carregam choices. É isso que o formulário de execução renderiza
— no desktop e no celular.
Esconder o workflow
hideWorkflow tira o workflow.json do bundle por completo, então o
grafo não é entregue a quem roda ou instala o app.
Rodar um app
Uma execução aplica os seus valores de formulário no snapshot guardado e enfileira o resultado. As chaves de patch são"<nodeId>.<widget>" — por
exemplo {"6.text": "a cat", "3.seed": 42}. A chave parte só no primeiro ponto, então nomes de
widget que eles mesmos contêm pontos (pilhas de LoRA, lora_1.model)
permanecem intactos.
O patch é estrito: uma chave que endereça um nó ou uma entrada que não
existe no snapshot é um erro duro, não um skip silencioso. Um erro
significa que o manifest se descolou do snapshot, e falhar alto vence
rodar com valores velhos. Entradas que você omite mantêm os defaults da
hora da conversão.
A execução devolve um prompt_id; sonde-o para o status (pending →
running → done, ou unknown se o ComfyUI nunca ouviu falar dele) e
para as saídas agrupadas sob cada nó de saída.
Rodar num pod RunPod
O caminho Run on RunPod do painel reusa o mesmo motor de patch em modo dry: o painel pede o prompt aplicado sem enfileirá-lo localmente, empurra quaisquer dependências pinadas para o pod, e enfileira o prompt lá.Publicar e Explorar
A aba Explore do painel é um registro público (um Cloudflare Worker apoiado em D1 + R2) com listagens de em alta / novos / mais estrelados e busca. O trending éstars * 3 + runs em 7 dias. Publicar envia o bundle
— manifest, prompt, workflow a menos que escondido, thumbnail — sob uma
identidade de criador chaveada por sha256.
Instalar a partir de Explore mostra primeiro um diálogo de consentimento
de dependências: as deps de um app são reportadas, nunca instaladas
em silêncio. Nada instala um modelo ou um pacote de nós personalizados na
sua máquina porque você tocou num cartão.
pricing_json e hosted_only existem no schema do manifest e são
passados adiante sem mudança, mas nada os lê. Eles reservam espaço para
uma fase de monetização só de design — não há comportamento de app pago
hoje.A ferramenta MCP apps
Uma ferramenta com cinco ações, todas proxies finos sobre a API Apps do
painel. É a superfície sem canvas: o que o app de celular e um agente
conduzido direto usam. Está na whitelist de call_tool do orquestrador —
list/get/run_status são só leitura, e run carrega a mesma postura
de risco que enqueue_workflow (enfileira um job que o usuário tocou de
propósito).
Parâmetros
action é o único parâmetro exigido pelo schema — cada ação precisa de um
subconjunto diferente, então o resto é opcional no schema e a presença é
imposta pelo handler, que nomeia o campo que está faltando.
A restrição de forma do
prompt_id é imposta duas vezes — na fronteira
do schema e de novo dentro do handler — porque o id é interpolado num
caminho de URL. Um “prompt id” com cara de traversal nunca deve chegar ao
construtor de URL mesmo se um caller desviar do schema.
Para a referência gerada de schema por ferramenta, veja
Ferramentas de Apps.
Importar a partir do registro
action:"import" busca o bundle do registro no lado do servidor e o cria
como um app local. O id do registro vira o id local, então reimportar
um app que você já tem reporta um conflito de id em vez de duplicá-lo. O
thumbnail vive num endpoint separado do registro e é buscado e
encaminhado à parte, então um app instalado mantém a arte do cartão.
As dependências não são instaladas. A ferramenta devolve as deps do
manifest para o caller reportá-las e deixar o usuário instalá-las de
propósito.
Limites e validação
Coisas que você de fato consegue bater:
Validação que você vai notar:
- Ids de app precisam ser uuids. Qualquer outra coisa é rejeitada antes de um caminho ser construído, e o caminho de bundle resolvido é rechecado por contenção sob a raiz de apps.
- Um prompt precisa estar no formato API — chaves de id de nó
numéricas, cada nó um objeto
{class_type, inputs}. Grafos no formato UI são rejeitados. - Um workflow UI é obrigatório a menos que
hideWorkflowesteja definido. - Criar um app que já existe é um conflito, não uma sobrescrita.
- Atualizações parciais de manifest são de fato parciais. Publicar ou
esconder um app envia só os próprios campos e não vai apagar o seu nome,
descrição ou
appMode. - Chaves de manifest desconhecidas são descartadas, exceto os campos reservados de pass-through, então uma máquina mais antiga ignora campos que não entende em vez de falhar.
COMFYUI_MCP_APPS_DIR (principalmente
para testes); por padrão é derivada do próprio diretório de usuário do
ComfyUI, então sobrevive a instalações portáteis.
No celular
O app de celular traz uma aba Apps de verdade — não uma prévia. Tem duas metades:- My Apps — os apps instalados na sua máquina, listados pela ponte via
action:"list". Tocar num abre um formulário de execução gerado, enfileira comaction:"run", e sondaaction:"run_status"a cada 2s (limitado a 30 minutos) até as saídas renderizarem. - Explore — o registro público, acessado direto por HTTPS a partir
do celular (sem salto pela ponte, então navegar funciona antes de você
ter pareado). Instalar vai na outra direção: a máquina busca o bundle
ela mesma via
action:"import".
Veja também
- Ferramentas de Apps — a referência gerada de schema por ferramenta
- Painel lateral — onde os apps são convertidos, publicados e explorados
- App de celular — a aba Apps no contexto
- Pods RunPod — o pod que o caminho “Run on RunPod” mira
- Roadmap