Skip to main content
Glama
Prog-up

Web Scraper MCP

by Prog-up

Web Scraper MCP

Ein selbst gehosteter Model Context Protocol-Server, der einem LLM-Client (Claude Code, Cursor, ChatGPT) dieselbe Tool-Oberfläche bietet wie kostenpflichtige Scraping-Dienste — scrape, crawl, map, search, extract, interact, deep_research — und vollständig auf Ihrer eigenen Hardware läuft.

Keine kostenpflichtigen Proxy-/CAPTCHA-Dienste: Der Anti-Bot-Schutz ist selbst gehostet (headless Chromium + playwright-stealth, robots.txt, höfliches Rate Limiting). Härtende Websites können uns dennoch blockieren; siehe Einschränkungen.

Werkzeuge

Tool

Was es tut

scrape

Eine URL → sauberes Markdown (Boilerplate entfernt). Statisch zuerst, automatischer Browser-Fallback für JS-Seiten.

crawl / check_crawl_status

Hintergrund-BFS-Crawl-Job (Deduplizierung, Tiefen-/Seitenlimits); Ergebnisse abfragen.

map

Listet die Links auf einer Seite auf (optional gleiche Domain) — entscheiden Sie, was gecrawlt werden soll.

search

Websuche. Austauschbares Backend: DuckDuckGo (Standard), SearXNG, Brave oder Tavily.

extract

Ruft eine Seite ab und extrahiert strukturiertes JSON passend zu Ihrem Schema, über ein LLM.

browser_navigate / browser_act / browser_close

Steuern einer persistenten Browser-Sitzung (Klicken/Ausfüllen/Drücken) mithilfe tokenarmer ARIA-Snapshots.

deep_research

Suche → Top-Quellen lesen → einen zitierten Synthesebericht zurückgeben.

extract und deep_research erfordern ANTHROPIC_API_KEY.

Related MCP server: Fetch MCP Server

Schnellstart

uv sync                      # install deps (uses the pinned uv.lock)
uv run playwright install chromium
export SCRAPER_AUTH_TOKEN=$(openssl rand -hex 32)
uv run web-scraper-mcp       # HTTP server on http://127.0.0.1:8000/mcp

Stdio (lokal, für einen Desktop-Client): SCRAPER_TRANSPORT=stdio uv run web-scraper-mcp.

Docker

Der schnellste Weg, um loszulegen, ist das Ziehen des vorgefertigten Images von DockerHub.

# Pull the latest image
docker pull PROG_UP_USERNAME/web-scraper-mcp:latest

# Run the container (with Anthropic / Claude)
docker run -p 8000:8000 \
  -e SCRAPER_AUTH_TOKEN=your_secure_token_here \
  -e ANTHROPIC_API_KEY=sk-ant-api03-... \
  PROG_UP_USERNAME/web-scraper-mcp:latest

# Or run the container over stdio (useful for local MCP clients)
docker run -i --rm \
  -e SCRAPER_TRANSPORT=stdio \
  -e SCRAPER_AUTH_TOKEN=your_secure_token_here \
  PROG_UP_USERNAME/web-scraper-mcp:latest

(Stellen Sie sicher, dass Sie PROG_UP_USERNAME durch Ihren tatsächlichen DockerHub-Benutzernamen ersetzen).

Verwendung lokaler Modelle (Ollama) und Kontextfenster

Wenn Sie Modelle lieber lokal ausführen möchten, anstatt die Anthropic-API zu verwenden, unterstützt der Server Ollama vollständig als alternatives Backend für die extract- und deep_research-Werkzeuge.

docker run -p 8000:8000 \
  -e SCRAPER_AUTH_TOKEN=your_secure_token_here \
  -e SCRAPER_OLLAMA_HOST=http://host.docker.internal:11434 \
  -e SCRAPER_EXTRACT_MODEL=qwen3.5:2b \
  -e SCRAPER_RESEARCH_MODEL=qwen3.5:2b \
  PROG_UP_USERNAME/web-scraper-mcp:latest

[!WARNUNG] Kontextfenster sind entscheidend! Web-Scraping erzeugt eine enorme Menge an Markdown. extract kann bis zu 100.000 Zeichen und deep_research bis zu 16.000 Zeichen an das LLM senden.

Standardmäßig verarbeitet Claude große Kontexte nativ. Allerdings ist das Standard-Kontextfenster von Ollama (num_ctx) oft auf nur 2.048 Token eingestellt. Wenn Sie eine riesige Wikipedia-Seite an ein lokales Modell übergeben, wird der Prompt stillschweigend abgeschnitten (Ihre Anweisungen werden verworfen) und leere Zeichenfolgen zurückgegeben!

Wir übergeben automatisch "num_ctx": 32768 an Ollama in den API-Payloads, um dieses Abschneiden zu verhindern. Stellen Sie sicher, dass Ihr lokaler Rechner genügend RAM/VRAM hat, um ein 32K-Kontextfenster zu unterstützen, wenn Sie Ollama verwenden!

In einem Client registrieren (mcp.json)

Wenn über HTTP ausgeführt:

{
  "mcpServers": {
    "web-scraper": {
      "url": "http://127.0.0.1:8000/mcp",
      "headers": { "Authorization": "Bearer your_secure_token_here" }
    }
  }
}

Wenn über stdio (Docker) ausgeführt:

{
  "mcpServers": {
    "web-scraper": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "SCRAPER_TRANSPORT=stdio",
        "-e", "SCRAPER_OLLAMA_HOST=http://host.docker.internal:11434",
        "-e", "SCRAPER_EXTRACT_MODEL=qwen3.5:2b",
        "-e", "SCRAPER_RESEARCH_MODEL=qwen3.5:2b",
        "PROG_UP_USERNAME/web-scraper-mcp:latest"
      ]
    }
  }
}

Konfiguration

Alle Einstellungen sind Umgebungsvariablen (Präfix SCRAPER_) oder eine .env-Datei — siehe .env.example.

Var

Standard

Hinweise

SCRAPER_AUTH_TOKEN

(nicht gesetzt)

Bearer-Token für den HTTP-Endpunkt. Erforderlich für jede Netzwerkbereitstellung; nicht gesetzt = nicht authentifiziert (gewarnt).

SCRAPER_HOST / SCRAPER_PORT

127.0.0.1 / 8000

Bind-Adresse. Docker-Image setzt Host 0.0.0.0.

SCRAPER_MAX_CONCURRENT_PAGES

8

Gleichzeitigkeitslimit für Headless-Seiten (RAM/CPU-gebunden).

SCRAPER_MAX_CRAWL_PAGES / _DEPTH

100 / 3

Harte Obergrenzen für Crawl-Jobs.

SCRAPER_PER_DOMAIN_DELAY_S

1.0

Höfliches Ratenlimit pro Domain.

SCRAPER_RESPECT_ROBOTS

true

robots.txt respektieren.

SCRAPER_ALLOW_PRIVATE_NETWORKS

false

Auf false lassen — deaktiviert den SSRF-Schutz, wenn true.

ANTHROPIC_API_KEY

(nicht gesetzt)

Aktiviert extract / deep_research.

SCRAPER_SEARXNG_URL, BRAVE_API_KEY, TAVILY_API_KEY

(nicht gesetzt)

Optionale Such-Backends (erste gesetzte gewinnt, sonst DuckDuckGo).

Sicherheit

  • SSRF-Schutz — jede abgerufene URL (und jeder Redirect-Hop) wird per DNS aufgelöst und abgelehnt, wenn sie auf eine private / Loopback- / Link-Local- / Cloud-Metadata-Adresse zeigt. Der Browser bricht auch Subresource-Anfragen an private IPs ab.

  • Authentifizierung — Bearer-Token auf dem HTTP-Transport; standardmäßig an localhost gebunden.

  • Ressourcenlimits — Antwortgröße, Timeout, Seiten-Gleichzeitigkeit, Crawl-Seiten-/Tiefenlimits zum Schutz des Hosts.

  • robots.txt + Ratenlimitierung standardmäßig aktiviert.

  • Container — läuft als Nicht-Root-Benutzer; Geheimnisse nur über Umgebungsvariablen.

Lieferkette — Überprüfung des Images

CI signiert das Image schlüssellos mit cosign (Sigstore) unter Verwendung der OIDC-Identität von GitLab und fügt eine SPDX-SBOM-Bescheinigung hinzu. Überprüfen Sie vor der Ausführung:

cosign verify \
  --certificate-oidc-issuer https://gitlab.cri.epita.fr \
  --certificate-identity-regexp 'https://gitlab.cri.epita.fr/enzo.juhel/web-scraper//.*' \
  registry.gitlab.cri.epita.fr/enzo.juhel/web-scraper@sha256:...

Benchmark

benchmarks/run.py bewertet unser scrape/extract gegen öffentliche Datensätze und die Crawl4AI-Baseline und erstellt eine Scorecard (pro Seitentyp F1/Genauigkeit + einen Abschnitt zu Einschränkungen). Führen Sie es lokal oder über den manuellen CI-benchmark-Job aus:

uv run python benchmarks/run.py --output scorecard.md

Einschränkungen

  • Keine kostenpflichtigen Proxys/CAPTCHA: Stark verteidigte Websites (LinkedIn, Amazon, Cloudflare-Herausforderungen) blockieren uns manchmal. Die Benchmark-Scorecard quantifiziert, wo.

  • Die Extraktion des Hauptinhalts ist bei Artikeln stark, bei Foren / Produkt- / Listenseiten schwächer (eine bekannte Eigenschaft aller Extraktoren).

  • In-Memory-Crawl-/Sitzungsstatus — bewusst Single-Process, Single-User.

Entwicklung

uv run pre-commit install        # local lint/secret hooks
uv run ruff check . && uv run ruff format --check .
uv run mypy src
uv run pytest -q

Available Tools

4 tools
deep_researchA

Search the web, read the top sources, and return a cited synthesis report.

NameRequiredDescriptionDefault
queryYesThe research question.
max_sourcesNoHow many top results to read.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the general workflow (searching the web, reading top sources, producing a cited report) but does not mention read-only behavior, potential latency, rate limits, or any limitations. The description is truthful and somewhat informative, but leaves important operational behavior unaddressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with a clear chronological structure, no filler, and immediate front-loading of the core action ('Search the web'). Every phrase earns its place: 'read the top sources' and 'cited synthesis report' are distinct and necessary components. This is appropriately concise for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the two fully documented parameters and the presence of an output schema (likely covering the report structure), the description covers the essential process and outcome well. What is missing is more explicit context about when to use the tool versus siblings and a few behavioral notes, but the combination of description and schema is largely sufficient for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: both 'query' and 'max_sources' have descriptions in the schema. The tool description's phrasing ('research question', 'top results') mirrors the schema descriptions without adding new meaning about formats, constraints, or interpretation. This meets the baseline of 3 but does not exceed what structured data already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb sequence ('Search', 'read', 'return') with a clear deliverable ('a cited synthesis report'). It unambiguously identifies the tool's function and naturally distinguishes deep_research from siblings like search (just web results) or scrape/extract (page-level content gathering). The multi-step process is explicit and not a tautology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for comprehensive research with cited synthesis, but it never explicitly states when to prefer this over search, scrape, or extract, nor does it give any 'instead of' guidance. Context makes the intended use reasonably clear, yet there are no exclusions or alternative routing as seen in higher-quality definitions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extractB

Extract structured data (JSON matching json_schema) or a text answer from a page.

NameRequiredDescriptionDefault
urlYesURL to extract from.
promptNoNatural-language extraction instruction.
renderNoForce a browser render.
json_schemaNoJSON Schema describing the fields to extract (recommended).

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It does disclose the two operating modes (structured JSON versus text answer), which is meaningful. However, it does not mention rendering defaults, page-fetch behavior, rate limits, or side effects. The render parameter is defined in the schema, so some of that context is available, but the description itself stays minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It could be slightly better structured by explicitly separating the two modes, but as written it is efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return-value details are covered elsewhere, and the input schema is fully documented. The main gaps are the lack of choice guidance between prompt and json_schema, and no indication of when to use extract instead of scrape. These gaps make the description adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines url, prompt, render, and json_schema. The description adds a high-level mapping by linking json_schema to structured JSON and implying the text answer comes from the prompt, but it does not add much beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('extract'), the target resource ('a page'), and the two possible outputs: JSON matching json_schema or a text answer. It does not explicitly distinguish itself from sibling tools like scrape or search, though the verb and output specification make the core purpose clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use extract versus scrape, search, or deep_research, and no exclusions or conditions. The only context is 'from a page,' which is too thin to help an agent choose between this and its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scrapeA

Scrape a single URL into clean markdown (boilerplate/ads stripped).

Tries a fast static fetch first and falls back to a stealth headless browser automatically when the page looks JS-gated.

NameRequiredDescriptionDefault
urlYesThe URL to scrape (http/https).
renderNoForce a headless browser render (for JS-heavy pages).
include_linksNoAlso return all links found on the page.
include_raw_htmlNoAlso return the raw HTML (large).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It clearly reveals the two-phase fetch strategy, the automatic fallback to headless browsing, and the output transformation to clean markdown. It does not discuss rate limits, authentication, or failure behavior, but the core operational traits are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no fluff, front-loading the primary purpose before the fallback behavior. Every sentence contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema means return values do not need to be explained in the description. Combined with fully documented parameters and a clear explanation of the scraping strategy, the definition is largely complete, though it omits failure semantics and any rate-limit or authentication caveats.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented in the input schema. The tool description adds no additional parameter-level meaning, which matches the baseline for fully-covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Scrape a single URL') and a concrete outcome ('into clean markdown'), making the tool's purpose immediately clear. The boilerplate/ads-stripping detail further distinguishes it from general fetch or research siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains that a fast static fetch is attempted first and that a stealth headless browser is used automatically for JS-gated pages, giving clear context on when the tool adapts. It does not explicitly name alternatives or say when to prefer sibling tools, so it stops short of full exclusion guidance.

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. 4 tool updatesv0.1.0
    • First observeddeep_research
    • First observedextract
    • First observedscrape
    • First observedsearch

TDQS

A3.8/5.0

Scored across 4 tools

Disambiguation4/5

scrape and extract both operate on a page but are clearly distinguished by output type: markdown document vs structured JSON/answer. search and deep_research are also distinct, though deep_research could be seen as a superset of search.

Naming Consistency5/5

All tools use lowercase snake_case imperative verbs: scrape, extract, search, deep_research. The naming pattern is consistent and predictable.

Tool Count5/5

Four tools is well-scoped for a web scraper/research server: one for raw page content, one for structured extraction, one for search, and one for synthesis. Each tool has a clear purpose with no redundant bloat.

Completeness4/5

The core web research workflow is covered: search, fetch, extract, and synthesize. A minor gap is the lack of batch crawling or link-following features, but most common agent tasks can be completed with these tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables web scraping and crawling capabilities for LLM clients, supporting single-page scraping, multi-page website crawling, and web search with multiple engines (Playwright, Cheerio, Puppeteer) and flexible output formats including markdown, HTML, text, and screenshots.
    19 npm
    6
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables LLMs to fetch and extract web content using browser automation, OCR, and multiple extraction methods, handling JavaScript rendering and anti-scraping techniques.
    17
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables privacy-first web scraping and structured data extraction using a local headless browser and your own LLM key. Supports tools for scraping, batch scraping, data extraction with prompts or schemas, and screenshots.
    5
    6 npm
    3
    MIT