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