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

LangGraph + Scrapeless: エージェントグラフにライブウェブツールを統合する

Ava Wilson
Ava Wilson

Expert in Web Scraping Technologies

22-Jul-2026

TL;DR:

  • LangGraphは、langchain-mcp-adaptersを通じてScrapeless MCPサーバーのツールを読み込み、scrape_markdownから完全なブラウザセットまでの21個をエージェントグラフに渡します。
  • MultiServerMCPClient.get_toolsがハンドシェイクを実行し、ツールを返します。ツールを読み込むためや、直接呼び出すためにモデルプロバイダーキーは必要ありません。
  • langchain-mcp-adaptersは各ツールの結果をコンテンツブロックのリストとして返すため、リストを文字列化するのではなくresult[0]["text"]と読みます。
  • エージェント自体はfrom langchain.agents import create_agentを使用して構築されており、これは非推奨のcreate_react_agentの現在の代替品です。
  • create_agentグラフとそのainvoke実行のみがモデルキーを必要とし、ツールの読み込みや呼び出しは必要ありません。
  • Scrapelessの無料プランから始めて、あなたのグラフに実際のウェブツールを追加しましょう。

LangGraphはグラフとしてエージェントを構築します。これは、タスクが完了するまでモデルとそのツール間をループする状態機械です。その設計はグラフ内のツールに依存しており、無機質なLangGraphエージェントにはライブウェブに到達するツールがありません。モデルコンテキストプロトコルがそのギャップを埋めます。LangGraphのMCPアダプタをサーバーに向けると、公開されるすべてのツールはあなたのグラフが呼び出すことができるLangChainツールになります。

このガイドは、LangGraphをScrapeless MCPサーバーに接続し、21のツールを読み込み、一つを実際に呼び出し、モデルプロバイダーキーが必要になる正確な場所を示します。ツールの読み込みと直接呼び出しはライブサーバーに対して検証されており、生成ステップは必要条件としてマークされています。

なぜScrapeless MCPか

Scrapeless MCPサーバーは、エージェントが直接呼び出すことができるウェブスクレイピングおよびブラウザツールを公開していますので、スクレイピングレイヤーはあなたが構築したりホストしたりするものではありません。一つの接続で21のツールを提供します:コンテンツ用のscrape_markdownscrape_html、検索データ用のgoogle_searchgoogle_trends、キャプチャ用のscrape_screenshot、そしてクラウドブラウザを駆動する完全なbrowser_*セット。LangGraphは既にlangchain-mcp-adaptersを通じて強力なMCPストーリーを持っており、これによりそれらのツールは追加のグルーコードなしで標準のLangChainツールに変わります。

browser_*ツールはScrapelessクラウドブラウザを駆動するため、エージェントはインタラクティブなページをナビゲートし、表示される内容を読み取ることができます。すべてはScrapelessインフラストラクチャの上で、ローカルブラウザプールではなく行われます。もしあなたがLangGraphではなく通常のLangChainを使用している場合は、LangChain + Scrapeless MCPの投稿がその側から同じサーバーをカバーしています。

前提条件

  • Python 3.10以上。
  • ダッシュボードから取得したScrapeless APIキーをSCRAPELESS_API_KEYとしてエクスポート。
  • エージェント実行専用のモデルプロバイダーキー(例えばOPENAI_API_KEY)。ツールの読み込みや呼び出しには必要ありません。

インストール

LangGraph、LangChain、およびMCPアダプタをインストールします。

bash Copy
pip install langgraph langchain langchain-mcp-adapters

シェルでScrapelessキーを設定します。実行時には実際のキーを使用し、ソースコードにはプレースホルダーを残しておきます。

bash Copy
export SCRAPELESS_API_KEY="sk_your_key_here"

ツールの読み込み

MultiServerMCPClientはサーバー名と接続設定のマッピングを受け取ります。各設定はトランスポート、URL、およびヘッダーを指定し、Scrapelessキーはx-api-tokenヘッダー内に配置されます。get_toolsがハンドシェイクを実行し、ツールをLangChainツールとして返します。

python Copy
import asyncio
import os

from langchain_mcp_adapters.client import MultiServerMCPClient

client = MultiServerMCPClient(
    {
        "scrapeless": {
            "url": "https://api.scrapeless.com/mcp",
            "transport": "streamable_http",
            "headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
        }
    }
)


async def main() -> None:
    tools = await client.get_tools()
    names = sorted(t.name for t in tools)
    print("tool count:", len(names))
    print("tools:", ", ".join(names))


asyncio.run(main())

ライブサーバーは21のツールを返し、Scrapelessキーのみで読み込まれます。

text Copy
tool count: 21
tools: 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

クライアントはMultiServerMCPClientと名付けられており、これは複数のMCPサーバーを同時にフェデレーションします。ここでは1つのサーバーを保持しており、別のサーバーを追加する場合はマッピングに別のエントリを追加するだけで、エージェントを変更するわけではありません。トランスポートおよびメッセージ層は、Model Context Protocolの仕様に従い、JSON-RPC 2.0の仕様に基づいています。

ツールを呼び出す

グラフに配線する前に手動でツールを呼び出します。読み込まれた各ツールはainvokeメソッドを持つLangChainツールであり、引数を渡し結果を読み取ります。1つの詳細が重要です:アダプタはプレーンな文字列ではなく、コンテンツブロックのリストを返すため、最初のブロックからテキストを取ります。

python Copy
import asyncio
import os

from langchain_mcp_adapters.client import MultiServerMCPClient

client = MultiServerMCPClient(
    {
        "scrapeless": {
            "url": "https://api.scrapeless.com/mcp",
            "transport": "streamable_http",
            "headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
        }
    }
)


async def main() -> None:
    tools = await client.get_tools()
    scrape_markdown = next(t for t in tools if t.name == "scrape_markdown")
    result = await scrape_markdown.ainvoke({"url": "https://quotes.toscrape.com/"})
    # langchain-mcp-adaptersはコンテンツブロックのリストを返します。テキストブロックを取得します
    text = result[0]["text"] if isinstance(result, list) and result else str(result)
    print("markdown chars:", len(text))
    print("contains a quote:", "The world as we have created it" in text)


asyncio.run(main())

呼び出しはページをMarkdownとして返し、コンテンツチェックは実際に引用が存在することを確認します。

text Copy
markdown chars: 4308
contains a quote: True

result[0]["text"]を読むことが、素朴なコードが間違える部分です:リスト全体を文字列化すると、Pythonのreprがエスケープシーケンスを含んでおり、クリーンなMarkdownにはなりません。LangChain MCPアダプタガイドはクライアントと結果の形状を完全に文書化しています。

エージェントグラフを構築する

ツールが読み込まれたら、エージェントは1回の呼び出しです。create_agentはモデルとツールの間でループするReActスタイルのグラフを構築し、これは非推奨のcreate_react_agentの現在の置き換えです。このステップはモデルプロバイダキーが必要です:グラフはモデルを実行し、モデルがscrape_markdownや他のツールを呼び出すタイミングを決定します。

注意:グラフを構築し実行するにはOPENAI_API_KEYなどのモデルプロバイダキーが必要ですが、ここでは設定されていません。上記の21のツールを読み込み、直接scrape_markdownを呼び出すことはそれなしで実行できます。このブロックはその正確な形状で表示されています。モデルのラウンドトリップのみが依存関係としてのギャップです。

python Copy
from langchain.agents import create_agent


async def run_graph(tools) -> None:
    agent = create_agent("openai:gpt-4o", tools)
    result = await agent.ainvoke(
        {"messages": [{"role": "user", "content": "Fetch https://quotes.toscrape.com/ with scrape_markdown and list the first three quotes with authors."}]}
    )
    print(result["messages"][-1].content)

実行時にグラフはプロンプトをモデルに渡し、モデルはURLを使ってscrape_markdownを呼び出し、ツールはすでにデモンストレーションされたMarkdownを返し、モデルは答えを書きます。ツールは、モデルが呼び出すかあなたが呼び出すかに関わらず、同じオブジェクトです。

結論

LangGraphとScrapeless MCPサーバーは、素のグラフからライブウェブを読み取るものへの短い道です。MultiServerMCPClientは21のツールを読み込み、ainvokeは1つが機能することを証明し、そのコンテンツブロックの読み取り方を示し、create_agentはツールを実行中のグラフに変えます。最後のステップだけがモデルキーを必要とするので、最初に全ツールの表面を読み込み、テストできます。上記のスクリプトから始めて、グラフが必要とするツールの範囲を決め、モデルに運転させてください。

無料のScrapelessアカウントを作成してAPIキーを取得し、定期的なエージェントを計画する際にはScrapelessの料金を確認してください。

FAQ

Q: LangGraphはMCPツールを読み込むためにモデルキーが必要ですか?

いいえ。MultiServerMCPClient.get_toolsはハンドシェイクを実行し、Scrapeless APIキーのみが設定されたツールを返します。各ツールはainvokeで直接呼び出すことができます。モデルプロバイダキーは、create_agentでエージェントグラフを構築して実行する際にのみ必要であり、その時にモデル自体がどのツールを呼び出すかを決定します。

Q: なぜツールの結果が文字列ではなくリストとして返されるのですか?
langchain-mcp-adaptersは、各MCPツールの結果をコンテンツブロックのリストとして返します。これがMCPがツール出力を表す方法です。最初のブロックからテキストを読み取るにはresult[0]["text"]を使用します。全リストを文字列化すると、クリーンなコンテンツではなくエスケープシーケンスを含むreprが得られます。

Q: create_react_agentとcreate_agentのどちらを使うべきですか?

langchain.agentsからcreate_agentを使用してください。create_react_agentはLangGraph 1.0でlanggraph.prebuiltから移動され、現在は非推奨の警告を出していますので、現在の警告なしの方法はfrom langchain.agents import create_agentで、同じモデルとツールの引数を使用します。

Q: 一つのサーバーしか持っていない場合、MultiServerMCPClientは何に使うのですか?

クライアントは、複数のMCPサーバーを一度にフェデレートするように設計されていますが、単一のサーバーとも機能し、一つのエントリのマッピングとして使われます。今使用することで、後で二つ目のサーバーを追加する際には設定にもう一つのエントリが必要になりますが、エージェントがツールを使用する方法には変更はありません。

Q: グラフにツールの一部だけを与えるにはどうすればいいですか?

get_toolsはリストを返すので、create_agentに渡す前にフィルタリングしてください。タスクがコンテンツと検索のみを必要とする場合、グラフにscrape_markdowngoogle_searchのみを渡す方が、全21ツールセットを使うよりも安全です。

Q: ツールを通じてのスクレイピングはターゲットのルールに縛られますか?

はい。ツールは公開ページを取得し、各ターゲットの利用規約およびそのロボット排除プロトコルの指示に従う責任を持ち続けます。ボリュームを制限し、データを公開のままにし、タスクが実際に必要なツールにグラフのスコープを絞るようにしてください。

Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。

最も人気のある記事

カタログ