Ⓜ️

OpenAIのResponses APIにおける新機能「Remote MCP (Model Context Protocol)」

に公開

1. はじめに

https://platform.openai.com/docs/guides/tools-remote-mcp#page-top

OpenAIのResponses APIにおける新機能「Remote MCP (Model Context Protocol)」に関する調査結果をまとめたものである。Remote MCPは、大規模言語モデル(LLM)が外部のツールやコンテキストを標準化された方法で利用できるようにするためのオープンプロトコルであるMCPを活用し、開発者が管理するリモートサーバー上のツールへのアクセスをモデルに提供する。これにより、LLMの応用範囲を大幅に拡大する可能性を秘めている。

具体的には、以下のようなAPIコールを通じてMCPサーバーのツールを利用できる。この例では、deepwiki MCPサーバーに対し、MCP仕様の特定バージョンがサポートするトランスポートプロトコルについて質問している。

curl https://api.openai.com/v1/responses \\  
  \-H "Content-Type: application/json" \\  
  \-H "Authorization: Bearer $OPENAI\_API\_KEY" \\  
  \-d '{  
  "model": "gpt-4.1",  
  "tools": \[  
    {  
      "type": "mcp",  
      "server\_label": "deepwiki",  
      "server\_url": "https://mcp.deepwiki.com/mcp",  
      "require\_approval": "never" \# この例では承認をスキップ  
    }  
  \],  
  "input": "What transport protocols does the 2025-03-26 version of the MCP spec (modelcontextprotocol/modelcontextprotocol) support?"  
}'

2. Remote MCPの仕組み

Remote MCPの動作は、主にResponses APIを介した以下の2ステップで行われる。

2.1. ツールリストの取得 (Step 1)

Responses APIは、tools 配列に指定されたリモートMCPサーバーに対し、利用可能なツールのリストを要求する。この際、サーバーはStreamable HTTPまたはHTTP/SSEトランスポートプロトコルをサポートしている必要がある。

リスト取得に成功すると、mcp_list_tools という出力アイテムがレスポンスオブジェクト内に生成される。これには、インポートされたツールの定義(名前、入力スキーマなど)が含まれる。
例:


{  
  "id": "mcpl\_682d4379df088191886b70f4ec39f90403937d5f622d7a90",  
  "type": "mcp\_list\_tools",  
  "server\_label": "deepwiki",  
  "tools": \[  
    {  
      "name": "read\_wiki\_structure",  
      "input\_schema": { /\* ...スキーマ定義... \*/ }  
    },  
    // ... 他のツール  
  \]  
}

レイテンシを最適化するため、この mcp_list_tools アイテムはモデルのコンテキスト内に保持することが推奨される。

2.2. ツールの呼び出し (Step 2)

モデルがコンテキストに基づいてMCPツールの利用を決定すると、Responses APIはリモートMCPサーバーに該当ツールの実行をリクエストする。実行結果は mcp_call アイテムとしてモデルのコンテキストに追加される。このアイテムには、モデルが使用した引数(arguments)とサーバーからの出力(output)が含まれる。

例:


{  
  "id": "mcp\_682d437d90a88191bf88cd03aae0c3e503937d5f622d7a90",  
  "type": "mcp\_call",  
  "arguments": "{\\"repoName\\":\\"modelcontextprotocol/modelcontextprotocol\\",\\"question\\":\\"...\\"}",  
  "output": "The 2025-03-26 version of the Model Context Protocol (MCP) specification supports two standard transport mechanisms: \`stdio\` and \`Streamable HTTP\` ...",  
  "server\_label": "deepwiki",  
  "name": "ask\_question",  
  "error": null  
}

ツール呼び出しが失敗した場合、error フィールドにエラー情報が格納される。

3. 主な機能と利用方法

3.1. 対応モデルと料金体系

Remote MCPツールは、gpt-4o、gpt-4.1、およびOpenAIの推論モデルで利用可能である。料金は、ツール定義のインポート時やツール呼び出し時に使用されるトークン量に基づいて計算され、追加の利用料金は発生しない。

3.2. ツールフィルタリング (allowed_tools)

MCPサーバーが多数のツールを公開している場合、allowed_tools パラメータを使用して、モデルに公開するツールを特定のサブセットに限定できる。これにより、コストとレイテンシの増加を抑制できる。

例:deepwiki サーバーの ask_question ツールのみを許可するcURLコマンド

curl https://api.openai.com/v1/responses \\  
  \-H "Content-Type: application/json" \\  
  \-H "Authorization: Bearer $OPENAI\_API\_KEY" \\  
  \-d '{  
  "model": "gpt-4.1",  
  "tools": \[  
    {  
      "type": "mcp",  
      "server\_label": "deepwiki",  
      "server\_url": "https://mcp.deepwiki.com/mcp",  
      "require\_approval": "never",  
      "allowed\_tools": \["ask\_question"\] \# ask\_questionツールのみを指定  
    }  
  \],  
  "input": "What transport protocols does the 2025-03-26 version of the MCP spec (modelcontextprotocol/modelcontextprotocol) support?"  
}'

3.3. 承認プロセス (require_approval)

デフォルトでは、データがリモートMCPサーバーに送信される前にユーザーの承認が必要となる(すなわち require_approval が指定されていない場合や、明示的に承認が必要と設定されている場合)。承認リクエストが発生すると、mcp_approval_request アイテムが生成される。
例:mcp_approval_request のJSON出力

{  
  "id": "mcpr\_682d498e3bd4819196a0ce1664f8e77b04ad1e533afccbfa",  
  "type": "mcp\_approval\_request",  
  "arguments": "{\\"repoName\\":\\"modelcontextprotocol/modelcontextprotocol\\",\\"question\\":\\"What transport protocols are supported in the 2025-03-26 version of the MCP spec?\\"}",  
  "name": "ask\_question",  
  "server\_label": "deepwiki"  
}

ユーザーは、このリクエストに対して mcp_approval_response アイテムを新しいリクエストに含めて送信することで、承認または拒否を伝える。この際、previous_response_id パラメータを使用して、この承認がどのリクエストに対するものかを紐付ける。

以下は、特定の承認リクエスト (mcpr_...) に対して承認 (approve: true) を返すcURLコマンドの例である。

curl https://api.openai.com/v1/responses \\  
  \-H "Content-Type: application/json" \\  
  \-H "Authorization: Bearer $OPENAI\_API\_KEY" \\  
  \-d '{  
  "model": "gpt-4.1",  
  "tools": \[  
    {  
      "type": "mcp",  
      "server\_label": "deepwiki",  
      "server\_url": "https://mcp.deepwiki.com/mcp"  
      \# この時点では require\_approval はデフォルトまたは明示的に承認を求める設定  
    }  
  \],  
  "previous\_response\_id": "resp\_682d498bdefc81918b4a6aa477bfafd904ad1e533afccbfa", \# 承認リクエストを生成したレスポンスID  
  "input": \[{  
    "type": "mcp\_approval\_response",  
    "approve": true,  
    "approval\_request\_id": "mcpr\_682d498e3bd4819196a0ce1664f8e77b04ad1e533afccbfa" \# 承認するリクエストのID  
  }\]  
}'

信頼できるMCPサーバーに対しては、前述の最初のcURL例のように require_approval パラメータを "never" に設定するか、特定のツール名を指定することで、承認プロセスをスキップし、レイテンシを削減できる。
例:特定のツール(ask_question, read_wiki_structure)について承認をスキップ

curl https://api.openai.com/v1/responses \\  
  \-H "Content-Type: application/json" \\  
  \-H "Authorization: Bearer $OPENAI\_API\_KEY" \\  
  \-d '{  
  "model": "gpt-4.1",  
  "tools": \[  
    {  
      "type": "mcp",  
      "server\_label": "deepwiki",  
      "server\_url": "https://mcp.deepwiki.com/mcp",  
      "require\_approval": {  
          "never": { \# 常に承認をスキップするツールのリスト  
            "tool\_names": \["ask\_question", "read\_wiki\_structure"\]  
          }  
      }  
    }  
  \],  
  "input": "What transport protocols does the 2025-03-26 version of the MCP spec (modelcontextprotocol/modelcontextprotocol) support?"  
}'

3.4. 認証メカニズム

多くのリモートMCPサーバーは認証を要求する。Responses APIでは、リクエストの headers オブジェクトに必要な認証情報(APIキー、OAuthアクセストークンなど)を指定できる。一般的には Authorization ヘッダーが使用される。

例:Stripe APIキーを用いた認証を行うcURLコマンド

curl https://api.openai.com/v1/responses \\  
  \-H "Content-Type: application/json" \\  
  \-H "Authorization: Bearer $OPENAI\_API\_KEY" \\  
  \-d '{  
  "model": "gpt-4.1",  
  "input": "Create a payment link for $20",  
  "tools": \[  
    {  
      "type": "mcp",  
      "server\_label": "stripe",  
      "server\_url": "https://mcp.stripe.com", \# 認証が必要なサーバー  
      "headers": {  
        "Authorization": "Bearer $STRIPE\_API\_KEY" \# サーバー固有の認証情報  
      }  
    }  
  \]}'

セキュリティ上の理由から、headers オブジェクトに指定された文字列値はResponses APIに保存されず、レスポンスオブジェクトにも表示されない。また、サーバーURLのパス部分もレスポンスでは破棄されるため、リクエストごとに完全な server_url と関連ヘッダーを送信する必要がある。

4. MCPエコシステムの現状

MCPエコシステムはまだ初期段階にある。現在、Cloudflare, Hubspot, Intercom, Paypal, Pipedream, Plaid, Shopify, Stripe, Square, Twilio, Zapierなどが人気のあるリモートMCPサーバーとして挙げられている。今後数ヶ月で、さらに多くのサーバーや、これらのサーバーを発見しやすくするためのレジストリが登場することが期待される。MCPプロトコル自体も進化を続けており、それに伴いOpenAIのMCPツールもアップデートされる予定である。

5. リスクと安全対策

Remote MCPを利用する際には、以下のリスクを認識し、適切な安全対策を講じる必要がある。

  • 信頼できるサーバーへの接続:
    • サービスプロバイダー自身が公式にホストしているサーバー(例:mcp.stripe.com)の利用を推奨。
    • サードパーティが運営するアグリゲーター型MCPサーバーを利用する場合は、運営組織の信頼性やデータ取り扱い方法について十分なデューデリジェンスを行う。
  • データ共有に関する注意点:
    • MCPサーバーは独自のツール定義を持つため、意図しないデータが要求される可能性がある。デフォルトの承認プロセスを活用し、共有されるデータを慎重にレビューすることが推奨される。
    • MCPサーバーに送信されるデータはログに記録し、定期的にレビューすることが望ましい。OpenAIのResponses APIで store=true を設定している場合、データは30日間ログ記録される(Zero Data Retentionが有効な場合を除く)。
  • 悪意のあるサーバーからの潜在的脅威:
    • データ漏洩: 悪意のあるサーバーは、モデルのコンテキストに含まれる機密データを外部に送信する可能性がある。
    • プロンプトインジェクション: 隠された指示により、モデルが予期せぬ振る舞いをするよう誘導される可能性がある。OpenAIは組み込みのセーフガードを提供しているが、入力と出力を注意深くレビューすることが不可欠である。
    • ツール動作の予期せぬ変更: MCPサーバーがツールやその動作を予告なく変更し、意図しない、あるいは悪意のある結果を引き起こす可能性がある。

悪意のあるMCPサーバーを発見した場合は、security@openai.com に報告することが推奨される。

6. データ保持ポリシーとデータ所在地に関する考慮事項

Remote MCPツールは、Zero Data Retention (ZDR) および Data Residency (データ所在地) ポリシーと互換性がある。しかし、重要な注意点として、MCPサーバーはサードパーティのサービスであり、MCPサーバーに送信されたデータは、そのサーバー独自のデータ保持ポリシーおよびデータ所在地ポリシーの対象となる。

例えば、組織がデータ所在地をヨーロッパに指定している場合、OpenAIは顧客コンテンツの推論と保存をヨーロッパ内に限定するが、データがMCPサーバーに送信された時点で、そのデータの扱いは当該MCPサーバーのポリシーに委ねられる。したがって、利用者はMCPサーバーが自組織のZDRやデータ所在地の要件を満たしているかを確認する責任がある。

7. まとめ

Remote MCPは、LLMの機能を外部ツールとの連携によって拡張する強力な手段を提供する。その利用はResponses APIを介して比較的容易に行えるが、同時にセキュリティリスクやデータ管理に関する新たな考慮事項も生じる。開発者は、MCPサーバーの信頼性を慎重に評価し、データ共有の承認プロセスを適切に管理し、認証情報を安全に取り扱う必要がある。エコシステムの成熟と共に、より多くの安全で信頼性の高いツールが登場することが期待されるが、現時点では慎重な運用が求められる。

Discussion