Apidog

オールインワン協働API開発プラットフォーム

API設計

APIドキュメント

APIデバッグ

APIモック

API自動テスト

MCPサーバーをOpenRouterで使用する方法

@apidog

@apidog

Updated on 3月 14, 2025

AIの開発は急速に進化しており、外部ツールを言語モデルと統合することは重要なステップです。 OpenRouterは、多数の言語モデルにアクセスするための統一されたAPIを提供し、MCPサーバー(モデルコンテキストプロトコルサーバー)は、これらのモデルが外部ツールを実行し、ライブデータにアクセスできるようにします。これらを組み合わせることで、高度なAIアプリケーションを構築するための強力なシステムが作成されます。

この記事では、MCPサーバーOpenRouterと統合する方法を案内します。基本的な機能、統合プロセス、実際の例を学びます。

💡
始める前に、Apidogを無料でダウンロードしてください。これは、APIをテストし、設定をデバッグするための優れたツールです。
button

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テストに推奨されます。無料でダウンロード。
button

ステップ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構造は、OpenRouterAPIペイロードで期待するものです。

ステップ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サーバーでファイルを一覧表示してみましょう。

  1. ツール定義:前述のlist_filesツールを使用します。
  2. MCPサーバーhttp://localhost:8000で実行されていると仮定します。
  3. API呼び出しOpenRouterに「現在のディレクトリのファイルを一覧表示」を送信します。
  4. レスポンス処理:モデルがlist_filesを呼び出し、{"path": "."}を渡します。
  5. MCP実行:サーバーが["file1.txt", "file2.txt"]を返します。
  6. 最終出力:モデルが「見つかったファイル: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をテストしてください。どうだったか教えてください!

button