Esta é exatamente a superfície em que o app de celular é construído. Se
você consegue abrir um WebSocket e enviar JSON, você consegue construir um
host.
Como funciona
1
O desktop já está escutando
Quando o Painel do Agente está aberto, o orquestrador roda um listener
de pareamento protegido por token na LAN (veja Endpoints).
Cada aba aberta do painel é uma aba de desktop com um
tab_id estável
e uma sessão de agente ao vivo.2
O seu host se conecta com o token de pareamento
Abra um WebSocket para a URL de pareamento com o token na query string.
Sem um token válido a conexão é recusada — o pareamento é a fronteira de
segurança inteira.
3
Liste e ligue-se a uma aba
Envie
list_tabs para descobrir as abas de desktop abertas, depois
attach_tab para espelhar uma. O seu host agora recebe a atividade
dessa aba (em stream) e pode conduzi-la.4
Conduza a sessão compartilhada
Envie frames
user_message. Enquanto ligado, o servidor os roteia para a
aba espelhada — então a sua mensagem entra na mesma conversa em que
o agente do desktop está. É isso que faz ser “um agente, contexto
compartilhado” em vez de uma segunda sessão.Endpoints
O listener de pareamento é derivado da porta da ponte (COMFYUI_MCP_BRIDGE_PORT, padrão 9180):
URL de pareamento:
- O token é ou pinado pelo usuário via
COMFYUI_MCP_PAIR_TOKEN(pareamento sempre ligado) ou cunhado por sessão e entregue pelo fluxo de QR / pareamento do painel. O seu host o obtém do mesmo jeito que o app de celular: o usuário pareia uma vez. - Restrito à LAN por padrão, mas a exposição pública está embutida
quando o usuário pede: o modal de pareamento do painel oferece um modo
Internet que abre um túnel rápido criptografado do cloudflared, e
empresas podem roteá-lo por um relay auto-hospedado
(
COMFYUI_MCP_TUNNEL_BACKEND=relay). O token protege de qualquer jeito.
Formas das mensagens
Todos os frames são objetos JSON com umtype. Frames de
requisição/resposta carregam um cid (id de correlação) que você
escolhe, ecoado de volta na resposta correspondente.
Entrada — host → orquestrador
Qualquer outro evento de painel que você envie enquanto ligado é
igualmente roteado para a aba espelhada.
Saída — orquestrador → host
Mais a atividade ao vivo do agente da aba espelhada (respostas em stream,
status, cartões), que o seu host renderiza.
Invariantes de segurança — um host DEVE preservar estes
Estas são as garantias que tornam o pareamento seguro. Construir um host que as respeita é o contrato inteiro; um host que tenta desviá-las é exatamente o que o listener foi desenhado para rejeitar.Preservar isto não é uma restrição sobre o seu host — é o recurso. Elas
impedem um cliente de sequestrar uma sessão com a qual nunca se pareou.
- Portão de token. O listener recusa qualquer conexão sem um token de
pareamento válido (
verifyClient). Nunca construa um fluxo que envie ou embuta o token automaticamente — o usuário pareia, uma vez, de propósito. - Carimbo autoritativo de
attach_tab. O servidor, não o cliente, decide qual aba os seus frames miram. Não se apoie numtab_idfornecido pelo cliente para o roteamento; ligue primeiro, depois envie. - Só alvos não headless. Você pode se ligar a uma aba real de desktop, nunca a outro cliente headless (você não consegue espelhar outro celular/host).
- Uma aba por vez. Ligar-se a B derruba a sua inscrição em A. Modele um único espelho ativo por conexão.
- Tipo de socket pinado. O tipo de uma conexão (headless vs desktop)
é fixado no primeiro
hello; não tente virá-lo para escapar das proteções de takeover.
Cliente de referência mínimo
Ensine um LLM a construir o seu adapter
Cole o prompt abaixo no Claude, no ChatGPT, ou no seu agente de código para ele escorar um adapter de host para a sua plataforma. Ele carrega o contrato completo do protocolo, então o modelo não precisa chutar.Copy this into your LLM
Registre a sua integração
Construiu alguma coisa? Registre para poder ser listada e para podermos avisar você de mudanças de protocolo antes de saírem:Registrar um host de terceiros
Abra o template de registro no GitHub — nome, plataforma, repo, e contra
qual versão do protocolo você construiu.
Estabilidade: os frames acima são o que o app de celular sai usando,
mas isto ainda não é um contrato congelado e versionado — leia o código
(
src/services/ui-bridge.ts)
como a autoridade, e registre o seu host para ser avisado quando as formas
se moverem.