Web APIをMCP化してAgent-readyにした話
この記事は、サイバーエージェントのAI事業本部が、開発している複数のWeb APIをAIエージェントから容易に利用できるようにするため、FastMCPというフレームワークを用いてMCP (Model Context Protocol) Gatewayを構築した取り組みを紹介しています。
1. 背景と目的
- 背景: 記事の筆者らが所属する「極予測TD」では、広告文の品質判定など、複数のWeb APIを開発・運用しています。昨今、AIエージェントの開発が盛んになる中で、これらのAPIをAIエージェントから呼び出せるようにすることで、広告文の生成と品質判定を繰り返し、より高品質な広告文を生成することが期待されました。
- 課題: AIエージェントから複数のAPIサーバーを直接呼び出す場合、エージェントごとに各APIの呼び出しロジックを実装したり、APIの仕様変更のたびにロジックを修正したりする必要があり、開発・運用に手間がかかります。
- 目的: これらの手間を削減し、AIエージェントが複数のWeb APIを簡単に利用できるようにするために、MCPサーバーを導入することにしました。
2. MCPサーバーの導入パターンの検討
AIエージェントが複数のAPIを利用可能にするために、以下の2つのパターンが検討されました。
- 各APIサーバーに対応するMCPサーバーを開発する:
- 既存APIと同じインターフェイスのMCPサーバーを個別に開発する。
- デメリット: 個別の開発コスト、MCPホスト側での登録手間がかかる。
- APIサーバーのGatewayとなるようなMCPサーバーを開発する(MCP Gateway):
- APIサーバーの前段に、Gatewayの役割を持つ単一のMCPサーバーを配置する。
- メリット: 構築するMCPサーバーが一つで済むため、開発・運用コストが小さい。
- デメリット: Gateway経由でリクエストを送るため、通信のオーバーヘッドが増える。
筆者らのチームでは、「開発・運用コストを抑えたい」「通信のオーバーヘッドを無視できるユースケース」という理由から、MCP Gatewayを開発するパターンを採用しました。
3. FastMCPを用いたMCP Gatewayの構築
MCP Gatewayの構築には、Python向けフレームワークであるFastMCPが採用されました。FastMCPの以下の2つの機能を組み合わせて実現しています。
① OpenAPI統合機能 (FastMCP.from_openapi)
- 機能: OpenAPI仕様に準拠した既存のAPIサーバーがある場合、そのOpenAPI Specification (API仕様書) をもとに、手動でMCPツールやリソースを構築することなく、自動でMCPサーバーを作成する機能です。
- これにより、既存のWeb APIを簡単にMCP化できます。
② Server Composition機能 (mount)
- 機能: 複数のMCPサーバーを一つにまとめる機能です。
- 特に
mount機能は、メインサーバー(Gateway)にサブサーバー(個別のAPIに対応するMCPサーバー)とのライブリンクを作成し、メインサーバーへのリクエストをサブサーバーに委譲する方式です。 mountを使うことで、複数のWeb APIに対応するMCPサーバーを一つのMCP Gatewayとして統合し、単一のエンドポイントで利用可能にしました。
これらの機能の組み合わせにより、既存の複数のWeb APIを、AIエージェントから簡単に呼び出せるAgent-readyな状態にすることができました。
4. まとめと注意点
- 成果: FastMCPのOpenAPI統合機能とServer Composition機能を組み合わせることで、Gatewayの役割を持つMCPサーバーを構築し、複数のWeb APIを簡単にMCP化できました。
- メリット: 構築のしやすさ、Web APIとAIエージェントとの連携のしやすさが魅力です。
- 注意点: OpenAPI SpecからMCPのツール・リソースがエンドポイント単位で自動生成されるため、エンドポイントの数が多い場合、ツール・リソースの定義が膨大になり、結果的にLLM (大規模言語モデル) のコンテキストを圧迫してしまう可能性があります。
サンプルコードについて
記事で紹介されていた、FastMCPを使用して既存のWeb APIをMCP化するためのサンプルコードは以下の通りです。
主に「OpenAPI統合機能」を使ってAPIをMCPサーバー化する方法と、それを「Server Composition機能」で一つにまとめる(Gateway化する)方法の2段階で紹介されています。
1. OpenAPI統合機能を使ったMCP化
既存のAPIがOpenAPI仕様(Swaggerなど)に準拠している場合、その定義ファイル(JSON)を読み込むだけでMCPサーバーを作成できます。
import httpx
from fastmcp import FastMCP
client = httpx.AsyncClient(base_url="https://api.example.com")
# OpenAPI Specを取得する
openapi_spec = httpx.get("https://api.example.com/openapi.json").json()
# OpenAPI統合機能を用いて、既存のAPIからMCPサーバーを作成する
mcp = FastMCP.from_openapi(
openapi_spec=openapi_spec,
client=client,
name="My API Server"
)
2. 複数のMCPサーバーをGatewayとしてまとめる方法
複数のAPI(MCPサーバー)を一つのMCPサーバー(Gateway)に統合して、AIエージェントから一括で扱えるようにするコードです。
import httpx
from fastmcp import FastMCP
# 1. 各APIのクライアントとSpecを用意
api1_client = httpx.AsyncClient(base_url="https://api1.example.com")
api2_client = httpx.AsyncClient(base_url="https://api2.example.com")
api1_openapi_spec = httpx.get("https://api1.example.com/openapi.json").json()
api2_openapi_spec = httpx.get("https://api2.example.com/openapi.json").json()
# 2. 各APIを個別のMCPサーバーとして定義
mcp1 = FastMCP.from_openapi(
openapi_spec=api1_openapi_spec,
client=api1_client,
name="Mcp1"
)
mcp2 = FastMCP.from_openapi(
openapi_spec=api2_openapi_spec,
client=api2_client,
name="Mcp2"
)
# 3. メインとなるMCP Gatewayを定義
gateway = FastMCP("MCPGateway")
# 4. mount機能を使って、Gatewayに各MCPサーバーをマウントする
gateway.mount(mcp1)
gateway.mount(mcp2)
# 5. 実行
gateway.run()
このコードを実行し、作成されたMCPサーバーをClaude DesktopなどのAIエージェントに登録することで、定義されたWeb APIをエージェント経由で呼び出せるようになります。


コメント