scrape-mcp
This server lets AI clients fetch real web pages as clean, token-efficient text or structured data, with anti-bot escalation and login support.
web_fetch: Fetch a page and get compact, token-saving body text; options for max token budget and link handling (internal/all/none).
web_extract: Extract structured JSON from a page using a custom field schema (text, attribute, count, list).
web_batch: Concurrently fetch multiple URLs, each through the full pipeline, returning per-URL results.
login: Open a visible browser to manually log in to a site and persist the login state for subsequent requests.
Automatically detects and reports blocked/login-required pages instead of returning CAPTCHA or skeleton content.
Uses tiered fetching: lightweight L1 (curl_cffi) first, then upgrades to Playwright browser rendering when needed.
Supports caching, robots.txt respect, host allow/deny lists, rate limiting, proxy, and stdio/HTTP MCP transports.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@scrape-mcpscrape this article and give me the key points: https://example.com/news/ai-trends"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
scrape-mcp
⚠️ 这是 scrape-mcp 的官方源仓库(upstream)。 若在别处看到同名/相似项目并带不同作者署名,即为转载或派生,非原作者发布。
反爬感知抓取 + 极省 Token 内容精简的 MCP Server —— 让 AI 读真实网页时,只花 1%~5% 的 token 就能拿到干净、真实、免登录的正文。
自动化分三层应对:默认 curl_cffi(伪装 TLS/JA3 + HTTP2)低成本打头阵,命中 Cloudflare/验证码/WAF 才升级 Playwright 真浏览器渲染;遇到"登录才给内容"的站,先弹窗手动登录一次、登录态落盘,之后自动带上、过期会提示重登。
⚡ 60 秒入门
第 1 步:一键演示(拉起库内 MCP 服务,对真实站点自动跑 web_fetch + web_extract)
git clone https://github.com/guanyuyan/scrape-mcp.git
cd scrape-mcp
python -m venv .venv && .venv\Scripts\pip install -e .
.venv\Scripts\python scripts\demo.py预计输出(对不同站点自动选 L1/L2 分级,给出省 token 压缩比):
=== 文档站 | https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
ok=True tier=l1 status=200 html=260128B → tokens=3730 (约 5.7% 压缩)
标题: 跨源资源共享(CORS) - HTTP | MDN
ok=True tier=l1 data={"heading": "跨源资源共享(CORS)", "h2_count": 10, "links": 665}第 2 步:作为 MCP 客户端接入(Claude / Cursor 等,命令指向本仓库)
scrape-mcp # 已安装时;或 python -m scrape_mcp.server在客户端里调用 web_fetch(url=...) 即可拿到极省正文。
MDN 整页约 260KB,这里只花几千 token 就拿到干净正文;拦截/登录页会自动升级或如实上报,不会把验证码当正文。
Related MCP server: SteadyFetch
功能说明
它解决什么:模型读网页不是在读正文,而是在读整棵 DOM(脚本、导航、版权、链接一应尽收),又贵又脏。这个工具把页面剪成"只有正文"再喂给 AI。
核心价值(三点)
极省 token —— 属性剥离 + 模板块丢弃 + 站外链接降级 + 表格转 CSV + 预算截断。实测 MDN 整页 214KB → 数百 token,压缩率约 1%。
自动分级反爬 —— 85% 的站只走最轻的 L1(快、并发高),拦截/JS 骨架页才升级 L2 真浏览器 + stealth 伪装,绝不暴力逐站上浏览器。
登录墙处理 + 如实上报 —— 判定登录/拦截时返回
login_required/blocked,引导登录而非硬撞,从不让模型把验证码当正文。
怎么用(一行)
web_fetch(url="https://xxx/article/1") → JSON:{ok, content(极省正文), token_estimate, tier, blocked?, login_required?, cached?}覆盖的站点类型:文章页 / 文档站 / 门户与列表页 / 需要 JS 渲染的 SPA / 需要登录才给正文的站(如知乎)。
真实站点实测(一键 scripts/demo.py 可复现):
站点 | 类型 | 分级 | 原始 | 抓到正文 | 说明 |
MDN CORS 文档 | 文档站 | L1 | 260KB | ~3.7k token(约 5.7%) | 纯静态,最短路径直达 |
腾讯新闻首页 | 列表/门户 | L2 | 338KB | ~1.4k token(约 1.6%) | 动态页升级浏览器渲染 |
极客邦首页 | SPA/动态 | L2 | 12KB | ~1.4k token | JS 骨架页,需渲染才有正文 |
形态:本地 MCP Server(stdio/HTTP 均可),隐私可控;支持单页 web_fetch、批量 web_batch、结构化抽取 web_extract、登录持久化 login,缓存默认开启。
特性
分级抓取:L1
curl_cffi→ L2 Playwright,拦截才升级,不误伤正常页面。内容密度选根:从 article/main/div 中挑出"恰好装住正文的最紧容器",避开导航/侧栏。
compact 精简:属性剥离、模板块丢弃、站外链接降级、表格转 CSV、token 预算截断, 压缩率可达 1~20% 数量级(如 MDN 214KB → 数百 token)。
拦截如实上报:不把挑战页/空壳页当正文喂给模型,返回
blocked/block_reason。登录态持久化:
login工具手动登录并落盘,web_fetch自动带上;过期会提示重登。缓存与批量:L1 明文响应按 TTL 磁盘缓存;
web_batch并发抓取一批 URL。Stealth 加固:Wipe
webdriver、UA 数据、Canvas/WebGL 确定性指纹噪声、时区对齐。
安装
# L2 渲染所需浏览器(国内可用镜像)
$env:PLAYWRIGHT_DOWNLOAD_HOST="https://cdn.npmmirror.com/binaries/playwright"
pip install "playwright>=1.49"
playwright install chromium
# 或复用系统浏览器,无需下载
$env:SCRAPE_MCP_L2_CHANNEL="chrome" # 或 msedge启动(MCP,stdio)
scrape-mcp
# SSL_DIR 切换协议:stdio(默认)环境变量(前缀 SCRAPE_MCP_)
全部配置可用环境变量(SCRAPE_MCP_ 前缀)设置,也可集中放到项目根目录 .env 文件里。
# 项目根目录执行
cp .env.example .env # 生成配置模板
# 编辑 .env 后无需改代码,直接启动即可优先级:实际进程环境变量 > .env > 默认值。.env 被 gitignore,不入库;.env.example 是随仓库提交的模板。
变量 | 默认 | 说明 |
|
| curl_cffi 指纹模板 |
|
| L1 超时(秒) |
| — | 代理,L1/L2 共用 |
|
| 是否启用 Playwright 升级链 |
| — | 关联浏览器:空=自带 Chromium, |
|
| 挑战页等待窗口(秒) |
|
| 隐身加固时区 |
|
| 登录态/缓存放盘目录 |
|
| L1 缓存 TTL(秒), |
|
|
|
|
|
|
|
| 默认遵循目标站 robots.txt; |
| — | 主机白名单(逗号分隔);非空时仅允许名单内主机 |
| — | 主机黑名单(逗号分隔),优先于白名单 |
|
| 全网抓取限流(每秒请求数); |
HTTP 模式(Postman / curl 直连)
默认 stdio,改环境变量即可切到 HTTP,无需改代码:
$env:SCRAPE_MCP_TRANSPORT="streamable-http"
$env:SCRAPE_MCP_HTTP_PORT="8000"
python -m scrape_mcp.server以 json_response=1(默认)启动,请求/响应都是普通 JSON(非事件流)。stateless 模式无需先 initialize,直接发 tools/call 即可。
必需项:请求头 MCP-Method、Mcp-Name;body 内 params 需带 _meta(protocolVersion + clientCapabilities)。完整示例见下。
接入 MCP 客户端(Claude / Cursor 等)
scrape-mcp 是标准 MCP Server,支持 stdio(推荐,配置即用,无需起 HTTP 服务)。
以 Claude Desktop 为例(claude_desktop_config.json):
{
"mcpServers": {
"scrape-mcp": {
"command": "python",
"args": ["-m", "scrape_mcp.server"],
"env": { "PYTHONPATH": "/绝对路径/src" }
}
}
}command用项目.venv的python(确保已pip install -e .),避免系统解释器报ModuleNotFoundError。若复用系统浏览器(免下载):在
env里加"SCRAPE_MCP_L2_CHANNEL": "chrome"或"msedge"。配置完重启客户端,即可在会话里直接调用
web_fetch/web_extract/web_batch。
其它支持 MCP 的 IDE/客户端(Cursor、Windsurf 等)配置方式同理:把上面的
mcpServers段填进对应配置即可。
MCP 工具
web_fetch(url, max_tokens=4000, link_policy="internal")→ 状态 + 极省正文link_policy:internal(站内相对链接+站外降级)/all/none
web_extract(url, schema={...})→ 按字段 schema 抽取结构化 JSON(可入库)字段类型:
text(默认)/attr(需配attr取属性)/count/list(list_key取值)
web_batch(urls, max_tokens=3000, link_policy="internal")→ 并发抓取一批,逐 URL 返回;单条异常不影响整批login(url, timeout=180)→ 打开带界面浏览器手动登录并持久化登录态
返回为 JSON 字符串(落在 content[0].text,请解析文本,勿依赖 structured_content)。
web_extract 示例
schema='{"fields": {
"title": {"selector": "h1", "type": "text"},
"main_link":{"selector": "a", "type": "attr", "attr": "href"},
"tag_count":{"selector": ".tag", "type": "count"},
"tags": {"selector": ".tag", "type": "list", "list_key": "text"}
}}'
# → {"ok":true, "data": {"title":"…","main_link":"…","tag_count":3,"tags":["a","b","c"]}, "missing":[]}目录结构
src/scrape_mcp
├── server.py # MCP 入口 + 工具(web_fetch/web_batch/login)
├── config.py # 环境变量配置
├── tokenizer.py # tiktoken 计数 + 预算截断
├── core/
│ ├── http_client.py # L1 curl_cffi + 磁盘缓存
│ ├── fetcher.py # 分级调度(L1→L2),对工具层返回 FetchOutcome
│ ├── detector.py # 拦截/骨架页判定
│ ├── browser.py # L2 Playwright + stealth
│ ├── session.py # 登录态持久化
│ └── cache.py # HTTP 响应缓存
└── extract/
├── compact.py # DOM 剪枝 → 极省 token 正文
└── schema.py # 结构化抽取(按字段 schema 出 JSON)开发
pip install -e ".[dev]"
python -m pytestAvailable Tools
4 toolsloginA
打开带界面的浏览器手动登录,并把该站登录态持久化到磁盘。
用于 web_fetch 报告 login_required=true 的站点:浏览器会以非无头方式打开目标页, 请在弹出的窗口里完成登录;检测到登录成功或超时后,登录态(cookie 等)会被保存, 之后该站的 web_fetch 会自动带上登录态。
Args: url: 目标站点任一页面 URL(按域名区分登录态)。 timeout: 等待手动登录完成的秒数,超时也会保存当前状态便于下次继续。
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully carries the behavioral burden. It discloses that the browser opens non-headless, that login must be manually completed, that cookies are persisted per domain, and that timeout still saves current state—covering the key behavioral side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a short overview followed by an Args section. It is slightly verbose in places, but every part contributes useful operational context, and the key workflow information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the manual, interactive nature of this tool, the description covers the full call flow: why to invoke it, what the user will see, how the state is saved, and what happens after timeout. The existing output schema covers return values, so no additional explanation is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully documents both parameters: url specifies any page URL of the target site with login state keyed by domain, and timeout sets the manual-login waiting period with a defined timeout behavior. This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: opening a GUI browser for manual login and persisting the site's login state to disk. It also explicitly ties itself to the web_fetch login_required=true workflow, which clearly distinguishes it from the sibling fetch tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: when web_fetch reports login_required=true for a site. It also explains the follow-up behavior (web_fetch will automatically carry the saved login state afterward), giving the agent clear situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_batchA
并发抓取一批 URL,各自走完整分级链路,返回逐个结果。
Args: urls: 目标 URL 列表(最多 batch_max_urls 个,默认 20)。 max_tokens: 每个 URL 的正文 token 预算上限。 link_policy: 同 web_fetch。
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | ||
| max_tokens | No | ||
| link_policy | No | internal |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add useful behavior: concurrency, full processing chain per URL, per-URL token limits, and a batch default of 20. It does not cover failure handling, rate limits, or clarify what '完整分级链路' actually entails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core behavior, and uses a clear argument list with no filler. Each sentence contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter tool with an output schema present, the description covers the essentials: target URLs, per-URL token budget, link policy, and result granularity. It is incomplete in that it omits error semantics, behavior when the batch limit is exceeded, and the precise meaning of the full processing chain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates well by defining all three parameters: urls with a maximum/default count, max_tokens as a per-URL budget, and link_policy as equivalent to web_fetch. It loses one point because 'batch_max_urls' is referenced but not fully explained and link_policy values are not expanded.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: '并发抓取一批 URL' (concurrently fetch a batch of URLs) and notes that results are returned per URL. This is clear and the batch name distinguishes it from web_fetch, though it does not explicitly contrast the two siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The batch behavior implies use for multiple URLs versus web_fetch for a single URL, and link_policy is explicitly delegated to web_fetch semantics. However, it does not state when to prefer this tool over web_fetch or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_extractA
抓取网页并按字段 schema 抽取结构化 JSON(字段级数据,可入库)。
适合需要"数据而非整页正文"的场景:给 URL 和字段规则,直接返回字段值, 而不是一段 compact 文本。抓取链路(分级反爬、登录态、合规)与 web_fetch 一致。
字段规则示例: {"fields": { "title": {"selector": "h1", "type": "text"}, "first_heading": {"selector": "h1", "type": "text"}, "main_link": {"selector": "a", "type": "attr", "attr": "href"}, "link_count": {"selector": "a", "type": "count"}, "tags": {"selector": ".tag", "type": "list", "list_key": "text"} }} 字段类型:text(默认,节点归一化文本)/ attr(需配 attr,取属性值)/ count(匹配节点数)/ list(取所有匹配节点,list_key 决定取值方式: text / text_trimmed / attr / html)。
Args: url: 目标网页完整 URL。 schema: 字段抽取规则字典,见上方示例。
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| schema | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It discloses that extraction uses the same pipeline as web_fetch (tiered anti-crawling, login state, compliance), that it returns field-level data rather than full-page text, and details field-type semantics such as count and list behavior. It does not cover error handling or rate limits, but it provides meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and usage, then uses a compact example and a concise field-type reference. It is somewhat long, but the length is justified because the schema parameter requires documentation beyond what the input schema provides. The structure is logical and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only two parameters, an output schema, and no annotations, the description covers the essential usage, parameter construction, and behavioral context. It explains when to use it, how to define extraction rules, and what kind of result to expect. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It defines url as the target complete URL and provides an extensive breakdown of the schema parameter, including a full JSON example and detailed semantics for text, attr, count, and list field types with list_key options. This more than covers the minimal input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: it scrapes a webpage and extracts structured JSON by field schema. It explicitly contrasts with web_fetch ('directly returns field values, not a compact text'), so an agent can distinguish it from the main sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a direct use-case signal ('适合需要数据而非整页正文的场景') and explains that the scraping chain is the same as web_fetch. It does not explicitly enumerate when not to use it or mention web_batch, but the context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_fetchA
抓取网页并返回极省 token 的紧凑正文(自动辨别反爬拦截页并如实上报)。
Args: url: 目标网页完整 URL,需带 http/https 协议头。 max_tokens: 正文 token 预算上限,超出时保留头尾、省略中段。 link_policy: 链接处理策略。internal=站内链接保留为相对路径、站外降级为纯文本(默认,最省); all=站内外链接全保留;none=全部降级为纯文本。
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| max_tokens | No | ||
| link_policy | No | internal |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does a good job: it discloses anti-crawler interception detection, truthful reporting, and the truncation strategy of keeping head/tail while omitting the middle when max_tokens is exceeded. This goes beyond what the schema alone would tell an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the main purpose, and uses a clear bulleted Args section. Every sentence adds useful information without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value shape does not need to be described. The description covers the operation, URL requirement, token budget behavior, link policy variants, and an important edge case (anti-crawling pages). It is slightly incomplete only in not addressing relationship to sibling tools such as web_batch and login.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by explaining the URL protocol requirement, the max_tokens truncation behavior, and every link_policy option with its default and trade-off. This gives an agent actionable parameter-level semantics that the raw schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: it fetches a web page and returns a token-efficient compact body. It also signals a distinctive behavior (auto-detecting anti-crawling block pages), which helps distinguish it from generic fetch tools, though it does not explicitly contrast with its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does and how parameters work, but gives no guidance on when to prefer web_fetch over web_batch or login, nor any conditions where it should not be used. Usage context is only implied by the tool name and the single-page nature of the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.2.0- Added
web_extract
3 tool updates
v0.1.0- First observed
login - First observed
web_batch - First observed
web_fetch
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: single-page text fetch, structured field extraction, manual login for auth persistence, and batch fetching. The overlap between web_fetch and web_batch is limited to shared parameters, but their single vs. multi-URL scopes are unambiguous.
Three tools follow the web_verb pattern (web_fetch, web_extract, web_batch), which is predictable and readable. The lone 'login' tool breaks the pattern, but it represents a different kind of operation (authentication rather than fetching), so the deviation is minor.
With four tools, the server is well-scoped for scraping: a basic fetch, a structured extraction, a batch operation, and an auth helper. Each tool fills a distinct role without unnecessary bloat or obvious missing core functionality.
The tool surface covers the main scraping lifecycle: fetching text, extracting structured data, handling multiple URLs, and dealing with login-protected pages. Minor gaps exist, such as no raw HTML output or explicit pagination/crawling support, but these can be worked around with the existing extraction and batch tools.
Maintenance
Related MCP Connectors
Web scraping for AI agents. Converts URLs to clean, LLM-ready Markdown with anti-bot bypass.
Reliable web access for AI agents: smart HTTP, rotating proxies, and full-browser rendering.
Clean Markdown and AI-readability scoring for any URL. Built for AI agents.
Web search, browser automation, scraping, crawling and CAPTCHA solving for AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI agents to read web pages reliably, returning clean markdown content, hyperlinks, and metadata without navigation or ad noise.36 npmMIT
- AlicenseNot gradedqualityDmaintenanceProvides AI agents with reliable web fetching capabilities, handling retries, caching, and anti-bot bypass automatically.MIT

foundrynet-scrapeofficial
FlicenseNot gradedqualityFmaintenanceEnables AI agents to extract clean, structured content from any web page via a pay-per-call API or with a Forge key.-- AlicenseAqualityCmaintenanceEnables AI agents to extract clean, structured web content (articles, tables, links, visual layouts) optimized for LLM token efficiency, with fast response times and optional JavaScript support.567 npmMIT