CrewAI + Scrapeless: あなたのエージェントにライブウェブデータを提供する
Lead Scraping Automation Engineer
CrewAIのクルーは、そのエージェントがアクセスできるツールによってのみ有用です。研究エージェントに言語モデルだけを与えると、それは自分が開いたことのないページを自信満々に説明します。
そのクルーをScrapeless MCPサーバーに接続すると、入力側が修正されます:エージェントは標準のCrewAIツールとしてブラウザコントロール、ページスクレイピング、Google検索、Googleトレンドにアクセスできる一方で、レンダリング、プロキシルーティング、そしてアンチ検出機能はサーバー上に留まります。このガイドは接続の全プロセスを示し、ツールリスト、引数スキーマ、および実際の呼び出しが返すマークダウンを示します。
このセットアップがクルーに与えるもの
エージェントは、一度の接続から21の呼び出し可能なツールを得ます。Scrapeless MCPサーバーはそれらをストリーミング可能なHTTP経由で公開し、crewai-toolsは各ツールを標準のCrewAI BaseToolに変換し、どのエージェントでも保持できます。
ツールは三つのグループに分かれます:
- ページ取得 —
scrape_markdown、scrape_html、scrape_screenshotはURLを取得し、リクエストした形式で返します。 - ライブブラウザコントロール — セッションを作成し、クリック、入力、スクロール、ナビゲート、待機、スナップショットを行う16の
browser_*ツール。 - 検索サービス —
google_searchとgoogle_trends。
作業がサーバー側で行われるため、クループロセスは小さく保たれます。インストールするローカルブラウザは必要なく、管理するプロキシプールもなく、Chromeリリースに合わせて調整するドライバーバージョンも必要ありません。
Scrapeless MCPサーバーの理由
モデルコンテキストプロトコルの仕様は、クライアントがサーバー上のツールを発見し、呼び出す方法を定義しており、これが一つの接続の価値を手作業で書かれたラッパー以上にしています:ツールリスト、引数スキーマ、結果の封筒はすべてプロジェクトにハードコードされるのではなく、サーバーから届きます。呼び出しはJSON-RPC 2.0メッセージとして送信されるため、リクエストとレスポンスの形式は、ベンダーの慣習ではなく公開された標準です。
Scrapelessはホスティングされたエンドポイントを公開しているため、実行するサーバーはありません。輸送はストリーミング可能なHTTPで、プロトコルのHTTPメカニズムと認証は単一のヘッダーです。CrewAIエージェントが必要とするすべては、一つの辞書です。同じキーは、browser_*ツールが駆動するクラウドブラウザであるScrapeless Scraping Browserも支えており、各ツールのパラメータリファレンスはScrapelessのドキュメンテーションにあります。
前提条件
- Python 3.10以降。
crewaiとcrewai-toolsは現在、>=3.10,<3.14を宣言しています。 - ダッシュボードから取得したScrapeless APIキー。
- あなたのクルーが使用するLLMのモデルプロバイダキー。CrewAIはデフォルトでOpenAIを使用し、
OPENAI_API_KEYを読み取ります。
注:以下の例はScrapelessキーで実行されましたが、モデルプロバイダキーは使用していません。MCP接続、ツールの検出、引数スキーマ、ツールの呼び出し、およびエージェントの接続はすべてライブで実行されました。最終的な
crew.kickoff()呼び出しは前提条件のギャップです — モデルキーが必要で、記事はそのステップを示しており、作り事の出力は表示していません。
インストール
bash
pip install "crewai==1.15.4" "crewai-tools[mcp]==1.15.4"
[mcp]の追加は、MCPツール定義をフレームワークネイティブツールに変換するレイヤーであるmcpクライアントライブラリとmcpadaptを引き込みます。
あなたの環境にすでにOpenTelemetryスタックがある場合は、これら2つのパッケージを一度にインストールする方が良いです。crewaiはopentelemetry-sdk~=1.42を固定し、一部がアップグレードされたエクスポータセットは、あなたのコードが実行される前にインポートエラーを引き起こします。
シェルにキーを設定します:
bash
export SCRAPELESS_API_KEY="your_api_key_here"
ストリーミング可能なHTTP経由で接続
MCPServerAdapterはサーバーを記述する辞書を一つ受け取ります。headersエントリーにはScrapeless APIキーが含まれます:
python
import os
from crewai_tools import MCPServerAdapter
server_params = {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable-http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
with MCPServerAdapter(server_params) as tools:
names = sorted(t.name for t in tools)
print(f"ツールの数: {len(names)}")
for n in names:
print(" -", n)
これを実行すると、サーバーが実際に提供しているものがリストアップされます:
text
ツールの数: 21
- browser_click
- browser_close
- browser_create
- browser_get_html
- browser_get_text
- browser_go_back
- browser_go_forward
- browser_goto
- browser_press_key
- browser_screenshot
- browser_scroll
- browser_scroll_to
- browser_snapshot
- browser_type
- browser_wait
- browser_wait_for
- google_search
- google_trends
- scrape_html
- scrape_markdown
- scrape_screenshot
注目すべき2つの詳細があります。名前はフラットであり、サーバープレフィックスやドット付きネームスペースはないため、scrape_markdownはエージェントが呼び出すリテラル文字列です。そして、コンテキストマネージャーが重要です:エントリ時にセッションを開き、エグジット時に閉じるため、アダプターは裸のコンストラクターではなくwithブロックとして記述されています。
エージェントに必要なツールだけを渡す
すべての21のツールをすべてのエージェントに渡すことは、モデルの仕事を容易にするのではなく、逆に難しくします。MCPServerAdapterはサーバー辞書の後にツール名を受け取り、それだけを返します:
python
import os
from crewai_tools import MCPServerAdapter
server_params = {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable-http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
with MCPServerAdapter(server_params, "scrape_markdown", "google_search") as tools:
print("フィルターされたツール:", [t.name for t in tools])
for t in tools:
schema = getattr(t, "args_schema", None)
fields = list(schema.model_fields) if schema else "n/a"
print(f" {t.name} 引数: {fields}")
text
フィルターされたツール: ['scrape_markdown', 'google_search']
scrape_markdown 引数: ['url']
google_search 引数: ['q', 'hl', 'gl']
引数スキーマはサーバーからのもので、実際の契約を示します:scrape_markdownは単一のurlを受け取り、google_searchはクエリとともに言語および国コードを受け取ります。ページを読み取り、検索を実行するだけの研究エージェントは、まさに2つのツールだけを持ち、不正使用するブラウザセッションの表面を持ちません。
自分のクルーにこれを接続する準備はできましたか? 無料のScrapelessアカウントを作成し、ダッシュボードからキーを接続してください。
ツールをクルーに追加する
ツールはAgentコンストラクターに直接渡され、エージェントはそのタスクを持つCrewに入ります:
python
import os
from crewai import Agent, Task, Crew
from crewai_tools import MCPServerAdapter
server_params = {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable-http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
with MCPServerAdapter(server_params, "scrape_markdown", "google_search") as tools:
analyst = Agent(
role="Web Research Analyst",
goal="公的なページをクリーンなマークダウンに変換し、分析のために下流に渡す。",
backstory="公的なウェブソースを扱い、構造化されたノートを返します。",
tools=tools,
verbose=False,
)
print("エージェントツール:", [t.name for t in analyst.tools])
task = Task(
description="https://quotes.toscrape.com/js/を取得し、存在する著者を要約します。",
expected_output="ページ上に見つかった著者の名前のリスト。",
agent=analyst,
)
crew = Crew(agents=[analyst], tasks=[task], verbose=False)
print("クルーエージェント数:", len(crew.agents), "| クルータスク数:", len(crew.tasks))
text
エージェントツール: ['scrape_markdown', 'google_search']
クルーエージェント数: 1 | クルータスク数: 1
エージェントはサーバー提供のツールの両方を保持しており、クルーは編成されています。ここまでのすべてはScrapelessキーだけで実行されます。
注:
crew.kickoff()は、モデル提供者キーが必要です。OPENAI_API_KEYが設定されていないと、CrewAIは最初のモデル呼び出しの前にValueError: OPENAI_API_KEY is requiredを発生させるため、実行は追加した行として表示され、キャプチャされた出力とはなりません。
python
result = crew.kickoff()
print(result)
ツール呼び出しが返すもの
ツールを直接呼び出すことは、モデルトークンを消費せずに返される形を見る最も迅速な方法です。scrape_markdownはURLを受け取り、マークダウンを返します:
python
import os
from crewai_tools import MCPServerAdapter
server_params = {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable-http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
with MCPServerAdapter(server_params, "scrape_markdown") as tools:
tool = list(tools)[0]
md = tool.run(url="https://quotes.toscrape.com/js/")
text = md if isinstance(md, str) else str(md)
print("マークダウン文字数:", len(text))
print("アインシュタインを含む:", "Einstein" in text)
print("最初の180文字:", text[:180].replace("\n", " "))
text
マークダウン文字数: 1580
アインシュタインを含む: True
最初の180文字: レスポンス: "# [Quotes to Scrape](https://quotes.toscrape.com/)\n\n[Login](https://quotes.toscrape.com/login)\n\n“私たちが作り出した世界は、私たちの思考のプロセスです。それは
ターゲットページは初期HTMLではなくブラウザ内で引用リストを構築し、引用はどちらにせよマークダウンに含まれています—サーバーがページをレンダリングした後に変換されたからです。これが、実際のインフラストラクチャによって支えられたMCPツールと単純なHTTPフェッチとの間の実際的な違いです:エージェントがページを要求し、ユーザーが見るページを取得します。
マークダウンは、言語モデルが最も安価に扱うフォーマットでもあります。見出し、リンク、および段落構造は維持されますが、スクリプト、スタイリング、およびレイアウトマークアップは維持されないため、エージェントはコンテンツにそのコンテキストを費やします。
結論
CrewAIをScrapeless MCPサーバーに接続するには、1つの辞書とコンテキストマネージャーが必要です。サーバーは、独自の引数スキーマを持つ21のツールを提供し、crewai-toolsはそれらをネイティブのCrewAIツールに変換します。アダプター内で特定のツールに名前を付けることで、各エージェントの表面をモデルがうまく使用できるほど小さく保ちます。
自分のプロジェクトに持ち込む価値のある部分は、ツールフィルターです。研究エージェントがscrape_markdownとgoogle_searchを持ち、別のブラウジングエージェントがbrowser_*セットを持つクルーは、各モデルに短いメニューと明確な仕事を提供します。
Scrapeless無料プランで開始してキーを取得し、作業負荷を測定する際にはScrapelessの価格設定を確認し、Scrapeless MCPサーバーの概要を読んでツールの完全なリファレンスを確認してください。
よくある質問
Q: CrewAIのためのScrapeless MCPサーバーのエンドポイントは何ですか?
ホストされたエンドポイントはhttps://api.scrapeless.com/mcpで、x-api-tokenヘッダーにキーを入れてstreamable-httpトランスポート経由でアクセスします。CrewAIはローカルサーバープロセスを必要とせず、ツールはリモートで提供されます。
Q: Scrapeless MCPサーバーはどれくらいのツールを公開していますか?
ライブ接続では21のツールが返されます:16のbrowser_*セッション制御ツール、3つのページ取得ツール(scrape_markdown、scrape_html、scrape_screenshot)、および2つの検索ツール(google_search、google_trends)です。サーバーはリリース間にツールを追加することができるため、仮定するのではなくランタイムでリストをチェックしてください。
Q: エージェントが受け取るMCPツールを制限できますか?
はい。サーバー辞書の後にツール名をMCPServerAdapterに渡します — MCPServerAdapter(server_params, "scrape_markdown", "google_search")はこれらの2つだけを返します。これにより、モデルのツールメニューが短く保たれ、通常は選択精度が向上します。
Q: CrewAIはMCPサーバーに接続するためにLLMキーが必要ですか?
いいえ。MCPハンドシェイク、ツール発見、そして直接ツール呼び出しはすべてScrapelessキーだけで動作します。crew.kickoff()を呼び出す瞬間にモデルプロバイダーキーが必要になるのは、その時にエージェントがどのツールを使用するかをモデルに尋ねるためです。
Q: MCPServerAdapterとともにコンテキストマネージャーを使用する理由は何ですか?
withブロックは、エントリ時にMCPセッションを開き、エグジット時にそれを閉じます。コンテキストマネージャーなしでアダプターを構築すると接続がオープンなままとなり、ツールはセッションが生きている間のみ有効です。セッションが閉じた後にアクセスするとエラーが発生します。
Q: scrape_markdownはブラウザでレンダリングされるページを処理できますか?
はい。JavaScript経由でコンテンツを書き込むページも、コンバージョンの前にサーバーサイドでレンダリングが行われるため、そのコンテンツとともにマークダウンに返されます。同じURLのプレーンHTTPフェッチはプレレンダーマークアップを返します。
Q: ライブサイトにクルーを向ける前に何を確認すべきですか?
サイトの利用規約と/robots.txtディレクティブを確認してください。これはロボット排除プロトコル標準に従っています。収集は公にアクセス可能なページに限定し、クルーにオープンエンドのクロール指示ではなく、制約されたタスクリストを与えてください—エージェントループはそうでなければ、意図した以上のリクエストを発行する可能性があります。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



