获取爬网MCP v4.2.0
MCP(模型上下文协议)服务器,用于抓取、爬网和分析网站。29个工具可从Claude Code、Claude Desktop或任何兼容的MCP客户端使用。
安装
npm install
npm run build工具需要Puppeteer screenshot, check_performance, check_mobile, check_datalayer, intercept_tracking_requests, audit_tracking 以及反机器人回退。Chromium在 npm install.
使用
stdio(默认)
npm start
# ou
node build/index.js超文本传输协议
npm run start:http
# ou
node build/index.js --http --port 3001配置客户端MCP
{
"mcpServers": {
"fetch-crawl-mcp": {
"command": "node",
"args": ["/path/to/fetch-crawl-mcp/build/index.js"]
}
}
}标准响应格式
所有工具返回一种格式 StandardResponse 统一:
{
url: string; // URL demandée
finalUrl: string; // URL finale (après redirections)
status: number; // Code HTTP
score?: number; // Score 0-100 (si applicable)
summary: string; // Résumé en une phrase
issues: ToolIssue[]; // Problèmes détectés (severity, element, message, evidence?)
recommendations: []; // Recommandations d'amélioration
meta: {
fetchedWith: "fetch" | "puppeteer";
fallbackUsed: boolean;
partial: boolean; // true si le contenu a été tronqué (> 5MB)
durationMs: number;
timestamp: string;
};
data: {}; // Données spécifiques à l'outil
}反机器人检测
Fetcher集成了先进的反机器人检测系统:
- 自动检测 :Cloudflare、DataDome、Akamai、Sucuri、PerimeterX
- 隐形木偶 :补丁navigator.webdriver、插件、语言、平台、硬件加密货币、设备内存、chrome.runtime、通知权限、WebGL渲染器
- 自行撤退 :如果即使使用Puppeteer,站点仍然被阻止,则返回403状态和信息
antiBot: { blocked, provider, confidence }联合国坠机事件 - 启动优化的ARGS :
--disable-blink-features=AutomationControlled,--disable-features=IsolateOrigins,site-per-process,--window-size=1920,1080
工具(29)
抓取和爬行
fetch_page
获取网页并以指定格式返回其内容。
| 参数 | 类型 | 缺陷 | 描述 | ||
|---|---|---|---|---|---|
url | 字符串 | *必需的* | 获取器的URL | ||
format | "html" | "text" | "markdown" | "markdown" | 分拣格式 |
headers | 对象 | - | 自定义HTTP头 |
归来 :页面内容、标题、描述、内容类型。
______________________________________________________________________
crawl_site
通过跟踪内部链接递归地抓取站点。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 起始URL |
maxDepth | 数字(0-10) | 2 最大深度(0=仅起始页) | |
maxPages | 数字(1–500) | 50 最大页数 | |
delay | 数字(0-10000) | 300 请求之间的延迟(毫秒)(±30%抖动) | |
concurrency | 数字(1-10) | 3 | 并行生成的页面 |
respectRobotsTxt | 布尔值 | true | 尊敬的robots.txt抓取延迟 |
includePattern | string | -- | 正则表达式:爬虫无法匹配URL |
excludePattern | string | -- | 正则表达式:排除匹配的URL |
得分 :基于错误页面的比率(状态>=400)。
超时 :爬行在5分钟后干净停止(abortedEarly: true).
归来 :爬网页面列表,包括标题、状态、深度、找到的链接+ crawlStats: { startedAt, finishedAt, durationSeconds, pagesPerSecond, abortedEarly, abortReason }.
______________________________________________________________________
screenshot
通过Puppeteer捕获网页截图。支持PNG/JPEG、自定义视口、全页捕获、CSS选择器等待和cookie横幅关闭。
| 参数 | 类型 | 缺陷 | 描述 | |
|---|---|---|---|---|
url | 字符串 | *必需的* | 要捕获的URL | |
width | 号码(320–3840) | 1280 视口宽度 | ||
height | 号码(240-2160) | 800 | 高级视口 | |
fullPage | 布尔值 | false | 捕获整个可滚动页面 | |
format | "png" | "jpeg" | "png" | d图像格式 |
quality | 数字(1–100) | 80 | 质量(仅限JPEG) | |
waitForSelector | 字符串 | - | 捕获前等待的CSS选择器 | |
dismissCookies | 布尔值 | false | 尝试关闭Cookie横幅 |
罗伯斯 :全局木偶超时,如果完整页面>900KB,则自动重新压缩JPEG,失败时返回干净错误。
______________________________________________________________________
SEO审计
audit_onpage
页面完整性审计技术:标题、元描述、规范、机器人、语言、hiérarchie H1-H6、图像属性、开放图、推特卡、JSON-LD。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要审核的URL |
得分 :0-100基于问题(错误=-15pts,警告=-5pts)。
归来 :完整的SEO数据 data{},严重性问题,建议。
______________________________________________________________________
check_indexability
检查页面是否可被搜索引擎索引。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 页面URL |
分析 :
- 状态HTTP
- 元机器人(noindex、nofollow、none、noarchive、nosnippet)
- X-Robots-Tag HTTP标头
- Canonical(自引用?跨域?)
- Hreflang/rel备用
- 在网站地图中的存在
得分 :-40个noindex,-30个状态!=200,-20在其他地方是规范的,-10缺少站点地图。
归来 :判决 indexable: boolean 有详细的理由。
______________________________________________________________________
check_structured_data
提取并验证页面的结构化数据。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要分析的URL |
提取 :
- JSON-LD (包括
@graph)按类型验证:产品、组织、本地业务、面包屑列表、文章、新闻文章、博客文章 - 微数据 (项目范围/项目类型/项目道具)
- 开放图谱 (以及:\*)
- 推特卡 (推特:\*)
得分 :-20如果没有JSON-LD,-10如果没有OG,-10如果没有Twitter卡,-15每个无效模式。
______________________________________________________________________
check_robots_txt
分析站点的robots.txt并检查站点地图的一致性。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 网站URL |
分析 :
- 用户代理完全解析(允许+不允许)
- 爬行延迟
- 声明的站点地图与实际可访问的站点地图
- 检测未声明的站点地图(/sitemap.xml,/1-index-sitemap.xml)
得分 :-30如果不存在,-15如果没有声明站点地图,-10每个站点地图不可访问或未声明。
______________________________________________________________________
内容提取
extract_content
提取页面的结构化内容:标题、链接、图像、纯文本和统计信息。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | URL源 |
归来 :标题、描述、语言、标题、链接(最多100个)、图像(最多50个)、文本内容(最多10000个字符)、统计数据。
______________________________________________________________________
extract_links
通过类型筛选从页面中提取所有链接。
| 参数 | 类型 | 缺陷 | 描述 | ||
|---|---|---|---|---|---|
url | 字符串 | *必需的* | URL源 | ||
type | "all" | "internal" | "external" | "all" | 按类型筛选 |
归来 :与href、text、rel、isinternal、isnofollow的唯一链接。
______________________________________________________________________
extract_with_schema
基于可配置CSS选择器的结构化提取,内置预设。
| 参数 | 类型 | 缺陷 | 描述 | |||
|---|---|---|---|---|---|---|
url | 字符串 | *必需的* | URL源 | |||
schema | 对象 | - | 提取模式(见下文) | |||
fallbackSelectors | 对象 | - | 如果主体失败,则回退选择器 | |||
preset | "ecommerce-product" | "article" | "local-business" | "recipe" | - | 内置预设 |
模式 :每个键都是一个字段,值为 { selector, attribute?, multiple?, transform? }.
{
"productName": { "selector": "h1.product-title", "transform": "text" },
"price": { "selector": ".product-price .current", "transform": "number" },
"images": { "selector": ".product-gallery img", "attribute": "src", "multiple": true },
"description": { "selector": ".product-description", "transform": "html" }
}转型 : text (innerText), html (innerHTML), number (parseFloat), trim (文本修剪), href (属性href)。
集成预设 :
ecommerce-product:productName,价格,旧价格,货币,图片,描述,sku,品牌,可用性,面包屑,评论计数article:标题、作者、发布日期、内容、类别、标签、阅读时间(自动计算)local-business:姓名、地址、电话、电子邮件、工作时间、坐标、评级、评论计数recipe:标题、准备时间、烹饪时间、份量、配料、说明、卡路里、图片
是 preset 外星人 schema 如果提供,模式覆盖预设字段。
得分 : (fieldsFound / fieldsTotal) * 100.
归来 : data.extracted (数据), fieldsFound, fieldsTotal, fieldsMissing, usedFallback, preset.
______________________________________________________________________
parse_sitemap
解析sitemap.xml(或自动检测)。支持站点地图索引。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 站点地图URL或站点根 |
得分 :-20解析错误,-5如果截断。
归来 :输入LOC、LASTMOD、CHANGEFREQ、优先级(最大500)。
______________________________________________________________________
技术检查
check_links
检查页面上的所有链接是否存在断开的链接(404、超时、错误)。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要检查的URL |
timeout | 数量(1000-30000) | 5000 | 留置权超时 |
concurrency | 数字(1-20) | 3 | 并行检查的链接 |
delay | 数字(0-5000) | 200 批处理之间的延迟(±30%抖动) |
得分 :基于断开链接/总数的比率。
______________________________________________________________________
check_redirect_chain
遵循逐跳重定向链。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要跟踪的URL |
maxRedirects | 数字(1-30) | 10 | 最大重定向次数 |
得分 :100表示0-1重定向,80表示Si 2-3,60表示Si>3,0表示Boucle。
检测 :重定向循环、长字符串(>3)、HTTP→HTTPS升级。
______________________________________________________________________
check_performance
通过具有移动或桌面配置文件的Puppeter测量性能指标。
| 参数 | 类型 | 缺陷 | 描述 | |
|---|---|---|---|---|
url | 字符串 | *必需的* | 要审核的URL | |
device | "mobile" | "desktop" | "mobile" | Profil(手机:375x812+节流,台式机:1280x800) |
度量 :TTFB、FCP、LCP、DOM内容加载、完全加载、网络请求、传输字节、按类型划分的资源。
分数(0-100) :LCP(40%)、FCP(35%)、TTFB(25%),基于Web Vitals阈值。
______________________________________________________________________
check_mobile
通过Puppeter和ViewPort iPhone(375x812)进行移动兼容性审核。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要检查的URL |
核查 :元视口,水平滚动,字体\` 无)
- 存在 `
GTM回落` - 身份证重复(重复计算)
得分 :-15如果没有跟踪,-5通过警告(缺少noscript、重复、错误位置)。
______________________________________________________________________
check_datalayer
检查 window.dataLayer 通过Puppeter运行时。检查存在、内容并检测可疑模式。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要检查的URL |
wait_ms | 数字(0-5000) | 2000 | 数据层读取前加载后的等待时间 |
核查 :
window.dataLayer存在并包含事件window.google_tag_managerchargé(运行时GTM)window.gtag是一个函数- 启动GTM后数据层重新定义检测(模式可疑)
超时 :30秒(木偶戏)。
______________________________________________________________________
intercept_tracking_requests
在通过Puppeter加载页面时拦截跟踪网络请求(GA4、GTM、GTAG)。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* 要监视的URL | |
wait_ms | 数字(0-8000) | 3000 | 加载后捕获延迟点击的等待时间 |
截获的请求 :
google-analytics.com/g/collect→ 点击GA4analytics.google.com/g/collect→ 点击GA4替代品googletagmanager.com/gtm.js→加载GTMgoogletagmanager.com/gtag/js→加载GTAGstats.g.doubleclick.net→点击通用分析(已弃用)
解析GA4 :事件名称(en),测量ID(tid),协议版本(v).
得分 :-15如果没有命中GA4,-15如果检测到UA,-5通过警告(重复,多ID)。
超时 :45秒(木偶戏)。
______________________________________________________________________
audit_tracking
完整审计跟踪:执行 check_gtm_snippet, check_datalayer 和 intercept_tracking_requests 并行,然后生成统一报告。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要审核的URL |
融洽 :
- 总分(加权平均:GTM 30%,数据层30%,拦截40%)
severity_summary:按级别计数(关键、警告、正常)diagnosis:交叉诊断短语(例如:“GTM存在,但未发送GA4命中→检查触发器”)- 3个子工具的完整数据
______________________________________________________________________
多页比较
compare_pages
比较12个SEO标准上的两个并排网页。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
urlA | 字符串 | *必需的* 第一个URL | |
urlB | 字符串 | *必需的* 第二个URL | |
includeScreenshot | 布尔值 | false | 捕获每个页面的屏幕截图 |
比较标准 :标题、元描述、H1、标题结构、字数、内部链接、外部链接、图像alt、开放图、推特卡、JSON-LD、规范。
归来 :每页个人评分(0-100),按标准与获奖者的比较表,可选截图。
______________________________________________________________________
audit_site_batch
批量审核站点的多个页面,并聚合结果。
| 参数 | 类型 | 缺陷 | 描述 | ||
|---|---|---|---|---|---|
url | 字符串 | *必需的* | 网站URL | ||
source | "sitemap" | "crawl" | "urls" | "sitemap" | URL来源 |
urls | string\[\] | -- | 列出'URLs(si-source=“URLs”) | ||
limit | 数字(1-200) | 30 最大页数 | |||
concurrency | 数字(1-5) | 2 | 并行审核的页面 | ||
delay | 数字(0-5000) | 500 批之间的延迟 |
超时 :批次在5分钟后干净停止 meta.partial = true.
回退站点地图 :si /sitemap.xml 不返回URL,自动尝试 /1_index_sitemap.xml.
聚合 :
- 平均和中位数分数
- 分布(优秀/良好/中等/差)
- 按频率排序的前10个问题
- 快速获胜(页面>60分,1-2个简单固定)
- 评论页面(10个最差分数)
executionStats:开始时间,结束时间,持续时间秒,页数每秒,超时时间
______________________________________________________________________
detect_orphan_pages
通过交叉站点地图、爬网和内部链接图检测孤立页面。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 网站URL |
maxCrawlPages | 数字(1–300) | 100 | 为图形爬网的页面 |
crawlDepth | 数字(1-5) | 3 爬行深度 | |
concurrency | 数字(1-5) | 3 并行页面 | |
delay | 数字(0-5000) | 300 批处理之间的时间 |
分类 (6类):
orphan_in_sitemap:在站点地图中,0个内部链接(关键)orphan_not_in_sitemap:站点地图外,0-1内部链接(隔离)sitemap_only:在站点地图中,爬网无法到达crawl_only:通过爬网找到,不在站点地图中deep_page:仅达到深度>=4well_linked:站点地图+抓取+>=2个留置权条目
得分 :-2/orpheline(最大值-40),-1/sitemap_only(最大值-20),-1/crawl_only。
归来 :统计数据(重叠站点地图/爬网)、带示例的类别、前20名中心页面(更多入站链接)、前10名评论孤儿。
______________________________________________________________________
detect_duplicate_content
检测站点上的重复和准重复内容。
| 参数 | 类型 | 缺陷 | 描述 | ||
|---|---|---|---|---|---|
url | 字符串 | *必需的* | 网站URL | ||
source | "sitemap" | "crawl" | "urls" | "crawl" | URL来源 |
urls | string\[\] | -- | 列出'URLs(si-source=“URLs”) | ||
limit | 数字(1-200) | 50 最大页数 | |||
concurrency | 数字(1-5) | 3 并行页面 | |||
delay | 数字(0-5000) | 300 批处理之间的时间 | |||
similarityThreshold | 数字(0-1) | 0.8 | 近副本的相似性阈值 |
检测 :
- 完全重复 :相同的标题、描述、H1(按集群分组)
- 近乎重复 :几乎相同的标题和内容(通用词/单词相似性>阈值)
- 优化:前3个单词分组以避免O(n²)
得分 :-5个标准杆簇精确(最大值-40),-2个标准杆组接近重复(最大值-30)。
归来 : exactDuplicates[], nearDuplicates[], uniquePages,统计数据 mostDuplicatedValue.
______________________________________________________________________
安全性、可访问性和合规性(v4.2.0)
check_security_headers
审核HTTP安全标头(HSTS、CSP、X-Frame-Options、Referrer策略、权限策略、COOP、CORP、COEP)。得分0-100平均A-F级。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要审核的URL |
______________________________________________________________________
check_hreflang
验证hreflang标记:ISO 639-1代码、对等链接、与页面语言的一致性、是否存在 x-default,与Canonical一致。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要审核的URL |
______________________________________________________________________
audit_content_quality
内容质量分析:多语言可读性(FR/NL/EN/DE/ES/IT)、字数、标题结构、链接密度、媒体丰富性、参与信号(TOC、常见问题解答、CTA)。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要审核的URL |
______________________________________________________________________
check_accessibility
对9个类别的轻量级WCAG审计:图像alt、表单标签、语义地标、标题层次结构、链接文本质量(多语言检测FR/NL/EN/DE“单击此处”)、咏叹调、表格、媒体、对比度。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要审核的URL |
______________________________________________________________________
extract_images_audit
通过Puppeteer对图像进行全面审计:采用现代格式(WebP/AVIF)、Alt文本、响应(SRCSET)、最佳尺寸、延迟加载、LCP候选、文件权重。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要审核的URL |
______________________________________________________________________
check_consent_mode
Google同意模式v2审核和GDPR Cookie合规性:CMP检测(Cookiebot、OneTrust、Didomi、Axeptio等)、IAB TCF API、验证 gtag('consent', 'default'|'update'),信号分析 gcs/gcd 在点击GA4时,审核同意前放置的Cookie。
| 参数 | 类型 | 缺陷 | 描述 |
|---|---|---|---|
url | 字符串 | *必需的* | 要审核的URL |
wait_ms | 数字(0-10000) | 5000 | 加载后等待CMP初始化 |
______________________________________________________________________
建筑
src/
├── index.ts # Entry point (stdio + HTTP)
├── server.ts # MCP server, tool registration
├── tools/
│ ├── fetch-page.ts # fetch_page
│ ├── crawl-site.ts # crawl_site
│ ├── screenshot.ts # screenshot
│ ├── analyze-seo.ts # audit_onpage
│ ├── check-indexability.ts # check_indexability
│ ├── check-structured-data.ts # check_structured_data
│ ├── check-robots-txt.ts # check_robots_txt
│ ├── extract-content.ts # extract_content
│ ├── extract-links.ts # extract_links
│ ├── extract-with-schema.ts # extract_with_schema
│ ├── parse-sitemap.ts # parse_sitemap
│ ├── check-links.ts # check_links
│ ├── check-redirect-chain.ts # check_redirect_chain
│ ├── check-performance.ts # check_performance
│ ├── check-mobile.ts # check_mobile
│ ├── compare-pages.ts # compare_pages
│ ├── audit-site-batch.ts # audit_site_batch
│ ├── detect-orphan-pages.ts # detect_orphan_pages
│ ├── detect-duplicate-content.ts # detect_duplicate_content
│ ├── check-gtm-snippet.ts # check_gtm_snippet
│ ├── check-datalayer.ts # check_datalayer
│ ├── intercept-tracking-requests.ts # intercept_tracking_requests
│ └── audit-tracking.ts # audit_tracking
└── utils/
├── fetcher.ts # HTTP fetch + stealth Puppeteer + anti-bot detection
├── html-parser.ts # Cheerio-based HTML extraction
├── robots-parser.ts # robots.txt parser
├── url-utils.ts # URL normalization utilities
└── response.ts # StandardResponse, ToolIssue, ToolMeta, helpers堆叠技术
- 运行时 :Node.js(ES2022)
- 语言 :TypeScript(严格)
- MCP-SDK :@modelcontextprotocol/sdk
- HTML解析 :再见
- 浏览器自动化 :木偶(隐形模式)
- 验证 :佐德
- 运输 :stdio(默认)或http(express+streamablehttpservertransport)
Docker部署
快速开始
./deploy.sh曼努埃尔
# Build TypeScript
npm run build
# Build image Docker
docker build -t fetch-crawl-mcp:latest .
# Lancer avec docker compose
docker compose up -d
# Vérifier
curl http://localhost:3001/health配置Docker
乐 Dockerfile 利用 node:22-slim 为木偶预先安装了Chromium。最终图像仅包含: build/ 以及生产依赖性。
| 环境变量 | 默认值 | 描述 |
|---|---|---|
NODE_ENV | production Node.js环境 | |
PUPPETEER_EXECUTABLE_PATH | /usr/bin/chromium | 容器中铬的路径 |
默认资源(docker compose):2 GB RAM,1.5 CPU。
配置客户端MCP(HTTP远程)
{
"mcpServers": {
"fetch-crawl-mcp": {
"url": "http://YOUR_SERVER:3001/mcp"
}
}
}______________________________________________________________________
发展
npm run dev # Watch mode avec tsx
npm run build # Build TypeScript
npm start # Serveur stdio
npm run start:http # Serveur HTTP (port 3001)许可证
麻省理工学院
