エージェントにシェルがあるなら、コマンドラインを渡しましょう

AIエージェントにとってのMCPとCLIの違いは、1つの問いに集約されます。エージェントにシェルがあるかどうかです。Claude Code、Codex、Cursorのようにシェルがあるなら、よく作られたコマンドラインのほうがたいてい優れたインターフェースです。必要なものだけを読み込み、シェル内のほかのあらゆるものと組み合わせられ、すべてのコマンドを自分でも実行できます。チャットアプリのようにシェルがないなら、MCPが入口になります。 私たちはTime Momentumのエージェント向けアクセスをコマンドラインtmとして作り、MCPサーバーは採用しませんでした。このガイドではその理由と、その選択が誤りになる場面を説明します。

更新日 2026年10月10日

MCPとは

Model Context Protocolは、自らの説明によれば「AIアプリケーションを外部システムに接続するためのオープンソースの標準」です(modelcontextprotocol.io)。プロジェクトはこれをUSB-Cポートにたとえています。1つの差し込み口で多くの機器につながるということです。

現行の仕様(バージョン2026-07-28)は、ホスト(AIアプリケーション)、クライアント(その中のコネクター)、サーバー(データやツールを提供するサービス)を定義し、これらはJSON-RPCで通信します。サーバーはリソース、プロンプト、ツールを提供できます。エージェントが最もよく使うのはツールです。クライアントはtools/listでサーバーにツールの一覧を求め、各ツールには名前、説明、入力用のJSON Schemaが付いています。

AIエージェント向けのCLI設計:コマンドラインをエージェントに適したものにする要素

コマンドラインが自動的にエージェントに向いているわけではありません。人間がめったに求めない、いくつかの性質が必要です。

  • 自身をデータとして説明する:--helpと全コマンドのカタログをJSONで提供し、エージェントがフラグを推測する必要をなくします。
  • 出力は契約である:--jsonでは標準出力にちょうど1つのJSON文書を、エラーは標準エラー出力にJSONで返します。
  • 終了コードに意味を持たせる:呼び出しを修正する、人に確認する、待つ、再試行する。1つの数字が、次に何をすべきかをエージェントに伝えます。
  • 答えられない入力を待たない:ターミナルがなければ、何も問い合わせません。破壊的な操作には--yesのような明示的なフラグが必要です。
  • 実行せずに見せられる:--dry-runは、送信せずに正確なリクエストを表示します。
  • 秘密情報を出力に含めない:--verboseや--dry-runでも同様です。エージェントが見たものはすべてそのコンテキストに入るからです。
  • エージェントが動くあらゆる場所に簡単にインストールできる:理想的には依存関係のツリーなしで。

AIエージェントにとってのMCPとCLIの違い:早見表

問いMCPサーバーエージェントに適したCLI
最初の呼び出し前に使われるコンテキスト一部対応多くの場合、すべての定義求められたときだけ
モデルを介さずに結果を組み合わせられる–モデル経由パイプ、jq、スクリプト
エージェントの操作を自分で再現できる一部対応Inspector同じコマンド
バージョンを固定できる一部対応サーバー次第
シェルを持つエージェントで動く一部対応クライアントが対応していれば
シェルのないチャットアプリで動く–
標準化された検出とサインインtools/list、OAuth–独自の慣習

更新日: 2026年10月10日

コンテキスト:定義を最初に読むか、必要なときに読むか

Anthropicのエンジニアリングチームは2025年11月に、この問題を「ほとんどのMCPクライアントは、すべてのツール定義を最初にそのままコンテキストへ読み込む」と説明し、こうした説明が応答時間とコストを増やすと指摘しました(Code execution with MCP)。推奨は、モデルに必要に応じてツール定義を読ませることです。

公平を期せば、クライアント側も追いついてきています。Claude Codeは現在、MCPツールの読み込みを初期設定で遅延させます。セッション開始時に読み込まれるのはツール名とサーバーの指示だけで、完全な定義はClaudeがツールを検索したときに読み込まれます(MCP tool search)。ほかのクライアントは、今もすべてを読み込むかもしれません。

CLIなら、必要に応じた読み込みが最初から実現しています。エージェントがコマンドを実行するまで、コンテキストには何も入らないからです。tm 0.3.0で読み込める量を測定しました。全カタログ(tm schema --json)は377,203文字、全コマンドグループの概要(tm --json)は32,110文字、invoicesグループは104,009文字です。1つのコマンドは、157コマンドの中央値で934文字です。方法:2026年10月10日にnpx -y @time-momentum/cli@0.3.0 schema --json | wc -c、ほかの呼び出しも同様に計測。

カタログは小さくありません。そこが要点です。何を読み込むかはエージェントが決め、通常は1つのグループか1つのコマンドです。

組み合わせやすさ:パイプ、jq、スクリプト

同じAnthropicの記事が述べるとおり、MCPでは「すべての中間結果がモデルを通過しなければならない」のです。エージェントが数えるだけでよい500件の請求書の一覧も、そのコンテキストに入ってしまいます。

シェルでは、エージェントは読む前に絞り込めます。tm payments outstanding --json | jq '[.data[].summary.outstanding_micros] | add / 1000000'は、未入金の合計額(ユーロ)を1つの数字で返します。tm invoices list --all --json | jq '[.data[] | select(.status == "draft")] | length'は、全ページにわたって下書きを数えます。同じ行は、エージェントなしでもcronジョブやシェルスクリプトで動きます。

認証:OAuthかAPIキーか

MCPでは認可は任意です。HTTP経由のリモートサーバーは仕様のOAuth 2.1フローに従うべきとされ、stdio経由のローカルサーバーは環境から認証情報を受け取ります。各ユーザーが自分のアカウントでサインインするチャットアプリなら、OAuthのほうが快適です。

CLIは通常APIキーで動作します。簡単ですが、注意が必要です。キーがエージェントの読むものに現れてはいけません。tmはキーをモード600のローカルファイルまたは環境変数に保存し、書き込み用キーを1時間有効なトークンと交換し、--verboseや--dry-runでもキーを表示しません。この交換で得たトークンでは、新しいキーの作成もアカウントの削除もできません。

テストしやすさ:ドライランと、自分でも使える同じコマンド

エージェントがCLIを通じて行うすべての呼び出しは、コピーして読み、自分でも実行できる1行です。--dry-runはさらに一歩進み、何も送信せずにメソッド、URL、本文を表示します。これにより、エージェントの作業を実行前に確認できます。これは請求書で特に重要です。

MCPにも、開発者向けのMCP Inspectorのようなツールがあります。しかし、ツール呼び出しは、何が起きるかを見るために自分のターミナルに打ち込めるものではありません。

バージョン管理:固定するか、追従させるか

CLIはバージョンを持つパッケージです。固定でき(npx -y @time-momentum/cli@0.3.0)、元に戻せ(tm update --to <version>)、昨日動いたスクリプトが今日も動くとわかります。古いバージョンが誤って扱うようなAPIの変更があった場合、サーバーはそのバージョンを明確なエラーと更新コマンドを添えて拒否します。

MCPはプロトコルを日付でバージョン管理し、サーバーが実行中にツール一覧の変更を通知できるようにしています。今日どのツールが使えるかは、リモートサーバーが自分で決めます。何も壊れないうちは便利です。

対応範囲:シェルを持つあらゆるエージェント

Claude Code、Codex、Cursor、そしてほとんどのコーディングエージェントはシェルコマンドを実行できます。CLIは、クライアントがほかに何かをサポートしなくても、それらすべてで動作し、サンドボックスやCIでも同様です。

MCPのほうが適している場面

  • シェルのないクライアント。claude.ai、Claude Desktop、Claudeのモバイルアプリは、MCPサーバーであるコネクターを通じて外部ツールにアクセスします(Claude docs)。そこではCLIは役に立ちません。
  • 標準化された検出。どのMCPサーバーもtools/listに同じ方法で応答し、公式MCP Registryがサーバーを一覧にしています。CLIはそれぞれ独自の方法で自身を説明します。
  • ユーザーごとのサインイン。OAuthなら、各自がキーを扱わずに自分のアカウントを接続できます。
  • 技術者でないユーザー。チャットアプリでコネクターを追加するほうが、コマンドラインをインストールするより簡単です。

Time Momentumのやり方

私たちのユーザーのエージェントは、すでにシェルで顧客プロジェクトに取り組んでいます。そのためTime MomentumにはMCPサーバーがありません。あるのはtm、製品全体を操作するコマンドラインです。工数、顧客、案件、プロジェクト、請求書と電子請求書、入金、作業報告書、採算。

tmには実行時の依存関係がありません。コマンドライン向けのREST APIのすべての操作にちょうど1つのコマンドがあり、バージョン0.3.0では143の操作に対応しています。APIを変更するたびに、テストがこれを強制します。tm skillは、インストール済みのバージョンに合った使い方ガイドを返します。Claude Codeではtm skill --installがそれを指す短いスキルを追加し、Time MomentumはClaude Codeのプラグインとしても利用できます。

請求書の発行や取消、削除には明示的な--yesが必要です。それがなければ、ターミナルのない環境ではtmは停止します。

関連情報

  • AIエージェント向け

    エージェントがtmを通じてTime Momentumでできること、セキュリティモデル、設定方法。

    AIエージェント向け
  • AIエージェントのための業務ソフト

    顧客、請求書、入金を扱う作業をエージェントに安全に任せられるソフトウェアかを見極める方法。

    ガイドを読む

請求業務をシェルからエージェントに任せる

  • Proを30日間
  • クレジットカード不要
  • その後はFreeで継続

よくある質問

AIエージェントにはCLIとMCPサーバーのどちらが適していますか?

Claude Code、Codex、Cursorのようにシェルを持つエージェントなら、よく作られたCLIのほうがたいてい優れています。エージェントが求めたものだけを読み込み、モデルが読む前に結果をパイプで絞り込め、すべての呼び出しを自分でも再現できます。シェルのないチャットアプリでは、MCPが唯一の選択肢です。

MCPのツール定義はコンテキストウィンドウを消費しますか?

多くのクライアントでは消費します。Anthropicは2025年11月に、ほとんどのMCPクライアントがすべてのツール定義を最初に読み込むと書いています。Claude Codeは現在、初期設定でこれを遅延させ、開始時にはツール名だけを読み込みます。

CLIをエージェントに適したものにするのは何ですか?

機械可読なコマンドカタログ、呼び出しごとにちょうど1つのJSON文書、JSON形式のエラー、意味のある終了コード、ターミナルがない場合の対話的な問い合わせの排除、破壊的な操作のための明示的な確認フラグ、ドライラン、そして出力に秘密情報を含めないことです。

Time MomentumにMCPサーバーはありますか?

いいえ。エージェントはコマンドラインのtmを使い、tm向けのすべてのAPI操作に対応しています。Claude Code向けには、スキルとプラグインもあります。