WebSearchAndCrawl
WebSearchAndCrawl
認証付きWebクローリング、検索、ドキュメント処理のためのMCPサーバー
---.
🚀 目的
WebSearchAndCrawl は、以下のことを目的とした MCP(Model Context Protocol)サーバー です:
Firefoxセッショントークン またはブラウザ自動化を使用して、ウェブサイト(認証が必要なものを含む)をクロールします。
クロールしたコンテンツを正規表現マッチで検索し、構造化インデックスに結果を保存します。
クロールしたサイトからドキュメントをダウンロードして解析します(PDF、DOCX、XLSXなど)。
MCPクライアントとの統合のために、HTTP経由でリアルタイムに結果をストリーミングします。
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スレッドを適用します。 |
再開サポート | チェックポイントから中断されたクロールを再開できます。 |
セッション検証 | 不正使用を防ぐためにトークンのスコープを検証します。 |
📦 インストール
前提条件
Python 3.9以上(推奨:3.11以上)。
Firefox(ブラウザ自動化に必要)。
システムライブラリ(ドキュメント解析用):
PDF:
poppler-utils(Linux)またはpdfminer.six(クロスプラットフォーム)。DOCX/XLSX:
python-docx、openpyxl。
手順
1. リポジトリをクローンする
git clone https://github.com/bpweatherill/WebSearchAndCrawl.git
cd WebSearchAndCrawl2. 仮想環境をセットアップする
python -m venv venv
source venv/bin/activate # Linux/Mac
# OR
venv\Scripts\activate # Windows3. 依存関係をインストールする
pip install -r requirements.txt4. Playwrightブラウザをインストールする
playwright install firefox5. (任意)環境変数を設定する
プロジェクトルートに .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レスポンスを返し、リアルタイム結果のストリーミングをサポートします。
エンドポイント | メソッド | 説明 | リクエストボディ |
| POST | ウェブサイトをクロールし、結果をストリーミングします。 | |
| POST | ローカルインデックスを正規表現マッチで検索します。 | |
| POST | 正規表現に一致するドキュメントをダウンロードします。 | |
| POST | Firefoxの検索エンジンを使用して結果を取得します。 | |
| GET | インデックス化されたコンテンツを持つすべてのドメインを一覧表示します。 | - |
| 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⚙️ 設定
環境変数
変数 | デフォルト | 説明 |
|
| HTTPサーバーのポート。 |
|
| HTTPサーバーのホスト。 |
|
| 最大クロール深度(1〜9)。 |
|
| 最大同時スレッド数。 |
|
| 1秒あたりの最大リクエスト数。 |
|
| リクエストのタイムアウト(秒)。 |
|
| 最大メモリ使用量(MB)。 |
|
| Firefoxプロファイル名(任意)。 |
|
| デフォルトの検索エンジン。 |
|
| インデックスファイルのディレクトリ。 |
|
| ダウンロードファイルのディレクトリ。 |
|
| クロールチェックポイントのディレクトリ。 |
🛡️ セキュリティに関する考慮事項
セッショントークン:
トークンはメモリ内にのみ保存されます(ディスクには永続化されません)。
トークンのスコープは検証され、不正使用を防ぎます(例:
nasa.gov用のトークンをevil.comには使用できません)。
入力サニタイズ:
すべての入力(URL、正規表現など)は、インジェクション攻撃を防ぐためにサニタイズされます。
レート制限:
サーバーに過剰な負荷をかけないように、5リクエスト/秒と最大5スレッドを適用します。
robots.txtの遵守:クローラーは**
robots.txtを尊重**し、許可されていないURLをスキップします。
ホワイトリスト:
ホワイトリストに登録されたドメインに一致するURLのみがクロールされます。
🚀 拡張(ロードマップ)
拡張機能 | 説明 | 優先度 |
永続トークン | 再起動後も保持できるように、トークンを暗号化ファイルに保存します。 | 中 |
完全な | 単純なチェックではなく、 | 中 |
高度なページネーション処理 | ページネーションリンク(「次へ」ボタンなど)を検出して追跡します。 | 高 |
遅延読み込みサポート | 遅延読み込みコンテンツ(無限スクロールなど)を検出してトリガーします。 | 高 |
チェックポイント | クロール状態を保存して、中断されたクロールを再開します。 | 高 |
全文検索 | 正規表現に加えて全文検索をサポートします。 | 低 |
データベースバックエンド | スケーラビリティのためにJSONファイルをSQLite/PostgreSQLに置き換えます。 | 低 |
分散クローリング | 複数のワーカーによる水平スケーリングをサポートします。 | 低 |
Dockerサポート | コンテナ化されたデプロイ用に | 中 |
認証ヘルパー | 一般的な認証方法(OAuth、SAML)の組み込みサポート。 | 中 |
プロキシサポート | ファイアウォールの背後でのクローリング用にプロキシサポートを追加します。 | 低 |
カスタムヘッダー | ユーザーがリクエスト用のカスタムヘッダーを指定できるようにします。 | 中 |
Webhook通知 | 新しい結果が見つかったときにWebhook URLに通知します。 | 低 |
🤝 コントリビューション
リポジトリをフォークします。
フィーチャーブランチを作成します(
git checkout -b feature/your-feature)。変更をコミットします(
git commit -m "Add your feature")。ブランチにプッシュします(
git push origin feature/your-feature)。プルリクエストを開きます。
📜 ライセンス
このプロジェクトはMITライセンスの下でライセンスされています。詳細は LICENSE を参照してください。
📞 サポート
問題:バグの報告や機能リクエストは、GitHub Issues タブで行ってください。
ディスカッション:Q&Aについては、GitHub Discussions に参加してください。
🏆 謝辞
Playwright:ブラウザ自動化用。
FastAPI:HTTPサーバー用。
pdfminer.six:PDF解析用。
python-docx/openpyxl:Officeファイル解析用。
This server cannot be installed
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
- AlicenseCqualityCmaintenanceProvides browser automation and web scraping as MCP tools, enabling autonomous URL ingestion, crawling, extraction, and anti-bot handling with interactive browser control.625MIT

Scout MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceEnables web search, scraping, extraction, and crawling through an MCP interface, allowing coding agents to access real-time web data.1MIT- AlicenseNot gradedqualityCmaintenanceA 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
- AlicenseNot gradedqualityBmaintenanceEnables web search and scraping through MCP, running locally with courtesy rate limiting and caching.4ISC
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.
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/bpweatherill/WebSearchAndCrawl'
If you have feedback or need assistance with the MCP directory API, please join our Discord server