AIコーディングエージェントのMCP対応状況を比較する — 5ツールの実装差
Claude Code・Cursor・Cline・Windsurf・Roo CodeのMCP対応を、通信方式(stdio/HTTP/SSE)と認証方式、設定ファイルの違いで比較します。
MCP対応状況で見るべきはトランスポートと認証方式
MCP(Model Context Protocol)サーバーをどれだけ豊富に繋げるかは、ツール自体の対応状況より先に「そのMCPサーバーが要求する通信方式と認証方式をクライアント側が受け付けるか」で決まります。Claude Code・Cursor・Cline・Windsurf・Roo Codeは全社がMCPをサポートすると謳っていますが、対応トランスポート・OAuthの有無・設定ファイルの置き場所は一致していません。あるMCPサーバーが「OAuth必須のStreamable HTTP」で公開されている場合、OAuthに対応していないクライアントでは接続できず、ヘッダーに手動でトークンを埋め込む代替手段を探すことになります。
比較する5つのツール
比較対象はClaude Code(CLI/VS Code拡張)・Cursor・Cline・Windsurf・Roo Codeです。いずれもMCPクライアントとしてサーバーを追加・管理する機能を持ちますが、Windsurfだけは事情が異なります。公式ドキュメントdocs.windsurf.comは現在docs.devin.aiへ転送されており、WindsurfはCognition社が提供する「Devin Desktop」アプリの一部として、レガシーのCascadeエージェントと新しいDevin Localエージェントを切り替える構成になっています。本記事のWindsurf欄は、このCascadeエージェントのMCP実装を対象にしています。
対応トランスポートの比較表
MCPの通信方式にはstdio(ローカルプロセス起動)・SSE(レガシーのServer-Sent Events)・Streamable HTTP(現行の推奨方式)・WebSocketがあります。5ツールの対応状況は次のとおりです。
| ツール | stdio | Streamable HTTP | SSE | WebSocket |
|---|---|---|---|---|
| Claude Code | stdio○ | Streamable HTTP○(推奨) | SSE△(非推奨・HTTP接続をサーバーが拒否するとSSEへ自動切替) | WebSocket○(type: "ws") |
| Cursor | stdio○ | Streamable HTTP○ | SSE○ | WebSocket非対応 |
| Cline | stdio○ | Streamable HTTP○(推奨) | SSE○(type省略時の既定・非推奨扱い) | WebSocket非対応 |
| Windsurf(Cascade) | stdio○ | Streamable HTTP○ | SSE○ | WebSocket非対応 |
| Roo Code | stdio○ | Streamable HTTP○(推奨) | SSE○(レガシー) | WebSocket非対応 |
WebSocketに対応しているのはClaude Codeだけです。ドキュメントは「サーバーがイベントを能動的にプッシュするならWebSocket、リクエストに応答するだけならHTTPを使う」と使い分けを明記しており、OAuthとclaude mcp add --transportフラグはWebSocketでは使えずヘッダー認証限定になる点が制約です。SSEも--transport httpで追加した場合、v2.1.265以降はまずHTTPで接続を試み、サーバーが受け付けなければSSEへ自動的に切り替わる仕様です。
Clineの挙動には注意点があります。設定にtypeを書かないエントリは、Streamable HTTPではなく後方互換のためレガシーSSEとして扱われます。新しいサーバーを繋ぐときは"type": "streamableHttp"を明示しないと、意図せずレガシー方式で接続してしまいます。
認証方式の比較 — OAuth対応が分かれ目
リモートMCPサーバーの認証方式で最も差が出るのがOAuthへの対応です。
| ツール | OAuth対応 | 主な設定ファイル |
|---|---|---|
| Claude Code | OAuth対応○(動的クライアント登録+CIMD自動検出+静的クライアントID/シークレット指定) | 主な設定ファイル.mcp.json(プロジェクト共有)/ ~/.claude.json(ローカル・ユーザー) |
| Cursor | OAuth対応○(動的クライアント登録+静的OAuth認証情報のauthフィールド) | 主な設定ファイル.cursor/mcp.json(プロジェクト)/ ~/.cursor/mcp.json(グローバル) |
| Cline | OAuth対応ヘッダー認証(OAuthの記載なし) | 主な設定ファイル~/.cline/mcp.jsonまたは拡張機能のMCP設定JSON |
| Windsurf(Cascade) | OAuth対応○(各トランスポートでOAuthをサポートと明記) | 主な設定ファイル~/.config/devin/mcp_config.json(macOS / Linux。$XDG_CONFIG_HOME設定時は$XDG_CONFIG_HOME/devin/mcp_config.json)/ %APPDATA%\devin\mcp_config.json(Windows) |
| Roo Code | OAuth対応ヘッダー認証・環境変数展開のみ(OAuth専用フローの記載なし) | 主な設定ファイルグローバルmcp_settings.json/ プロジェクト.roo/mcp.json |
OAuthに頼れないサーバーへの逃げ道
Claude Code
claude mcp login <name>でOAuthフローを単独実行できます。動的クライアント登録に対応しないサーバーには、--client-id・--client-secret・--callback-portで固定のOAuthアプリ認証情報を渡します。コールバックのポートを自分で固定する形です。Cursor
mcp.jsonのauthオブジェクトにCLIENT_ID・CLIENT_SECRET・scopesを書きます。ポートを選べるClaude Codeと違い、Cursorはリダイレクト先が固定です。Webとエージェント向けのhttps://www.cursor.com/agents/mcp/oauth/callbackと、デスクトップアプリ向けのhttp://localhost:8787/callbackを、使う面に合わせて提供元のOAuthアプリに許可登録します。Cline・Roo Code
提供元でトークンを別途発行し、ヘッダーに渡す運用です。Roo Codeは
"${env:GITHUB_PERSONAL_ACCESS_TOKEN}"のように環境変数を参照できます。
設定ファイルのスキーマは似ているようで違う
5ツールとも設定のトップレベルキーはmcpServers(Windsurfも同様)で揃っていますが、細部のフィールド名が異なります。リモートサーバーのURLを指定するキーは、Claude Code・Cursor・Cline・Roo Codeがurlなのに対し、WindsurfはserverUrl(またはurl)を使います。
リモートサーバーをJSONで書く場合、Claude Codeは次の形です。
{
"mcpServers": {
"server-name": {
"type": "http",
"url": "https://api.example.com/mcp",
"headers": { "Authorization": "Bearer ${TOKEN}" }
}
}
}Cursorのリモートサーバー設定は、Claude Codeと違ってtypeを書かず、url(必要に応じてheadersやauth)だけで完結する形です(typeが必須になるのはCursorのSTDIOサーバーだけです)。Streamable HTTPを示すtypeの値もツールごとに異なり、Claude Codeが"http"、Clineが"streamableHttp"、Roo Codeが"streamable-http"という表記です。ただしClaude Codeはstreamable-httpをMCP仕様が使う正式名としてhttpの別名でも受け付けるため、Roo Codeの設定はそのままコピーしても通ります。一方、ClineのstreamableHttpはClaude Codeに通りません。
他クライアント向けの設定を貼るとどうなるか
Claude Code v2.1.287で、空のHOMEを指定した一時ディレクトリを使い、typeの書き方ごとに設定を書き込ませました。接続はしていません。
claude mcp add-json -s project a '{"type":"streamable-http","url":"https://example.com/mcp"}'
# Added http MCP server a to project config
claude mcp add-json -s project b '{"type":"streamableHttp","url":"https://example.com/mcp"}'
# Invalid configuration: : Invalid input
claude mcp add-json -s project c '{"type":"ws","url":"https://example.com/mcp"}'
# Added ws MCP server c to project config
claude mcp add --transport ws x wss://example.com/mcp
# Invalid transport type: ws. Must be one of: stdio, sse, http (or streamable-http)aは.mcp.jsonに"type": "http"として保存され、別名が正規の名前に直されます。bは書き込み時点で弾かれ、エラー文はどのフィールドが悪いのかを示しません。Clineの設定をコピーして動かないときは、typeの綴りから疑えます。
--transportはwsを受け付けません。claude mcp add --helpのオプション欄はstdio, sse, httpの3つだけで、streamable-httpはエラー文にだけ現れます。WebSocketサーバーを足せるのはadd-jsonか.mcp.jsonの直接編集です。ドキュメントによると、WebSocketサーバーはclaude mcp listに表示されません。確認にはclaude mcp get <name>か/mcpパネルを使います。
環境変数の埋め込み構文もツールごとに異なります。Claude Codeがサポートする構文は${VAR}と${VAR:-default}で、${env:VAR}形式はサポート構文に含まれていません。Cursorは${env:NAME}(:-defaultのようなフォールバック構文の記載はありません)、Roo Codeは${env:VAR}、Windsurfは${env:VAR}と${file:/path}(ファイルの中身を読み込む方式)をサポートします。Clineの設定例は、envブロックやheadersに値を直接書く形です。
設定ファイルのスコープ(有効範囲)も揃っていない
同じMCPサーバーをプロジェクト単位で共有したいのか、自分の全プロジェクトで使いたいのかによって、どのファイルに書くべきかがツールごとに変わります。
Claude Codeは3階層を持ちます。ローカル(そのプロジェクトの自分専用・~/.claude.json)、プロジェクト(チーム共有・.mcp.jsonをリポジトリにコミット)、ユーザー(全プロジェクト共通・~/.claude.json)です。同名サーバーが複数階層にあるときは、最も優先度の高い定義が丸ごと使われ、フィールドは混ぜ合わされません。Cursorも同様に、プロジェクト直下の.cursor/mcp.jsonとホームディレクトリの~/.cursor/mcp.jsonの2階層を持ちます。Roo Codeはグローバルなmcp_settings.jsonとプロジェクト直下の.roo/mcp.jsonの2階層で、プロジェクト設定がグローバル設定を上書きする方式です。
プロジェクトごとに切り替えられるか
プロジェクト用の設定ファイルがある
リポジトリに設定を置いてチームで共有できます。プロジェクトごとに使うMCPサーバーを変えたいチームは、こちらの構成が扱いやすくなります。
グローバル設定が中心
Clineは~/.cline/mcp.json(CLI)か拡張機能のMCP設定JSONで、ドキュメントに載る設定ファイルはこの2系統です。WindsurfはDevin Desktopの単一のmcp_config.jsonで、チーム単位の統制は管理者ダッシュボードのallowlistが担います。Clineにも企業向けの制御があり、allowedMCPServersとremoteMCPServersで組織がサーバーを管理します(詳細は後述の管理者向け統制の節)。
接続できるサーバーの数と、待ち時間の既定値
MCPサーバーを増やすと、同時に持てるツール数と、1回の呼び出しをどれだけ待つかが効いてきます。ここにも実装差があります。
上限と既定値の数字
Windsurf(Cascade)
100個
同時にアクセスできるツールの総数
Claude Code
25,000トークン
1回のツール出力の既定の上限(1万超で警告)
Roo Code
60秒
サーバーごとのタイムアウトの既定(1〜3600秒で上書き)
Claude Code
約28時間
MCP_TOOL_TIMEOUT未設定時のツール呼び出しの待ち時間
不要なツールはdisabledTools配列で外せます。Windsurf(Cascade)は接続中の全サーバーを通した総数に上限があり、サーバーを足すほど枠に近づきます。...メニューのMCPs欄で有効なツール数を確かめられます。他の4ツールのドキュメントには、総ツール数の上限は載っていません。
Claude Codeはサーバーごとの固定のツール数上限を設けず、実質の上限はコンテキストウィンドウの予算だと説明しています。代わりにツール検索(Tool Search)で消費を抑えます。起動時に読み込むのはツール名とサーバーの指示文だけで、定義は必要になってから取り込みます。常に見せたいサーバーはalwaysLoadをtrueにします。ANTHROPIC_BASE_URLがAnthropic以外のホストを指すと、ツール検索は既定で無効になります。
出力サイズの制限は別の軸です。MAX_MCP_OUTPUT_TOKENSで上限を変えられるので、「繋げる数」ではなく「1回の応答が肥大化しないか」を絞る仕組みと言えます。
Claude Codeは長い壁時計の上限を置きつつ、応答も進捗通知も無い呼び出しは別に中断します。その窓はHTTP・SSE・WebSocketで5分、stdioで30分です。長く走るツールを繋ぐなら、Roo Codeではtimeoutを上げる必要があります。
プロトコル拡張機能への対応にも差がある
MCPの仕様には、ツール呼び出し以外にもプロンプトのテンプレート化(Prompts)、構造化データの参照(Resources)、サーバーがクライアントに追加情報を求めるElicitation、インタラクティブなUIを返すApps拡張など、いくつかの発展的な機能があります。この対応状況を最も詳しく公開しているのはCursorです。Tools・Prompts・Resources・Roots・Elicitation・Apps拡張のすべてに対応していると明記しています。とくにMCP Apps拡張は、MCPツールが通常のテキスト応答に加えてインタラクティブなUIビューを返せる仕組みで、5ツールの中で明示的にサポートを謳っているのはCursorだけです。
Claude Codeのドキュメントは、サーバーからのElicitationリクエストへの応答(フォーム入力またはブラウザでの認証フローに答える形)、サーバーのroots/listリクエストへの応答(セッションの起動ディレクトリと--add-dirで追加したディレクトリを返す)、Prompts・Resourcesのlist_changed通知を受けた能力の自動更新を明記しており、独自のChannels機能(サーバーからセッションへイベントをpushする仕組み)も持っています。Claude CodeのドキュメントでApps拡張に触れているのは、ui://のUIリソースが@の候補とリソース一覧に出ないという点だけで、UIを描画する対応は書かれていません。
Windsurfはツール・リソース・プロンプトに対応("currently support an MCP server's tools, resources, and prompts.")と明記し、ClineとRoo Codeのドキュメントはツール呼び出しの説明が中心です。
Windsurf(Cascade)だけが持つ正規表現allowlist
企業向けの管理機能では、引数まで照合するという点でWindsurf(Cascade)のMCP allowlistが最も踏み込んでいます。管理者はサーバーのcommandとargsの各要素を正規表現で指定でき、argsの配列長も含めて完全一致を要求するマッチングルールです。一度でも1つのサーバーをallowlistに載せると、それ以外の全サーバーが自動的にブロックされる仕様もあわせ持ちます。
Claude Codeの管理者向け制御は、固定のサーバー集合を配布するmanaged-mcp.json・managedMcpServersと、許可・拒否のリストです。許可リストのallowedMcpServersと拒否リストのdeniedMcpServersは、サーバーの識別を3種類のキーで行います。
serverUrl: リモートサーバーのURLで、完全一致か*のワイルドカードserverCommand: stdioサーバーを起動するコマンドと引数の完全一致serverName: ユーザーが付けたラベルで、完全一致のみ
serverNameは誰でも好きな名前を付けられるので、セキュリティ上の統制にはなりません。正規表現でマッチさせるWindsurfと違い、引数の照合は完全一致です。
Clineの企業向け制御は、サーバー名で許可する方式です。allowedMCPServersはローカルサーバーを、ユーザー設定でのサーバー名と同じidで許可します。remoteMCPServersは組織からリモートサーバーを配布し、blockPersonalRemoteMCPServersは個人のリモートサーバーを止め、mcpMarketplaceEnabled: falseでマーケットプレイスを無効にします。名前ベースの許可はClaude CodeのserverNameと同じ性質で、引数まで照合するWindsurfのallowlistとは粒度が違います。
Cursorは企業ダッシュボードのMCP Allowlistで、コマンドのパターンとURLのパターンによる許可に加え、承認済みサーバーのうち自動実行してよいツールを絞るツールallowlistを持ちます。空のままにすると、そのサーバーの全ツールが許可されます。Windsurfの引数単位の正規表現や配列長の一致に当たる記述は、Cursorのドキュメントにはありません。
承認を省く設定とツールを外す設定は、キーの名前から違う
ツールごとの自動承認と無効化も、設定ファイルのキー名が揃っていません。
| ツール | 自動承認するツールの列 | 外す指定 |
|---|---|---|
| Cline | 自動承認するツールの列autoApprove | 外す指定サーバー単位のdisabled |
| Roo Code | 自動承認するツールの列alwaysAllow | 外す指定サーバー単位のdisabled、ツール単位のdisabledTools |
| Windsurf(Cascade) | 自動承認するツールの列記載なし | 外す指定ツール単位のdisabledTools |
Roo Codeには、watchPathsに挙げたファイルが変わるとサーバーを自動で再起動する設定もあります。ローカルで開発中のMCPサーバーを繋ぐときに効きます。xAIのGrok BuildがClaude Codeの.mcp.jsonを読む点は、Claude CodeとGrok Buildの比較で扱っています。
使い分け早見表
| 優先したいこと | 向いているツール | 理由 |
|---|---|---|
| WebSocketでイベントをpushしてくるMCPサーバーを使いたい | 向いているツールClaude Code | 理由5ツール中唯一WebSocketトランスポートに対応 |
| OAuth必須のリモートサーバーを固定クライアントIDで繋ぎたい | 向いているツールClaude Code / Cursor | 理由静的OAuthクライアント認証情報の設定項目を持つ |
| MCPサーバーの利用をコマンド単位で厳密に統制したい | 向いているツールWindsurf(Cascade) | 理由正規表現ベースの引数マッチングallowlistを持つ |
| ヘッダー認証のシンプルなサーバーだけで足りる | 向いているツールCline / Roo Code | 理由OAuthフローを組まずに済み、設定項目も少ない |
まとめ
他ツールの設定を移すときは、typeの綴りと環境変数構文を書き換えます。ClineのstreamableHttpはClaude Codeに弾かれ、Roo Codeのstreamable-httpは通ります。${env:VAR}はClaude Codeでサポート構文に含まれません。OAuth必須のサーバーを繋ぐ予定があるかどうかが、選択の分かれ目です。Claude Code側のMCP設定手順はClaude Code MCP設定ガイド、ツールごとの権限ルールの書き方はClaude Code MCP権限ルールにまとめています。個別のMCPサーバー選びでは、シンボル単位でコード理解を強化するSerena MCPも選択肢になります。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。