世界を動かす技術を、日本語で。

MCPとCLIはいつ使い分けるべきか?

概要

MCP(Model Context Protocol) の普及が停滞している理由を解説。 CLI(コマンドラインインターフェース) の優位性を具体例とともに強調。 認証やデバッグの簡便さ など、CLIの現実的な利点を列挙。 MCPが適切な場合もあるが、 大半の用途ではCLIが有効 と主張。 開発者への提言として、まず CLIの提供を優先 する重要性を訴求。

MCPはすでに衰退しつつある

  • OpenClawPi がMCPをサポートしていない現状
  • Anthropic によるMCP発表時の業界の過剰反応
  • 多くの企業が MCPサーバー開発にリソース投入 という非効率
  • LLMが既存の方法で十分にサービスと連携できる事実
  • MCPの現実的な価値への疑問

LLMに特別なプロトコルは不要

  • LLMは CLIツールの利用が得意 である訓練済み
  • マニュアルやStack Overflow、GitHub などの情報も豊富に学習
  • MCPによるインターフェースの「清潔化」は 実際には冗長
  • 結局 CLIの使い方やパラメータ説明 など、同じドキュメント作成が必要
  • 新プロトコル導入の実益の薄さ

CLIは人間にも分かりやすい

  • LLMがJira操作で想定外の動作をした場合、 同じCLIコマンドで確認可能
  • CLIなら出力の透明性 が担保される
  • MCPでは 内部的なやり取りがブラックボックス化 しやすい
  • デバッグの難易度上昇 と非効率化

CLIの強力な構成性

  • CLIはパイプやリダイレクトによる柔軟な組み合わせ が可能
    • jqやgrepとの連携
    • ファイルへの出力
  • 例: Terraformの大規模プラン分析 もCLIなら既存ツールで簡単対応
  • MCPでは データ全体をコンテキストに投入(非効率・高コスト) や、サーバー側でのカスタム実装が必要
  • CLIの方が既存の資産や知見を活用しやすい

認証は既存の仕組みで十分

  • MCPは 認証方式が独自で過剰
  • CLIは aws, gh, kubectl など、既存の認証フローが安定
  • 認証トラブル時も 従来通りの解決手順 で対処可能
  • MCP固有のトラブルシューティング不要

余計なプロセス管理が不要

  • MCPサーバーはプロセス管理が必要 で、不安定要素
  • Claude Codeでは 子プロセスとして起動 だが、失敗時に再起動や状態リセットが必要
  • CLIは単なるバイナリ で、プロセス常駐や初期化不要
  • 必要な時だけ起動・利用できる シンプルな運用

MCP導入による実務的な不便さ

  • 初期化の不安定さ で作業効率低下
  • MCPツールごとに 認証作業が煩雑
  • CLIならSSOや長期認証で一括管理 が可能
  • MCPの 権限管理が大雑把 で、CLIのような細やかな操作制御が不可
  • 具体例: gh pr view は許可、 gh pr merge は承認必須など、CLIなら柔軟な許可設定

MCPが有効なケース

  • CLI相当が存在しないツール にはMCPが有用
  • MCPの 標準化インターフェース としての価値は一定あり
  • ただし 大半の業務ではCLIの方が現実的

本質的な教訓

  • 人間と機械の両方に使いやすいツールが最良
  • CLIは 長年の設計改善 で熟成
  • デバッグ性・構成性・認証連携 の面でCLIが優秀
  • MCPは 既存の良い仕組みを置き換えるには至らず

開発者への提言

  • MCPサーバー開発前に公式CLIの提供を優先 する重要性
  • まず APIとCLIを整備 し、エージェント側での活用を促進
  • LLMやエージェントは既存CLIを十分活用可能 である現実

Hackerたちの意見

昨年の5月頃から、反MCP・賛CLIの流れが続いてるね(私もその頃からずっと言ってるけど)。でも、MCPには本当に実用的な使い道があると思う。特に、MCPはカプセル化の素晴らしい単位なんだ。私はセキュアエージェントフレームワーク(https://github.com/sibyllinesoft/smith-core)を使って、MCPをサイドカー経由でマイクロサービスに変換してサービスメッシュに接続してる。これで、エージェントの機能を簡単にセキュアにできるんだ。エージェントは、すべてのコマンドをbashでcurlするだけで済むから、CLIが必要なくなる。CLIは少しトークン効率が良いけど、全体的にはシンプルさとパワーが大きな勝利だよ。

MCPとCLIのどちらが優れているかをみんなが議論してるなんて信じられない。どちらもツール呼び出しの方法で、LLMがどのフォーマットを使っても、同じ機能を提供できれば問題ないんだ。CLIの方がほんの少し良いかもしれないけど(LLMは一般的なCLIで訓練されてるかもしれないし)、MCPにも使い道がある(複雑な認証やユーザーをデータソースに接続するなど)。私の経験では、フロンティアモデルを使っているなら、どのツール呼び出しフォーマットを使ってもあまり関係ないよ。オーダーメイドのフォーマットでも問題ないしね。話すべき違いは、スキルがどれだけ効率的なコンテキスト管理を可能にするかだと思う。スキルはCLIの使用とよく結びつけられるけど、理由が見当たらない。例えば、AmpではスキルにMCPサーバーを接続できるんだ。エージェントがそのスキルを読み込むと、MCPサーバーが自動的に起動する[0]。MCPサーバーとCLIの両方において、スキルに組み込むことが効率的なコンテキストの方法だと思うし、他のエージェントもこの機能を採用してくれることを願ってるよ。[0]: https://ampcode.com/manual#mcp-servers-in-skills

MCP対CLIは、カッコのメリットと重要な空白について議論している現代版みたいなもんだね。つまり、長く議論することにはならないと思う。

MCPはトレーニング中にサポートされ、LLMに組み込まれる必要があるけど、CLIはすでにトレーニングセットで非常に一般的なんだ。MCPは特に大きなメリットを提供しないから、良いCLIツールとLLMによるその使用が今後の道だと思う。

同じ機能を提供できれば問題ないんだ。もしあなたの「機能」の定義が、提供されたツールのモデル理解や、ツールを理解しようとする際のトークンの無駄遣いを含むほど広いなら、それはいいけど。ツールを理解できないものを与えたら、同じ機能を持つツールを理解している場合でも、トークンを大量に消費することになるよ。ツールの組み合わせがパフォーマンスや成功率、効率に大きく影響することを示す証拠はたくさんある。あなたの段落の最後でも、いくつかのモデルにしか焦点を当てていないことを認めているよね。でもそれでも、理解できないツールを与えたら、トークンを無駄にすることになるよ。ツールは本当に重要なんだ。

いや、本当に重要なんだ。コンテキストトークンに与える影響があるから。MCPに関するGHの問題を読むだけで、仕様を読み込むのに54,000トークンも消費するんだ。複数のMCPを使うと、すぐにトークンが増えていくよ。

エージェントがそのスキルを読み込むと、MCPサーバーが自動的に起動する 現在のこのアプローチの主な問題は、プロンプトキャッシュが壊れることなんだ。LLMはすべてのツール定義がコンテキストウィンドウの最初に定義されることを期待しているから。入力トークンは推論コストの主な要因で、多くのユースケースはプロンプトキャッシングなしでは経済的じゃない。将来的には、LLMがコンテキストウィンドウのどこにでもツール定義を追加できるように訓練されることを願ってる。多くのユースケースがこれから恩恵を受けると思う。例えば、eコマースでは、最初にLLMに「カートをクリアする」ツールを提供する意味はあまりないから、アイテムが最初に追加された後に動的に提供できるといいよね。

両方ともツール呼び出しの方法で、LLMがツール呼び出しにどのフォーマットを使うかは、同じ機能を提供する限り関係ない。MCPのツール呼び出しはコンポーザブルじゃない。同じ機能じゃない。大きな違いだよ。

うん、もっとスキルを使わなきゃ。先週、自分が作ったスキルを使うまで、あんまり理解できてなかったんだ。スキルが実行される単一のコマンドのためだけにコンテキストに引き込まれるって知らなかった。スキルが呼ばれたらコンテキストに引き込まれて、そのまま残ると思ってた。今考えると、それはすごく強力なことだね。

MCP(特にリモートMCP)は、まるでブラックボックスAPIみたいだね。何もインストールしたり、リソースを準備したりする必要がない。呼び出すだけで、答えが返ってくる。そういうのも必要だけど、MCPは結局鈍器みたいなもんだ。一方でCLIツールは精密機器みたいなもの。確かに一度ローカルにインストールする必要があるけど、その後はローカル環境にアクセスできて、自分で物事を発見できる。特に大規模な構造化データを扱うのに強力なCLIが2つある:jqduckdb CLI。エージェントには、大きなJSON、CSV、Parquetファイルをコンテキストに読み込ませないように言ってる。代わりに、これらのCLIツールを使ってデータをサンプリングして賢く調べるんだ。そしてOpus 4.6はこれがすごく得意!数秒でデータの形を理解して、DuckDBやjqで「プロービング」クエリを書くんだ。ボトルネックにぶつかると、Opus 4.6は何が問題かを理解して、他のクエリ戦略を試す。うさぎの穴に入っていく様子を見て、そして自動的に回復するのは本当にすごい。これはML作業での探索的データ分析に特に役立つ。エージェントはこれらのツールを使って、データのエッジケースを素早くチェックして、私よりもずっと徹底的に仕事をしてくれる。CLIはMCPよりも「サクサク」動く感じがする。MCPは遅延があることが多いけど、CLIはリアルタイムで動くのが見える。これには特有の使いやすさがあるね。追記:エージェントと一緒に使うことが多い他のCLI:showboat(Simon Willison)でコードのリニアウォークスルーをする。br(Rust版Beads)でOpusに計画を実装するためのエピック/ストーリー/タスクを作成する。psqlでPostgresデータベースを調べる。roborev(Wes McKinney)で自動コードレビューと修正を行う。

俺もそれを見つけたよ。CLIはインタラクティブにテキストを出力したり入力したりするから、テキストベースのLLMには最適だと思う。視覚やマルチモーダルモデルが進化すれば、もっとクレイジーなインタラクションが見られると思うよ。duckdbについてだけど、ChatGPTとduckdbで話すのは楽しいけど、インメモリDBだけにしてるんだ。現在のフォルダにローカルでduckdbデータベースを保持するようなシステムプロンプトを設定してる?

一度ローカルにインストールするか、Dockerをインストールして、エージェントがローカルディレクトリをマウントしたDockerコンテナ内でCLIコマンドを実行する必要がある。そうすれば、基本的に何もインストールする必要がなくなる。CLIのやり取りのためにDocker(またはPodmanなど)を使う方法を説明する「スキル」を設定できると思うけど、まだ試してないんだ。

Hacker Newsで議論の続きを見る