Unrendered: AI Crawler Checker

io.github.missiongrowth由 GitHub 帳號 missiongrowth 發布v0.1.4更新於 Nov 4, 2026

AI crawler checker: shows which page content GPTBot and ClaudeBot can't read without JavaScript.

概覽

AI 產生的概覽

本機 MCP 伺服器:用無頭 Chrome 載入頁面,回報不執行 JavaScript 的 AI 爬蟲能看到什麼,並給出各機器人的 robots.txt 與抓取判定。

可以做什麼
  • 分析頁面:在無頭 Chrome 中載入頁面,比對原始 HTML 與渲染後的頁面,給出正文覆蓋率、僅由 JavaScript 加入的字詞,以及原始 HTML 中缺少的最大文字區塊。
  • 比對原始與渲染版本的詮釋資料差異:標題、meta 描述、canonical、hreflang、html lang、robots meta 與 JSON-LD。
  • 列出僅在 JavaScript 執行後才出現的連結,以及被 JavaScript 移除的原始 HTML 文字。
  • 當原始請求遇到驗證頁、HTTP 錯誤、重新導向或抓取失敗時,說明未計算覆蓋率的原因。
  • 檢查 AI 機器人:給出每個機器人的 robots.txt 判定,以及以其公開 user-agent 請求時伺服器的回應結果。
適用情境
適合檢查網站內容在不執行 JavaScript 時能否被 GPTBot、ClaudeBot 等 AI 爬蟲讀取,或審查這些機器人的 robots.txt 規則與伺服器回應。適用於針對公開頁面的 SEO 與 AI 可見度評估。
執行需求
透過 npx 在本機執行(npm 套件 unrendered-mcp),需要 Node 20 以上版本與已安裝的 Google Chrome,不會下載瀏覽器。選用環境變數 UNRENDERED_CHROME_CHANNEL 可選擇其他 Chromium 通道,UNRENDERED_ALLOW_PRIVATE_HOSTS=1 可允許本機或私有主機。需要能連線到被分析的網站。
安裝前請注意
工具會抓取目標 URL 及其資源,check_ai_bots 會向網站依序送出約 20 次請求,可能被視為機器人流量。預設拒絕私有、回送與連結本機位址;開啟 UNRENDERED_ALLOW_PRIVATE_HOSTS 會擴大模型提供 URL 可觸及的範圍。頁面在無登入、無 Cookie 的狀態下載入,結果與登入後的檢視不同。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Unrendered: AI Crawler Checker,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

unrendered-mcp: AI Crawler Checker MCP Server

An MCP server that gives an AI assistant the analysis of the Unrendered Chrome extension: what a crawler that does not run JavaScript receives (the raw HTML) compared with the page a browser renders.

It does not reimplement the analysis. The extension's own snapshot code (src/content/snapshot.ts), analyze, robots.txt parser and bot classifier are bundled and run unchanged, inside your installed Google Chrome.

Install

Requires Node 20 or later and Google Chrome. No browser is downloaded.

sh
npx -y unrendered-mcp

Claude Code

sh
claude mcp add unrendered -- npx -y unrendered-mcp

Claude Desktop

Add to claude_desktop_config.json:

json
{  "mcpServers": {    "unrendered": {      "command": "npx",      "args": ["-y", "unrendered-mcp"]    }  }}

If Chrome is missing the tools answer with an error that says so. UNRENDERED_CHROME_CHANNEL selects another Chromium channel (default chrome).

By default the tools refuse URLs whose host is, or resolves to, a loopback, private, link-local or multicast address, because the URL comes from a model that may have read a hostile page. Set UNRENDERED_ALLOW_PRIVATE_HOSTS=1 to analyse a local dev server. Chrome runs with its sandbox on.

Tools

analyze_page({ url })

Loads the URL in a headless Chrome, takes the extension's snapshot in an isolated world of the page (as a content script does), runs analyze, and returns a compact JSON object:

  • coverage: share of the main content (and of all visible text) whose words are present in the raw HTML, with word counts and the basis used (main-landmark or outside-landmarks)
  • main_content_words: words found in the raw HTML, words found only in JSON-LD or hydration data, words only present after JavaScript
  • missing_from_raw_html: the largest text blocks that exist only after JavaScript (truncated, capped at 15)
  • fields: differences in title, meta description, canonical, hreflang, html lang, robots meta and JSON-LD (capped at 30 rows)
  • links_only_after_javascript, text_in_raw_html_removed_by_javascript
  • gate: when the raw request is a challenge page (Cloudflare, AWS WAF, DataDome), an HTTP error, a different URL or a failed fetch, no coverage is computed and the gate says why
  • not_checked: what this run did not verify

check_ai_bots({ url })

For every bot in the extension's list: the robots.txt verdict for the URL (with the matching rule and line), and what the server answers when requested with that bot's published user-agent (same, different, blocked, challenged, rate-limited, redirected-elsewhere, error), plus noindex. Bots with no verified user-agent string, Googlebot and Applebot (which the extension does not imitate) and control tokens such as Google-Extended get a robots.txt verdict only (http: "not_probed").

What runs where

  • Everything runs on your machine. Chrome starts headless for each call and is closed afterwards.
  • analyze_page loads the page in that Chrome. The page requests its own resources, and the raw HTML is requested three times from the page itself, as in the extension.
  • check_ai_bots requests /robots.txt and the URL about 20 times from Node, sequentially, with Chrome's user-agent and with each bot's.
  • The analysis code runs in a blank Chrome page, because it needs a browser DOM parser.

Privacy

Nothing is sent anywhere except requests to the site you analyse (and to addresses it redirects to or loads resources from). No analytics, no telemetry, no accounts, nothing stored. Each call uses a fresh temporary Chrome profile that is discarded when it ends.

Known differences from the extension

  • Closed shadow roots cannot be reached without the extension API, so their text counts as absent from the rendered side.
  • The browser is headless, 1280x720, en-US, without your logins or cookies; the user-agent is Chrome's without the Headless marker.
  • check_ai_bots sends its requests from Node, not from the browser: the TLS fingerprint and some headers differ from Chrome's, and no cookies are sent (the extension also sends none for bot probes). The character-set fallback is utf-8 because no rendered page is loaded to read document.characterSet from.

Development

sh
pnpm installpnpm build       # bundles the page scripts and the server into dist/pnpm typecheckpnpm parity      # compares this server with the extension's panel on 20 URLs (build the extension in the repo root first)

License

AGPL-3.0-only.

來源:mcp/README.md,提交 dd7596a

工具

2

analyze_page

Compare raw HTML with rendered DOM

Loads the URL in Chrome and compares what a crawler that does not run JavaScript receives (the raw HTML) with the rendered page, using the Unrendered extension's analysis. Returns the share of the main content present in the raw HTML, words only added by JavaScript, the text blocks missing from the raw HTML, head and JSON-LD field differences, challenge or error gates, and a not_checked list.

輸入參數url必填

check_ai_bots

Check AI bot access

For each AI bot the extension knows (GPTBot, ClaudeBot, PerplexityBot and others), returns the robots.txt verdict for the URL and what the server answers when requested with that bot's published user-agent (same page, different page, blocked, challenged, redirected).

輸入參數url必填

版本歷史

1
  1. v0.1.4最新Oct 21, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分