MCPコネクタでリモートMCPサーバーに接続する

Claude.ai エンジニアリング 8分で読めます

Messages API に mcp_servers を渡すだけで、MCP クライアントを自前で実装せずにリモート MCP サーバーのツールを Claude に使わせられます。この記事では現行のベータヘッダー mcp-client-2025-11-20 を前提に、リクエストの書き方・ツールの絞り込み方・レスポンスの読み方を公式ドキュメントに沿って解説します。

MCPコネクタとは

MCP(Model Context Protocol)は、外部サービスの機能をツールとして共通の形で公開するための規格です。通常この規格を使うには、アプリケーション側に MCP クライアントを実装してサーバーと接続する必要があります。

MCP コネクタは、そのクライアント実装を Anthropic 側に肩代わりさせる機能です。Messages API のリクエストにサーバーの URL を書けば、API がサーバーへ接続し、ツール一覧を取得し、Claude が呼んだツールを実行して結果を返してくれます。アプリケーション側に増えるコードは、リクエストの JSON に数行足すだけです。

この機能を使うには、次のベータヘッダーが必要です。

anthropic-beta: mcp-client-2025-11-20

以前の mcp-client-2025-04-04 は非推奨になりました。旧版はツールの設定をサーバー定義の中(tool_configuration)に書く形式でしたが、現行版では後述するとおり tools 配列側の MCPToolset に移っています。

Claude がいつ MCP ツールを呼ぶかについては、公式に分かりやすい線引きがあります。接続したサービスに関する一般知識の質問(「Notion のデータベースはどういう仕組みですか」)には直接答え、そのサービス上の実データを必要とする質問(「私の Projects データベースには何が入っていますか」)でツールを呼びます。

リクエストの書き方

MCP コネクタは2つの部品でできています。接続先を定義する mcp_servers 配列と、どのツールを有効にするかを決める tools 配列の MCPToolset です。もっとも単純な、サーバーの全ツールを有効にする例が次のものです。

curl https://api.anthropic.com/v1/messages \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: mcp-client-2025-11-20" \
  -d '{
    "model": "claude-opus-5",
    "max_tokens": 1000,
    "messages": [{"role": "user", "content": "What tools do you have available?"}],
    "mcp_servers": [
      {
        "type": "url",
        "url": "https://example-server.modelcontextprotocol.io/sse",
        "name": "example-mcp",
        "authorization_token": "YOUR_TOKEN"
      }
    ],
    "tools": [
      {
        "type": "mcp_toolset",
        "mcp_server_name": "example-mcp"
      }
    ]
  }'

サーバー定義のフィールドは次のとおりです。

ここで見落としやすいのが検証ルールです。mcp_servers に書いたサーバーは、必ずどれか1つの MCPToolset から参照されなければならず、逆に1つのサーバーを2つの MCPToolset から参照することもできません。サーバーだけ書いて tools を書き忘れると、リクエストは通りません。

認証が必要なサーバーの場合、OAuth フローを回してアクセストークンを取得するのはアプリケーション側の責任です。トークンの更新も同様です。テスト目的なら、MCP inspector(npx @modelcontextprotocol/inspector)の「Quick OAuth Flow」でトークンを取得し、その値を authorization_token に貼るのが手早い方法です。

ツールの許可リストと拒否リスト

MCPToolset は tools 配列に置き、default_config(そのサーバーの全ツールに適用する既定値)と configs(ツール名ごとの上書き)で構成します。

{
  "type": "mcp_toolset",
  "mcp_server_name": "example-mcp",
  "default_config": {
    "enabled": true,
    "defer_loading": false
  },
  "configs": {
    "specific_tool_name": {
      "enabled": true,
      "defer_loading": true
    }
  }
}

設定の優先順位は、configs のツール個別設定 > default_config > システム既定値の順です。この2段構えを理解すると、許可リストと拒否リストが同じ道具で書けることが分かります。

許可リスト(指定したツールだけ有効にする)は、既定を無効にしてから個別に有効化します。

{
  "type": "mcp_toolset",
  "mcp_server_name": "google-calendar-mcp",
  "default_config": { "enabled": false },
  "configs": {
    "search_events": { "enabled": true },
    "create_event": { "enabled": true }
  }
}

拒否リスト(特定のツールだけ無効にする)は、既定のまま個別に無効化します。公式ドキュメントは、読み取り専用のアシスタントを作るときや、状態を変える操作の前に人間の確認を挟みたいときに、書き込み系・破壊的なツールを拒否リストに入れることを勧めています。

{
  "type": "mcp_toolset",
  "mcp_server_name": "google-calendar-mcp",
  "configs": {
    "delete_all_events": { "enabled": false },
    "share_calendar_publicly": { "enabled": false }
  }
}

もう一つの設定値 defer_loading は、そのツールの説明文を最初からモデルに渡すかどうかを制御します(既定は false)。true にすると、ツール検索ツールで見つかったときだけ読み込まれます。ツールが数十個を超える構成では、この組み合わせでコンテキストの消費を大きく減らせます。

なお、configs に MCP サーバー側に存在しないツール名を書いてもエラーにはなりません(バックエンドに警告が記録されるだけです)。MCP サーバーは提供するツールを動的に変えられるためですが、裏を返せばツール名の打ち間違いに気づけないということでもあります。拒否リストを書いたつもりが1文字違いで機能していない、という事故が起きうるので、実際にツールが無効になっているかは応答で確認してください。

レスポンスに現れるブロック

Claude が MCP ツールを使うと、レスポンスの content に通常のツール使用とは別の2種類のブロックが現れます。

MCP ツール使用ブロックは、Claude がどのサーバーのどのツールを何の入力で呼んだかを示します。

{
  "type": "mcp_tool_use",
  "id": "mcptoolu_014Q35RayjACSWkSj4X2yov1",
  "name": "echo",
  "server_name": "example-mcp",
  "input": { "param1": "value1", "param2": "value2" }
}

MCP ツール結果ブロックは、その実行結果です。

{
  "type": "mcp_tool_result",
  "tool_use_id": "mcptoolu_014Q35RayjACSWkSj4X2yov1",
  "is_error": false,
  "content": [
    { "type": "text", "text": "Hello" }
  ]
}

ここが通常のツール使用との決定的な違いです。ツールの実行は API 側で完結しているため、アプリケーションが tool_result を返す必要がありません。 自前でツールを定義する場合は「Claude がツールを呼ぶ → 自分で実行する → 結果を返す」というループを回しますが、MCP コネクタではそのループが不要です。is_error を見て失敗を検知する程度で済みます。

複数のサーバーに同時に接続することもできます。mcp_servers に複数のサーバー定義を並べ、それぞれに対応する MCPToolset を tools に置くだけです。ツールが増えるほど Claude はツール名と説明文から選ぶことになるので、説明文が具体的であるほど選択の精度が上がります。数十個を超える規模になったら、defer_loading とツール検索ツールの併用を検討してください。

制限事項と注意点

便利な機能ですが、制限は明確です。導入前に次の4点を確認してください。

  1. 対応しているのはツール呼び出しだけです。MCP 仕様にはリソースやプロンプトといった機能もありますが、MCP コネクタが扱うのは tool calls のみです。
  2. サーバーは公開された HTTP で到達できる必要があります(Streamable HTTP と SSE の両方に対応)。手元で動かすローカルの STDIO サーバーは直接つなげません。
  3. 利用できる基盤が限られます。 Claude API、Claude Platform on AWS、Microsoft Foundry で使えますが、Amazon Bedrock と Google Cloud では現時点で利用できません
  4. ZDR(ゼロデータ保持)の対象外です。 MCP サーバーとやり取りするデータ(ツール定義や実行結果を含む)は、Anthropic の標準的なデータ保持ポリシーに従って保持されます。機微なデータを扱うサーバーを接続する場合は、この点を先に確認してください。

ローカルのサーバーを使いたい、あるいは MCP のプロンプトやリソースも扱いたい場合は、MCP コネクタではなくクライアント側のヘルパーを使う経路があります。各言語の SDK には MCP の型を Claude API の型へ変換する関数(TypeScript なら mcpTools / mcpMessages / mcpResourceToContent / mcpResourceToFile)が用意されており、自分で張った MCP クライアント接続と ツール使用のツールランナーを組み合わせられます。

公式の使い分けの指針は明快です。URL で到達できるリモートサーバーで、ツールだけあればよいなら mcp_servers パラメータ。ローカルサーバー・プロンプト・リソースが必要、あるいは接続をより細かく制御したいならクライアント側ヘルパー、となります。

なお、mcp_serversMessage Batches API のリクエストにも含められます。バッチ経由の MCP ツール呼び出しの料金は、通常の Messages API と同じです。