這正是手機 App 建在上面的那一面。只要你能開啟 WebSocket 並發送 JSON,就能構建主機。
運作原理
1
桌面已經在聽
代理面板開啟時,協調器會在區域網上跑一個權杖把門的配對監聽器(請看
端點)。每個開啟的面板分頁都是一個帶穩定
tab_id 和即時代理工作階段的
桌面分頁。2
你的主機帶著配對權杖連線
用查詢字串裡的權杖開啟到配對 URL 的 WebSocket。沒有有效權杖,連線會被拒絕 ——
配對就是整條安全邊界。
3
列出並附著到一個分頁
傳送
list_tabs 發現開啟的桌面分頁,再發 attach_tab 鏡像其中一個。你的主機現在
接收那個分頁的活動(流式),並且可以驅動它。4
驅動共享工作階段
傳送
user_message 幀。附著期間,伺服器把它們路由到被鏡像的分頁 —— 於是你的
訊息進入桌面代理所在的同一段對話。這才是「一個代理、共享上下文」,而不是第二個
工作階段。端點
配對監聽器從橋接連接埠派生(COMFYUI_MCP_BRIDGE_PORT,預設 9180):
配對 URL:
- 權杖要麼由使用者透過
COMFYUI_MCP_PAIR_TOKEN釘死(始終開啟配對),要麼按工作階段 鑄造並透過面板的二維碼 / 配對流程發出。你的主機拿到它的方式和手機 App 一樣: 使用者配對一次。 - 預設綁在區域網上,但使用者要求時也內建了公網暴露:面板的配對對話框提供
Internet 模式,開啟一條加密的 cloudflared 快速通道;企業也可以把它走自架中繼
(
COMFYUI_MCP_TUNNEL_BACKEND=relay)。無論哪種,權杖都把門。
訊息形狀
所有幀都是帶type 的 JSON 物件。請求 / 響應幀攜帶一個你自己選的 cid(關聯 id),
在對應回覆上原樣回顯。
入站 —— 主機 → 協調器
附著期間你傳送的任何其他面板事件,同樣會路由到被鏡像的分頁。
出站 —— 協調器 → 主機
再加上被鏡像分頁的即時代理活動(流式回覆、狀態、卡片),由你的主機來算圖。
安全不變量 —— 主機必須守住這些
這些保證讓配對是安全的。構建一個尊重它們的主機就是整份合約;試圖繞過它們的主機,正是 監聽器設計來拒絕的東西。守住這些不是對你主機的約束 —— 它就是功能本身。它們擋下用戶端劫持它從未配對過的
工作階段。
- 權杖門。 監聽器拒絕任何沒有有效配對權杖的連線(
verifyClient)。永遠不要做 自動下發或內嵌權杖的流程 —— 使用者配對,一次,故意的。 - 權威的
attach_tab蓋戳。 決定你的幀打向哪個分頁的是伺服器,不是用戶端。 不要相依用戶端提供的tab_id做路由;先附著,再發送。 - 只允許非無頭目標。 你可以附著到真實桌面分頁,永遠不能附著到另一個無頭用戶端 (你不能映像檔另一部手機 / 主機)。
- 一次一個分頁。 附著到 B 會丟掉你對 A 的訂閱。按每個連線一個活動鏡像來建模。
- 釘死的通訊端種類。 連線的種類(無頭 vs 桌面)在第一次
hello時固定;不要試圖 翻轉它來逃過接管護欄。
最小參考用戶端
教 LLM 構建你的轉接器
把下面的提示粘進 Claude、ChatGPT 或你的編碼代理,讓它為你的平台搭一份主機轉接器 腳手架。它帶著完整的協定合約,模型不用猜。Copy this into your LLM
登記你的整合
做出了什麼?登記它,這樣它可以被列出,我們也能在協定變更發貨前通知你:登記第三方主機
在 GitHub 上開啟登記模板 —— 名稱、平台、儲存庫,以及你對照構建的協定版本。
穩定性: 上面的幀是手機 App 發貨時用的,但這還不是一份凍結、帶版本的合約 ——
以原始碼(
src/services/ui-bridge.ts)
為準,並登記你的主機,形狀變動時你會收到通知。