【ITニュース解説】Build a Web Scraping Tool Server with FastMCP & Zyte API

2025年09月10日に「Dev.to」が公開したITニュース「Build a Web Scraping Tool Server with FastMCP & Zyte API」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

AIはリアルタイムのWeb情報にアクセスできない。本記事はFastMCPとZyte APIでWebスクレイピングツールサーバーを構築し、AIに最新情報取得の能力を与える方法を紹介する。AIは質問に対し、このサーバーのツールを使いWebからデータを取得し、正確な回答を生成できる。

ITニュース解説

大規模言語モデル(LLM)は、非常に強力な人工知能であるが、その知識は最後の学習時点のものであり、常に最新のインターネット情報にアクセスできるわけではないという限界を持つ。例えば、リアルタイムの商品価格を知りたい、最新の記事をダウンロードしたい、ウェブサイトの現在のHTML構造を分析したいといった場合、既存のLLMだけでは対応が難しい。これは、ウェブサイトによってはアクセス制限があったり、ブラウザを通さないと正確な情報を得られない場合があるためだ。

このようなLLMの課題を解決し、AIに現実世界と連携する能力を与えるのが、MCP(Model Context Protocol)サーバーである。MCPサーバーは、LLMが外部の情報を取得したり、特定のアクションを実行したりするための「手足」や「センサー」のような役割を果たす。AIは、自分自身の内部知識だけでは解決できない質問を受けたとき、このMCPサーバーに用意された「ツール」を使って外部の情報を取りに行く。これは、AIがより高度なタスクをこなすための、一般的なAIエージェントやRAG(Retrieval-Augmented Generation)といったシステムの一部として機能する。

具体的な例で考えると、ユーザーがAIに「Appleのウェブサイトにある新しいiPhoneの価格はいくらか?」と質問する状況を想定する。AIは自身の記憶だけでは最新の価格を知り得ないため、利用可能なツールの中から「指定されたURLから製品データを抽出する」という説明のツールを見つけ、それが今回の質問に最適だと判断する。次に、AIはこのツールをMCPサーバーに呼び出し、iPhoneのウェブページのURLを渡す。MCPサーバーはこの要求を受けて、裏側でウェブスクレイピング(ウェブサイトから情報を自動的に収集する技術)を実行し、Zyte APIという外部サービスを利用して、ウェブサイトから製品価格や在庫状況などの整理されたデータを取り出す。そして、その新鮮なデータをAIに返す。AIはその情報を使って、ユーザーに正確で最新の回答を提供する。このように、MCPサーバーを構築することで、AIは単に質問に答えるだけでなく、積極的に情報を収集し、処理する強力なエージェントとなる。

このようなシステムを構築するには、単なる簡単なスクリプトではなく、信頼性の高いサービスとして設計する必要がある。そのためには、コードの明確さ、再利用性、安全性を考慮した構造が求められる。

まず、基盤となるのは、外部サービス(今回はZyte API)とやり取りするための専用APIクライアントである。requests.postのようなAPI呼び出しをコードのあちこちに直接記述するのではなく、ZyteAPIClientという一つのクラスにまとめるのが良い方法だ。これにより、APIへのベースURL、認証情報、タイムアウト設定などの詳細な通信ロジックがすべてこのクラス内にカプセル化される。もし将来、APIの仕様変更があったとしても、このクラス内のコードを修正するだけで対応できるため、コード全体を整理し、保守を容易にする。このクライアントクラスには、extract_productextract_htmlといった、特定のタスクを実行するためのメソッドが用意され、それぞれがZyte APIに適切なリクエストを生成する。

次に、取得したデータの整合性を保つための仕組みも不可欠である。ウェブサイトから取得するデータは、常に期待通りの形式であるとは限らない。価格情報がない場合や、APIの応答形式が少し変わるだけで、プログラムが誤動作する可能性がある。これを防ぐために、Pydanticというライブラリを使用してデータモデルを定義する。Pydanticモデルは、受け取るデータの「形」や「スキーマ」を厳密に定義する役割を持つ。これにより、Zyte APIから返されたデータが、私たちが定義したProductResponseなどのスキーマと一致しない場合、Pydanticがエラーを検出し、不正なデータがシステム全体に広がるのを防ぐ。この仕組みによって、アプリケーション内で流れるデータは常に正しい構造であることが保証され、ツールの信頼性が向上し、AIも安全にデータを利用できる。

これらの堅牢な基盤が整った上で、AIのための「ツール」を実際に作成する。ここではFastMCPというフレームワークが使われる。FastMCPの@mcp.toolデコレータを使うと、任意のPython関数を、AIが安全に呼び出し可能なAPIエンドポイントへと瞬時に変換できる。

例えば、製品データを抽出するextract_product関数を例に取る。

1@mcp.tool
2def extract_product(url: str) -> dict:
3    """
4    Extracts structured product data (name, price, SKU, etc.) from a given product page URL.
5    Use this when a user asks for specific details about a product.
6    """
7    response = zyte_client.extract_product(url)
8    return response.model_dump()

このコードで最も重要な部分は、関数の直下にある三重引用符で囲まれた文字列、すなわち「docstring」である。このdocstringは、単なるプログラマー向けのコメントではない。これはLLMに対する「説明書」なのだ。AIはこの説明を読み込み、このツールが何をするものなのか、そしてどのような状況で使うべきかを理解する。明確で簡潔なdocstringは、AIエージェントが効果的に機能するための鍵となる。同様に、生のHTMLコンテンツを取得するextract_htmlツールや、ブラウザでレンダリングされたHTMLを取得するextract_html_with_browserツールなども、それぞれ適切なdocstringと共に定義される。

クライアント、データモデル、ツールの定義が完了したら、最後にサーバーを起動する。たった一つのmcp.run()というコードを実行するだけで、FastMCPはウェブサーバーを立ち上げ、AIからのリクエストを待ち受け、適切なツールを実行する準備が整う。

このように構築されたMCPサーバーは、AIにウェブスクレイピングという強力なスーパーパワーを与え、AIは常に最新の情報を手に入れ、現実世界の様々な課題に対応できるようになる。これは、LLMの持つ知識の限界を突破し、より実用的で賢いAIシステムを構築するための重要なステップである。