/ 目錄 / 演練場 / Puppeteer
● 官方 modelcontextprotocol ⚡ 即開即用

Puppeteer

作者 modelcontextprotocol · modelcontextprotocol/servers-archived

一個 MCP 搞定無頭 Chrome — 導航、截圖、點擊、填表。只需要 Chromium 時比 Playwright 更簡單。

Anthropic 官方的封存但仍可運作的參考 MCP。透過 Puppeteer 驅動無頭 Chromium:導航、截圖、點擊、填表、選取、懸停,以及任意 page.evaluate。沒有無障礙樹的功能 — 你直接使用 CSS 選擇器。當 Playwright 感覺太重時可以用這個。

為什麼要用

核心特性

即時演示

實際使用效果

puppeteer.replay ▶ 就緒
0/0

安裝

選擇你的客戶端

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "puppeteer": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-puppeteer"
      ]
    }
  }
}

開啟 Claude Desktop → Settings → Developer → Edit Config。儲存後重啟應用。

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "puppeteer": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-puppeteer"
      ]
    }
  }
}

Cursor 使用與 Claude Desktop 相同的 mcpServers 格式。專案級設定優先於全域。

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "puppeteer": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-puppeteer"
      ]
    }
  }
}

點擊 Cline 側欄中的 MCP Servers 圖示,然後選 "Edit Configuration"。

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "puppeteer": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-puppeteer"
      ]
    }
  }
}

格式與 Claude Desktop 相同。重啟 Windsurf 生效。

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "puppeteer",
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-puppeteer"
      ]
    }
  ]
}

Continue 使用伺服器物件陣列,而非映射。

~/.config/zed/settings.json
{
  "context_servers": {
    "puppeteer": {
      "command": {
        "path": "npx",
        "args": [
          "-y",
          "@modelcontextprotocol/server-puppeteer"
        ]
      }
    }
  }
}

加入 context_servers。Zed 儲存後熱重載。

claude mcp add puppeteer -- npx -y @modelcontextprotocol/server-puppeteer

一行命令搞定。用 claude mcp list 驗證,claude mcp remove 移除。

使用場景

實戰用法: Puppeteer

對一批網址截圖以進行視覺稽核

👤 QA、設計師、內容管理人員 ⏱ ~10 min beginner

何時使用: 你有一份頁面清單,需要在變更後逐一確認外觀。

步驟
  1. 導航並截圖
    對 [清單] 中的每個網址,依序導航、等待載入完成、截取全頁截圖並命名為 <slug>.png。✓ 已複製
    → N 張截圖已儲存
  2. 與基準比對(選用)
    將每張截圖與 ./baseline/ 中對應的檔案比較,標記像素差異超過 5% 的項目。✓ 已複製
    → 已變更頁面清單
  3. 彙整結果
    寫一段摘要:共幾個頁面、幾個有變更、哪些可能需要人工審查。✓ 已複製
    → 可直接貼入 PR 描述的快速狀態說明

結果: 不需建置視覺回歸流水線,即可產出附有差異報告的基準截圖集。

注意事項
  • 動態內容(日期、A/B 測試橫幅)會產生誤判差異 — 在截圖前先用 puppeteer_evaluate 透過 CSS 隱藏這些元素
搭配使用: filesystem

用測試資料反覆填寫表單

👤 QA 工程師、測試輸入流程的後端開發者 ⏱ ~15 min intermediate

何時使用: 需要用 20 種輸入變體來驗證表單的驗證邏輯。

前置條件
  • 測試環境網址 — 絕對不要對正式環境執行 — 請啟動一個預備環境實例
步驟
  1. 導航至表單
    開啟 https://staging.app/signup,截圖確認頁面狀態。✓ 已複製
    → 頁面已載入,表單可見
  2. 提交測試案例
    對每個測試案例 [清單:{email, password, expected_error}],依序填寫欄位、點擊送出,並擷取錯誤訊息元素的文字內容。✓ 已複製
    → 每個案例的實際結果與預期結果對照
  3. 回報不符項目
    彙整:哪些案例通過、哪些失敗、差異為何。對每個失敗案例截圖留存。✓ 已複製
    → 附有證據的測試報告

結果: 在 10 分鐘內完成超出 Playwright 規格測試範疇的驗證覆蓋度。

注意事項
  • 前一次的表單狀態在執行間持續殘留 — 每個案例之間用 puppeteer_navigate 導航至新頁面,或對各欄位使用 puppeteer_fill 傳入空字串明確清除

找出頁面上損壞或遺失的圖片

👤 內容/文件維護人員 ⏱ ~10 min intermediate

何時使用: 遷移後或 CMS 變更後 — 圖片損壞是常見且令人難堪的問題。

步驟
  1. 載入頁面
    開啟 <URL>,等待 2 秒讓延遲載入的圖片觸發。✓ 已複製
    → 頁面已載入
  2. 透過 evaluate 找出損壞圖片
    執行 page.evaluate,回傳所有 naturalWidth === 0 的 <img> 元素 — 這些是載入失敗的圖片。包含每個元素的 src 和 alt。✓ 已複製
    → 損壞圖片來源清單
  3. 對整個網站重複執行
    對這 20 個網址重複執行,輸出包含頁面、損壞圖片來源、alt 文字的 CSV 檔。✓ 已複製
    → 可直接採取行動的 CSV

結果: 一份具體的損壞圖片修復清單,附帶其所在頁面。

注意事項
  • 延遲載入的圖片尚未觸發載入 — 先用 evaluate 執行 window.scrollTo(0, document.body.scrollHeight) 捲動頁面,等待後再檢查
搭配使用: filesystem

組合

與其他 MCP 搭配,撬動十倍槓桿

puppeteer + filesystem

截取每個頁面的截圖並儲存為圖片檔案供審查

開啟 urls.txt 中的每個網址,截取全頁截圖,儲存至 ./audit/<slug>.png。✓ 已複製
puppeteer + sentry

透過重現使用者操作路徑來復現 Sentry 回報的錯誤

Sentry issue WEB-3a91 的麵包屑顯示使用者點擊了 .checkout-btn,然後填寫了 #card-number。用 Puppeteer 重現這個操作並擷取主控台輸出。✓ 已複製

工具

此 MCP 暴露的能力

工具輸入參數何時呼叫成本
puppeteer_navigate url 開啟或重新導向至某個網址 free
puppeteer_screenshot name, selector?, width?, height? 截取整個頁面或特定元素 disk space
puppeteer_click selector 透過 CSS 選擇器點擊元素 free
puppeteer_fill selector, value 在輸入框中輸入文字 free
puppeteer_select selector, value 從 <select> 中選擇一個選項 free
puppeteer_hover selector 顯示僅在懸停時出現的選單或提示 free
puppeteer_evaluate script 在頁面環境中執行任意 JS — 當選擇器無法處理時的最後手段 free

成本與限制

運行它的成本

API 配額
免費 — 本機執行
每次呼叫 Token 數
截圖不計 token;選擇器與字串很小(每次呼叫約 ~100 tokens)
費用
免費
提示
使用 puppeteer_evaluate 直接將所需資料提取為 JSON — 不要截圖後再 OCR

安全

權限、密鑰、影響範圍

憑證儲存: 絕對不要在提示詞中放入真實使用者憑證 — 請使用專屬的 QA 帳號
資料出站: 瀏覽器會導航至你指定的任何位址;不會有資料傳送至 MCP 發行者

故障排查

常見錯誤與修復

Error: Element not found

元素尚未渲染完成。透過 puppeteer_evaluate('await new Promise(r => setTimeout(r, 1000))') 加入短暫等待,或使用能隱式等待的更精確選擇器。

Chromium fails to launch on Linux/Docker

安裝相依套件:apt-get install -y chromium-browser,或使用已預先安裝所有相依項目的 Playwright MCP 映像檔。

Screenshots are blank

頁面尚未載入完成。導航後,先輪詢等待已知元素出現:puppeteer_evaluate("document.querySelector('.main') !== null"),確認後再截圖。

替代方案

Puppeteer 對比其他方案

替代方案何時用它替代權衡
Playwright MCP任何正式的瀏覽器自動化需求 — 絕對更優的選擇安裝檔案略大,但透過無障礙樹提供更好的可靠性
Firecrawl MCP只需要內容擷取而不需要互動操作時雲端託管、需消耗點數,但對反爬蟲機制的處理更好
browser-tools MCP需要操控你自己的真實 Chrome(含已登入的工作階段、擴充功能)需要安裝 Chrome 擴充功能;完全不同的使用情境

更多

資源

📖 閱讀 GitHub 上的官方 README

🐙 查看未解決的 issue

🔍 瀏覽全部 400+ MCP 伺服器和 Skills