AIの開発は急速に進化しており、外部ツールを言語モデルと統合することは重要なステップです。 OpenRouterは、多数の言語モデルにアクセスするための統一されたAPIを提供し、MCPサーバー(モデルコンテキストプロトコルサーバー)は、これらのモデルが外部ツールを実行し、ライブデータにアクセスできるようにします。これらを組み合わせることで、高度なAIアプリケーションを構築するための強力なシステムが作成されます。
この記事では、MCPサーバーをOpenRouterと統合する方法を案内します。基本的な機能、統合プロセス、実際の例を学びます。
MCPサーバーとOpenRouterの理解
MCPサーバーをOpenRouterと統合するには、まず各コンポーネントの役割を理解する必要があります。
OpenRouter:言語モデルへの統一アクセス
OpenRouterは、OpenAI、Anthropic、xAIなどのプロバイダーからの大規模言語モデル(LLM)とのインタラクションを簡素化するプラットフォームです。OpenAIのAPI構造に互換性がある単一のAPIエンドポイントhttps://openrouter.ai/api/v1/chat/completions
を提供します。主な機能は次のとおりです:
- モデル集約:1つのインターフェースを通じて数百のLLMにアクセス。
- コスト最適化:利用可能性と価格に基づいて、コスト効果の高いモデルにリクエストをルーティング。
- ロードバランシング:リクエストを分散し、単一のプロバイダーへの過負荷を防止。
- フォールバック:1つのモデルが失敗した場合に代替モデルに切り替え。
進めるにはOpenRouterアカウントとAPIキーが必要です。openrouter.aiで取得してください。

MCPサーバー:モデル機能の拡張
MCPサーバーはモデルコンテキストプロトコルを実装しており、LLMが外部ツールを呼び出すことを可能にします。独立したモデルがトレーニングデータに制限されるのとは異なり、MCPサーバーはファイルディレクトリ、データベース、サードパーティのAPIなどのシステムとリアルタイムで対話できます。典型的なMCPツール定義には次のような内容が含まれます:
- 名前:ツールを特定します(例:
list_files
)。 - 説明:目的を説明します。
- パラメータ:JSONスキーマ形式で入力を指定します。
例えば、ディレクトリ内のファイルをリストするためのMCPツールは次のようになります:
{
"name": "list_files",
"description": "指定したディレクトリのファイルをリストします",
"parameters": {
"type": "object",
"properties": {
"path": {"type": "string", "description": "ディレクトリのパス"}
},
"required": ["path"]
}
}
全体として、OpenRouterがモデルを提供し、MCPサーバーがツールを供給することで、強力なAIエコシステムが形成されます。
なぜMCPサーバーをOpenRouterと統合するのか?
これらの技術を組み合わせることで、いくつかの技術的利点が得られます:
- モデルの柔軟性:ツール呼び出し機能を持つ任意のOpenRouter対応LLMを使用できます。
- コスト削減:外部ツールと一緒に安価なモデルを組み合わせて、複雑なタスクをオフロードできます。
- 機能の強化:モデルがライブデータを取得したり、アクションを実行したり(例:ファイル操作)できるようになります。
- スケーラビリティ:コアロジックを書き直すことなく、モデルやツールを切り替えることができます。
- 将来性:新しいLLMやツールが登場するにつれて適応できます。
この統合は、実世界のインタラクティビティを必要とするAIシステムを構築する開発者に最適です。
ステップバイステップの統合プロセス
では、技術的な内容に入ります。MCPサーバーをOpenRouterと統合する方法をご紹介します。
前提条件
次のものを用意してください:
- OpenRouterアカウントおよびAPIキー:openrouter.aiから。
- MCPサーバー:ローカル(例:
http://localhost:8000
)またはリモートで実行中。このガイドでは、ファイルシステムMCPサーバーを使用します。 - Python 3.8+:
requests
ライブラリを含みます(pip install requests
)。 - Apidog:オプションですが、APIテストに推奨されます。無料でダウンロード。
ステップ1:MCPツールを定義および変換する
OpenRouterはOpenAIのツール呼び出しフォーマットを使用しているため、MCPツール定義を変換する必要があります。まず、MCP定義から始めます:
{
"name": "list_files",
"description": "指定したディレクトリのファイルをリストします",
"parameters": {
"type": "object",
"properties": {
"path": {"type": "string", "description": "ディレクトリのパス"}
},
"required": ["path"]
}
}
次に、type
フィールドを追加し、関数の詳細をネストしてOpenAI形式に変換します:
{
"type": "function",
"function": {
"name": "list_files",
"description": "指定したディレクトリのファイルをリストします",
"parameters": {
"type": "object",
"properties": {
"path": {"type": "string", "description": "ディレクトリのパス"}
},
"required": ["path"]
}
}
}
このJSON構造は、OpenRouterがAPIペイロードで期待するものです。
ステップ2:APIリクエストを構成する
OpenRouterへのAPIリクエストを準備します。あなたのAPIキーでヘッダーを定義し、モデル、メッセージ、ツールを含むペイロードを準備します。Pythonの例は次のとおりです:
import requests
import json
# ヘッダー
headers = {
"Authorization": "Bearer your_openrouter_api_key",
"Content-Type": "application/json"
}
# ペイロード
payload = {
"model": "openai/gpt-4", # お好みのモデルに置き換えてください
"messages": [
{"role": "user", "content": "現在のディレクトリのファイルをリストしてください。"}
],
"tools": [
{
"type": "function",
"function": {
"name": "list_files",
"description": "指定したディレクトリのファイルをリストします",
"parameters": {
"type": "object",
"properties": {
"path": {"type": "string", "description": "ディレクトリのパス"}
},
"required": ["path"]
}
}
}
]
}
your_openrouter_api_key
を実際のキーに置き換えてください。
ステップ3:最初のAPIリクエストを送信する
OpenRouterのエンドポイントにPOSTリクエストを行います:
response = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers=headers,
json=payload
)
response_data = response.json()
ステップ4:ツール呼び出しを処理する
レスポンスにツール呼び出しが含まれているか確認します:
{
"choices": [
{
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_123",
"type": "function",
"function": {
"name": "list_files",
"arguments": "{\"path\": \".\"}"
}
}
]
}
}
]
}
ツール呼び出しの詳細を抽出します:
message = response_data["choices"][0]["message"]
if "tool_calls" in message:
tool_call = message["tool_calls"][0]
function_name = tool_call["function"]["name"]
arguments = json.loads(tool_call["function"]["arguments"])
ステップ5:MCPサーバーを呼び出す
ツールリクエストをMCPサーバーに送信します:
mcp_response = requests.post(
"http://localhost:8000/call",
json={
"name": function_name,
"arguments": arguments
}
)
tool_result = mcp_response.json()["result"] # 例:["file1.txt", "file2.txt"]
ステップ6:ツールの結果をOpenRouterに返す
アシスタントのツール呼び出しとその結果をメッセージ履歴に追加します:
messages = payload["messages"] + [
{
"role": "assistant",
"content": null,
"tool_calls": [tool_call]
},
{
"role": "tool",
"tool_call_id": tool_call["id"],
"content": json.dumps(tool_result)
}
]
# ペイロードを更新
payload["messages"] = messages
# フォローアップリクエストを送信
final_response = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers=headers,
json=payload
)
final_output = final_response.json()["choices"][0]["message"]["content"]
print(final_output) # 例:"Files: file1.txt, file2.txt"
ステップ7:複数のツール呼び出しを処理する
モデルが複数のツール呼び出しを必要とする場合は、プロセスをループします:
messages = payload["messages"]
while True:
response = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers=headers,
json={"model": "openai/gpt-4", "messages": messages}
)
message = response.json()["choices"][0]["message"]
if "tool_calls" not in message:
print(message["content"])
break
for tool_call in message["tool_calls"]:
function_name = tool_call["function"]["name"]
arguments = json.loads(tool_call["function"]["arguments"])
mcp_response = requests.post(
"http://localhost:8000/call",
json={"name": function_name, "arguments": arguments}
)
tool_result = mcp_response.json()["result"]
messages.extend([
{"role": "assistant", "content": null, "tool_calls": [tool_call]},
{"role": "tool", "tool_call_id": tool_call["id"], "content": json.dumps(tool_result)}
])
すべてのツール呼び出しが処理されることを確認します。
実際の例:ファイルシステムとの対話
これを実際のシナリオに適用して、MCPサーバーでファイルを一覧表示してみましょう。
- ツール定義:前述の
list_files
ツールを使用します。 - MCPサーバー:
http://localhost:8000
で実行されていると仮定します。 - API呼び出し:OpenRouterに「現在のディレクトリのファイルを一覧表示」を送信します。
- レスポンス処理:モデルが
list_files
を呼び出し、{"path": "."}
を渡します。 - MCP実行:サーバーが
["file1.txt", "file2.txt"]
を返します。 - 最終出力:モデルが「見つかったファイル:file1.txt, file2.txt」と応答します。
こちらが完全なコードです:
import requests
import json
headers = {"Authorization": "Bearer your_openrouter_api_key", "Content-Type": "application/json"}
payload = {
"model": "openai/gpt-4",
"messages": [{"role": "user", "content": "現在のディレクトリのファイルをリストしてください。"}],
"tools": [{
"type": "function",
"function": {
"name": "list_files",
"description": "指定したディレクトリのファイルをリストします",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string", "description": "ディレクトリのパス"}},
"required": ["path"]
}
}
}]
}
response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=payload)
message = response.json()["choices"][0]["message"]
if "tool_calls" in message:
tool_call = message["tool_calls"][0]
function_name = tool_call["function"]["name"]
arguments = json.loads(tool_call["function"]["arguments"])
mcp_response = requests.post("http://localhost:8000/call", json={"name": function_name, "arguments": arguments})
tool_result = mcp_response.json()["result"]
messages = payload["messages"] + [
{"role": "assistant", "content": null, "tool_calls": [tool_call]},
{"role": "tool", "tool_call_id": tool_call["id"], "content": json.dumps(tool_result)}
]
final_response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json={"model": "openai/gpt-4", "messages": messages})
print(final_response.json()["choices"][0]["message"]["content"])
一般的な問題のトラブルシューティング
よくある問題の解決策は次のとおりです:
- ツールが呼び出されない:ツール定義の構文とプロンプトの明確さを確認します。
- 無効な引数:パラメータがJSONスキーマと一致していることを確認します。
- MCPサーバーの失敗:サーバーログとエンドポイント(
http://localhost:8000/call
)をチェックします。 - API認証:OpenRouterのキーが正しいことを確認します。
Apidogを使用して、APIリクエストやレスポンスを効率的にデバッグしてください。
統合の拡張
2000語を超え、深みを追加するために、次の拡張を考慮してください:
データベースクエリの例
データベースを照会するためのMCPツールを定義します:
{
"type": "function",
"function": {
"name": "query_db",
"description": "SQLでデータベースを照会します",
"parameters": {
"type": "object",
"properties": {"sql": {"type": "string", "description": "SQLクエリ"}},
"required": ["sql"]
}
}
}
「データベースからすべてのユーザーを取得」というリクエストをOpenRouterに送信し、query_db
呼び出しを処理し、[{"id": 1, "name": "Alice"}]
のような結果を返します。
エラーハンドリング
堅牢なエラーハンドリングを追加します:
try:
mcp_response = requests.post("http://localhost:8000/call", json={"name": function_name, "arguments": arguments})
mcp_response.raise_for_status()
except requests.RequestException as e:
tool_result = f"エラー: {str(e)}"
これにより、アプリケーションの安定性が保たれます。
結論
MCPサーバーをOpenRouterと統合すると、外部ツールを単一のAPIを通じて活用できるようになります。このガイドでは、設定、ツールの変換、API呼び出し、およびファイルシステムとの対話のような実際の例について説明しました。コスト削減や機能の強化などの利点があるため、このアプローチは技術的な開発者にとっては試す価値のあるものです。
今すぐ実験を始めましょう。Apidogを無料で取得してAPIをテストしてください。どうだったか教えてください!
