LlamaIndex + Scrapeless:ライブウェブページでインデックスをフィードする
Senior Web Scraping Engineer
リトリーバルインデックスは、そこに入れるドキュメントと同じくらい最新のものです。LlamaIndex はチャンク処理、埋め込み、リトリーバルをうまく処理しますが、すべての前にあるステップ、つまりライブウェブページがクリーンテキストに変換される部分が静かに壊れます。
LlamaIndex を Scrapeless MCP サーバーに接続することで、そのステップをカバーします。MCP ツールは、レンダリングされたページをマークダウンとして返し、LlamaIndex はそれらを Document オブジェクトとしてラップし、残りのインジェスチョンパイプラインは変更されずに続行されます。このガイドでは、接続、ツールの発見、実際のページ取得、ドキュメントからノードへの分割をエンドツーエンドで実行します。
このセットアップがインデックスにもたらすもの
インジェスチョンコードは、1つの接続から21の呼び出し可能なツールを取得し、それらは自分でラップするのではなく、ネイティブな LlamaIndex ツールとして到着します。
インジェスチョンにはグループが重要です:
- ページ取得 —
scrape_markdownはすでにマークダウンに変換されたページを返します。これはスプリッターと埋め込みモデルが最も得意とするフォーマットです。scrape_htmlとscrape_screenshotは他の2つの形式を返します。 - 検索 —
google_searchとgoogle_trendsは、インジェスチョンジョブが固定リストを渡されるのではなく、URLを発見することを可能にします。 - ライブブラウザ制御 — コンテンツが存在する前に対話が必要なページのための16の
browser_*ツール。
レンダリング、プロキシルーティング、アクセス処理はすべてサーバー側で行われるため、インジェスチョンプロセスは、インストールするブラウザがない普通の Python ジョブにとどまります。
なぜ Scrapeless MCP サーバーなのか
モデルコンテキストプロトコル仕様は、クライアントがサーバーからツールとその引数スキーマをどのように発見するかを定義しており、これがフェッチヘルパーを書くことと異なる理由です:ツールリストと各ツールのパラメーターは、プロジェクトにハードコードされるのではなく、サーバーから到着します。呼び出しはJSON-RPC 2.0メッセージとして移動します。
Scrapeless はエンドポイントをホストしているため、インデクサーと並行して実行するサーバープロセスはありません。認証は1つのヘッダーです。browser_* グループは、Scrapeless スクレイピングブラウザ によって支えられており、ツールごとのパラメーターはScrapeless ドキュメントに記載されています。
必要条件
- Python 3.10 以上。
llama-index-coreとllama-index-tools-mcpは現在>=3.10,<4.0を宣言しています。 - ダッシュボードからの Scrapeless API キー。
- エージェントセクションのみ:
llama-index-llms-openaiなどのLLM統合パッケージと、そのプロバイダーのキー。
注意:以下のインジェスチョンセクションを通じて、Scrapelessキーとモデルプロバイダーキーなしで実行されました。MCP接続、ツール発見、引数スキーマ、ライブツール呼び出し、
Documentからノードへの分割はすべて実行されました。最後のエージェントステップは前提条件のギャップです —FunctionAgentを構築する際、LLM統合がインストールされていないとImportError: llama-index-llms-openai package not foundが発生するため、そのブロックはキャプチャ出力としてではなく、追加するコードのように表示されます。
インストール
bash
pip install "llama-index-tools-mcp==0.4.8"
そのパッケージは llama-index-core と mcp クライアントを持ってきます。シェルでキーを設定します:
bash
export SCRAPELESS_API_KEY="your_api_key_here"
接続し、ツールをリストする
BasicMCPClient はエンドポイントの URL とヘッダーを受け取り、McpToolSpec はサーバーのツールリストを LlamaIndex ツールに変換します:
python
import asyncio, os
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec
async def main():
client = BasicMCPClient(
"https://api.scrapeless.com/mcp",
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
)
spec = McpToolSpec(client=client)
tools = await spec.to_tool_list_async()
print("tool count:", len(tools))
print("sample names:", sorted(t.metadata.name for t in tools)[:6])
asyncio.run(main())
text
tool count: 21
sample names: ['browser_click', 'browser_close', 'browser_create', 'browser_get_html', 'browser_get_text', 'browser_go_back']
APIは全体的に非同期であるため、例は asyncio.run 内で実行されます。ツール名はフラットに到着し、サーバープリフィックスやドット付き名前空間がないため、scrape_markdown はコードとエージェントが使用する文字通りの名前です。
ジョブが必要なツールのみを取る
インジェスチョンジョブは、ブラウザセッションの制御を必要とすることはほとんどありません。McpToolSpec は allowed_tools を受け入れ、指定されたツールのみを返します。これにより、表面が小さくなり、スキーマの読みやすさが向上します:
python
import asyncio, os
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec
async def main():
client = BasicMCPClient(
"https://api.scrapeless.com/mcp",
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
)
text
フィルタリングされたカウント: 1
名前: scrape_markdown
fn_schema フィールド: ['url']
スキーマはサーバーから提供されるため、仮定ではなく実際の契約です: scrape_markdown は単一の url を受け取ります。LlamaIndex はこれを fn_schema として公開しており、エージェントがその呼び出しを構築するために使用するのと同じ Pydantic モデルです。
自分のソースにこれを指し示す準備はできましたか? 無料の Scrapeless アカウントを作成し、ダッシュボードからのキーを接続してください。
ライブページをノードに変換
これは取得に重要な部分です。ツールを直接呼び出し、各結果をそのメタデータにソースを含む Document としてラップしてから、ノードに分割します:
python
import asyncio, os
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec
from llama_index.core import Document
from llama_index.core.node_parser import SentenceSplitter
async def main():
client = BasicMCPClient(
"https://api.scrapeless.com/mcp",
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
)
spec = McpToolSpec(client=client, allowed_tools=["scrape_markdown"])
tool = (await spec.to_tool_list_async())[0]
urls = [
"https://quotes.toscrape.com/js/",
"https://quotes.toscrape.com/page/2/",
]
docs = []
for url in urls:
markdown = str(await tool.acall(url=url))
docs.append(Document(text=markdown, metadata={"source": url}))
print(f"ドキュメント数: {len(docs)}")
splitter = SentenceSplitter(chunk_size=256, chunk_overlap=32)
nodes = splitter.get_nodes_from_documents(docs)
print(f"分割後のノード数: {len(nodes)}")
print(f"最初のノードのソース: {nodes[0].metadata['source']}")
print(f"最初のノードの文字数: {len(nodes[0].get_content())}")
asyncio.run(main())
text
ドキュメント数: 2
分割後のノード数: 14
最初のノードのソース: https://quotes.toscrape.com/js/
最初のノードの文字数: 571
その出力には注意すべき点がいくつかあります。
最初の URL はクライアントレンダリングされたページです — その内容はスクリプトによって DOM に書き込まれ — それでも利用可能なマークダウンを生成しました。なぜなら、その変換の前にサーバーサイドでレンダリングが行われたからです。同じ URL の通常の HTTP フェッチは、内容が含まれていないマークアップを返します。
chunk_size=256 はトークンをカウントし、文字をカウントしないため、最初のノードは 571 文字になります。文字でスプリッタをサイズ指定することは、埋め込みモデルのコンテキストをオーバーフローさせるチャンクができる一般的な方法です。
metadata={"source": url} が各 Document に設定されており、それは分割後にも維持され、そこから派生したすべてのノードに渡ります。これにより、取得結果がどこから来たのかを引用でき、後で再構築するよりもはるかに簡単にここに添付できます。
マークダウンは、このための適切な中間フォーマットです: 見出しとリンクは残りますが、スクリプト、スタイル、およびレイアウトマークアップは残りませんので、埋め込み予算は内容に向かいます。
ツールをエージェントに与える
ツールが手に入ったら、エージェントは固定された URL リストに従うのではなく、どれを呼び出すかを決定できます。このステップには、LLM 統合パッケージとそのプロバイダーのキーが必要です。
注: このブロックは前提条件のギャップです。LLM 統合がインストールされていないと、エージェントを構築する際に
ImportError: llama-index-llms-openai package not found, please run pip install llama-index-llms-openaiが発生するため、出力は表示されません。
python
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI
agent = FunctionAgent(
tools=tools,
llm=OpenAI(model="gpt-4.1-mini"),
system_prompt="公共ページを調査して、出典付きのクリーンなノートを返してください。",
)
response = await agent.run("quotes.toscrape.com に引用された著者を要約してください")
print(response)
結論
LlamaIndex を Scrapeless MCP サーバーに接続するには、クライアント、ツールの仕様、および 1 つのヘッダーが必要です。サーバーはそれぞれの引数スキーマを持つ 21 のツールを提供し、allowed_tools により、取り込みジョブに実際に必要なものに絞り込まれ、scrape_markdown はスプリッタと埋め込みモデルの両方が好むフォーマットでページを返します。
持ち帰るべき習慣は、取得時にソース URL を Document のメタデータとして添付することです。一つの辞書で済み、ノードの分割を生き残り、取得ヒットを追跡可能な回答に変えるものです。
Scrapelessの無料プランに登録するとキーを取得し、インジェストランのサイズを確認する際はScrapelessの料金プランを確認し、Scrapeless MCPサーバーの概要でツールの詳細を確認してください。
よくある質問
Q: LlamaIndex用のScrapeless MCPサーバーのエンドポイントは?
ホスティングされたエンドポイントはhttps://api.scrapeless.com/mcpで、BasicMCPClientを介してx-api-tokenヘッダーにキーを指定して到達します。ツールはリモートで提供されるため、ローカルサーバープロセスを実行する必要はありません。
Q: Scrapeless MCPサーバーはLlamaIndexに何ツールを公開していますか?
ライブ接続では21のツールが返されます:16のbrowser_*セッション制御ツール、3つのページ取得ツール(scrape_markdown、scrape_html、scrape_screenshot)、2つの検索ツール(google_search、google_trends)です。サーバーはリリースの間にツールを追加できるため、仮定するのではなくランタイムで列挙してください。
Q: MCPツールを一部だけ読み込むことはできますか?
はい。McpToolSpecにallowed_tools=["scrape_markdown"]を渡すと、そのツールだけがリストに返されます。インジェストする際にはこれを行う価値があります — スキーマが読みやすく保たれ、エージェントが必要のないブラウザセッションを開くのを防ぎます。
Q: MCPを介してページを取得するのにLLMキーは必要ですか?
いいえ。接続、ツールの発見、スキーマの検査、直接のtool.acall(...)はすべてScrapelessキーだけで動作します。ツールをエージェントに渡すときにモデルプロバイダーが必要になります。それがツールを呼び出すべきかを決定する必要があるときです。
Q: 取得にHTMLの代わりにMarkdownを使用する理由は何ですか?
Markdownは取得の助けとなる構造を保持します — 見出し、リスト、リンク — そして意味を追加せずに埋め込みコンテキストを消費するスクリプト、スタイリング、レイアウトマークアップを取り除きます。scrape_htmlは、テキストを埋め込む代わりに自分のセレクターを実行するつもりであれば正しい選択です。
Q: 取得したチャンクがどのページから来たかを追跡するにはどうすればよいですか?
ドキュメントを作成するときにDocument(metadata={"source": url})にURLを入れてください。そのメタデータは分割器が生成するすべてのノードにコピーされるため、取得した各チャンクは追加の管理なしでその起源を保持します。
Q: サイトをインジェストする前に何を確認すべきですか?
サイトの利用規約と/robots.txtの指示を確認してください。これはロボット排除プロトコル標準に従います。インジェストは公開ページに限定し、明示的なURLリストまたは制限された発見ステップから作業し、すべてのドキュメントにソースURLを記録して、インデックスが返すものの出所を明確に保ちます。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



