Skip to main content
Glama
bpweatherill

WebSearchAndCrawl

by bpweatherill

WebSearchAndCrawl

Ein MCP-Server für authentifiziertes Web-Crawling, Suchen und Dokumentenverarbeitung

---.

🚀 Zweck

WebSearchAndCrawl ist ein MCP-Server (Model Context Protocol), der dazu dient:

  1. Websites zu crawlen (einschließlich authentifizierter) mithilfe von Firefox-Sitzungstokens oder Browser-Automatisierung.

  2. Gecrawlten Inhalt zu durchsuchen nach Regex-Treffern und Ergebnisse in einem strukturierten Index zu speichern.

  3. Dokumente herunterzuladen und zu parsen (PDF, DOCX, XLSX usw.) von gecrawlten Websites.

  4. Ergebnisse in Echtzeit zu streamen über HTTP zur Integration mit MCP-Clients.

  5. robots.txt zu respektieren und Ratenbegrenzungen durchzusetzen (5 Anfragen/Sek., max. 5 Threads).

Dieses Tool ist ideal für:

  • Forscher, die authentifizierte oder dynamische Websites scrapen müssen.

  • Entwickler, die KI-Agenten bauen, die Webdaten benötigen.

  • Automatisierung wiederkehrender Webaufgaben (z. B. Überwachung, Datenextraktion).


Related MCP server: Scout MCP Server

🔧 Funktionen

Funktion

Beschreibung

Authentifiziertes Crawling

Verwendet Firefox-Sitzungstokens, um auf angemeldete Seiten zuzugreifen.

Browser-Automatisierung

Fällt auf Playwright zurück für dynamische Inhalte oder Anmeldeformulare.

Domain-Whitelisting

Crawlt nur URLs, die einer durch Kommas getrennten Liste von Domains entsprechen.

Tiefenbegrenztes Crawling

Konfigurierbare Crawl-Tiefe (1-9 Ebenen).

Regex-Suche

Durchsucht gecrawlten Inhalt oder Index nach Regex-Mustern.

Dokument-Parsing

Extrahiert Text aus PDF-, DOCX-, XLSX- und TXT-Dateien.

Echtzeit-Streaming

Ergebnisse werden als JSONL gestreamt (seitenweise aufgeteilt).

Indizierung

Speichert Ergebnisse in JSON-Dateien pro Domain für spätere Suche.

Ratenbegrenzung

Erzwingt 5 Anfragen/Sek. und max. 5 Threads.

Fortsetzungsunterstützung

Kann unterbrochene Crawls von Prüfpunkten aus fortsetzen.

Sitzungsvalidierung

Validiert Token-Bereiche, um Missbrauch zu verhindern.


📦 Installation

Voraussetzungen

  1. Python 3.9+ (empfohlen: 3.11+).

  2. Firefox (erforderlich für Browser-Automatisierung).

  3. Systembibliotheken (für Dokument-Parsing):

    • PDF: poppler-utils (Linux) oder pdfminer.six (plattformübergreifend).

    • DOCX/XLSX: python-docx, openpyxl.

Schritte

1. Repository klonen

git clone https://github.com/bpweatherill/WebSearchAndCrawl.git
cd WebSearchAndCrawl

2. Virtuelle Umgebung einrichten

python -m venv venv
source venv/bin/activate  # Linux/Mac
# OR
venv\Scripts\activate   # Windows

3. Abhängigkeiten installieren

pip install -r requirements.txt

4. Playwright-Browser installieren

playwright install firefox

5. (Optional) Umgebungsvariablen konfigurieren

Erstellen Sie eine .env-Datei im Projektstamm:

# Server
MCP_PORT=8808
MCP_HOST=0.0.0.0

# Crawler
MAX_DEPTH=9
MAX_THREADS=5
RATE_LIMIT=5
REQUEST_TIMEOUT=10
MAX_MEMORY_MB=1024

# Firefox
FIREFOX_PROFILE=my_profile  # Optional: Specific Firefox profile
DEFAULT_SEARCH_ENGINE=google

# Directories
INDEX_DIR=./index
DOWNLOADS_DIR=./downloads
CHECKPOINTS_DIR=./checkpoints

🏃 Verwendung

1. Starten Sie den MCP-Server

python -m server.main

Der Server startet auf http://localhost:8808 (oder dem in .env angegebenen Port).

2. MCP-Tools (HTTP-Endpunkte)

Alle Tools geben JSON-Antworten zurück und unterstützen Streaming für Echtzeitergebnisse.

Endpunkt

Methode

Beschreibung

Anforderungstext

/crawl_website

POST

Eine Website crawlen und Ergebnisse streamen.

CrawlRequest

/search_index

POST

Den lokalen Index nach Regex-Treffern durchsuchen.

SearchIndexRequest

/download_documents

POST

Dokumente herunterladen, die einem Regex entsprechen.

DownloadRequest

/get_search_results

POST

Die Suchmaschine von Firefox verwenden, um Ergebnisse abzurufen.

WebSearchRequest

/list_indexed_domains

GET

Alle Domains mit indiziertem Inhalt auflisten.

-

/health

GET

Gesundheitscheck.

-


Anfrage-/Antwortschemata

CrawlRequest
{
  "url": "https://www.nasa.gov",
  "whitelist_domains": "nasa.gov",
  "max_depth": 3,
  "use_token": false,
  "firefox_profile": "my_profile"
}
  • url: Start-URL für den Crawl.

  • whitelist_domains: Durch Kommas getrennte Liste erlaubter Domains (z. B. "nasa.gov,spacex.com").

  • max_depth: Maximale Crawl-Tiefe (1-9).

  • use_token: Firefox-Sitzungstoken verwenden, falls verfügbar.

  • firefox_profile: Name des Firefox-Profils (optional).

Gestreamte Antwort (JSONL):

{
  "excerpt": "NASA's Perseverance Rover lands on Mars...",
  "full_text": "Full article text here...",
  "url": "https://www.nasa.gov/mars2020",
  "timestamp": "2024-05-20T12:00:00Z",
  "domain": "nasa.gov"
}

---.

SearchIndexRequest
{
  "domain": "nasa.gov",
  "regex": ".*Mars.*",
  "max_results": 10
}
  • domain: Zu durchsuchende Domain (z. B. "nasa.gov").

  • regex: Regex-Muster, das übereinstimmen soll.

  • max_results: Maximale Anzahl zurückzugebender Ergebnisse.

Antwort:

[
  {
    "url": "https://www.nasa.gov/mars2020",
    "excerpt": "NASA's Perseverance Rover lands on Mars...",
    "timestamp": "2024-05-20T12:00:00Z"
  }
]

---.

DownloadRequest
{
  "domain": "nasa.gov",
  "regex": ".*\\.pdf$",
  "output_dir": "./downloads/nasa.gov"
}
  • domain: Domain, von der heruntergeladen werden soll.

  • regex: Regex-Muster für herunterzuladende Dateien (z. B. "*.pdf").

  • output_dir: Benutzerdefiniertes Ausgabeverzeichnis (optional).

Gestreamte Antwort (JSONL):

{
  "filename": "./downloads/nasa.gov/mars_rover.pdf",
  "url": "https://www.nasa.gov/pdf/mars_rover.pdf",
  "parsed_text": "Extracted text from PDF..."
}

---.

WebSearchRequest
{
  "query": "NASA Mars missions",
  "search_engine": "google",
  "use_token": false,
  "firefox_profile": "my_profile"
}
  • query: Suchanfrage.

  • search_engine: Suchmaschine (Standard: Firefox-Standard).

  • use_token: Firefox-Sitzungstoken verwenden, falls verfügbar.

  • firefox_profile: Name des Firefox-Profils (optional).

Gestreamte Antwort (JSONL):

{
  "title": "Mars 2020 Mission - NASA",
  "url": "https://www.nasa.gov/mars2020",
  "snippet": "Learn about the Perseverance Rover..."
}

🔍 Beispiele

1. NASA.gov crawlen und Ergebnisse indizieren

curl -X POST http://localhost:8808/crawl_website \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.nasa.gov",
    "whitelist_domains": "nasa.gov",
    "max_depth": 2,
    "use_token": false
  }'

2. Indizierten Inhalt nach "Mars" durchsuchen

curl -X POST http://localhost:8808/search_index \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "nasa.gov",
    "regex": ".*Mars.*",
    "max_results": 5
  }'

3. PDFs von NASA.gov herunterladen

curl -X POST http://localhost:8808/download_documents \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "nasa.gov",
    "regex": ".*\\.pdf$"
  }'

4. Firefox verwenden, um Google zu durchsuchen

curl -X POST http://localhost:8808/get_search_results \
  -H "Content-Type: application/json" \
  -d '{
    "query": "NASA Mars missions",
    "search_engine": "google"
  }'

📁 Projektstruktur

WebSearchAndCrawl/
│
├── server/                          # Core server logic
│   ├── __init__.py
│   ├── main.py                       # FastAPI app + MCP tools
│   ├── config.py                     # Configuration settings
│   ├── schemas.py                    # Pydantic request/response models
│   │
│   ├── firefox/                      # Firefox browser automation
│   │   ├── __init__.py
│   │   ├── controller.py              # Playwright Firefox management
│   │   └── token_manager.py           # Session token handling
│   │
│   ├── crawler/                     # Web crawling logic
│   │   ├── __init__.py
│   │   ├── crawler.py                # Main crawling logic
│   │   └── rate_limiter.py            # Thread/rate limiting
│   │
│   ├── indexer/                     # Indexing and search
│   │   ├── __init__.py
│   │   ├── indexer.py                 # JSON index management
│   │   └── search_engine.py           # Regex search
│   │
│   ├── downloader/                  # Document downloading and parsing
│   │   ├── __init__.py
│   │   ├── downloader.py              # Download logic
│   │   └── parsers/                  # File type parsers
│   │       ├── __init__.py
│   │       ├── pdf_parser.py
│   │       ├── docx_parser.py
│   │       └── xlsx_parser.py
│   │
│   └── streamer.py                   # Chunked JSON streaming
│
├── tests/                           # Unit and integration tests
│   ├── __init__.py
│   ├── test_firefox.py
│   └── test_crawler.py
│
├── index/                           # Index files (auto-generated)
│   ├── nasa.gov.json
│   └── ...
│
├── downloads/                       # Downloaded documents (auto-generated)
│   ├── nasa.gov/
│   │   ├── document1.pdf
│   │   └── ...
│   └── ...
│
├── checkpoints/                     # Crawl checkpoints (auto-generated)
│   └── ...
│
├── requirements.txt                 # Python dependencies
├── .env.example                     # Example environment variables
└── README.md                        # This file

⚙️ Konfiguration

Umgebungsvariablen

Variable

Standard

Beschreibung

MCP_PORT

8808

HTTP-Server-Port.

MCP_HOST

0.0.0.0

HTTP-Server-Host.

MAX_DEPTH

9

Maximale Crawl-Tiefe (1-9).

MAX_THREADS

5

Maximale gleichzeitige Threads.

RATE_LIMIT

5

Maximale Anfragen pro Sekunde.

REQUEST_TIMEOUT

10

Timeout für Anfragen (Sekunden).

MAX_MEMORY_MB

1024

Maximale Speichernutzung (MB).

FIREFOX_PROFILE

None

Name des Firefox-Profils (optional).

DEFAULT_SEARCH_ENGINE

google

Standardsuchmaschine.

INDEX_DIR

./index

Verzeichnis für Indexdateien.

DOWNLOADS_DIR

./downloads

Verzeichnis für heruntergeladene Dateien.

CHECKPOINTS_DIR

./checkpoints

Verzeichnis für Crawl-Prüfpunkte.


🛡️ Sicherheitshinweise

  1. Sitzungstokens:

    • Tokens werden nur im Speicher gespeichert (nicht auf der Festplatte).

    • Token-Bereiche werden validiert, um Missbrauch zu verhindern (z. B. kann ein Token für nasa.gov nicht für evil.com verwendet werden).

  2. Eingabebereinigung:

    • Alle Eingaben (URLs, Regex usw.) werden bereinigt, um Injektionsangriffe zu verhindern.

  3. Ratenbegrenzung:

    • Erzwingt 5 Anfragen/Sek. und max. 5 Threads, um Server nicht zu überlasten.

  4. robots.txt-Konformität:

    • Der Crawler respektiert robots.txt und überspringt nicht erlaubte URLs.

  5. Whitelisting:

    • Es werden nur URLs gecrawlt, die den whitelisted Domains entsprechen.


🚀 Erweiterungen (Roadmap)

Erweiterung

Beschreibung

Priorität

Persistente Tokens

Tokens in einer verschlüsselten Datei speichern, um sie über Neustarts hinweg zu erhalten.

Mittel

Vollständiges robots.txt-Parsing

robots.txt-Regeln ordnungsgemäß parsen statt einfacher Prüfungen.

Mittel

Erweiterte Paginierungsbehandlung

Paginierungslinks erkennen und verfolgen (z. B. "Weiter"-Schaltflächen).

Hoch

Lazy-Loading-Unterstützung

Lazy-geladene Inhalte erkennen und auslösen (z. B. unendliches Scrollen).

Hoch

Checkpointing

Crawl-Zustand speichern, um unterbrochene Crawls fortzusetzen.

Hoch

Volltextsuche

Volltextsuche zusätzlich zu Regex unterstützen.

Niedrig

Datenbank-Backend

JSON-Dateien durch SQLite/PostgreSQL für Skalierbarkeit ersetzen.

Niedrig

Verteiltes Crawling

Horizontale Skalierung mit mehreren Workern unterstützen.

Niedrig

Docker-Unterstützung

Ein Dockerfile für containerisierte Bereitstellung hinzufügen.

Mittel

Authentifizierungshelfer

Integrierte Unterstützung für gängige Authentifizierungsmethoden (OAuth, SAML).

Mittel

Proxy-Unterstützung

Proxy-Unterstützung für das Crawlen hinter Firewalls hinzufügen.

Niedrig

Benutzerdefinierte Header

Benutzern erlauben, benutzerdefinierte Header für Anfragen anzugeben.

Mittel

Webhook-Benachrichtigungen

Eine Webhook-URL benachrichtigen, wenn neue Ergebnisse gefunden werden.

Niedrig


🤝 Mitwirken

  1. Repository forken.

  2. Erstellen Sie einen Feature-Branch (git checkout -b feature/your-feature).

  3. Committen Sie Ihre Änderungen (git commit -m "Add your feature").

  4. Pushen Sie den Branch (git push origin feature/your-feature).

  5. Öffnen Sie einen Pull Request.


📜 Lizenz

Dieses Projekt ist unter der MIT-Lizenz lizenziert. Siehe LICENSE für Details.


📞 Support

  • Issues: Melden Sie Fehler oder fordern Sie Funktionen im GitHub Issues-Tab an.

  • Diskussionen: Nehmen Sie an den GitHub Discussions für Fragen und Antworten teil.


🏆 Danksagungen

  • Playwright: Für Browser-Automatisierung.

  • FastAPI: Für den HTTP-Server.

  • pdfminer.six: Für PDF-Parsing.

  • python-docx/openpyxl: Für das Parsen von Office-Dateien.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    C
    quality
    C
    maintenance
    Provides browser automation and web scraping as MCP tools, enabling autonomous URL ingestion, crawling, extraction, and anti-bot handling with interactive browser control.
    62
    5
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A read-only Python MCP server for authorized website research, structured data extraction, downloadable-document analysis, and content auditing inside OpenCode. It crawls authorized public domains with safety constraints including robots.txt respect, SSRF defenses, bounded concurrency, and content-type allowlists.
    MIT

View all related MCP servers

Related MCP Connectors

  • Stealth web browser for agents: search, fetch, click and type through persistent sessions over MCP.

  • Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.

  • Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.

View all MCP Connectors

Latest Blog Posts

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/bpweatherill/WebSearchAndCrawl'

If you have feedback or need assistance with the MCP directory API, please join our Discord server