我在直播上說沒人會用 WebMCP,十三天後 ChatGPT 打臉了

8/12 我親口講「目前沒有任何主流的 agent 產品真的在呼叫這個 API」。8/25 OpenAI 就把 WebMCP 接進 ChatGPT 桌面版的內建瀏覽器。今天我把 LINE 對話製造機丟進去實測,順便學到一件事:AI 說它呼叫了工具,不算證據。

ChatGPT 桌面版的內建瀏覽器呼叫 LINE 對話製造機註冊的工具

8 月 12 日那場直播,我講了一句現在看起來很好笑的話。

那頁投影片的標題是「誠實的界線」,我怕大家聽完以為裝了瀏覽器就有 AI 幫你操作網頁,所以特地擺了一頁潑冷水。第三條界線我是這樣講的:

目前沒有任何主流的 agent 產品真的在呼叫這個 API。

十三天後,OpenAI 宣布 ChatGPT 桌面版的內建瀏覽器支援 WebMCP。

先講 WebMCP 是什麼

一句話:網頁可以主動把自己的功能公開成工具,讓 AI 直接呼叫,不用再去猜你的按鈕長怎樣。

以前 agent 要操作一個網頁,得自己找元素、模擬點擊、猜狀態存在哪,你改個版它就壞了。現在它可以問這一頁「你有哪些工具」,拿到名稱跟參數格式,然後直接呼叫。對做網頁的人來說,這等於把「agent 可以怎麼操作我」從逆向工程變成一份公開合約。

這篇是寫給做網頁的人看的。如果你手上有一個站,這件事影響的是「你要不要現在就花半天,把站內已經寫好的功能公開出去」。我的答案往下看。

我為什麼有資格被打臉

LINE 對話製造機(https://yazelin.github.io/line-chat-maker/)站內有一顆 AI,它有四個工具:讀腳本、改腳本、加訊息、匯出 PNG。這四個工具的定義只寫了一份,同時給兩個地方用:一邊給站內那顆 AI 當工具表,另一邊註冊給瀏覽器。

所以 8/25 那則公告出來的時候,我手上剛好有一個已經註冊好工具的站,當天就能拿來試。

第一件試出來的事,是我差點死在一行 code 上。

救我的是 8/10 那個 commit

先看實測結果。我在 ChatGPT 桌面版的內建瀏覽器開啟那一頁,然後從外面問這個頁面兩個問題:

document.modelContext  → object
navigator.modelContext → undefined

navigator 那個是 undefined。

而我 8/12 的投影片上寫的、README 上寫的、直播現場敲進 Console 給大家看的,全部都是 navigator.modelContext。如果程式碼照著投影片寫,今天在 ChatGPT 裡就是完全叫不動,而且不會有任何錯誤訊息,只會安靜地什麼都沒有。

活下來是因為兩天前的一個 commit:

cdb20be 2026-08-10 fix(webmcp): 優先註冊到 document.modelContext

ai.js 裡實際跑的是 document.modelContext || navigator.modelContext,先找 document,找不到才退回 navigator。我當時改它的理由很無聊,只是看到規格把 API 從 navigator 搬到 document,覺得兩個都接一下比較保險。十五天後這個順序決定了這一頁在 ChatGPT 裡是活的還是死的。

我不想把這件事說成「我很有遠見」。真相是規格還在動的東西,兩邊都接、把新的擺前面,成本是一行,賭錯的代價是整條路徑靜默死掉。這種賠率不用想。

它真的動了

叫工具的部分我沒有手動點,是用 CDP 從外面驅動整個桌面版跑完的,所以每一步都有紀錄。

第一步先確認四個工具讀得到:

["get_script", "apply_script", "append_messages", "export_png"]

然後我打了一句人話給它:「右邊瀏覽器開著 LINE 對話製造機,請用那一頁提供的工具,在對話最後加一則我說的訊息,內容是『今天雨好大』。」

56 秒後它回「已在對話最後加入一則你說的訊息」。畫面上那則綠泡泡真的長出來了,訊息列數從 19 變成 20。

對話最後那則綠泡泡「今天雨好大」是 ChatGPT 加上去的

但這樣還不算證明

它的思考紀錄展開來只有一行:「已使用 瀏覽器 已載入工具」。

載入工具跟呼叫工具是兩件事。而且它前面那句話講得更可疑:「我會用瀏覽器操作技能」。如果它其實是自己去點 DOM、把字打進輸入框、按下送出,畫面一樣會多一則訊息,結果看起來一模一樣,但那跟 WebMCP 一點關係都沒有,只是傳統的模擬點擊。

這正好是我 8/12 在同一場直播裡講過的坑的反面。那天我講的是「工具回成功,不等於使用者看得到」;今天遇到的是「使用者看得到,不等於工具被呼叫過」。同一件事的兩個方向,都是驗收 agent 最容易放過的地方。

所以要一個決定性的證據。做法是在那一頁再註冊第五個工具,它只做一件事:回傳一串隨機字。那串字關在 closure 裡,DOM 沒有、innerText 沒有、window 上也掛不到,我三個都查過:

{ inDOM: false, inText: false, onWindow: false }

換句話說,除非真的呼叫那個工具,否則沒有任何辦法拿到它。

我叫 ChatGPT 去拿。它先停下來問我一句「驗證碼屬於敏感的登入資訊,請確認要我呼叫嗎」,我說是,然後它回了一行:

LCM-VK4TWV

一字不差。那一刻才算數。

負控制我也補了。把那個瀏覽器分頁收掉,換一串新的隨機字,用一模一樣的問法再問一次,它的回答是:

目前沒有任何可接管的瀏覽器分頁。請在內建瀏覽器開啟「LINE 對話製造機」頁面。

沒有分頁就拿不到,而且它沒有編一個給我。正面拿得到、反面拿不到,這樣才叫驗過。

誠實的界線,重寫一次

8/12 那頁投影片有三條界線,現在只有一條半還站得住:

第一條還在。Chrome 那邊仍然是實驗階段,要自己去 chrome://flags/#enable-webmcp-testing 開旗標,重開瀏覽器才有。repo 裡那支 test/webmcp.e2e.mjs 今天在 Chrome 151 上重跑是 5/5 通過,其中一條就是負控制:沒開旗標時 navigator.modelContext 必須不存在。它現在還是綠的,代表這條界線沒動。

第二條要改寫。「沒有主流 agent 產品在用」已經不成立了,這篇整篇都是反證。

第三條是新加的,也是實務上最擋人的:ChatGPT 這邊要 GPT-5.6 Sol 或 Terra 才吃得到,Luna 是關掉的;Enterprise 與 Edu 工作區不支援。所以就算你的站註冊好了,使用者選錯模型一樣什麼都沒有,而且畫面上不會告訴他為什麼。

還有一條是我自己的界線:以上全部只在一台 Ubuntu 上、用 ChatGPT 桌面版的 Linux 預覽版驗過,一個帳號,一個站。macOS、Windows、其他型態的網站我都沒測。

那要不要現在就做

要,如果你的站已經有一套自己在用的工具定義。

我這邊之所以半天就試完,是因為那四個工具本來就存在,是站內 AI 在用的。註冊給瀏覽器的部分只有十幾行,等於把同一份定義換個形狀再公開一次。這種情況下成本低到不值得討論,就算現在只有一個客戶端支援,也先放著。

反過來說,如果你得為了 WebMCP 從零設計一套工具介面,那可以再等等。目前它還是設計材料多過使用者摸得到的功能,這句話 8/12 講的,今天還沒過期。

分工線照舊:什麼時候接、接哪四個工具、要用什麼標準才算驗過,是我定的;ai.js 那段註冊、那支端到端測試、還有今天這一輪驅動桌面版跑驗收的腳本,都是 AI 寫的。用隨機字串當探針去逼出決定性證據,也是這一輪 AI 提的做法。我做的事只有一件:把標準定死在「要能用程式驗出來」。AI 自己回報做了什麼,一律不算數。

想自己驗的話,程式碼跟測試都在 https://github.com/yazelin/line-chat-makertest/webmcp.e2e.mjs 那支會自己開瀏覽器、開旗標、呼叫工具、再檢查畫面真的變了。工具本身在 https://yazelin.github.io/line-chat-maker/,先玩玩看它能做什麼,再回頭看它把哪些功能公開給了 AI。前情提要在這裡:教一個 AI 小劇組寫出「值得截圖」的對話