MCP Inspectorの環境変数・ポート・設定ファイル形式の一覧
MCP Inspectorの既定ポート6274、Dockerでの起動、環境変数の一覧、catalogとconfigの違い、Claude Desktop設定の読み込み方をまとめたリファレンスです。
MCP Inspectorのポートや設定の疑問は、先に次の表で引けます。詳しい理由は各節にあります。
| 知りたいこと | 答え | 詳細 |
|---|---|---|
| Web UIの既定ポート | 答え6274。CLIENT_PORTで変更 | 詳細環境変数 |
| OAuthコールバックのポート | 答えWebは6274、CLIとTUIは6276 | 詳細OAuth設定 |
| Dockerでの起動 | 答えdocker run --rm -p 127.0.0.1:6274:6274 ghcr.io/modelcontextprotocol/inspector | 詳細Docker |
| Claude Desktopの設定を開く | 答え--config <claude_desktop_config.json>で読み取り専用 | 詳細catalogとconfig |
| ポートを変えたら403 | 答えALLOWED_ORIGINSかCLIENT_PORTを揃える | 詳細403の切り分け |
編集した設定が反映されない:catalogとconfigの違い
MCP Inspectorがサーバー一覧を読み込む方法は--catalogと--configの2つのフラグに分かれています。どちらも中身は同じmcpServersスキーマですが、Inspector自身がファイルを書き換えるかどうかが根本的に違います。この違いを取り違えると「編集したはずの設定が反映されない」「ファイルが勝手に書き換わった」というつまずきに直結します。
catalogとconfigの役割
--catalog <path>
Inspector自身の作業用サーバー一覧です。ファイルが無ければ自動で作成・初期化され、Web版の画面からサーバーの追加・削除を書き込めます。既定のパスは~/.mcp-inspector/mcp.jsonで、MCP_CATALOG_PATHでも変更できます。
--config <path>
ファイルをそのまま読むだけのセッションで、書き込み・初期化・移行は行われません。既定パスは無く、必ず明示します。存在しないパスはエラーで止まり、Web UIでの編集もできません。他人や他アプリの設定ファイルを開くときの経路です。
2つは排他利用で、両方を指定するとWeb・CLI・TUIのどのクライアントでも同じように拒否されます。アドホックターゲット(ファイルを介さず--server-urlやstdioのコマンドを直接渡す方法)とも組み合わせられません。
# 自作サーバーを書き込み可能なcatalogとして開く
mcp-inspector --catalog ./mcp.json
# 他人のClaude Desktop設定を読み取り専用で開く
mcp-inspector --config ~/Library/Application\ Support/Claude/claude_desktop_config.jsonWeb画面に出るサーバー一覧が編集できるかどうかは、起動方法で決まります。
| 起動方法 | サーバー一覧の出どころ | 画面から編集 |
|---|---|---|
mcp-inspector --web | サーバー一覧の出どころ既定のcatalog。初回起動で生成 | 画面から編集できる |
--catalog <path> | サーバー一覧の出どころそのファイル。無ければサンプル入りで生成 | 画面から編集できる |
--config <path> | サーバー一覧の出どころそのファイル(書き込み・生成なし) | 画面から編集できない |
--server-urlか位置引数のコマンド | サーバー一覧の出どころメモリ上の1台だけ | 画面から編集できない |
自動生成の中身はクライアントによって違います。Web版の初回起動だけは、サンプルサーバーが2つ(filesystem-server-defaultとeverything-server-default)入った状態で作られます。前者は/tmpを対象にした@modelcontextprotocol/server-filesystem、後者は@modelcontextprotocol/server-everythingをnpxで起動する定義です。
CLIとTUIは非対話的・一覧駆動のクライアントで、サンプルが並んでいてもノイズになるだけなので{ "mcpServers": {} }の空の状態で生成されます。この初期化はファイルが存在しないときにだけ動きます。
なお、Webページ冒頭のコード例では、npx @modelcontextprotocol/inspectorの行に「空の状態で起動し、画面からサーバーを追加する」という趣旨のコメントが付いています。同じページの起動方法の表は、初回起動でサンプル2台を入れるとしています。実際の初回起動は、後者のサンプル入りです。
mcpServersスキーマの書き方と既定値
catalogとconfigの両方が読み書きするファイルは、一般的なMCPクライアントの設定ファイルと同じmcpServersオブジェクトの形をしています。サーバーごとにInspector固有のフィールドを重ねて持てます。
{
"mcpServers": {
"my-stdio-server": {
"command": "node",
"args": ["build/index.js"],
"env": { "API_KEY": "..." }
},
"my-modern-server": {
"type": "http",
"url": "https://api.example.com/mcp",
"protocolEra": "modern",
"modernLogLevel": "info",
"headers": { "X-Tenant": "acme" },
"roots": [{ "uri": "file:///Users/me/project", "name": "project" }]
}
}
}protocolEraはサーバーごとにlegacy / auto / modernのいずれかを取るフィールドです。2026-07-28のMCP仕様改訂より前の挙動として扱うか、改訂後の挙動として扱うかを、トランスポート(stdioかHTTPか)とは独立に決めます。同じHTTPのURLを、legacyのサーバーとしてもmodernのサーバーとしても調べられます。
protocolEra | 接続時の動き |
|---|---|
legacy | 接続時の動き既定。通常のinitializeだけで、探りは入れない |
auto | 接続時の動きまずserver/discoverを試し、modernと判定できなければinitializeへ戻る |
modern | 接続時の動き2026-07-28に固定。フォールバックしないので、modernでないサーバーははっきり失敗する |
既定がautoでなくlegacyなのは、デバッグツールが接続時に勝手に探りを入れるべきでないからです。server/discoverは応答しないlegacyのstdioサーバー相手だと固まって見え、読みたい通信記録も汚れます。そのためautoやmodernに切り替えるのは、利用者が明示した場合に限られます。ログ・タスク・サブスクリプションの表示違いはMCP Inspectorの新旧バージョン互換性の仕組みで扱っています。
modernLogLevelはmodernプロトコルでのログレベルを決めるサーバー単位のフィールドです。デバッグツールなので最も詳細なdebugが既定で、うるさいときは"off"のようにサーバーごとに下げます。
保存時には、既定値と同じフィールドはファイルから省かれます。手で編集したcatalogをコミットして共有する運用では、無関係な差分がPRに混ざりません。
起動フラグの読まれ方:ランチャーが取るのは2つだけ
mcp-inspectorはランチャーで、自分では2種類のフラグしか読みません。--web / --cli / --tui(クライアントの選択。省略すると--web)と、-h / --helpです。残りの引数はすべて選ばれたクライアントに渡されます。
注意点は2つあります。クライアントを複数指定するとSpecify at most one of --web, --cli, or --tui.で失敗します。また、ランチャーのフラグは先頭に置く必要があり、ランチャーが知らない引数に当たった時点で解析が止まり、以降はそのままクライアントへ転送されます。mcp-inspector --cli --helpのようにモードと一緒に渡した--helpは、CLI側のヘルプとして表示されます。
クライアントごとに差が出るのは、--server(TUIだけ対話で選ぶ)と--header(Webはアドホック指定のHTTP/SSEのみ)です。--catalog / --config / --transport / --server-url / --cwd / -eはWeb・CLI・TUIで挙動が揃っています。--methodのようにCLIだけが持つフラグもあります。
--server <name>:Web版とCLIは名前付きの1台を選ぶ。TUIはファイル内の全サーバーを読み込み、対話で選ばせる--header "Name: Value":HTTP/SSEサーバー用で繰り返し指定できる。Web版ではアドホックなHTTP/SSEサーバーのときだけ有効--transport/--server-url:アドホックターゲット専用--dev:Web版だけのフラグ。ビルド済みバンドルの代わりにViteの開発サーバーを動かす。Inspector自体を触るとき用
CLIの--headerは、Web版と違ってファイル由来のサーバーにも効きます。ファイル内のheadersをその実行だけ上書きし、タイムアウトとOAuthの設定はそのまま残ります。
自分のサーバーに引数を渡す--
ファイル内ではなく、位置引数で指定したstdioサーバーに追加の引数を渡したいときは--セパレータを使います。Web版とCLIだけがこの区切りに対応し、以降の文字列をすべてターゲットのコマンド自身への引数として転送します。
mcp-inspector node build/index.js -- --config /etc/myserver.conf --verboseセパレータが無いと、--configはInspector自身の読み取り専用フラグとして先に消費されてしまい、ターゲットのサーバーには届きません。
環境変数はどの層が読むかで3つに分かれる
環境変数はフラグと同じ分担で、ランチャー本体・CLIとTUI・Webバックエンドの3層に分かれます。
ランチャー本体が読む変数
| 変数 | 効果 |
|---|---|
MCP_DEBUG | 効果失敗時にエラースタックを表示に追加する。0 / false / 空文字は「オフ」扱い |
DEBUG | 効果同上。npmのdebugパッケージの名前空間フィルタとしての機能も維持される |
DEBUG=0のような変数がシェルに残っていても、スタックトレースが意図せずオンにはなりません。
CLIとTUIが読む変数
| 変数 | 効果 |
|---|---|
MCP_CATALOG_PATH | 効果--catalogのフォールバック。アドホックターゲット指定時は無視される |
MCP_CLIENT_CONFIG_PATH | 効果--client-configのフォールバック |
MCP_OAUTH_CALLBACK_URL | 効果--callback-urlのフォールバック |
MCP_STORAGE_DIR | 効果OAuth状態ファイル(<dir>/oauth.json)の格納先 |
MCP_INSPECTOR_OAUTH_STATE_PATH | 効果OAuth状態ファイルのパスを個別に上書き。MCP_STORAGE_DIRより優先 |
MCP_AUTO_OPEN_ENABLED | 効果ブラウザ自動起動とTTY無しでのOAuthプロンプト許可を制御。trueで強制オープン、falseで常に無効、未設定ならTTYがあるときだけ開く |
MCP_CATALOG_PATHがアドホック指定時に無視されるので、シェルの設定ファイルでexportしておいても、mcp-inspector node build/index.jsのような一回きりの起動が邪魔されません。
CLIとTUIにはOAuthクライアント設定用のフラグも5つあり、Web版が画面のClient Settingsダイアログで扱う内容と同じです。
| フラグ | 対応する環境変数 | 意味 |
|---|---|---|
--client-config <path> | 対応する環境変数MCP_CLIENT_CONFIG_PATH | 意味インストール単位のクライアント設定。既定は~/.mcp-inspector/storage/client.json |
--client-id <id> | 対応する環境変数なし | 意味静的クライアントのOAuthクライアントID。client.jsonを上書き |
--client-secret <secret> | 対応する環境変数なし | 意味confidentialクライアントのOAuthクライアントシークレット。client.jsonを上書き |
--client-metadata-url <url> | 対応する環境変数なし | 意味CIMDメタデータURL。client.jsonを上書き |
--callback-url <url> | 対応する環境変数MCP_OAUTH_CALLBACK_URL | 意味認可サーバーに送るリダイレクトURI |
OAuthのコールバックはクライアントごとに違います。Webは開いたオリジンに追随し、既定はhttp://127.0.0.1:6274/oauth/callback、CLIとTUIはhttp://127.0.0.1:6276/oauth/callbackです。認可サーバーはリダイレクトURIを完全一致で照合し、localhostと127.0.0.1を別のURIとして扱います。事前登録が要るIdPでWebとCLIを併用するなら、2つとも登録します。
--callback-urlにはループバックホスト(127.0.0.1かlocalhost)しか指定できません。ローカルのコールバックリスナーが認可コードを平文のhttpで受け取る仕組みのため、それ以外のホストは常に拒否され、上書きするフラグも存在しません。
Webバックエンドが読む変数
| 変数 | 効果 |
|---|---|
MCP_INSPECTOR_API_TOKEN | 効果起動のたびにランダム生成されるセッショントークンを固定値に差し替える |
DANGEROUSLY_OMIT_AUTH | 効果/api/*のトークンチェックを完全に無効化する |
HOST | 効果バインドするホスト。既定は127.0.0.1 |
CLIENT_PORT | 効果Web UIのポート。既定は6274 |
DANGEROUSLY_BIND_ALL_INTERFACES | 効果ワイルドカードホスト(0.0.0.0・::等)にバインドするための明示的なオプトイン |
ALLOWED_ORIGINS | 効果オリジン許可リスト(カンマ区切り)。既定リストをマージではなく置き換える |
MCP_SANDBOX_PORT | 効果MCP Appsサンドボックスのポートを固定(既定は動的割り当て) |
HTTPS_PROXY / HTTP_PROXY / NO_PROXY | 効果outboundのMCP接続に対する標準的なプロキシ経路指定 |
セッショントークンを固定する
Webバックエンドは/api/*のすべてを起動ごとのトークンで守っています。起動時に表示されるURLにトークンが入っているので、localhost:6274を手で打たずにそのURLを開きます。
ブラウザ側は、index.htmlに注入されるwindow.__INSPECTOR_API_TOKEN__、クエリ文字列の?MCP_INSPECTOR_API_TOKEN=...、sessionStorageの順でトークンを探します。ページを再読み込みしたりブックマークから開いたりしても動くのは、先頭の注入値があるためです。
MCP_INSPECTOR_API_TOKENで固定すると、スクリプトから起動URLを組み立てられます。ディープリンクのhttp://127.0.0.1:6274/?serverUrl=<url>&transport=http&autoConnect=<token>では、autoConnectがCSRF対策の必須パラメーターで、起動したプロセスだけが知るトークンと一致しなければなりません。CIで自動テストを回すときに、同じ値を毎回使い回せます。
Dockerで動かすときは既定値がローカル運用と違う
イメージはghcr.io/modelcontextprotocol/inspectorとしてGitHub Container Registryに公開されており、linux/amd64とlinux/arm64に対応します。
docker run --rm -p 127.0.0.1:6274:6274 ghcr.io/modelcontextprotocol/inspector公開ポートには必ず127.0.0.1:を付けます。省くとホストの全インターフェースに公開され、プロセスを起動できるバックエンドがLANに出ます。
このイメージは既定で--web起動・0.0.0.0:6274へのバインド・ブラウザ自動起動オフ・非rootユーザーで動きます。ローカル実行との最大の違いはDANGEROUSLY_BIND_ALL_INTERFACES=trueがあらかじめ設定されている点です。docker run -pでホストのポートへ転送する以上、コンテナ内ではワイルドカードアドレスへのバインドが必須になるためです。セッショントークンはコンテナのログから読むか、-e MCP_INSPECTOR_API_TOKEN=<値>で固定できます。
HEALTHCHECKはWeb UIを叩く設定です。--cliや--tuiにはWebサーバーが無いので、--no-healthcheckを付けます。ワンショットでツール一覧を取る例です。
docker run --rm --no-healthcheck ghcr.io/modelcontextprotocol/inspector \
--cli --server-url https://api.example.com/mcp --transport http \
--method tools/list接続が403で拒否されるときの切り分け
Inspectorは既定で127.0.0.1(ループバック)にしかバインドせず、受け付けるオリジンもそのポートのループバックだけです。どちらも、バックエンドがプロセスを起動できる以上、安全側に固定された境界です。ワイルドカードアドレス(0.0.0.0・::等)へのバインドはDANGEROUSLY_BIND_ALL_INTERFACES=trueを明示しない限り拒否されますが、特定の1つのアドレスへのバインドはオプトイン不要で許可されます。全インターフェースを一度に晒す構成と、意図した1箇所だけを晒す構成を区別しているためです。
オリジンの不一致は、状況によって対処が分かれます。
403を状況から切り分ける
- 1
Dockerの公開ポートを変えたか
-p 127.0.0.1:8080:6274のように変えると、ブラウザのオリジンはhttp://localhost:8080になり、コンテナ内のポートと食い違って接続は403になります。-e CLIENT_PORT=8080 -p 127.0.0.1:8080:8080でポートを揃えるか、-e ALLOWED_ORIGINS=http://localhost:8080,http://127.0.0.1:8080を指定します。 - 2
LAN上の別マシンから開くか
HOST=192.168.1.50のように特定のアドレスで起動します。既定のオリジン許可リストはバインドホストに追随するので、http://192.168.1.50:6274は追加設定なしで通ります。 - 3
TLSやリバースプロキシの背後か
ブラウザの
Originは公開用のものになり、バインドホストと一致しません。ALLOWED_ORIGINS=https://inspector.example.comを明示します。 - 4
ワイルドカードで公開したコンテナか
DANGEROUSLY_BIND_ALL_INTERFACES=trueでループバックからのアクセスはそのまま動きます。ループバック以外のアドレスで開くなら、別途ALLOWED_ORIGINSが要ります。
ALLOWED_ORIGINSは既定リストを置き換えるので、残したいループバックの形も自分で並べます。公開用オリジンだけを指定すると、手元のlocalhostから開けなくなります。
ALLOWED_ORIGINS=http://localhost:6274,http://127.0.0.1:6274,http://192.168.1.50:6274各要素にはスキーム(http://やhttps://)が必要で、無い値は警告付きで無視されます。空文字を指定してもチェックが無効になるわけではなく、既定値へ戻ります。オリジン検証そのものをオフにするスイッチはありません。
ループバック以外に公開するときは、MCP Appsにも注意が要ります。サンドボックスは別ポートを動的に使うため、MCP_SANDBOX_PORTで固定して転送しないと届きません。Dockerイメージが公開するのは6274だけです。サンドボックスのURLは常に平文のhttpなので、https://のページから開くとmixed contentとしてブロックされます。角括弧付きのIPv6リテラルもCSPのhost-sourceとして無効なため、ホスト名かIPv4アドレスで開きます。
設定を書かずに済ませる:既存設定のインポート
手書き以外の方法もあります。Web版のServers画面のAdd Serversから、Claude Desktop・Cursor・Cline・VS Codeの既存設定ファイルや、レジストリのserver.jsonを取り込めます。取り込みはアクティブなcatalogにマージされ、既存の項目は上書きされません。catalogに一切触れたくないときは、前掲のように--configで相手のファイルを読み取り専用で開く経路が使えます。サーバーに接続せず一覧だけ読みたいなら、CLIのservers/listです。
mcp-inspector --cli --catalog ~/.mcp-inspector/mcp.json --method servers/list自作サーバーの実装そのものはMCPサーバー自作ガイド、MCPプロトコル全体の位置づけはMCPとはで扱っています。
共有設定と作業用一覧:2ファイル制の使いどころ
--configが読み取り専用に固定されているのは、制限というより設計判断と読めます。チームで1つのMCPサーバー設定をリポジトリで共有しているとき、各メンバーが--catalogで自分の作業用一覧にサーバーを足し引きしても、コミット済みの共有設定は影響を受けません。CIやオンボーディングで「リポジトリの設定をそのまま検証する」場面でも、--configならInspectorがファイルを書き換える事故が起きません。
まとめ
外部に公開するときに最初に触るのはALLOWED_ORIGINSで、MCP Appsを使うならMCP_SANDBOX_PORTの固定も要ります。DANGEROUSLY_で始まる変数は認証とバインド範囲の制限を外すもので、オリジンの不一致では使いません。基本操作はMCP Inspectorの使い方にあります。