以下はhttps://mariozechner.at/posts/2025-11-02-what-if-you-dont-need-mcpの翻訳です。
そもそもMCP(マルチコンポーネントプロトコル)は本当に必要なものなのか?
目次
- 私のブラウザ開発者ツール(DevTools)のユースケース
- エージェント向けの一般的なブラウザDevToolsの問題点
- Bash(とコード)の活用
- Startツール
- Navigateツール
- Evaluate JavaScriptツール
- Screenshotツール
- メリット
- Pickツールの追加
- Cookiesツールの追加
- 具体例(Contrived Example)
- これをエージェント間で再利用可能にする方法
- 結論
数か月にわたるエージェントコーディングの熱狂の後も、TwitterではMCPサーバーに関する議論が盛んに交わされています。以前、私はBashツールとMCPサーバーのどちらが特定のタスクに適しているかを測る非常に軽いベンチマークを行いました。結論(TL;DR):注意深く使えば、どちらも効率的になり得ます。
残念ながら、最も人気のあるMCPサーバーの多くは、特定のタスクには非効率的です。それらはあらゆる状況をカバーする必要があるため、ツールの数が多くなり、その詳細な説明が大量のコンテキストを消費します。
既存のMCPサーバーを拡張するのも困難です。ソースコードを確認して修正することは可能ですが、そうすると、エージェントと一緒にそのコードベースを理解しなければなりません。
MCPサーバーにはコンポジション性がないという問題もあります。MCPサーバーが返す結果をディスクに永続化したり、他の結果と組み合わせたりするためには、エージェントのコンテキストを介す必要があります。
私は単純な人間なので、単純なものが好きです。エージェントはBashを実行し、コードをうまく書くことができます。Bashとコードにはコンポジション性があります。したがって、エージェントがCLIツールを呼び出し、コードを書くこと以上にシンプルな方法があるでしょうか?これは何も新しいことではありません。私たちは最初からずっとこれをやってきました。私が皆さんに納得していただきたいのは、多くの場合、MCPサーバーは必要ない、あるいは望ましくないということです。
この点を、一般的なMCPサーバーのユースケースであるブラウザ開発者ツールを使って説明しましょう。
私のブラウザDevToolsのユースケース
私のユースケースは、エージェントと一緒にWebフロントエンドの作業を行うこと、または、エージェントを悪用して小さなスクレイピングハッカーボーイにし、世界中のデータをスクレイピングすることです。これらの2つのユースケースのために、私が必要とするツールは最小限のセットだけです。
- ブラウザを起動する(オプションで、ログイン済みのデフォルトプロファイルを使用)
- アクティブなタブまたは新しいタブでURLにナビゲートする
- アクティブなページコンテキストでJavaScriptを実行する
- ビューポートのスクリーンショットを撮る
そして、私のユースケースで追加の特別なツールが必要になった場合、私はエージェントにそれを迅速に生成させ、他のツールと一緒に組み込めるようにしたいのです。
エージェント向けの一般的なブラウザDevToolsの問題点
上記のユースケースに対して、人々はPlaywright MCPやChrome DevTools MCPを推奨するでしょう。どちらも問題ありませんが、あらゆる状況をカバーする必要があります。Playwright MCPは21個のツールを使用し、13.7kトークン(Claudeのコンテキストの6.8%)を消費します。Chrome DevTools MCPは26個のツールを使用し、18.0kトークン(9.0%)を消費します。これほど多くのツールは、他のMCPサーバーや組み込みツールと組み合わせた場合、エージェントを混乱させるでしょう。
これらのツールを使用するということは、コンポジション性の問題に悩まされることにもなります。つまり、あらゆる出力がエージェントのコンテキストを介さなければならないのです。サブエージェントを使用することでこの問題をある程度解決できますが、そうするとサブエージェントに付随するあらゆる問題を引きずり込むことになります。
Bash(とコード)の活用
私の最小限のツールセットをREADME.mdで示します。
# Browser Tools
Minimal CDP tools for collaborative site exploration.
## Start Chrome
```bash
./start.js # Fresh profile
./start.js --profile # Copy your profile (cookies, logins)
Start Chrome on :9222 with remote debugging.
Navigate
Bash
./nav.js [https://example.com](https://example.com)
./nav.js [https://example.com](https://example.com) --new
Navigate current tab or open new tab.
Evaluate JavaScript
Bash
./eval.js 'document.title'
./eval.js 'document.querySelectorAll("a").length'
Execute JavaScript in active tab (async context).
Screenshot
Bash
./screenshot.js
Screenshot current viewport, returns temp file path.
これが私がエージェントに提供するすべてです。これは私のユースケースの全ての要点をカバーする一握りのツールです。各ツールはPuppeteer Coreを使用するシンプルなNode.jsスクリプトです。このREADMEを読むことで、エージェントは利用可能なツール、いつそれらを使用するか、そしてBashを介してどのようにそれらを使用するかを知ることができます。
エージェントがブラウザと対話する必要があるセッションを開始するときは、そのファイルを完全に読み込むように指示するだけでよく、それだけで効果を発揮します。これが実際にいかに少ないコードであるかを、その実装を順に見ていきましょう。
### The Start Tool
エージェントは新しいブラウザセッションを開始できる必要があります。スクレイピングタスクの場合、どこにでもログインしている実際のChromeプロファイルを使用したいことがよくあります。このスクリプトは、私のChromeプロファイルを一時フォルダに`rsync`で同期するか(Chromeはデフォルトプロファイルでのデバッグを許可しないため)、またはまっさらな状態で開始します。
(*ここに`start.js`のコードがあります。*)
エージェントが知る必要があるのは、`start.js`スクリプトをBashで実行することだけであり、`--profile`を付けるか付けないかの違いだけです。
### The Navigate Tool
ブラウザが実行されたら、エージェントはURLにナビゲートする必要があります。新しいタブでもアクティブなタブでも構いません。ナビゲートツールが提供するのはまさにそれです。
(*ここに`nav.js`のコードがあります。*)
### The Evaluate JavaScript Tool
エージェントは、アクティブなタブのDOMを読み取り、変更するためにJavaScriptを実行する必要があります。エージェントが書くJavaScriptはページコンテキストで実行されるため、Puppeteer自体をいじる必要はありません。エージェントが知る必要があるのはDOM APIを使用してコードを書く方法だけであり、それは確かに得意なことです。
(*ここに`eval.js`のコードがあります。*)
### The Screenshot Tool
エージェントはページの視覚的な印象を持つ必要があることがあるため、当然ながらスクリーンショットツールが必要になります。
(*ここに`screenshot.js`のコードがあります。*)
これはアクティブなタブの現在のビューポートのスクリーンショットを撮り、一時ディレクトリ内の.pngファイルに書き込み、ファイルパスをエージェントに出力します。エージェントはそのファイルパスを読み込み、ビジョン機能を使って画像を「見る」ことができます。
### メリット
では、これは私が上で触れたMCPサーバーと比べてどうでしょうか?まず、必要なときにいつでもREADMEを引き出すことができ、セッションごとにその費用を払う必要がありません。これはAnthropicが最近導入したスキル機能に非常に似ています。ただし、これはさらにアドホックで、あらゆるコーディングエージェントで機能します。私がする必要があるのは、エージェントにREADMEファイルを読み込むように指示することだけです。
(*ここでAnthropicのスキルシステムとこのセットアップの類似点についての補足的な説明があります。*)
READMEについて言えば、上記のMCPサーバーのように13,000〜18,000トークンを引き込む代わりに、このREADMEはわずか225トークンです。この効率性は、モデルがコードの書き方とBashの使い方を知っているという事実から来ています。私は、彼らの既存の知識に大きく依存することで、コンテキストスペースを節約しています。
これらのシンプルなツールにはコンポジション性もあります。呼び出しの出力をコンテキストに読み込む代わりに、エージェントは、後で自分自身またはコードによって処理するために、それらをファイルに保存することを決定できます。エージェントはまた、単一のBashコマンドで複数の呼び出しを簡単に連鎖させることができます。
ツールの出力がトークン効率的でないとわかった場合、使用するMCPサーバーによっては困難または不可能なことですが、私は出力形式を変更することができます。
そして、私のニーズに合わせて新しいツールを追加したり、既存のツールを修正したりすることが信じられないほど簡単です。例を挙げて説明しましょう。
### Pickツールの追加
エージェントと私が特定のサイトのスクレイピング方法を考え出すとき、私がDOM要素をクリックするだけで直接指摘できる方が効率的なことがよくあります。これを非常に簡単にするために、ピッカーを作成できます。READMEに追加するのは次のとおりです。
Pick Elements
Bash
./pick.js "Click the submit button"
Interactive element picker. Click to select, Cmd/Ctrl+Click for multi-select, Enter to finish.
そして、これがコードです。
(*ここに`pick.js`のコードがあります。*)
エージェントにDOM構造を理解させる代わりに、私がDOM要素の束をクリックする方が速いと判断した場合、私はエージェントに`pick`ツールを使用するように指示するだけです。これは非常に効率的で、あっという間にスクレイパーを構築できます。また、サイトのDOMレイアウトが変更された場合にスクレイパーを調整するのにも最適です。
このツールが何をするのかを理解するのが難しい場合は心配しないでください。ブログ記事の最後に、動作中のビデオがあります。それを見る前に、もう一つのツールを紹介しましょう。
### Cookiesツールの追加
最近のスクレイピングの冒険の一つで、決定的なスクレイパーが私になりすますことができるように、そのサイトのHTTP専用Cookieが必要になりました。`Evaluate JavaScript`ツールはページコンテキストで実行されるため、これを処理することはできません。しかし、Claudeにそのツールを作成させ、readmeに追加するように指示するのに1分もかからず、すぐに作業に取り掛かることができました。
(*ここに`cookies.js`のコードがあるはずです。*)
これは、既存のMCPサーバーを調整、テスト、デバッグするよりもはるかに簡単です。
### 具体例(Contrived Example)
このツールセットの使用方法を、具体例で説明させてください。私はシンプルなHacker Newsスクレイパーを構築することに着手しました。基本的に、エージェントがDOM要素に基づいて最小限のNode.jsスクレイパーを書けるように、私がDOM要素を選びます。それが実際にどのように見えるかを見てみましょう。Claudeがいつものように遅いセクションをいくつか早送りしました。
現実世界のスクレイピングタスクは、もう少し複雑になるでしょう。また、Hacker Newsのようなシンプルなサイトでこのように行う意味もありません。しかし、アイデアは理解できるでしょう。
(*ここに最終的なトークン集計があるはずです。*)
### これをエージェント間で再利用可能にする方法
Claude Codeや他のエージェントでこれを使用できるように、私は次のように設定しています。ホームディレクトリに`agent-tools`というフォルダがあります。次に、上記のブラウザツールリポジトリのような個々のツールのリポジトリをそのフォルダにクローンします。そして、エイリアスを設定します。
```bash
alias cl="PATH=$PATH:/Users/badlogic/agent-tools/browser-tools:<other-tool-dirs> && claude --dangerously-skip-permissions"
これにより、すべてのスクリプトがClaudeのセッションで利用可能になりますが、私の通常の環境を汚染することはありません。また、名前の衝突を避けるために、各スクリプトに完全なツール名(例:browser-tools-start.js)をプレフィックスとして付けています。さらに、エージェントに対して、すべてのスクリプトがグローバルに利用可能であることを伝える単一の文をREADMEに追加します。この方法により、エージェントはツールスクリプトを呼び出すためだけに作業ディレクトリを変更する必要がなくなり、トークンを節約し、エージェントが頻繁な作業ディレクトリの変更によって混乱する可能性を減らします。
最後に、/add-dirを介してエージェントツールディレクトリをClaude Codeに作業ディレクトリとして追加し、@README.mdを使用して特定のツールのREADMEファイルを参照し、エージェントのコンテキストに取り込むことができるようにします。私は、実際には信頼性が低いことがわかったAnthropicのスキル自動検出よりもこちらを好みます。これはまた、さらにいくつかのトークンを節約することを意味します。Claude Codeは、見つけることができるすべてのスキルのフロントマターをシステムプロンプト(または最初のユーザーメッセージ、忘れました。詳細はhttps://cchistory.mariozechner.atを参照)に挿入するからです。
結論
これらのツールを構築することは信じられないほど簡単であり、必要なすべての自由を与え、あなた、あなたエージェント、そしてあなたのトークン使用量を効率的にします。ブラウザツールはGitHubで見つけることができます。
この一般的な原則は、何らかのコード実行環境を持つあらゆる種類のハーネスに適用できます。MCPの枠を超えて考えてみてください。そうすれば、これがMCPで従わなければならないより厳格な構造よりもはるかに強力であることがわかるでしょう。
ただし、大きな力には大きな責任が伴います。これらのツールをどのように構築し、維持するかについて、自分で構造を考え出す必要があります。Anthropicのスキルシステムはそのための一つの方法かもしれませんが、それは他のエージェントへの移植性が低くなります。あるいは、上記の私のセットアップに従うこともできます。




免責事項
記事は、一般的な情報提供のみを目的としてのみ作成したものであり、投資家に対する有価証券の売買の推奨や勧誘を目的としたものではありません。また、記事は信頼できると判断した資料およびデータ等により作成しておりますが、その正確性および完全性について保証するものではありません。また、将来の投資成果や市場環境も保証されません。最終的な投資決定は、投資家ご自身の判断でなされますようお願いします。
