Skip to main content
Glama
bpweatherill

WebSearchAndCrawl

by bpweatherill

WebSearchAndCrawl

認証付きWebクローリング、検索、ドキュメント処理のためのMCPサーバー

---.

🚀 目的

WebSearchAndCrawl は、以下のことを目的とした MCP(Model Context Protocol)サーバー です:

  1. Firefoxセッショントークン またはブラウザ自動化を使用して、ウェブサイト(認証が必要なものを含む)をクロールします。

  2. クロールしたコンテンツを正規表現マッチで検索し、構造化インデックスに結果を保存します。

  3. クロールしたサイトからドキュメントをダウンロードして解析します(PDF、DOCX、XLSXなど)。

  4. MCPクライアントとの統合のために、HTTP経由でリアルタイムに結果をストリーミングします。

  5. robots.txt を尊重し、レート制限(5リクエスト/秒、最大5スレッド)を適用します。

このツールは以下の用途に最適です:

  • 認証付きまたは動的なウェブサイトをスクレイピングする必要がある研究者。

  • Webデータを必要とするAIエージェントを構築する開発者。

  • 反復的なWebタスク(モニタリング、データ抽出など)の自動化。


Related MCP server: Scout MCP Server

🔧 機能

機能

説明

認証付きクローリング

Firefoxセッショントークンを使用してログイン済みページにアクセスします。

ブラウザ自動化

動的コンテンツやログインフォームにはPlaywrightにフォールバックします。

ドメインホワイトリスト

カンマ区切りのドメインリストに一致するURLのみをクロールします。

深さ制限付きクローリング

クロール深度を設定可能(1〜9層)。

正規表現検索

クロールしたコンテンツまたはインデックスを正規表現パターンで検索します。

ドキュメント解析

PDF、DOCX、XLSX、TXTファイルからテキストを抽出します。

リアルタイムストリーミング

結果はJSONLとしてストリーミングされます(ページごとにチャンク化)。

インデックス化

後で検索できるように、ドメインごとにJSONファイルに結果を保存します。

レート制限

5リクエスト/秒と最大5スレッドを適用します。

再開サポート

チェックポイントから中断されたクロールを再開できます。

セッション検証

不正使用を防ぐためにトークンのスコープを検証します。


📦 インストール

前提条件

  1. Python 3.9以上(推奨:3.11以上)。

  2. Firefox(ブラウザ自動化に必要)。

  3. システムライブラリ(ドキュメント解析用):

    • PDF:poppler-utils(Linux)または pdfminer.six(クロスプラットフォーム)。

    • DOCX/XLSX:python-docx、openpyxl。

手順

1. リポジトリをクローンする

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

2. 仮想環境をセットアップする

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

3. 依存関係をインストールする

pip install -r requirements.txt

4. Playwrightブラウザをインストールする

playwright install firefox

5. (任意)環境変数を設定する

プロジェクトルートに .env ファイルを作成します:

# 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

🏃 使用方法

1. MCPサーバーを起動する

python -m server.main

サーバーは http://localhost:8808(または .env で指定されたポート)で起動します。

2. MCPツール(HTTPエンドポイント)

すべてのツールはJSONレスポンスを返し、リアルタイム結果のストリーミングをサポートします。

エンドポイント

メソッド

説明

リクエストボディ

/crawl_website

POST

ウェブサイトをクロールし、結果をストリーミングします。

CrawlRequest

/search_index

POST

ローカルインデックスを正規表現マッチで検索します。

SearchIndexRequest

/download_documents

POST

正規表現に一致するドキュメントをダウンロードします。

DownloadRequest

/get_search_results

POST

Firefoxの検索エンジンを使用して結果を取得します。

WebSearchRequest

/list_indexed_domains

GET

インデックス化されたコンテンツを持つすべてのドメインを一覧表示します。

-

/health

GET

ヘルスチェック。

-


リクエスト/レスポンススキーマ

CrawlRequest
{
  "url": "https://www.nasa.gov",
  "whitelist_domains": "nasa.gov",
  "max_depth": 3,
  "use_token": false,
  "firefox_profile": "my_profile"
}
  • url:クロールの開始URL。

  • whitelist_domains:許可されたドメインのカンマ区切りリスト(例:"nasa.gov,spacex.com")。

  • max_depth:最大クロール深度(1〜9)。

  • use_token:利用可能な場合はFirefoxセッショントークンを使用します。

  • firefox_profile:Firefoxプロファイル名(任意)。

ストリーミングレスポンス(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:検索するドメイン(例:"nasa.gov")。

  • regex:一致させる正規表現パターン。

  • max_results:返す結果の最大数。

レスポンス:

[
  {
    "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:ダウンロード元のドメイン。

  • regex:ダウンロードするファイルの正規表現パターン(例:"*.pdf")。

  • output_dir:カスタム出力ディレクトリ(任意)。

ストリーミングレスポンス(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:検索クエリ。

  • search_engine:検索エンジン(デフォルト:Firefoxのデフォルト)。

  • use_token:利用可能な場合はFirefoxセッショントークンを使用します。

  • firefox_profile:Firefoxプロファイル名(任意)。

ストリーミングレスポンス(JSONL):

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

🔍 例

1. NASA.govをクロールして結果をインデックス化する

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. インデックス化されたコンテンツから「Mars」を検索する

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

3. NASA.govからPDFをダウンロードする

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

4. Firefoxを使用してGoogleを検索する

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

📁 プロジェクト構造

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

⚙️ 設定

環境変数

変数

デフォルト

説明

MCP_PORT

8808

HTTPサーバーのポート。

MCP_HOST

0.0.0.0

HTTPサーバーのホスト。

MAX_DEPTH

9

最大クロール深度(1〜9)。

MAX_THREADS

5

最大同時スレッド数。

RATE_LIMIT

5

1秒あたりの最大リクエスト数。

REQUEST_TIMEOUT

10

リクエストのタイムアウト(秒)。

MAX_MEMORY_MB

1024

最大メモリ使用量(MB)。

FIREFOX_PROFILE

None

Firefoxプロファイル名(任意)。

DEFAULT_SEARCH_ENGINE

google

デフォルトの検索エンジン。

INDEX_DIR

./index

インデックスファイルのディレクトリ。

DOWNLOADS_DIR

./downloads

ダウンロードファイルのディレクトリ。

CHECKPOINTS_DIR

./checkpoints

クロールチェックポイントのディレクトリ。


🛡️ セキュリティに関する考慮事項

  1. セッショントークン:

    • トークンはメモリ内にのみ保存されます(ディスクには永続化されません)。

    • トークンのスコープは検証され、不正使用を防ぎます(例:nasa.gov 用のトークンを evil.com には使用できません)。

  2. 入力サニタイズ:

    • すべての入力(URL、正規表現など)は、インジェクション攻撃を防ぐためにサニタイズされます。

  3. レート制限:

    • サーバーに過剰な負荷をかけないように、5リクエスト/秒と最大5スレッドを適用します。

  4. robots.txt の遵守:

    • クローラーは**robots.txt を尊重**し、許可されていないURLをスキップします。

  5. ホワイトリスト:

    • ホワイトリストに登録されたドメインに一致するURLのみがクロールされます。


🚀 拡張(ロードマップ)

拡張機能

説明

優先度

永続トークン

再起動後も保持できるように、トークンを暗号化ファイルに保存します。

中

完全な robots.txt 解析

単純なチェックではなく、robots.txt のルールを適切に解析します。

中

高度なページネーション処理

ページネーションリンク(「次へ」ボタンなど)を検出して追跡します。

高

遅延読み込みサポート

遅延読み込みコンテンツ(無限スクロールなど)を検出してトリガーします。

高

チェックポイント

クロール状態を保存して、中断されたクロールを再開します。

高

全文検索

正規表現に加えて全文検索をサポートします。

低

データベースバックエンド

スケーラビリティのためにJSONファイルをSQLite/PostgreSQLに置き換えます。

低

分散クローリング

複数のワーカーによる水平スケーリングをサポートします。

低

Dockerサポート

コンテナ化されたデプロイ用に Dockerfile を追加します。

中

認証ヘルパー

一般的な認証方法(OAuth、SAML)の組み込みサポート。

中

プロキシサポート

ファイアウォールの背後でのクローリング用にプロキシサポートを追加します。

低

カスタムヘッダー

ユーザーがリクエスト用のカスタムヘッダーを指定できるようにします。

中

Webhook通知

新しい結果が見つかったときにWebhook URLに通知します。

低


🤝 コントリビューション

  1. リポジトリをフォークします。

  2. フィーチャーブランチを作成します(git checkout -b feature/your-feature)。

  3. 変更をコミットします(git commit -m "Add your feature")。

  4. ブランチにプッシュします(git push origin feature/your-feature)。

  5. プルリクエストを開きます。


📜 ライセンス

このプロジェクトはMITライセンスの下でライセンスされています。詳細は LICENSE を参照してください。


📞 サポート

  • 問題:バグの報告や機能リクエストは、GitHub Issues タブで行ってください。

  • ディスカッション:Q&Aについては、GitHub Discussions に参加してください。


🏆 謝辞

  • Playwright:ブラウザ自動化用。

  • FastAPI:HTTPサーバー用。

  • pdfminer.six:PDF解析用。

  • python-docx/openpyxl:Officeファイル解析用。

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

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
    27 PyPI
    6
    MIT
  • A
    license
    Not graded
    quality
    D
    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