🎯 カスタマイズ可能で検出回避型のクラウドブラウザ。自社開発のChromiumを搭載し、ウェブクローラーAIエージェント向けに設計されています。👉今すぐ試す
ブログに戻ります

CrewAI + Scrapeless: あなたのエージェントにライブウェブデータを提供する

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

21-Jul-2026

CrewAIのクルーは、そのエージェントがアクセスできるツールによってのみ有用です。研究エージェントに言語モデルだけを与えると、それは自分が開いたことのないページを自信満々に説明します。

そのクルーをScrapeless MCPサーバーに接続すると、入力側が修正されます:エージェントは標準のCrewAIツールとしてブラウザコントロール、ページスクレイピング、Google検索、Googleトレンドにアクセスできる一方で、レンダリング、プロキシルーティング、そしてアンチ検出機能はサーバー上に留まります。このガイドは接続の全プロセスを示し、ツールリスト、引数スキーマ、および実際の呼び出しが返すマークダウンを示します。

このセットアップがクルーに与えるもの

エージェントは、一度の接続から21の呼び出し可能なツールを得ます。Scrapeless MCPサーバーはそれらをストリーミング可能なHTTP経由で公開し、crewai-toolsは各ツールを標準のCrewAI BaseToolに変換し、どのエージェントでも保持できます。

ツールは三つのグループに分かれます:

  • ページ取得scrape_markdownscrape_htmlscrape_screenshotはURLを取得し、リクエストした形式で返します。
  • ライブブラウザコントロール — セッションを作成し、クリック、入力、スクロール、ナビゲート、待機、スナップショットを行う16のbrowser_*ツール。
  • 検索サービスgoogle_searchgoogle_trends

作業がサーバー側で行われるため、クループロセスは小さく保たれます。インストールするローカルブラウザは必要なく、管理するプロキシプールもなく、Chromeリリースに合わせて調整するドライバーバージョンも必要ありません。

Scrapeless MCPサーバーの理由

モデルコンテキストプロトコルの仕様は、クライアントがサーバー上のツールを発見し、呼び出す方法を定義しており、これが一つの接続の価値を手作業で書かれたラッパー以上にしています:ツールリスト、引数スキーマ、結果の封筒はすべてプロジェクトにハードコードされるのではなく、サーバーから届きます。呼び出しはJSON-RPC 2.0メッセージとして送信されるため、リクエストとレスポンスの形式は、ベンダーの慣習ではなく公開された標準です。

Scrapelessはホスティングされたエンドポイントを公開しているため、実行するサーバーはありません。輸送はストリーミング可能なHTTPで、プロトコルのHTTPメカニズムと認証は単一のヘッダーです。CrewAIエージェントが必要とするすべては、一つの辞書です。同じキーは、browser_*ツールが駆動するクラウドブラウザであるScrapeless Scraping Browserも支えており、各ツールのパラメータリファレンスはScrapelessのドキュメンテーションにあります。

前提条件

  • Python 3.10以降。crewaicrewai-toolsは現在、>=3.10,<3.14を宣言しています。
  • ダッシュボードから取得したScrapeless APIキー。
  • あなたのクルーが使用するLLMのモデルプロバイダキー。CrewAIはデフォルトでOpenAIを使用し、OPENAI_API_KEYを読み取ります。

注:以下の例はScrapelessキーで実行されましたが、モデルプロバイダキーは使用していません。MCP接続、ツールの検出、引数スキーマ、ツールの呼び出し、およびエージェントの接続はすべてライブで実行されました。最終的なcrew.kickoff()呼び出しは前提条件のギャップです — モデルキーが必要で、記事はそのステップを示しており、作り事の出力は表示していません。

インストール

bash Copy
pip install "crewai==1.15.4" "crewai-tools[mcp]==1.15.4"

[mcp]の追加は、MCPツール定義をフレームワークネイティブツールに変換するレイヤーであるmcpクライアントライブラリとmcpadaptを引き込みます。

あなたの環境にすでにOpenTelemetryスタックがある場合は、これら2つのパッケージを一度にインストールする方が良いです。crewaiopentelemetry-sdk~=1.42を固定し、一部がアップグレードされたエクスポータセットは、あなたのコードが実行される前にインポートエラーを引き起こします。

シェルにキーを設定します:

bash Copy
export SCRAPELESS_API_KEY="your_api_key_here"

ストリーミング可能なHTTP経由で接続

MCPServerAdapterはサーバーを記述する辞書を一つ受け取ります。headersエントリーにはScrapeless APIキーが含まれます:

python Copy
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 Copy
ツールの数: 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 Copy
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 Copy
フィルターされたツール: ['scrape_markdown', 'google_search']
  scrape_markdown 引数: ['url']
  google_search 引数: ['q', 'hl', 'gl']

引数スキーマはサーバーからのもので、実際の契約を示します:scrape_markdownは単一のurlを受け取り、google_searchはクエリとともに言語および国コードを受け取ります。ページを読み取り、検索を実行するだけの研究エージェントは、まさに2つのツールだけを持ち、不正使用するブラウザセッションの表面を持ちません。

自分のクルーにこれを接続する準備はできましたか? 無料のScrapelessアカウントを作成し、ダッシュボードからキーを接続してください。

ツールをクルーに追加する

ツールはAgentコンストラクターに直接渡され、エージェントはそのタスクを持つCrewに入ります:

python Copy
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 Copy
エージェントツール: ['scrape_markdown', 'google_search']
クルーエージェント数: 1 | クルータスク数: 1

エージェントはサーバー提供のツールの両方を保持しており、クルーは編成されています。ここまでのすべてはScrapelessキーだけで実行されます。

注:crew.kickoff()は、モデル提供者キーが必要です。OPENAI_API_KEYが設定されていないと、CrewAIは最初のモデル呼び出しの前にValueError: OPENAI_API_KEY is requiredを発生させるため、実行は追加した行として表示され、キャプチャされた出力とはなりません。

python Copy
    result = crew.kickoff()
    print(result)

ツール呼び出しが返すもの

ツールを直接呼び出すことは、モデルトークンを消費せずに返される形を見る最も迅速な方法です。scrape_markdownはURLを受け取り、マークダウンを返します:

python Copy
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 Copy
マークダウン文字数: 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_markdowngoogle_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_markdownscrape_htmlscrape_screenshot)、および2つの検索ツール(google_searchgoogle_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サイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。

最も人気のある記事

カタログ