cute-web-scraper
cute-web-scraper
Ein MCP-Server, der Claude Web-Scraping-Fähigkeiten verleiht. Kostenlos, lokal, ohne API-Schlüssel, ohne Cloud-Konto.
Frag einfach in normaler Sprache. Er holt die Seiten, rendert bei Bedarf das JavaScript, umgeht die Blockaden und liefert sauberes Markdown oder eine abfragbare Tabelle zurück – ohne Selektoren, ohne Klebecode.
Warum dieser
Er kommt rein. Vier aufsteigende Stufen – einfaches HTTP, Browser-TLS-Fingerprints, ein echter Browser, dann ein Stealth-Browser. ASOS, eBay, Booking.com und Trustpilot liefern alle echte Daten, über eine Heimverbindung ohne Proxys.
Er verschwendet deinen Kontext nicht. Artikel werden von Navigation, Cookie-Bannern und Fußzeilen befreit: Eine BBC-Nachrichtenseite geht von 20.513 Zeichen auf 3.198 zurück. Große Ergebnisse landen in einer SQLite-Tabelle, die du mit SQL abfragst, statt sie in den Chat einzufügen.
Er sagt die Wahrheit über Fehler. Fünf der getesteten Seiten lieferten eine Ablehnung unter einem Erfolgs-Status – ein Interstitial unter HTTP 200, ein Bot-Check unter 202 – und eine lieferte echten Inhalt unter 403. Die Block-Erkennung wiegt den Seiteninhalt, nicht den Statuscode, damit du keinen Stub als Daten gemeldet bekommst.
Ganze Websites, nicht einzelne Seiten. Sitemap-Erkennung, paralleles Abrufen und 24 Tools für Produkte, Kontakte, Shopify-Kataloge, Orte, PDFs und Änderungsverfolgung.
Installation
pipx install git+https://github.com/maccydee/cute-web-scraperChromium wird automatisch heruntergeladen, wenn du js_render zum ersten Mal verwendest (einmalig ~130 MB).
Related MCP server: mcp-server-scraper
Mit Claude Code verbinden
claude mcp add cute-web-scraper -- cute-web-scraperDann frag einfach:
Scrape every product from https://example-shop.com and give me a CSV of name and price.Tools
Abrufen und Erkunden
Tool | Was es tut |
| Durchsuche das Web und erhalte sortierte Ergebnisse – der Einstieg, wenn du eine Frage hast, keine URL |
| Eine URL zu sauberem Markdown, mit Titel, Status und Linkanzahl |
| Melde die API-Aufrufe, die eine Seite macht, mit ihrem JSON – lies die Datenquelle direkt |
| Viele URLs parallel, mit Ergebnissen und Fehlern pro URL |
| Entdecke die Seiten einer Website über die Sitemap, mit Fallback auf Link-Verfolgung |
| Erkenne die Plattform, finde die Sitemap, melde, ob JavaScript benötigt wird |
Extraktion
Tool | Was es tut |
| Beliebige Felder über CSS-Selektoren – macht aus jeder Liste eine Tabelle |
| Strukturierte Produktdaten (Name, Preis, Währung, Verfügbarkeit, Marke, SKU, Bewertung) aus JSON-LD, OpenGraph oder Mikrodaten |
| E-Mail-Adressen über eine Liste von URLs, mit umgebendem Kontext |
| Telefonnummern über eine Liste von URLs, mit umgebendem Kontext |
| Jeden Hyperlink, aufgelöst zu absoluten URLs |
| Soziale Profile auf acht Plattformen |
| Einen ganzen Shopify-Katalog, eine Zeile pro Variante |
| Die Kollektionen eines Shopify-Shops und ihre Produktanzahlen |
Orte und lokale Unternehmen
Tool | Was es tut |
| Suche nach Name oder Beschreibung – Name, Adresse, Koordinaten, Telefon, Website, Öffnungszeiten |
| Jedes Unternehmen einer Kategorie innerhalb eines Radius um einen Ort |
Änderungsverfolgung
Tool | Was es tut |
| Rufe eine Seite ab und vergleiche sie mit dem letzten Check – neu, gleich oder geändert |
| Beobachtete Seiten und wann jede zuletzt gesehen wurde |
| Beende die Beobachtung einer Seite |
Ergebnistabellen
Tool | Was es tut |
| Gespeicherte Ergebnistabellen mit Zeilenanzahl und Spalten |
| Spalten einer Tabelle, Zeilenanzahl und eine Stichprobe |
| Schreibgeschütztes SQL über eine gespeicherte Tabelle – filtern, aggregieren, gruppieren, sortieren und optional das Ergebnis als neue Tabelle speichern |
| Schreibe eine Tabelle als CSV oder JSON auf die Festplatte |
| Lösche eine gespeicherte Tabelle |
Ein typischer Ablauf kombiniert sie: analyze_website → crawl_site → fetch_pages → query_table.
Beliebige Felder extrahieren
extract_by_selector deckt alles ab, was die festen Extraktoren nicht tun:
Get the title, price and link from every product on these 40 pages,
save it as `catalogue`, then show me anything under £50.fields ordnet Spaltennamen CSS-Selektoren zu. row_selector macht jeden Treffer zu einer Zeile – das macht aus einer Liste eine Tabelle. Ein @attr-Suffix liest ein Attribut statt Text, wobei href und src zu absoluten URLs aufgelöst werden:
{"name": "h3 a@title", "price": ".price_color", "link": "h3 a@href"}Eine Seite steuern
fetch_page akzeptiert actions, die ausgeführt werden, bevor die Seite gelesen wird – Cookie-Gates, „Mehr laden“-Buttons, unendliches Scrollen und Suchformulare:
[{"action": "click", "selector": "#accept-cookies"},
{"action": "scroll_to_bottom", "max_rounds": 10}]Verfügbare Aktionen: click, type, press, wait, wait_for, scroll, scroll_to_bottom und click_until_gone. Jede meldet, was sie getan hat, sodass ein Schritt, der still nichts gefunden hat, sichtbar ist, statt dich raten zu lassen.
Die API statt der Seite lesen
Wenn eine Website schwer zu parsen ist, rendert inspect_network sie und meldet die ausgeführten Anfragen. Eine JavaScript-Seite lädt ihre Daten fast immer von einem Endpunkt, den du direkt abrufen kannst – billiger als das Parsen von Markup, und es übersteht Redesigns, die Selektoren brechen:
Inspect the network on this listing page, then fetch whatever JSON endpoint it uses.Änderungen beobachten
Check https://example.com/pricing for changes.track_changes speichert einen Schnappschuss und meldet new, same oder changed mit einem Unified-Diff. Das ist Überwachung ohne Zeitplaner – prüfe, wann du willst, und sieh nur den Unterschied.
Slash-Befehle
Der Server bringt vier fertige Workflows mit, die in Claude Code als Slash-Befehle erscheinen: scrape_site, scrape_shopify_store, find_contacts und compare_prices.
Mit großen Scrapes arbeiten
Jedes Tool, das Zeilen zurückgibt, akzeptiert save_as. Statt die Daten in die Konversation zu legen, schreibt es eine Ergebnistabelle und gibt eine Zusammenfassung zurück:
Extract the whole catalogue from deathwishcoffee.com into a table called `catalogue`,
then tell me the price range and how many variants are out of stock.Claude ruft extract_shopify_store(save_as="catalogue") auf, bekommt eine Zeilenanzahl und Spaltenliste zurück und antwortet dann mit query_table:
SELECT COUNT(*) AS variants, MIN(price) AS cheapest,
MAX(price) AS dearest, SUM(available) AS in_stock
FROM catalogueDie Tabelle kann 100.000 Zeilen enthalten und keine davon gelangt in die Konversation. query_table ist strikt schreibgeschützt – es läuft gegen ein schreibgeschütztes SQLite-Handle und lehnt alles ab, was kein SELECT ist, sodass eine Abfrage gespeicherte Daten niemals ändern oder löschen kann.
Tabellen liegen in einer SQLite-Datei unter ~/.cute-web-scraper/results.db (setze SCRAPER_DB_PATH, um sie zu verschieben).
Daten bereinigen
query_table akzeptiert auch save_as, was das Ergebnis als neue Tabelle speichert. SQL drückt bereits die üblichen Bereinigungsoperationen aus, daher gibt es keinen separaten Satz von Bearbeitungswerkzeugen:
SELECT DISTINCT * FROM leads -- deduplicate
SELECT street || ', ' || city AS address FROM leads -- merge columns
SELECT name, phone FROM leads WHERE phone IS NOT NULL -- drop columns and rows
SELECT vendor AS brand FROM catalogue -- renameDie Quelltabelle bleibt unangetastet, es sei denn, du zielst absichtlich auf ihren eigenen Namen, und die Antwort sagt replaced_existing_table, wenn du das tust – so ist ein In-Place-Filter nie ein stiller Verlust von Zeilen.
Orte und lokale Unternehmen
find_places sucht einen einzelnen Ort; find_places_nearby gibt alles einer Kategorie innerhalb eines Radius zurück, was der Fall für lokale Lead-Generierung ist:
Find every dentist within 4km of Bath, save it as `leads`,
then tell me how many have a website but no phone number.Kategorien akzeptieren freundliche Namen (cafe, dentist, hotel, solicitor, gym, hairdresser, …) oder ein rohes OpenStreetMap-Tag wie amenity=dentist.
Ein Hinweis zur Datenquelle. Das ist OpenStreetMap, nicht Google Maps. Google war das offensichtliche Ziel und es funktioniert nicht: Ein automatisierter Browser bekommt ein Cookie-Einwilligungs-Interstitial, und wenn man das überwindet, eine abgespeckte Karten-Shell ohne Orts-Panel. Die Stealth-Stufe hilft nicht, weil dies eine Einwilligungsmauer ist und keine Bot-Erkennung – ein anderes Problem als das, das Stealth löst.
OpenStreetMap bietet dieselben Felder – Name, Adresse, Koordinaten, Telefon, Website, Öffnungszeiten, Kategorie – über dokumentierte offene Endpunkte ohne Schlüssel. Das Einzige, wofür es kein Äquivalent gibt, sind Sternebewertungen und Bewertungsanzahlen, die Googles eigene proprietäre Daten sind.
Beide Endpunkte werden von Freiwilligen betrieben. Nominatims Richtlinie von einer Anfrage pro Sekunde wird intern unabhängig von SCRAPER_DELAY_MS durchgesetzt, und Overpass-Abfragen fallen auf mehrere öffentliche Spiegel zurück, weil die Hauptinstanz regelmäßig 504 unter Last zurückgibt.
Die Tool-Ausgabe ist außerdem auf SCRAPER_MAX_INLINE_CHARS begrenzt (standardmäßig 25.000). Darüber hinaus wird ein Ergebnis mit einem Hinweis auf save_as abgeschnitten – so kann ein einzelner Aufruf deinen Kontext nicht versehentlich füllen.
Beispiel-Prompts
Export the whole catalogue from deathwishcoffee.com and tell me the price range.
Find all email addresses on https://company.com and its contact pages.
What platform is https://myblog.com on? Does it need JavaScript to scrape?
Scrape these 200 product pages into a table, then show me everything under £50 that's in stock.
Extract the social media links from these 10 agency sites: [urls...]Konfiguration
Alles ist eine Umgebungsvariable, mit Standardwerten, die ohne Konfiguration funktionieren.
Variable | Standard | Bedeutung |
|
| Basisverzögerung zwischen Anfragen an dieselbe Domain |
|
| Maximale parallele Anfragen |
|
| Wie lange eine abgerufene Seite wiederverwendbar bleibt |
|
| Zwischengespeicherte Seiten vor der Entfernung nach dem Least-Recently-Used-Prinzip |
| nicht gesetzt | Bearer-Token für den HTTP-Modus |
| nicht gesetzt | Chrome-Profil, von dem angemeldete Sitzungen übernommen werden |
|
| Blockierte Anfragen mit Browser-TLS-Fingerabdrücken erneut versuchen |
|
| Stealth-Browser als letzte Option für die schwierigsten Blockaden |
|
| Wo Ergebnistabellen gespeichert werden |
|
| Obergrenze dafür, wie viel ein einzelnes Tool inline zurückgibt |
Das Bündeln einer langen URL-Liste in eine Tabelle erfordert mode: "append" bei jedem Aufruf nach dem ersten, sonst ersetzt jeder Stapel den letzten. Gerenderte Seiten, die spärlich zurückkommen, können mit wait_ms oder besser mit wait_for und einem CSS-Selektor versehen werden.
Verhalten
Hauptinhalt, nicht die ganze Seite. Seiten im Artikelformat werden durch trafilatura verarbeitet, das den Hauptteil isoliert und das umgebende Beiwerk entfernt – gewählt, weil es in einem unabhängigen Benchmark mit 2.008 Seiten einen F1-Wert von 0,791 erreicht, gegenüber Readabilitys 0,674. Es wird pro Seite angewendet, nicht universell: Derselbe Benchmark zeigt, dass Extraktoren bei Produktrastern und Sammlungen um 20–30 Punkte abweichen, wo „Hauptinhalt“ kein Artikel ist, daher behalten Listenseiten das vollständige Dokument. Übergeben Sie main_content: false, um das überall zu erzwingen.
Vier Stufen, die nur bei Ablehnung eskalieren. Ein einfacher HTTP-Client bewältigt die meisten Seiten. Wenn eine Website ablehnt, wird die Anfrage mit echten Browser-TLS-Fingerabdrücken (Chrome, dann Safari) wiederholt, da einige Websites den TLS-Handshake selbst erkennen und keine Header-Änderung sie überwindet. js_render: true rendert in Chromium für Single-Page-Apps. Als letzte Option übernimmt ein mit Stealth-Patches versehener Browser Seiten, die JavaScript benötigen und gewöhnliche Automatisierung ablehnen.
Jede Stufe behebt einen anderen Fehler, und keine ist eine Obermenge der anderen: Die TLS-Stufe kann kein JavaScript ausführen, und Playwright ist ein erkennbar automatisierter Browser. Jedes Ergebnis meldet, welche Stufe es bedient hat. Setzen Sie SCRAPER_IMPERSONATE=0 oder SCRAPER_STEALTH=0, um die letzten beiden abzuschalten und Blockaden bestehen zu lassen.
Die letzten beiden Stufen sind Umgehung, nicht Höflichkeit – sie existieren, um Bot-Erkennung zu umgehen, die Websites absichtlich eingesetzt haben. Sie laufen nur nach einer Ablehnung, nie auf einer Website, die die Seite normal ausgeliefert hat.
Adaptives Backoff. Anfragen an dieselbe Domain werden durch SCRAPER_DELAY_MS zeitlich gestaffelt, gemessen von Start zu Start, sodass die Verzögerung die Anfragerate begrenzt, anstatt zu langsamen Antworten hinzuzufügen. Wenn eine Domain Widerstand leistet – ein 429, ein 403, eine Cloudflare-Herausforderung – verdoppelt sich die Verzögerung für diese Domain, bis zu 60 Sekunden, und sinkt wieder, sobald Anfragen wieder erfolgreich sind. Domains werden unabhängig verfolgt, sodass das gleichzeitige Scrapen von zwei Websites nichts extra kostet.
robots.txt wird nicht durchgesetzt. Es wird nur gelesen, um Sitemaps zu finden; seine Disallow-Regeln werden nicht beachtet, und es gibt keine Einstellung, das zu ändern. Die adaptive Verzögerung pro Domain ist der Höflichkeitsmechanismus dieses Tools.
Ein kurzer Cache. Abgerufene Seiten werden fünf Minuten lang wiederverwendet, sodass das Ausführen von fetch_pages und dann extract_emails über dieselben URLs nicht alles doppelt abruft.
HTTP-Modus
Der Standard ist stdio, was claude mcp add oben verwendet. Um stattdessen eine persistente gemeinsame Instanz auszuführen:
SCRAPER_AUTH_TOKEN=$(openssl rand -hex 16) cute-web-scraper --http --port 8080claude mcp add --transport http cute-web-scraper http://127.0.0.1:8080/mcpEs bindet an 127.0.0.1 und stellt /mcp sowie einen /health-Endpunkt bereit. Das Binden über Loopback hinaus erfordert SCRAPER_AUTH_TOKEN, und der Server weigert sich ohne dieses zu starten, anstatt stillschweigend einen offenen Scraper in Ihr Netzwerk zu veröffentlichen.
Einschränkungen
Keine Proxy-Rotation und kein CAPTCHA-Lösen. Eine Website, die alle vier Stufen übersteht, wird als blockiert gemeldet, statt geraten zu werden.
LinkedIn und ähnliche benötigen möglicherweise
SCRAPER_CHROME_USER_DATA_DIR, das auf ein angemeldetes Chrome-Profil zeigt.SCRAPER_DELAY_MS=0entfernt die höfliche Verzögerung, aber das Backoff greift weiterhin, wenn eine Website Widerstand leistet.Die Telefonnummernextraktion ist bewusst konservativ: Sie erfordert eine Ländervorwahl oder eine Ortsnetzkennzahl, sodass sie einige nackte lokale Formate übersieht, anstatt Jahre und Bestellnummern zurückzugeben.
Entwicklung
uv sync --extra devuv run pytest -vuv run pytest -m integration -v -suv run ruff check src/ tests/ && uv run mypy src/cute_web_scraper/Unit-Tests sind hermetisch und greifen nie auf das Netzwerk zu. Integrationstests treffen Live-Websites und sind vom Standardlauf ausgeschlossen.
Lizenz
MIT – siehe LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceAn MCP server for web content extraction that converts HTML pages into clean, LLM-optimized Markdown using Mozilla's Readability. It supports batch processing, intelligent multi-page crawling, and configurable caching while respecting robots.txt standards.51
- AlicenseAqualityCmaintenanceMCP server for web scraping — extract clean markdown, links, and metadata from any URL. Free Firecrawl alternative.5935MIT
- AlicenseNot gradedqualityCmaintenanceOpen-source web scraper and extraction MCP server with JavaScript rendering, markdown output, PDF/DOCX parsing, structured errors, and validated extraction contract diagnostics for agents.2AGPL 3.0
- AlicenseNot gradedqualityAmaintenanceRemote MCP server for web scraping with anti-bot evasion. Provides stealth HTTP fetching, headless browser with Cloudflare bypass, CSS selectors, YouTube transcripts, and Markdown conversion.1MIT
Related MCP Connectors
All HasData scraping tools in one MCP server: Google, TikTok, Instagram, maps, e-commerce and more.
One MCP server for 180+ live web-data APIs returning clean JSON from sites that block scrapers.
Firecrawl MCP — wraps the Firecrawl API (firecrawl.dev) for web
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/maccydee/cute-web-scraper'
If you have feedback or need assistance with the MCP directory API, please join our Discord server