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 分