前端開發 別再讓 Agent 猜按鈕:30 天打造並實測 Agent-ready 的 WebMCP 活動網站 · 第 6 / 30 篇

Day 06|Playwright、REST API、MCP 與 WebMCP,各自負責哪一段?

2026 iThome 鐵人賽 WebMCP Day 6:安安~我是ChiYu~ 昨天 Playwright 因為按鈕改名而停在 click 以前。看到這個結果,很容易順手得出一個省事的 結論:「Browser Automation 太脆弱,換 WebMCP 就好了。」 有一說一,這個結論下得太快。Play…

快速導覽 查看本文目錄

本文同步自 2026 iThome 鐵人賽原文 。完整系列可見 iThome 系列頁 。

安安~我是ChiYu~

昨天 Playwright 因為按鈕改名而停在 click 以前。看到這個結果,很容易順手得出一個省事的 結論:「Browser Automation 太脆弱,換 WebMCP 就好了。」

有一說一,這個結論下得太快。Playwright 在驗收人類看得見的 UI,WebMCP 則讓目前分頁公開 任務能力;兩者本來就沒有在搶同一份工作。把其中一個失敗拿來替另一個頒獎,多少有點像 螺絲起子不好敲釘子,所以宣布榔頭贏得軟體架構大賽。

我把 Browser Automation、REST API、MCP 與 WebMCP 放進同一個活動搜尋任務,才看清楚 真正的差別:誰在呼叫、執行位置在哪裡,以及各自能讀到哪一種狀態。

同一個活動搜尋,四種技術站在不同位置

假設使用者說:「幫我找台北、免費,而且適合入門者的活動。」四種技術都可能出現在流程裡:

  • Playwright 操作搜尋表單。
  • REST API 接收條件並查詢活動。
  • MCP Server 向外部 Agent Host 提供 Tool。
  • WebMCP 讓目前網站分頁公開 search_events。

聽起來都在「搜尋活動」,執行位置卻完全不同:

WebMCP、MCP、REST API 與 Browser Automation 的責任邊界

圖 1:四種技術可以出現在同一條任務鏈,但呼叫者、狀態來源與驗證方式不同。

技術主要呼叫關係直接看見的狀態適合處理
Browser Automation測試腳本/Agent → 瀏覽器 UIDOM、accessible name、畫面流程E2E、回歸測試、既有網站操作
REST APIHTTP client → serverrequest、response、授權後資料穩定資料契約與商業行為
MCPAgent Host/Client ↔ MCP ServerServer 公開的 tools、resources、prompts跨網站、桌面或背景能力
WebMCP瀏覽器 Agent ↔ 目前網頁分頁內 Tool、route、session 與可見 UI使用者正在網站內進行的情境化任務

MCP 架構 描述的是 Host、Client 與 Server 之間如何協商能力。MCP Server 可以獨立存在,不需要使用者先打開某個網站分頁。

Chrome 的 WebMCP 與 MCP 比較 則把 WebMCP 放在瀏覽器前端。Tool 跟著目前頁面與 route 出現,可以使用該分頁的 session 與可見狀態;離開頁面後,這份能力也應該跟著解除。

所以 WebMCP 最有意思的地方,不是把所有 API 換一個名字,而是讓網站用目前分頁的情境描述: 「這個頁面現在願意提供哪些任務能力?」

WebMCP Tool 仍然要回到既有 REST API

AgentReady Events 的搜尋資料由這支 API 提供:

GET /api/events?location=taipei&price=free&level=beginner

Server 會驗證輸入、查詢活動,再回傳公開摘要。之後加入 WebMCP 時,呼叫鏈會長成:

Agent 選擇 search_events
          ↓
網站共用 search action
          ↓
REST API /api/events
          ↓
server validation 與活動資料

我沒有把查詢規則、授權與資料處理全部搬進 Tool description。這麼做看似少繞一層,實際上 會在前端複製另一套商業規則。人類表單走一套,Agent Tool 再走一套,兩邊早晚會各自長出 自己的脾氣。

這個專案的判斷很明確:REST API 仍是資料、授權與商業行為的事實來源;WebMCP 負責公開 任務語意,最後呼叫共用 action。Tool 宣告不會替 request 增加權限,也不能取代 server-side validation。

Playwright 繼續驗收人類 UI,不會被 WebMCP 取代

昨天的 timeout 正好證明 Playwright 還有工作。按鈕能不能被找到、表單能不能用鍵盤操作、 搜尋結果有沒有出現,以及取消 dialog 是否真的擋在最後確認前,這些都屬於人類 UI 契約。

WebMCP 加入後,反而多了一條交叉檢查線索:

  • Playwright 失敗、Tool 成功:先查 UI、可及性或 Locator regression。
  • Playwright 成功、Tool 失敗:先查 schema、註冊、執行或 browser capability。
  • 兩邊都失敗:回頭查共用 client action、REST API 或 server state。

如果把 Playwright 拿掉,只保留 Agent trace,網站很可能變成「Agent 用得動,人類按不下去」。 反過來,只有 UI 測試,也回答不了模型是否從自然語言選對 Tool。兩條路驗收的是不同問題, 不該硬湊成淘汰賽。

用三個問題分配責任

之後每碰到一項新能力,我會先問:

  1. 任務發生在目前分頁、外部 Agent Host,還是一般 client/server?
  2. 它需要的是 DOM/route、MCP Server 資源,還是後端資料?
  3. 應該用 UI 回歸測試、API test,還是自然語言 Agent trace 驗收?

答案通常不只落在一種技術。完整產品很可能同時保留四層:

MCP:跨系統、背景執行、長期存在的外部能力
WebMCP:目前分頁提供的情境化任務能力
REST API:後端資料、授權與商業規則
Playwright:人類 UI 與整合流程的回歸測試

昨天的按鈕改名屬於 UI 契約,所以由 Playwright 抓到。未來若 Tool schema 少了必要欄位, 問題會落在 WebMCP contract;如果 Agent 已送出正確 input,Server 卻接受過期報名,則要回到 REST API 與商業規則。先找對樓層,才不會每次報錯都把整棟房子翻修一遍。

E0~E5 標示證據進度,不是 WebMCP 規範

技術位置排好後,還有一件事不能混在一起:程式存在、Chrome 看見 Tool,以及 Agent 真的從 自然語言呼叫成功,是三種不同強度的證據。

我在系列裡使用 E0~E5 當內部標籤。這不是 WebMCP 規範,也不是鐵人賽的評分門檻;它只是 避免我把「程式寫好了」講成「Agent 已經會用了」。

讀者看到的狀態內部分級目前能說什麼
目前只是構想E0尚未實作或觀察
程式與契約已存在E1schema、文件或靜態能力可以查核
程式與自動測試已通過E2direct execution 或 deterministic tests 通過
Chrome 已看見網站 ToolE3真實 browser capability 與 Tool catalog 可觀察
Agent 已從自然語言自行呼叫E4保存 Prompt、Tool、input、result 與最後回答
換到乾淨環境仍能重現E5同一案例可以被獨立重播

目前網站有穩定的人類流程與 Playwright 測試,可以主張到 E2;四種技術的責任分工則是 接下來的設計契約。WebMCP Tool 尚未開始實作,所以沒有 E3,也不能提前寫成 E4。

系列開場曾看過一份完成版搜尋 trace,那是終點預覽,只屬於當時的固定版本與那一題。它 不會倒灌回來,讓今天尚未完成的 Tool 自動升級。

UI 基線已經站穩,第一支 Tool 還沒開始寫

走到今天,活動網站已經能由人類搜尋、收藏、準備報名與取消;固定版本可以重播,Playwright 也把 UI 劇本依賴的畫面線索攤開了。現在至少能分辨:按鈕改名造成 Locator timeout,和未來的 Tool 註冊或 Agent 選擇失敗,不是同一類問題。

這裡是第一個階段停靠點。WebMCP 此刻仍是待實作、待驗證的方向,下一步才會開始設計 Tool、 讓 Chrome 看見 catalog,再觀察 Agent 是否真的選對能力。

不過在寫第一支 Tool 以前,我還缺一份考卷。Agent 偶爾選對一次 search_events,不能順便替 參數、操作順序、人類確認與失敗復原背書。明天先列出十種行為、二十道固定題目;後面每完成 一小段,就拿對應題目來撞一次。成功要記,撞歪了也不能偷偷擦掉重考。

讀完了!你覺得這篇如何?

你的回饋會決定下一篇要寫什麼。

還有疑問

Learning path

別再讓 Agent 猜按鈕:30 天打造並實測 Agent-ready 的 WebMCP 活動網站

這篇是系列中的第 6 / 30 篇。可以順著列表補完整脈絡,也可以直接跳到需要的段落。

  1. 01 Day 01|網站真的會被 Agent 使用嗎?我先丟了一句自然語言
  2. 02 Day 02|換到全新資料夾後,網站還能不能跑?
  3. 03 Day 03|先別急著做 Tool,我把活動網站自己走了一遍
  4. 04 Day 04|按鈕只多包一層,哪種 Playwright Locator 撐得住?
  5. 05 Day 05|只改按鈕四個字,Playwright 為什麼停在 click 以前?
  6. 06 Day 06|Playwright、REST API、MCP 與 WebMCP,各自負責哪一段? 目前閱讀
  7. 07 Day 07|Agent 偶爾答對還不夠,我先出二十道測試題
  8. 08 Day 08|WebMCP Tool 該怎麼設計?把「點按鈕」改成「搜尋活動」
  9. 09 Day 09|網站該公開哪些 WebMCP Tool?從操作盤點到五支正式能力
  10. 10 Day 10|Inspector 裝好了,為什麼 Tool 面板還是一片空白?
  11. 11 Day 11|什麼是 Declarative API?讓 HTML 表單成為 WebMCP Tool
  12. 12 Day 12|Tool 註冊完還不算完成:離開 route 後誰把它收回來?
  13. 13 Day 13|第一次按下 Inspector 的 Send,先被 Gemini 429 擋在門外
  14. 14 Day 14|五支 Tool 不再往外長:把產品範圍寫成會亮紅燈的契約
  15. 15 Day 15|讓人類與 Agent 共用同一套活動搜尋規則
  16. 16 Day 16|Agent 怎麼知道「我現在看的活動」是哪一場?
  17. 17 Day 17|Tool 回太少做不完,回太多又把內部資料倒給 Agent
  18. 18 Day 18|活動服務暫時失敗時,Agent 應該重試還是停下來?
  19. 19 Day 19|同一場活動收藏兩次,網站為什麼只能留下同一筆?
  20. 20 Day 20|表單填好了,為什麼這次報名仍然不能算通過?
  21. 21 Day 21|一句「這個我不要了」,Agent 到底敢不敢直接取消?
  22. 22 Day 22|五支 Tool 如何共用同一套規則,串成三條完整流程?
  23. 23 Day 23|在問 Agent 聰不聰明前,先證明網站沒有壞
  24. 24 Day 24|活動摘要叫 Agent 洩漏祕密,它會把這句話當資料還是命令?
  25. 25 Day 25|localhost 成功不算交付:怎麼證明公開網址跑的是同一份程式?
  26. 26 Day 26|把自然語言送進公開站,Agent 真的會自己選對 Tool 嗎?
  27. 27 Day 27|寫入型 Tool 怎麼驗收?把 Trace、Network、UI 與 Server 狀態放在一起看
  28. 28 Day 28|Agent 選錯、傳錯或答錯時,怎麼知道問題卡在哪一層?
  29. 29 Day 29|把網站交給 Agent 前,我最後會檢查哪十件事?
  30. 30 Day 30|網站終於會說話:做完五支 Tool 後,我學到什麼?

Further reading

Day 30|網站終於會說話:做完五支 Tool 後,我學到什麼? 封面圖 2026-09-30 Day 30|網站終於會說話:做完五支 Tool 後,我學到什麼? Day 29|把網站交給 Agent 前,我最後會檢查哪十件事? 封面圖 2026-09-29 Day 29|把網站交給 Agent 前,我最後會檢查哪十件事? Day 28|Agent 選錯、傳錯或答錯時,怎麼知道問題卡在哪一層? 封面圖 2026-09-28 Day 28|Agent 選錯、傳錯或答錯時,怎麼知道問題卡在哪一層?

留言討論

用 GitHub 帳號留言,留言會同步到這個 Blog 的 GitHub Discussions。

閱讀導覽

約 6 分鐘

本文目錄

本篇所在系列 · 第 6 / 30 篇

別再讓 Agent 猜按鈕:30 天打造並實測 Agent-ready 的 WebMCP 活動網站

  1. Day 01|網站真的會被 Agent 使用嗎?我先丟了一句自然語言
  2. Day 02|換到全新資料夾後,網站還能不能跑?
  3. Day 03|先別急著做 Tool,我把活動網站自己走了一遍
  4. Day 04|按鈕只多包一層,哪種 Playwright Locator 撐得住?
  5. Day 05|只改按鈕四個字,Playwright 為什麼停在 click 以前?
  6. Day 06|Playwright、REST API、MCP 與 WebMCP,各自負責哪一段?
  7. Day 07|Agent 偶爾答對還不夠,我先出二十道測試題
  8. Day 08|WebMCP Tool 該怎麼設計?把「點按鈕」改成「搜尋活動」
  9. Day 09|網站該公開哪些 WebMCP Tool?從操作盤點到五支正式能力
  10. Day 10|Inspector 裝好了,為什麼 Tool 面板還是一片空白?
  11. Day 11|什麼是 Declarative API?讓 HTML 表單成為 WebMCP Tool
  12. Day 12|Tool 註冊完還不算完成:離開 route 後誰把它收回來?
  13. Day 13|第一次按下 Inspector 的 Send,先被 Gemini 429 擋在門外
  14. Day 14|五支 Tool 不再往外長:把產品範圍寫成會亮紅燈的契約
  15. Day 15|讓人類與 Agent 共用同一套活動搜尋規則
  16. Day 16|Agent 怎麼知道「我現在看的活動」是哪一場?
  17. Day 17|Tool 回太少做不完,回太多又把內部資料倒給 Agent
  18. Day 18|活動服務暫時失敗時,Agent 應該重試還是停下來?
  19. Day 19|同一場活動收藏兩次,網站為什麼只能留下同一筆?
  20. Day 20|表單填好了,為什麼這次報名仍然不能算通過?
  21. Day 21|一句「這個我不要了」,Agent 到底敢不敢直接取消?
  22. Day 22|五支 Tool 如何共用同一套規則,串成三條完整流程?
  23. Day 23|在問 Agent 聰不聰明前,先證明網站沒有壞
  24. Day 24|活動摘要叫 Agent 洩漏祕密,它會把這句話當資料還是命令?
  25. Day 25|localhost 成功不算交付:怎麼證明公開網址跑的是同一份程式?
  26. Day 26|把自然語言送進公開站,Agent 真的會自己選對 Tool 嗎?
  27. Day 27|寫入型 Tool 怎麼驗收?把 Trace、Network、UI 與 Server 狀態放在一起看
  28. Day 28|Agent 選錯、傳錯或答錯時,怎麼知道問題卡在哪一層?
  29. Day 29|把網站交給 Agent 前,我最後會檢查哪十件事?
  30. Day 30|網站終於會說話:做完五支 Tool 後,我學到什麼?
看完整系列 30 篇