Connect Claude Code to tools via MCP
概要
Model Context Protocol(MCP)で外部ツール・データソースへ接続する仕組み。MCP サーバーは Claude Code にツール、データベース、API へのアクセスを与える。
仕様
トランスポートと追加方法
| 方法 | コマンド |
|---|---|
| Remote HTTP(推奨) | claude mcp add --transport http <name> <url> |
| Remote SSE(非推奨) | claude mcp add --transport sse <name> <url> |
| Local stdio | claude mcp add [options] <name> -- <command> [args...] |
| Remote WebSocket | .mcp.json または claude mcp add-json(--transport は ws を受け付けない) |
- JSON 設定(
.mcp.json、~/.claude.json、claude mcp add-json)ではtypeがhttpのエイリアスとしてstreamable-httpを受け付ける urlがあってtypeが無い JSON エントリは設定エラー。Claude Code はtypeの無いエントリを stdio サーバーと読むため、そのサーバーをスキップしてMCP server "<name>" has a "url" but no "type"; add "type": "http" (or "sse" / "ws") to this entryを報告する- stdio サーバーでは
--(ダブルダッシュ)が Claude 自身のオプションとサーバーを起動するコマンドを分ける。--以降はそのままサーバーに渡される --envは複数のKEY=valueを受け付ける。サーバー名が--envの直後に来ると別のペアとして読まれ拒否されるため、--envとサーバー名の間に別のオプションを 1 つ以上置くtype: "ws"はhttpと同じurl、headers、headersHelper、timeout、alwaysLoadを受け付ける。認証はヘッダーのみ- stdio サーバーの環境には
CLAUDE_PROJECT_DIRがプロジェクトルートとして設定される。これは安定したプロジェクトルートで、セッション中に作業ディレクトリを追加・削除しても変わらない- 自身のファイルシステムアクセスを許可ディレクトリ集合に限りたいサーバーは MCP の
roots/listリクエストを実装する。Claude Code はセッションの起動ディレクトリと、--add-dir//add-dir/additionalDirectoriesで与えたすべての追加作業ディレクトリを返し、その集合が変わるとnotifications/roots/list_changedを送る(v2.1.203 以降) - この変数はサーバーの環境に設定されるものでありClaude Code 自身の環境ではない。project スコープの
.mcp.jsonや user / local スコープのサーバーエントリのcommand/argsで${VAR}展開して参照するには${CLAUDE_PROJECT_DIR:-.}のような既定値が必要。plugin が提供する MCP 設定は${CLAUDE_PROJECT_DIR}を直接置換するので既定値は不要
- 自身のファイルシステムアクセスを許可ディレクトリ集合に限りたいサーバーは MCP の
管理コマンド
claude mcp list # 設定済みサーバーを一覧
claude mcp get notion # 特定サーバーの詳細
claude mcp remove notion
claude mcp add-json <name> '<json>'
claude mcp add-from-claude-desktop
claude mcp reset-project-choices
claude mcp serve # Claude Code 自身を stdio MCP サーバーとして起動
/mcp # セッション内でサーバー状態を確認
claude mcp addは成功時にAdded ...を出力する。これは設定が書かれたことを意味するclaude mcp listは各サーバーの健全性(✔ Connected/! Needs authentication/✘ Failed to connect)を表示する- 承認待ちの project スコープサーバーは
⏸ Pending approval (run `claude` to approve)と表示される。拒否されたサーバーはclaude mcp get <name>で✘ Rejected (see disabledMcpjsonServers in settings) - WebSocket サーバーは
claude mcp listに現れない。claude mcp get <name>か/mcpパネルで確認する claude mcp serveは起動時に何も出力しない。stdio MCP サーバーは stdin / stdout で通信するため、無言でブロックしたターミナルはサーバーが動作中であることを意味するclaude mcpコマンドで追加するサーバー名に使えるのは英数字・ハイフン・アンダースコアのみ
サーバー状態の詳細:
- 以前使ったリモート(HTTP / SSE)サーバーは
cached 2h ago · connects on first use · 5 toolsのようなcached状態を示すことがある。前セッションからツール一覧を読み込んでおり、Claude が最初にツールを呼んだときに接続する。すべてのサーバーを起動時に接続させるにはMCP_DISCOVERY_CACHE=0。v2.1.221 以降が必要 ✘ Failed to connectのとき、claude mcp listは状態行に失敗詳細(HTTP ステータスやエラーコード、サーバーが返したエラーテキスト)を付け、claude mcp get <name>はIssue:行に表示する。認証情報らしきテキストは伏せられ、秘密を含みうる展開後のサーバー URL は決して含まれない。✘ Connection errorには詳細を付けない(v2.1.219 以降)urlが空のリモートサーバーはnot configuredと表示され、接続を試みない- 設定値の先頭・末尾に隠れた空白があると警告する。
command、url、各args、envとheadersの値とキー名を検査し、値を出力せずにLeading or trailing whitespace in: headers.Authorizationのように該当フィールドを示す。空白は自動で除去されない - 予約サーバー名:
workspace、claude-in-chrome、computer-use、Claude Preview、Claude Browser。予約名のサーバーは読み込み時にスキップされ改名を促す警告が出る。claude mcp addは予約名をエラーで拒否する
インストールスコープ
| スコープ | 読み込まれる範囲 | チーム共有 | 保存先 |
|---|---|---|---|
| Local(既定) | 現在のプロジェクトのみ | いいえ | ~/.claude.json |
| Project | 現在のプロジェクトのみ | はい(バージョン管理経由) | プロジェクトルートの .mcp.json |
| User | 自分の全プロジェクト | いいえ | ~/.claude.json |
-s/--scopeで指定する(local/project/user)- local スコープは
~/.claude.jsonのそのプロジェクトのパスの下に保存される。MCP の「local スコープ」は一般の local settings(.claude/settings.local.json)とは別物 - project スコープのサーバーは、対話セッションでは使用前に承認を求められる。承認の選択をリセットするには
claude mcp reset-project-choices claude -p実行、Agent SDK セッション、cloud セッションはそのプロンプトを出せないため、project スコープのサーバーを確認なしに読み込む。除外するにはdisabledMcpjsonServersに追加するか、--setting-sources/ SDK のsettingSourcesで project settings ごと除外する
優先順位(同じサーバーが複数箇所で定義されている場合、最も優先度の高いソースの定義でただ 1 回だけ接続する。フィールドはスコープをまたいでマージされない):
- Local scope
- Project scope
- User scope
- Plugin が提供するサーバー
- claude.ai connector
- 3 つのスコープは名前で重複を判定する。plugin と connector はエンドポイント(URL / コマンド)で判定する
.mcp.json の環境変数展開
${VAR}: 環境変数VARの値に展開する${VAR:-default}:VARが設定されていればその値、無ければdefault- 展開できる場所:
command、args、env、url(HTTP 系)、headers(HTTP 認証) - 参照する環境変数が未設定で既定値も無い場合、設定は読み込まれる。
claude mcp listにそのサーバーの missing-variable 警告が出て、${VAR}のテキストがそのまま使われる
project サーバーの承認と workspace trust
- v2.1.196 以降、
claude mcp listとclaude mcp getは、そのフォルダでclaudeを実行して workspace trust ダイアログを承認するまで、リポジトリにチェックインされていない settings ファイルからのみ.mcp.jsonの承認を読む - クローンしたリポジトリは自身のサーバーを承認できない。project の
.claude/settings.jsonにコミットされたenableAllProjectMcpServers/enabledMcpjsonServersは untrusted なフォルダでは無視され、サーバーは⏸ Pending approvalのままになる - untrusted なフォルダでも有効な承認元: user の
~/.claude/settings.json、managed settings、--settingsで渡した settings - 追跡されていない
.claude/settings.local.jsonの承認も有効になるが、そのフォルダかその親の trust ダイアログを承認した後のみ(例外は自分の設定ホーム) - どの settings ファイルの
disabledMcpjsonServersエントリも引き続きサーバーを拒否する
サーバーの無効化(設定を残したまま)
/mcp パネルでトグルすると、プロジェクトごとの選択が ~/.claude.json の 2 つのリストのいずれかに記録される。
-
disabledMcpServers: 既定でオンのサーバー(user 設定のサーバー、plugin サーバー、claude.ai connector、組み込みサーバー)の opt-out リスト。claude.ai connector を無効化すると表示名(例:claude.ai Slack)で書かれる -
enabledMcpServers: 既定でオフの組み込みサーバー(computer-useなど)の opt-in リスト -
各サーバーについて Claude Code はどちらか一方のリストのみを参照するため、相互に上書きしない。通常のサーバーを
enabledMcpServersに、既定オフの組み込みサーバーをdisabledMcpServersに書いても無視される -
これらは
.mcp.jsonのサーバー承認を制御するenabledMcpjsonServers/disabledMcpjsonServersとは無関係
動的更新と再接続
- MCP の
list_changed通知をサポートし、サーバーがツール・prompt・リソースを動的に更新できる。通知を受けると自動で再取得する - 再取得に失敗した場合、後の再取得が成功するまで以前に発見したものを保持する(v2.1.214 以降。それ以前は一時的なエラーで空リストに置き換わっていた)
- HTTP / SSE サーバーがセッション中に切断すると指数バックオフで自動再接続する。最大 5 回、初回 1 秒から倍々。5 回失敗するとサーバーは failed になり
/mcpから手動で再試行できる。stdio サーバーはローカルプロセスであり自動再接続しない - 起動時の初回接続失敗にも同じバックオフが適用される。5xx・接続拒否・タイムアウトのような一時的エラーは最大 3 回再試行し、なお接続できなければ failed になる。認証エラーと not-found は設定変更が必要なため再試行しない
- 接続に失敗したサーバーがあると、Claude Code は Claude にどのサーバーが失敗したかと接続エラーを伝える(tool search が必要。既定で有効)
- v2.1.191 以降、接続成功後の capability discovery(
tools/list、prompts/list、resources/list)も一時的なネットワーク・サーバーエラーを短いバックオフで最大 3 回再試行する。認証エラー、4xx、リクエストタイムアウトは再試行しない
タイムアウトと出力上限
- 起動タイムアウトは
MCP_TIMEOUT環境変数(例:MCP_TIMEOUT=10000で 10 秒) - サーバーごとのツール実行タイムアウトは
.mcp.jsonエントリのtimeoutフィールド(ミリ秒。例:"timeout": 600000)。そのサーバーについてMCP_TOOL_TIMEOUT環境変数を上書きする - サーバーごとの
timeoutはツール呼び出しごとの hard な実時間上限で、サーバーからの progress 通知では延長されない。1000 未満の値は無視されMCP_TOOL_TIMEOUT(未設定時は約 28 時間)へフォールバックする - HTTP / SSE / claude.ai connector には、サーバーの最初の応答バイトまでをカバーする 2 つ目の per-request タイマーがある。既定 60 秒。サーバーごとの
timeoutまたはMCP_TOOL_TIMEOUTを 60 秒以上にするとその値まで上がるが、それより低い値では短くならない。未設定のMCP_TOOL_TIMEOUTの 28 時間の既定はこれに影響しない。stdio と WebSocket には per-request タイマーが無い - idle timeout: 応答も progress 通知も無いまま idle window を過ぎたツール呼び出しは、実時間上限を待たずエラーで中断する。v2.1.187 以降。IDE サーバーと SDK in-process サーバーを除く全種別に適用される。既定は HTTP / SSE / WebSocket / claude.ai connector が 5 分、stdio が 30 分。
CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT(ミリ秒)で変更、0で無効化する - 1000 以上のサーバーごとの
timeoutは idle timeout の下限としても働く(v2.1.203 以降) - MCP ツール出力が 10,000 トークンを超えると警告が出る。既定の上限は 25,000 トークンで
MAX_MCP_OUTPUT_TOKENSで変更する(警告の閾値は固定) - 環境変数は自前の上限を宣言していないツールに適用される。
_meta["anthropic/maxResultSizeChars"]を設定したツールはテキストコンテンツについてその値を使う。画像データを返すツールは引き続きMAX_MCP_OUTPUT_TOKENSの対象 - サーバー作者は
tools/list応答の_meta["anthropic/maxResultSizeChars"]で個別ツールの上限を上げられる。ハード上限は 500,000 文字。注釈が無い場合、既定閾値を超える結果はディスクへ永続化され会話ではファイル参照に置き換えられる
長いツール呼び出しの自動バックグラウンド化
- メイン会話の MCP ツール呼び出しが 2 分を超えて実行中なら、セッションをブロックせずバックグラウンドタスクへ移る。Claude は即座にタスク ID を受け取り、結果は完了時にタスク通知として届く。v2.1.212 以降が必要
- タスクは
/tasksに現れ、そこで停止もできる。セッション終了後は残らない - バックグラウンドで動いている間も per-call の上限(
timeout/MCP_TOOL_TIMEOUTの実時間上限、CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUTの idle timeout)は適用される - 閾値は
CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS(ミリ秒)で変更、0で無効化する。CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1でも無効になる - バックグラウンド化されないもの: subagent からの呼び出し、IDE サーバーへの呼び出し、非対話モードでの呼び出し(
CLAUDE_AUTO_BACKGROUND_TASKS=1の場合を除く)、elicitation ダイアログを開いて待っている呼び出し
plugin が提供する MCP サーバー
- plugin ルートの
.mcp.json、またはplugin.jsonのインライン定義で MCP サーバーを定義する - plugin を有効にすると Claude Code が自動でサーバーを起動する。追加・削除は plugin のインストール/アンインストールで行い、
/mcpコマンドでは行わない。ただし/mcpでトグルオフはできる - セッション中に plugin を有効・無効にした場合、MCP サーバーを接続・切断するには
/reload-pluginsを実行する。リロード時、設定が変わっていない plugin サーバーのライブ接続は保たれる - パスのプレースホルダ:
${CLAUDE_PLUGIN_ROOT}は plugin のインストールディレクトリ、${CLAUDE_PLUGIN_DATA}は永続状態ディレクトリ、${CLAUDE_PROJECT_DIR}は安定したプロジェクトルートに解決される。置換対象は stdio のcommand/args/env、http / sse / ws のurl/headers/headersHelper - plugin バンドルの MCP サーバーのツール名は
mcp__plugin_<plugin-name>_<server-name>__<tool-name>。A-Z、a-z、0-9、_、-以外の文字は_に置き換えられる。permission ルール、skill のallowed-tools、subagent のtools、hook matcher ではこのフルネームを使う。素のサーバーキー(mcp__database-tools__.*)を書いた hook matcher は plugin バンドルのサーバーでは発火しない - サーバー自体は
plugin:<plugin-name>:<server-name>というスコープ名で登録される。mcp_toolhook のserverフィールドなど、設定済みサーバー名を期待する場所ではこの名前を使う
認証
- リモートサーバーが
401 Unauthorizedまたは403 Forbiddenを返すと、認証が必要とマークされる - サインイン済みの OAuth サーバーへのリクエストが
401を返した場合、保存トークンを更新して再接続し 1 回だけ再試行する。その再試行も失敗したときにのみ/mcpでフラグを立てる(v2.1.206 以降) - v2.1.195 以降、サーバーが保存済み refresh token を拒否したためにトークン更新が失敗した場合、
/mcpを指す通知を即座に表示する。サーバーのメニューに Re-authenticate がある - 認証が必要なサーバーがあると起動時に通知が出る(v2.1.193 以降)
- 非対話モードには
/mcpパネルが無いため OAuth フローを実行できない。v2.1.196 以降、tool search 有効時は、認証が必要なサーバーのツールが使えないことを Claude に伝える headers.Authorizationを設定していてサーバーがそのヘッダーを拒否した場合、OAuth にフォールバックせず接続失敗として報告するclaude mcp login <name>でシェルから OAuth フローを実行する(v2.1.186 以降)。claude mcp logout <name>で保存済み認証情報を消す- v2.1.191 以降、ローカルブラウザが使えない状況(SSH、ディスプレイサーバーの無い Linux)を検出して認可 URL を出力する。ローカルで開き、ブラウザのアドレスバーのリダイレクト URL 全体をプロンプトへ貼り戻す。貼り付けには対話ターミナルが必要(
ssh -t)。--no-browserで強制できる --callback-portで OAuth コールバックのポートを固定する(http://localhost:PORT/callback形式の事前登録リダイレクト URI に合わせる)。単独でも--client-idと併用でも使える- Dynamic Client Registration に対応しないサーバーには事前設定の認証情報を使う。
--client-idでクライアント ID、--client-secretはマスク入力で secret を尋ねる。MCP_CLIENT_SECRET環境変数で対話プロンプトを飛ばせる。client secret は macOS のシステムキーチェーン、または credentials ファイルに安全に保存され、設定ファイルには入らない - これらのフラグは HTTP と SSE にのみ適用され、stdio には効果が無い
oauth.authServerMetadataUrlで OAuth メタデータ探索を上書きする。既定は RFC 9728 の/.well-known/oauth-protected-resource、次に RFC 8414 の/.well-known/oauth-authorization-server。URL はhttps://でなければならない。メタデータのscopes_supportedが上流サーバーの広告するスコープを上書きするoauth.scopesで認可フロー時に要求するスコープを固定する。値は RFC 6749 §3.3 のscopeパラメータ形式に合わせたスペース区切りの 1 文字列。authServerMetadataUrlと/.well-knownで発見したスコープの両方より優先される- v2.1.196 以降、
oauth.scopes未設定時はサーバーのWWW-Authenticateヘッダーまたは protected resource metadata が提供するスコープを要求し、どちらも無ければscopeパラメータを送らない - 認可サーバーが
scopes_supportedにoffline_accessを広告している場合、固定したスコープに追加してトークンをブラウザ再サインインなしに更新できるようにする - ツール呼び出しで 403
insufficient_scopeが返ると、同じ固定スコープで再認証する
- v2.1.196 以降、
headersHelper
- OAuth 以外の認証方式(Kerberos、短命トークン、内部 SSO)向けに、接続時にリクエストヘッダーを生成するコマンド
- コマンドは文字列のキーと値の JSON オブジェクトを stdout に書く
- シェルで、10 秒のタイムアウト付き、セッションの現在の作業ディレクトリから実行される。スクリプトには絶対パスか
PATH上のコマンドを使う - 動的ヘッダーは同名の静的
headersを上書きする - 接続のたび(セッション開始時と再接続時)に新しく実行される。キャッシュは無い
- v2.1.193 以降、ツール呼び出しが
401/403を返すと自動でヘルパーを再実行し、新しいヘッダーで再接続して 1 回だけ再試行する
ヘルパー実行時に設定される環境変数:
| 変数 | 値 |
|---|---|
CLAUDE_CODE_MCP_SERVER_NAME | MCP サーバー名 |
CLAUDE_CODE_MCP_SERVER_URL | MCP サーバーの URL |
CLAUDE_PLUGIN_ROOT | plugin のルートディレクトリ(plugin がサーバーを提供する場合のみ) |
- plugin 提供のサーバーでは作業ディレクトリが plugin ルートに設定されるため、相対
headersHelperパスは plugin ディレクトリ内で解決される(v2.1.195 以降) - plugin 提供の
headersHelperは plugin の${user_config.*}値を参照できない(シェル経由で実行されるため)。代わりにサーバーのheadersフィールドに${user_config.KEY}を置く headersHelperは任意のシェルコマンドを実行する。project / local スコープで定義した場合、workspace trust ダイアログを承認した後にのみ実行される
claude.ai connector
- claude.ai アカウントでログインしていると、claude.ai で追加した MCP サーバー(connector)が自動で使える
- claude.ai の設定でサーバーを追加する。Team と Enterprise プランでは管理者のみが追加できる
/mcpに claude.ai 由来であることを示す表示付きで並ぶ- v2.1.161 以降、一度もサインインしていない connector は claude.ai セクション末尾の
Show unused connectors行に畳まれる - connector が取得されるのは、有効な認証方式が claude.ai サブスクリプションログインのときのみ。
ANTHROPIC_API_KEY/ANTHROPIC_AUTH_TOKEN/apiKeyHelperが有効な場合、Amazon Bedrock などの第三者プロバイダが有効な場合、CLAUDE_CODE_OAUTH_TOKENがclaude setup-tokenのトークンを保持している場合は読み込まれない connected · session token rejectedは、Claude Code のログイン由来のトークンを claude.ai が拒否した状態(多くはログイン期限切れ)。connector を再認可しても解決しない。/loginでサインインし直し、/mcpから connector を再接続する- Claude Code で追加したサーバーは、同じ URL を指す claude.ai connector より優先される。この場合
/mcpは connector を hidden として一覧し、connector を使いたい場合の重複解消方法を示す - Microsoft 365、Gmail、Google Calendar など一部の Anthropic ホスト connector は、上流 ID プロバイダが claude.ai の登録したリダイレクト URL しか受け付けないため Claude Code からのローカル OAuth に対応しない。v2.1.162 以降、
/mcpで認証しようとすると claude.ai の Settings → Connectors で接続するよう案内される
組織による connector ツールの制御:
askに設定されたツール: 呼び出しのたびにYour organization requires approval for this toolの理由でプロンプトを出す。acceptEdits/auto/bypassPermissionsモードでも出て、選択を記憶する選択肢は出ない。一致する allow ルールでもプロンプトは省けない。dontAskモードでは拒否されるblockedに設定されたツール: Claude が見る前に除外され、ツール一覧に現れない
connector の無効化:
disableClaudeAiConnectorsを任意の settings スコープでtrueにする。any-source-true のセマンティクスで、どこかのソースのtrueが優先される。project レベルのfalseは user / policy レベルのtrueを打ち消せない。--mcp-configで明示的に渡したサーバーは影響を受けないENABLE_CLAUDEAI_MCP_SERVERS=falseでも同じ効果(そのシェルセッション限り)- 個別にブロックするには
deniedMcpServersに名前または URL パターンで追加する(例:serverNameに"claude.ai Slack") - 現在のプロジェクトだけ切り替えるには
/mcpパネルを使う
ツール入力スキーマのルートレベル combinator
- Claude API はスキーマルートの
anyOf/oneOf/allOfを受け付けない。properties内にネストした combinator は受け付け、Claude Code はそのまま送る - v2.1.195 以降、ルートレベル combinator を持つツールも利用可能なまま。API へ送る前にスキーマを単一オブジェクトへ平坦化し、どのパラメータ群が組になるかを示す文をツールの description の先頭に付ける
allOf: 全ブランチの properties をマージし、各ブランチのrequiredはそのまま適用されるanyOf/oneOf: 全ブランチの properties をマージし、各ブランチのrequiredはスキーマで強制せず description に記述する
- 受け入れ可能なスキーマを作れない場合や、この書き換えを有効にするリモート設定を受け取らないデプロイでは、そのツール 1 つをスキップし理由をサーバーのログに記録して、他のツールは残す
承認の強制(requiresUserInteraction)
- サーバー作者は
tools/list応答の_meta["anthropic/requiresUserInteraction"]をtrue(JSON boolean のみ)にすると、そのツールの呼び出しごとに明示的な承認を求められる acceptEdits/auto/bypassPermissionsモードでもプロンプトが出て、「don't ask again」は提示されない。一致する allow ルールでも省けない。dontAskモードでは拒否される- 非対話モードで
--permission-prompt-toolを使う場合、フラグ付きツールへのallow結果はMCP tool requires user interaction; not supported via --permission-prompt-toolとして deny に変換される。Agent SDK のcanUseToolコールバックはこれらの呼び出しを受け取り承認できる - v2.1.199 以降が必要。それ以前は無視され通常の permission フローになる
- Remote Control や Agent SDK 製アプリのワンタップ承認は、この注釈が付いたツールでは提供されず、完全な permission prompt が表示される
elicitation
- MCP サーバーはタスク中に構造化された入力を求められる。設定は不要で、サーバーが要求するとダイアログが自動で表示される
- Form mode: サーバーが定義したフォームフィールドのダイアログを表示する
- URL mode: 認証や承認のためブラウザ URL を開く。ブラウザで完了してから CLI で確認する
- ダイアログを出さず自動応答するには
Elicitationhook を使う
MCP リソース
@を入力すると接続済み MCP サーバーのリソースがファイルと並んで補完メニューに現れる- 参照形式は
@server:protocol://resource/path(例:@github:issue://123) - 1 つのプロンプトで複数参照できる
- 参照されたリソースは自動取得され添付として含まれる
MCP prompts をコマンドとして使う
/mcp__servername__promptnameの形式でコマンド一覧に現れる- 引数はコマンドの後にスペース区切りで渡す
- サーバー名と prompt 名は正規化され、スペースはアンダースコアに変換される
tool search
- 既定で有効。MCP ツールは upfront に読み込まれず deferred になり、Claude が必要になったときに検索ツールで見つける。セッション開始時にはツール名とサーバーの instructions だけが読み込まれる
- サーバーごとの固定のツール上限は無い。実質の上限はコンテキストウィンドウの予算
tool_referenceブロックをサポートするモデルが必要: Claude Sonnet 4.5、Claude Haiku 4.5、Claude Opus 4.5 以降
ENABLE_TOOL_SEARCH | 挙動 |
|---|---|
| (未設定) | 全 MCP ツールを deferred にしオンデマンドで読み込む。Google Cloud's Agent Platform の Claude 4.5 世代より前のモデル、ANTHROPIC_BASE_URL が非 first-party ホストの場合、Azure ホストの Microsoft Foundry デプロイでは upfront 読み込みにフォールバックする |
true | 全 MCP ツールを deferred にする(Azure ホストの Microsoft Foundry デプロイと、Google Cloud's Agent Platform の Claude 4.5 世代より前のモデルを除く)。beta ヘッダーをプロキシへ送るため、tool_reference に対応しないプロキシではリクエストが失敗する |
auto | 閾値モード。コンテキストウィンドウの 10% に収まれば upfront、そうでなければ defer |
auto:N | 閾値モード(N は 0-100 のパーセンテージ。例: auto:5) |
false | 全 MCP ツールを upfront に読み込み、defer しない |
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETASを設定すると tool search はオフのままになり、ENABLE_TOOL_SEARCHでも上書きできない。defer_loadingのツール定義とtool_referenceコンテンツブロックが必要とする beta ヘッダーを剥がすため- v2.1.221 より前は、
ENABLE_TOOL_SEARCH=trueにしない限り Google Cloud's Agent Platform の全モデルで tool search が無効だった permissions.denyにToolSearchを追加してToolSearchツール自体を無効にすることもできる- サーバー作者向け: server instructions が Claude にツールを検索すべき場面を伝える。ツールの description と server instructions はそれぞれ 2KB で切り詰められる
deferral からの除外:
- サーバー設定に
alwaysLoad: trueを設定すると、ENABLE_TOOL_SEARCHに関わらずそのサーバーの全ツールがセッション開始時にコンテキストへ読み込まれる。全サーバー種別で使える - サーバーは
_metaに"anthropic/alwaysLoad": trueを含めて個別ツールを always-loaded にできる alwaysLoad: trueは起動時にそのサーバーのツールを待たせる(標準の 5 秒の接続タイムアウトが上限)。有効なcachedエントリを持つリモートサーバーは接続せずキャッシュからツールを供給するため起動を待たせない。他のサーバーは既定でバックグラウンド接続する。MCP_CONNECTION_NONBLOCKING=0で起動時に待たせられる
ツールが揃うまでの待機
- リクエストがまだバックグラウンドで接続中のサーバーのツールを必要とする場合、Claude はそのサーバーを待つ
- tool search 有効(既定)なら待機は
ToolSearch呼び出しの内側で起きる - tool search 無効なら
WaitForMcpServersツールを使う。tool search が無効になる構成: カスタムANTHROPIC_BASE_URL、ENABLE_TOOL_SEARCH=false、Google Cloud's Agent Platform で Claude 4.5 世代より前のモデル - Azure ホストの Microsoft Foundry デプロイでは、サーバー側の拒否を API からしか検知できないため、
WaitForMcpServersではなく tool search 経路で開始する。upfront 読み込みへ切り替わった後は、接続を終えたサーバーのツールが Claude の次のリクエストで使えるようになる - tool search 有効時、Claude の作業中にサーバーの接続が完了すると、同じターンの次のリクエストでサーバーのツール名が Claude に一覧される
設定
claude mcp add --transport http notion https://mcp.notion.com/mcp
claude mcp add --transport http secure-api https://api.example.com/mcp --header "Authorization: Bearer your-token"
claude mcp add --env AIRTABLE_API_KEY=YOUR_KEY --transport stdio airtable -- npx -y airtable-mcp-server
claude mcp add-json events-server '{"type":"ws","url":"wss://mcp.example.com/socket","headers":{"Authorization":"Bearer YOUR_TOKEN"}}'
claude mcp login sentry --no-browser
// .mcp.json
{
"mcpServers": {
"api-server": {
"type": "http",
"url": "${API_BASE_URL:-https://api.example.com}/mcp",
"headers": {
"Authorization": "Bearer ${API_KEY}"
}
}
}
}
{
"mcpServers": {
"slack": {
"type": "http",
"url": "https://mcp.slack.com/mcp",
"oauth": {
"scopes": "channels:read chat:write search:read"
}
}
}
}
{
"mcpServers": {
"core-tools": {
"type": "http",
"url": "https://mcp.example.com/mcp",
"alwaysLoad": true
}
}
}
{
"disableClaudeAiConnectors": true
}
制約・注意点
- 接続前に各サーバーを信頼できるか確認する。外部コンテンツを取得するサーバーは prompt injection のリスクをもたらしうる
- SSE トランスポートは非推奨。可能なら HTTP を使う
- Claude Desktop からのインポートは macOS と WSL でのみ動く。名前に英数字・ハイフン・アンダースコア以外の文字を含むサーバーはインポートできず、拒否した名前を報告して他はインポートする。同名のサーバーが既にある場合は数字の接尾辞が付く(
server_1) claude mcp serveが公開するのは Claude Code のツールだけなので、個別のツール呼び出しのユーザー確認はクライアント側の責任
関連
facts/claude-code/settings.mdfacts/claude-code/permissions.mdfacts/claude-code/plugins.mdfacts/claude-code/sub-agents.mdfacts/claude-code/env-vars.mdfacts/claude-code/cli-reference.mdfacts/claude-code/commands.mdfacts/claude-code/tools-reference.mdfacts/claude-code/security.mdfacts/claude-code/headless.md