IDE内蔵MCPサーバーのセキュリティモデル — VS Code/JetBrains実装の違い
VS Code拡張機能とJetBrainsプラグインが内部で動かす非表示のMCPサーバー「ide」の通信・認証・公開ツールの違いを、公式仕様から比較します。
ide サーバーが公開するツールと、公開しないもの
VS Code拡張機能とJetBrainsプラグインは、有効なあいだ ide という名前のローカルMCPサーバーを動かします。CLIがIDEネイティブの差分ビューアーで変更を見せたり、@メンションで選択範囲を読んだりするのは、このサーバー経由です。
/mcp の一覧には出ません。設定する項目が無いからです。ただし組織で PreToolUse フックを使ってMCPツールを許可リスト化しているなら、存在を知らないと許可・拒否のどちらかに意図せず倒れます。フックの書き方はClaude Code Hooks完全ガイドにあります。
サーバー内部には複数のRPCがありますが、モデルに届くツールは絞られています。VS Codeは「12個ほどのうち2つ」、JetBrainsは「いくつかのうち1つ」です。残りはCLIが自分のUIのために使う内部RPCで、差分表示や選択範囲の読み取りがそれにあたり、VS Codeではファイル保存も含まれます。ツール一覧がClaudeに渡る前に取り除かれます。
モデルに見えるツール
VS Code拡張
mcp__ide__getDiagnostics は読み取り専用で、Problemsパネルのエラーと警告を返します。mcp__ide__executeCode は書き込み系で、アクティブなJupyterノートブックのカーネルでPythonを実行します。
JetBrainsプラグイン
mcp__ide__getDiagnostics だけで、エディタに出るinspectionの診断を返します。1回の呼び出しは1ファイル分です。コード実行ツールはモデルに公開されません。
通信まわりの条件は、実装ごとに次のように違います。
| 観点 | VS Code拡張 | JetBrainsプラグイン |
|---|---|---|
| バインドアドレス | VS Code拡張127.0.0.1 | JetBrainsプラグイン既定は127.0.0.1、設定でローカルネットワークに公開可 |
| ポート | VS Code拡張10000〜65535のランダム(設定不可) | JetBrainsプラグインOSが割り当てるエフェメラルポート(設定不可) |
| トランスポート | VS Code拡張暗号化なしのws:// | JetBrainsプラグイン暗号化なしのws:// |
| 認証 | VS Code拡張起動ごとのランダムトークン | JetBrainsプラグイン起動ごとのランダムトークン |
暗号化がない点は弱点に見えます。ただ、ソケットがループバック限定なら、通信を盗み見られるプロセスは同じ権限でロックファイルのトークンも読めます。TLSを足しても保護は増えません。この前提が崩れるのは、後述するJetBrainsのネットワーク公開設定を有効にしたときです。
VS Codeには診断ツールが2系統ある
チャットパネルでは、Problemsパネルの読み取りが ide ではなく別の内蔵サーバー claude-vscode を通ります。Claude Code v2.1.285以降の挙動で、1つのファイルについても、診断のある全ファイルについても、その時点のエラーと警告を取得できます。
フックや権限ルールからは、この系統のツールが mcp__claude-vscode__getDiagnostics と見えます。CLIとチャットパネルの両方の診断を許可・拒否したいなら、2つの名前を並べて書きます。公式が示す settings.json の拒否例は次の形です。
{
"permissions": {
"deny": [
"mcp__ide__getDiagnostics",
"mcp__claude-vscode__getDiagnostics"
]
}
}Read の拒否ルールはこの2つのツールを止めません。診断の取得を止めるなら、ツール名で書いた拒否ルールが必要です。mcp__ide__executeCode を止めたい場合も、同じ名前指定の形になります。
Jupyterのセル実行は、誰が最終的に止めるのか
mcp__ide__executeCode は黙っては何も実行しません。呼び出しの流れは次のとおりです。
executeCodeが1回呼ばれたとき
- 1
セルが挿入される
コードはアクティブなノートブックの末尾に新しいセルとして入ります。
- 2
画面が移動する
VS Codeがそのセルまでスクロールします。
- 3
Quick Pickで確認される
ネイティブのQuick Pickが「Execute」か「Cancel」かを尋ねます。
- 4
結果が決まる
「Execute」なら実行されます。キャンセルや
EscではClaudeにエラーが返り、何も実行されません。
次の場合は、Quick Pickを出す前にツール自体が拒否されます。アクティブなノートブックがない、Jupyter拡張機能(ms-toolsai.jupyter)が入っていない、カーネルがPythonでない、のいずれかです。
Quick Pickは PreToolUse フックとは別の仕組みです。許可リストに mcp__ide__executeCode を入れても、Claudeがセル実行を提案できるようになるだけで、実際に走らせるかどうかを決めるのはVS Code内のQuick Pickです。フックで許可しても、実行の最終判断は人間の側に残ります。
ロックファイルは本当に本人しか読めないのか
CLIは ~/.claude/ide/<port>.lock に書かれたトークンを X-Claude-Code-Ide-Authorization ヘッダーで示して接続します。CLAUDE_CONFIG_DIR を設定している環境では、書き込み先が $CLAUDE_CONFIG_DIR/ide/ に変わります。公式のVS Code側の説明では、ロックファイルは 0600、置き場のディレクトリは 0700 です。
Claude Code v2.1.289を入れたmacOSで、VS Code Insidersを起動した状態の ~/.claude/ide を stat で見ると、次のようになりました。
stat -f '%Sp %N' ~/.claude/ide ~/.claude/ide/*.lockdrwxr-xr-x /Users/<user>/.claude/ide
-rw------- /Users/<user>/.claude/ide/<port>.lockロックファイルは 0600 で、所有者以外は読めません。一方、ディレクトリは 0755 でした。公式の記述とは違いますが、トークンを守っているのはファイル側の権限なので、同じマシンの別ユーザーがトークンを読めない点は変わりません。ディレクトリが 0755 なら、ファイルの一覧は他のユーザーにも見えます。自分の環境の権限は ls -ld ~/.claude/ide で確かめられます。
ロックファイルの中身はJSONで、pid・workspaceFolders・ideName・transport・runningInWindows・authToken の6つのキーがありました。transport の値は ws です。トークンはIDEを起動するたびに作り直されます。
CLI側には、IDEへの自動接続を制御する --ide フラグがあります。claude --help では次のように説明されています。
--ide Automatically connect to IDE on startup if exactly one valid IDE is available有効なIDEがちょうど1つだけのときに自動接続する、という条件です。
選択範囲とアクティブファイルは、プロンプトごとに送られる
ide サーバーに接続していると、CLIはプロンプトを送るたびに、現在の選択範囲とアクティブなファイルのパスをコンテキストに含めます。含めたときは、トランスクリプトに ⧉ Selected N lines from <file> という行が出ます。
メッセージをキューに積んだ場合は、Enterを押した時点の選択範囲が保持されます。その後に別の範囲を選んでも、送られる内容は変わりません。
.env のような機密ファイルは、そのパスへの Read の拒否ルールで外せます。一致する拒否ルールがあると、選択したテキストと開いているファイルの通知の両方がClaudeに届かなくなります。この仕組みはVS CodeにもJetBrainsにも共通です。
VS Codeには「Attach Open File」という設定があります。既定では、何も選択していなくても、開いているファイルをClaudeが把握し、プロンプト欄にファイル名が表示されます。オフにすると、アクティブファイルのパスは、そのファイル内でテキストを選択している間だけCLIに渡ります。この設定はClaude Code v2.1.271以降が条件です。
ここで扱っているのは、エディタの文脈を渡す経路の話です。外部のツールやデータベースにどこまで操作を許すかという別のリスクは、MCPセキュリティガイドで扱っています。同じ mcp__ で始まる名前でも、見るべき観点が違います。
JetBrainsのネットワーク公開設定は、いつ触るのか
JetBrainsプラグインには、Settings → Tools → Claude Code [Beta] → Networking (Advanced)に「Accept connections from all network interfaces」があります。既定は無効で、サーバーは 127.0.0.1 だけで待ち受けます。
この設定が用意されているのは、CLIがIDEにループバックで届かない場合のためです。例として、WSL2の既定のNATネットワークや、リモートIDEの構成が挙げられています。有効にすると、ポートはローカルネットワークから到達できるようになります。トークンは引き続き必要ですが、セッションの通信とトークンの両方が平文でネットワークを流れます。
WSL2では、この設定に頼る前にミラードネットワークへの切り替えが勧められています。Windows側のループバックをLinux VMと共有できるので、ソケットをループバックのまま使えます。ミラードネットワークはWindows 11 22H2以降が条件で、Windows 10ではファイアウォールルールで対処する流れになります。WSL1はホストのネットワークをそのまま使うため、この問題の対象外です。
VS Code拡張機能は 127.0.0.1 のランダムなポートで待ち受け、ポートは設定できません。ネットワークに公開するための設定は記載されていません。
JetBrainsのRemote Developmentでは、プラグインをローカルのクライアントではなく、Settings → Plugin (Host)からリモートホスト側に入れる必要があります。
VS Codeで自動編集を許可すると、IDEの設定ファイルも対象になる
IDE連携とは別の経路ですが、VS Code側にはもう1つ注意点があります。自動編集の権限を許可すると、Claude Codeは settings.json や tasks.json のような、VS Codeが自動で実行することがある設定ファイルも書き換えられます。
信頼できないコードを扱うときの軽減策として、次の3つが挙げられています。
- 信頼できないワークスペースではVS CodeのRestricted Modeを有効にする
- 編集は自動編集やAutoではなく、手動承認のモードで受ける
- 変更を受け入れる前によく確認する
評価:弱点は暗号化の有無ではなく、公開範囲の設定にある
平文のトランスポートは、ループバック限定のあいだは妥当な設計です。JetBrainsで「Accept connections from all network interfaces」を有効にすると、同じネットワーク上のほかのホストからセッションの中身とトークンの両方が読める状態になります。リスクが生じるのは、この設定を有効にした側です。
共有マシンで見るべき場所は2つに絞れます。ロックファイルが 0600 になっているか、そしてJetBrainsのネットワーク公開設定が無効のままか、です。ディレクトリが 0755 でも、トークンを守っているのはファイル側の権限なので、そこだけで危険とは言えません。
まとめ
許可リストに並べる名前は、VS Codeでは mcp__ide__getDiagnostics・mcp__ide__executeCode・mcp__claude-vscode__getDiagnostics の3つです。通信の安全性は、ループバックのまま使えるかどうかと、ロックファイルの権限が自分の環境でどうなっているかで決まります。