• #MCP
  • #Claude Code
  • #Chrome DevTools Protocol
  • #API
開発claude-code-toolsメモ

Claude Code CLI環境でMCPは必要か?

Claude Code(CLI版)を使っていて、ふと疑問が浮かんだ。CLIから直接curlやCLIツールでAPIを叩けるのに、MCP(Model Context Protocol)サーバーを間に挟む意味はあるのか。

答えは「場合による」。Chrome DevTools MCPを例に、使い分けの基準を整理する。

MCPの役割を誤解していた

MCPは「ブラウザ環境のClaude Webがローカルリソースにアクセスできないから存在する代替手段」ではない。LLMがツールとして構造的に呼び出せる標準インターフェースを提供するプロトコルだ。

Claude Webでのリモートアクセス用途は確かにユースケースの一つだが、本質はそこではない。

CLI環境でMCPが不要なケース

REST APIやCLIツールが充実しているサービスでは、直接叩いた方が柔軟で網羅性が高い。

サービス直接アクセス手段MCPを使わない理由
GitHubgh CLI全APIをカバー。MCPは一部のみラップ
Google Cloudgcloud CLI同上
一般的なREST APIcurl / 専用CLI1リクエストで完結。MCPは薄いラッパーに過ぎない

MCP側がAPIの全機能を網羅していないことが多く、「MCPにはないけどAPIには存在する機能」にぶつかる。直接叩く方が制約が少ない。

Chrome DevTools MCPが有利な理由

Chrome DevTools Protocol(CDP)は、REST APIとは性質が異なる。

1. ステートフルなプロトコル

CDPはWebSocket接続を維持し、セッション管理が必要。curlで1リクエスト投げて終わりではない。ページの選択状態、接続の維持、イベントの購読など、状態を持ち続ける必要がある。

2. プロトコルが複雑

CDPには数百のドメインとメソッドがある。正しいシーケンスで呼ばないと動かない。たとえば、スクリーンショットを撮るだけでも:

  1. WebSocket接続を確立
  2. ターゲット(タブ)を選択
  3. Page.enable でページイベントを有効化
  4. Page.captureScreenshot を呼ぶ
  5. Base64エンコードされた画像をデコード

3. MCPが状態管理を吸収してくれる

MCP経由なら、この複雑さがすべて隠蔽される:

mcp__chrome-devtools__new_page(url: "http://localhost:3000")
mcp__chrome-devtools__take_screenshot()
mcp__chrome-devtools__click(selector: "#submit-btn")

接続管理、セッション追跡、データのエンコード/デコードをMCPサーバーが処理する。自前でWebSocketクライアントを書く必要がない。

判断基準

MCPを使うかどうかは、対象プロトコルの性質で判断できる。

判断軸MCPなし(直接アクセス)MCPあり
プロトコルステートレス(REST)ステートフル(WebSocket等)
1回のリクエストで完結するかするしない
CLIツールの充実度高い低い・存在しない
認証管理シンプル(トークン等)OAuth等で面倒

MCPが不要

  • REST APIに対応するCLIツールが存在する
  • 1回のHTTPリクエストで完結する
  • APIの全機能を使いたい

MCPが有利

  • ステートフルなプロトコル(CDP、LSP等)で状態管理が必要
  • 認証フロー(OAuth)をMCPに任せたい
  • 自前でクライアントを実装するコストが高い

まとめ

「CLIなのにMCP使うの?」という疑問は自然だが、MCPの価値はAPI呼び出しの代行ではなく、複雑なプロトコルの状態管理を吸収することにある。Chrome DevTools MCPは、その恩恵が分かりやすい典型例だ。

逆に、ghで事足りるGitHub操作にMCPを挟むのは、ただの間接層が増えるだけで得るものがない。