← 返回作品集

firefox-bridge

讓 AI 跟你看同一個畫面——MCP server + Firefox 擴充套件,接手你本人已經登入的那個分頁。

JavaScript MCP Firefox WebExtension Native Messaging 33 tools MIT

AI 教你的步驟,跟你眼前的畫面對不上

你問 AI「這個系統怎麼改這個設定」,它給你五個步驟。第三步那個按鈕不在那裡。

它不是在亂講。它講的可能是另一個版本、另一套佈景主題、或者是它從文件上讀來的通用流程。更常見的情況是:你們公司那套系統,它根本沒看過——那是十年前導入的 ERP,網路上沒有教學,官方文件鎖在客戶入口網裡。

於是你開始截圖。貼一張,它回三句,你再貼一張。你花在搬運畫面的時間,比它省下的還多。

問題的根不在它笨。是它沒看到你的畫面。

現有的工具,開的都不是你的瀏覽器

要讓 AI 看到網頁,現成的路有好幾條——WebFetch 直接抓 HTML、headless 瀏覽器渲染完再抓、Playwright 開一個乾淨 profile 跑自動化。它們有個共同點,而這個共同點在企業內部系統面前是致命的:

它們開的都是全新的、乾淨的瀏覽器。沒有 session cookie,沒有 SSO 憑證,沒有 MFA 通過的紀錄。所以它們看到的內部系統,永遠只有登入頁那一張。

firefox-bridge 反過來做。它不開新瀏覽器——它接手你已經開著、已經登入的那個分頁。架構上分三段:一個 MCP server 講 MCP 協定給 AI 聽,一個 native messaging host 當管道,一個 Firefox 擴充套件真正在你的瀏覽器裡動手。

AI Agent Claude Code / 任何 MCP client MCP firefox-bridge MCP server native messaging Firefox 擴充套件 你本人的分頁 已經登入 · 帶著 container 身分 · 就在你眼前 全程在本機。沒有雲端 VM,沒有第二個瀏覽器。

lease:誰在操作是明確的

既然動的是你真的在用的瀏覽器,「現在誰在碰這個分頁」就必須講清楚。所以每個分頁都要先租用:acquire_tab 取得、release_tab 交還,list_tabs 會顯示每個分頁的 leasedBy

這原本只是多 session 的衛生措施——兩個 AI session 不該同時操作同一個分頁。後來才發現它剛好是別的東西,這篇後半會回來講。

33 個工具

分類工具
分頁租借list_tabs acquire_tab release_tab close_tab discard_tab open_private_window
導覽navigate go_back go_forward scroll_to
讀取read_page read_article list_elements list_frames screenshot
互動click type hover press_key drag_and_drop upload_file
等待wait_for
觀測start_console get_console start_network get_network
身分list_containers create_container
書籤與歷史list_bookmarks add_bookmark search_bookmarks search_history to_be_deleted

清單本身不是重點,挑三個講為什麼它們在這裡:

AI 把自己寫掉的地方:combo script

同一個 repo 裡還有第二台 MCP server,firefox-bridge-bot。它不是主 server 的功能,是獨立註冊的另一台,而它做的事乍看很窄、其實是整個專案的重點。

它是一個 script 載入器。開機時掃 scripts/ 目錄,每個檔案匯出的 name / description / inputSchema 直接註冊成一支 MCP 工具,而 script 拿到的是一條通往同一個 Firefox 的通用通道。

// firefox-bridge-bot/index.js
for (const script of await loadScripts()) {
server.registerTool(
script.name,
{ description: script.description, inputSchema: script.inputSchema },
async (input) => { /* 跑完整支流程,中途沒有 AI 判斷 */ }
);
}
// 丟一個檔案進 scripts/ ,就多一支 MCP 工具。

所以 script 能做的事 = bridge 能做的事全集。typeclickupload_file 都在裡面——填表、上傳、跑完一整趟流程都可以,不是只能讀

目前附的只有一支:read_url_fast,一次讀最多 10 個網址。它開拋棄式私密視窗、讀完就關、走 Firefox 自己的 Reader View 抽文——但那是這支 script 的選擇,不是機制的限制。要常駐、要留在既有視窗、要填完表單不關掉,都只是另一支 script 的事。

這支 script 的實測數字(工具自報 durationMs,不含模型往返):

8,762ms
3 頁,循序(concurrency:1
2,737ms
3 頁,並發
3,270ms
5 頁,並發

5 頁跟 3 頁幾乎一樣快——牆鐘時間由最慢那一頁決定,加頁數幾乎不加成本。(循序那組是在並發之後才跑的,快取已暖、條件對它有利,仍然慢三倍,所以不是量測順序造成的偏差。)

要誠實講一件事:這省的是時間,不是 token。並發只縮短牆鐘時間,工具呼叫次數一次都沒少。真正省 token 的是「批次」——10 個網址壓成 1 次呼叫,省掉的是 19 輪模型往返,每一輪都要重送一次上下文。這兩件事常被混為一談。

還缺的一塊:工具端沒有篩選參數。能傳一個關鍵字只回符合的段落,才會真的動到 token 這一項。

這正是對 microsoft/skill-recorder 的回答

微軟 2026 年 8 月開源了 skill-recorder:錄下人的桌面操作,讓 Copilot CLI 事後看錄影反推意圖,產出一份 SKILL.md 給下一次的 AI 讀。

它為什麼需要「人示範、AI 事後看」?因為 Copilot 碰不到那個畫面。錄製不是設計上的偏好,是搆不到的情況下的變通。

firefox-bridge 沒有這個限制,所以它不需要 record mode。AI 自己動手試,當場就知道哪一步成功、哪一步跳出確認框、哪個欄位其實不用填——這些是錄影事後回放猜不出來的。試通了之後,把成功那條路徑寫成一支 script,放進 scripts/,它就是一支永久的工具。

AI 用 firefox-bridge 一步一步試,直到走通 把成功那條路徑寫成 script,放進 scripts/ 它就是一支新的 MCP 工具 之後執行沒有 AI 判斷,也不再付 AI 的錢
誰示範產出物下次執行要 AI 嗎
Skill Recorder人錄螢幕SKILL.md,給 AI 讀的說明
Copilot Studio
computer use
沒人,雲端 VM 看畫面點滑鼠無,每次重看重點每次都要
firefox-bridge
+ bot
AI 自己試可執行的 script不要

差別最後會落在帳單上:computer use 的 AI 是每次執行都要付的通行費,這裡的 AI 是一次性的顧問費

你幫我,我幫你

但 AI 不是每一步都做得到。而有趣的是,兩邊卡住的地方剛好互補

錄影解不了這個,因為回放的時候人不在,不能插話。computer use 更解不了,因為人根本不在場,卡住就是卡住。只有共處同一個分頁,才有「換你」這個動作。

2026-08-07 實際跑了一次。用 open_private_window 開一個乾淨的私密視窗(沒有任何既有 session)連 Outlook:

# AI:開私密視窗連 outlook.office.com/mail/
→ 被丟到 login.microsoftonline.com
→ 畫面上只有:email 欄、password 欄、Next
→ 停。
# 不是點不動——selector 拿得到,type 也打得進去。
# 是要打進去的東西不該由 AI 擁有,
# 而下一關的推播寄到人的手機,那台裝置不在它的操作範圍裡。
release_tab(160) # 分頁交還,這個視窗現在是人的
# ……人自己登入、自己過 MFA……
acquire_tab(160) # 接回同一個分頁
→ tabId 160、windowId 2929 都沒變
→ 標題已經是「郵件 - Outlook」
→ 沒有重新導覽、沒有重跑、沒有從首頁摸回去

然後在同一個私密視窗裡開另一個服務 admin.microsoft.com——不同 host、不同產品——直接落在 Microsoft 365 admin center 首頁,沒有再出現任何登入畫面

人做的那一次交接,付清的是整個 tenant

這是乾淨 profile 永遠拿不到的東西:它連第一個服務都進不去,遑論第二個免費。而這裡人只動手一次,之後 AI 在那個視窗裡走到哪、SSO 就跟到哪。

反過來說也成立:那個視窗現在等於管理主控台的操作權。所以 lease 模型跟「什麼時候關由人決定」這個姿態不是多餘的儀式——誰在操作是明確的,而收回權限只是關掉一個視窗。

雙向都成立。AI → 人:走到第七步遇到 MFA,停下來說「推播寄到你手機了」,人按完,AI 接回去繼續,狀態還在那個分頁裡。人 → AI:人自己點到那個藏很深的頁面,然後說「就是這裡,以後每個月幫我做一次」——AI 不必從首頁摸索,它看得到的就是你眼前這一頁。

這就是帶新人的形狀,而且可以中途修正:「那個欄位不用填」「那個是測試環境,換另一個」。

沒有 API 的系統,畫面就是 API

把前面兩段接起來,會得到一個比「瀏覽器自動化工具」大一點的東西。

企業內部系統最常見的狀態是:有畫面,沒有 API。或者有 API 但要另外付費、要走採購、要等原廠排程。而畫面是唯一保證存在、而且不會被拿掉的介面——一整層樓的人靠它上班,廠商可以不給你 API,但不能不給你畫面。

UI 還有一個被低估的好處:它壞掉的時候很吵。系統改版當天使用者就會哀嚎,你當天就知道要修。API 悄悄改了一個欄位的型別,可能三個月後對帳才發現。

所以一條合理的路徑是四階,而且終點是 AI 把自己移除:

1 AI 摸索 貴、慢,但零先備知識——沒有文件也能開始 2 AI 照 script 走 省掉摸索,AI 還在但只做判斷 3 腳本驅動 extension——沒有 AI,還在瀏覽器裡 認證免費(session 就在那個 profile 裡)。常常是終點,不是過渡。 4 直接呼叫 API 最快,但認證要自己扛:SSO / MFA / session-bound token,常讓這階不值得 往下走一階,AI 的參與就少一分——終局是它把自己移除。

第三階不需要任何新東西。MCP 說到底只是 JSON-RPC,一支腳本就可以當 MCP client,跟 LLM 一點關係都沒有。那 33 個工具現在就是一組腳本 API。

它讀起來很像 Playwright。差別只有一個,但那個差別決定一切:Playwright 開乾淨 profile,永遠登不進去。「有登入狀態的瀏覽器自動化」這個東西,市面上其實不存在。

這件事本質上是 RPA 的老命題。不同的是前置成本——摸清流程、寫 selector、維護改版——那一塊被 AI 吃掉了。不是 AI 取代了自動化,是 AI 把自動化的門檻拆掉了。

限制

常見問題

它操作的是我真的在用的瀏覽器,我的密碼會被 AI 看到嗎?

不會,而且不是靠事後過濾,是在擴充套件那一側就不存在。passwordhiddenfile 三種 input 的值整個 key 都不會出現——不是空字串,是那個欄位不存在。上面那趟 Outlook 實測剛好把它演出來,同一次回應裡相鄰的兩筆:

{"tag":"input","type":"email", "state":{"value":"","disabled":false,"readonly":false}}
{"tag":"input","type":"password", "state":{ "disabled":false,"readonly":false}}

型別比對不分大小寫(type="PASSWORD" 也擋),text 標籤組字也一併排除。

網路觀測那一側更徹底:get_network 只掛 onCompleted,只收 url、method、statusCode、type、timeStamp。要拿到 request body 必須明確去要 requestBody,headers 同理,兩者都沒做——帳密在架構上進不來,不是靠過濾擋住

殘留的風險講明白:url 是完整記錄的,所以憑證放在 query string 裡的情況(?token=?api_key=)仍然會整條進去。

跟 Playwright / Puppeteer 差在哪?

Playwright 開的是全新的乾淨 profile,沒有你的 session cookie、沒有 SSO 憑證、沒有 container 身分。對公開網站兩者可以互換,對需要登入的內部系統,Playwright 看到的永遠是登入頁。firefox-bridge 不開瀏覽器,它接手你已經開著的那個。

Chrome 跟 Edge 都內建 AI 了,還需要這個嗎?

它們做的是另一件事。那是瀏覽器廠商的 AI,不是你的 AI。

Chrome 的 Built-in AI 把 Gemini Nano 包成一組給網頁開發者呼叫的 API(Writer、Rewriter、Translator、Summarizer、Prompt)——受益的是網站,不是你的 agent。Edge 走得更遠:2026 年 5 月 20 日起在 Edge for Business 開放 agentic browsing 限定預覽,Copilot 可以導覽網頁、填表、跑多步流程,但範圍必須是 IT 政策核准過的網站。

共同點是:模型是廠商綁定的,能力邊界是廠商定的,開放到哪也是廠商決定的。你換不掉那個模型,也不能叫它去做廠商沒開放的事。

firefox-bridge 的方向相反——模型你自己選(任何 MCP client 都能接),協定是開放的,全部跑在本機。它不是「瀏覽器裡多了一個 AI」,是你的 agent 拿到了一個瀏覽器

Mozilla 的立場剛好站在另一邊,而且他們自己寫得很直白:「在 Firefox 裡,你永遠不會被鎖進單一生態系,也不會被迫在瀏覽時使用 AI。」他們對 AI 公司做的瀏覽器的批評是——那些產品逼你二選一:要嘛一直用 AI,要嘛完全不用;而且是把你困在對話迴圈裡,而不是把你帶向更廣的網路。

要公允的話,有兩件事得補上。第一,Firefox 自己也內建了 AI(側邊欄聊天機器人、分頁分組、連結預覽、PDF 替代文字),所以這不是「不做 AI」,是「AI 預設不來煩你」。第二,那個能一次關掉全部 AI 功能的總開關,是 2026 年初使用者反彈之後才承諾、在 Firefox 148(2026-02-24)才推出的——不是一開始就有。

但對這個專案來說,那個立場剛好是對的地基:firefox-bridge 需要的正是一個不替你決定該用哪個 AI 的瀏覽器。

兩者也不互斥。你大可以在 Edge 裡用 Copilot 做它擅長的事,同時讓自己的 agent 在 Firefox 裡跑那條沒人會替你做的內部系統流程。

怎麼安裝?

從 GitHub Releases 下載簽章過的 .xpi(每個 release 都附 .sha256),加上 MCP server 與 native host 三段各自設定,步驟在 repo 的 README。

還沒上架 Firefox Add-ons(AMO),這是刻意的。要等下一版把 WebMCP 做完才會考慮送審——現在送出去的會是一個還沒定型的介面。

是開源的嗎?可以商用嗎?

MIT 授權,可以。原始碼在 github.com/raychao-oao/firefox-bridge,第三方套件授權另列在 THIRD_PARTY_LICENSES.md

為什麼是 Firefox,不是 Chrome?

Chrome 那邊已經有 claude-in-chrome,Firefox 沒有對應的東西。而 Firefox 有兩樣 Chrome 給不了的,剛好都打在這件事的要害上:

Multi-Account Containers——同一個瀏覽器同時掛著多重身分,公司帳號跟個人帳號可以並存在線,AI 得指定用哪一個。這是 Firefox 獨有的。

好讀模式(Reader View)——Firefox 把它內建在瀏覽器裡,而且開放給擴充套件用。所以 read_articleread_url_fast 的抽文是直接跟瀏覽器要現成的結果,不用自己塞一份 parser 進來、也不用維護它。

當然,也可能純粹是愛好小動物。

相關專案

GitHub →
← 返回作品集