
mcpsnoop v0.22.0
MCP向けWireshark。AIクライアントとMCPサーバーの間の透過プロキシ。すべての呼び出しをターミナルでライブ監視し、検出結果に基づいてCIを失敗させ、OpenTelemetryスパンをエクスポートします。
MCP 版 Wireshark。 mcpsnoop は AI クライアントと MCP サーバーの間に位置し、両者がやり取りするすべての JSON-RPC フレームを、どちら側にも変更を加えることなく記録します。ターミナルでライブに監視したり、検出結果に基づいて CI を失敗させたり、OpenTelemetry スパンとしてトレーシングバックエンドに送信したりできます。
課題
公式の MCP Inspector は独自のクライアントとして接続するため、あなたのクライアント(Cursor、Claude Code、Codex)が実際にサーバーへ送信している内容を目にすることはありません。また、リクエストの到着を待つ仕組みでは、モデルが呼び出さなかった呼び出しや、誤った引数で行った呼び出しを表示することはできません。ツールが黙って呼び出されない、ケイパビリティが噛み合わない、呼び出しが単にハングする——そんなとき、あなたはログを掘り返して推測するしかありません。
mcpsnoop は代わりに実際のデータパスに位置します。 サーバーコマンドをこれでラップすれば、実際のクライアントとサーバーが通信する様子を、すべての JSON-RPC フレームについてライブで監視できます。
CI での利用
このページは mcpsnoop GitHub Action のリスティングも兼ねているため、その全容をここに示します。キャプチャしたセッションを検査し、すべての検出結果をコードスキャンアラートとして記録し、ゲート条件に該当した場合にジョブを失敗させます。
permissions:
security-events: write
contents: read
steps:
- uses: kerlenton/[email protected]
with:
session: artifacts/session.jsonl
キャプチャを手元に用意できませんか?一度だけ自分のクライアントでセッションを記録してコミットすれば、あとはアクションがすべてのビルドに対してその記録をリプレイします。CI ではモデルも API キーも実行されません。リプレイは他のキャプチャと同様に検証され、サーバーが記録時よりも悪化した場合にはジョブも失敗します。Streamable HTTP 経由で到達するサーバーには、そのエンドポイントを指定した target が設定され、記録はどちらのトランスポートでもリプレイできます。
steps:
- uses: kerlenton/[email protected]
with:
replay: tests/mcp/claude-code-session.jsonl
server: node dist/index.js
releases ページから、任意のリリースを固定して使用できます。すべての入力と出力は後述のGitHub Actionに記載されており、チェックが失敗しうるすべてのシグナルはdocs/CI.mdに記載されています。
OpenTelemetry
MCP リビジョン 2026-07-28 では、プロトコルレベルの Logging が非推奨となり、実装は stdio 上の stderr、または構造化された可観測性のための OpenTelemetry へ移行することが推奨されています。mcpsnoop はクライアントやサーバーに手を加えることなく、その両方をカバーします。stdio サーバーの stderr 行はそのフレームの隣にストリーム内で表示され、すべてのリクエストはMCP 向け OpenTelemetry セマンティック規約に従うスパンになります。
mcpsnoop export -T otlp -o trace.json # spans from a capture
mcpsnoop --otlp-endpoint http://localhost:4318/v1/traces -- node build/index.js # spans as calls complete
ツール呼び出しは tools/call search という名前のスパンとして到着し、
mcp.method.name、gen_ai.tool.name、error.type を伴うため、mcpsnoop 向けに構築されたダッシュボードではなく、MCP 向けに構築されたダッシュボードに収まります。Prometheus 向けのライブツールメトリクスはフラグ1つで有効になります。どちらも
docs/OPENTELEMETRY.md に記載されています。
クイックスタート
何も設定せずに、すぐに試せます。
mcpsnoop demo
実際に使用するには、サーバーをクライアントのMCP設定でラップしてください。
{
"mcpServers": {
"my-server": {
"command": "mcpsnoop",
"args": ["--", "node", "build/index.js"]
}
}
}
-- 以降は、通常サーバーを起動するコマンドです。すでに使用しているもの、例えば python server.py、npx -y @scope/server、またはコンパイル済みバイナリに置き換えてください。
Claude Desktop では、その編集を手動で行う必要はありません。
mcpsnoop wrap my-server # route my-server through mcpsnoop
mcpsnoop unwrap my-server # put it back
wrap は claude_desktop_config.json を見つけ、初回に
claude_desktop_config.json.mcpsnoop.bak へコピーし、そのサーバーの
エントリだけを書き換えるため、あなたのフォーマットや他のすべてのサーバーはそのまま残ります。
書き換えられたエントリ内では、キーはアルファベット順に並びます。unwrap
はファイルを復元し、ラップされたサーバーがなくなるとバックアップを削除します。
MCP サーバーは起動時に一度だけ起動されるため、どちらの後でも Claude Desktop を再起動してください。
その後は通常どおりクライアントを使用し、UI を開いてください。
mcpsnoop
フラグもソケットパスも起動順序も覚える必要はありません。shimとUIは自動的に互いを見つけ、UIはディスクから過去のセッションをバックフィルします。
ストリーミング可能なHTTPサーバーの場合は、mcpsnoopをリバースプロキシとして実行します。
mcpsnoop http --target http://localhost:3000/mcp --listen :7000
すべてのレスポンスの HTTP ステータスがストリームに表示されるため、それ自体では JSON-RPC メッセージを持たないレスポンスも、何もないのではなく可視のフレームとして表示されます。これには、401 チャレンジ、拒否された Origin に対する 403、通知を確認応答する 202、そしてターゲットにまったく到達できない場合の 502 が含まれます。401 の WWW-Authenticate ヘッダーはそのまま保持され、インスペクターに表示されます。これは認証スキームと次に参照すべきリソースメタデータを示すためです。TUI で status:401 によりステータスでフィルタリングするか、status:err で任意の失敗によりフィルタリングできます。4xx または 5xx はエラーとしてカウントされるため、デフォルトの mcpsnoop check 実行はそれで失敗し、それが応答した呼び出しは、まだ待機中のものではなく失敗したものとして扱われます。
自分のサーバーがない場合は?公開テストサーバーに対して、自分のクライアントで駆動して実際に試すことができます。セッションが発生した後に検査するには、ログから過去のセッションをレビューするを参照してください。
インストール
npm
Go ツールチェーンは不要です。ほとんどの MCP サーバーは Node または Python で書かれているため、これが最も手軽な導入方法です。
npx mcpsnoop -- node build/index.js
npm パッケージ自体にはコードは含まれていません。6つのプラットフォームパッケージがそれぞれ1つのビルドを収めており、npm はお使いのマシンに一致する1つだけをインストールするため、インストール時にダウンロードするものも、プロキシでブロックを解除するものもありません。毎回取得するのではなく手元に保持しておくには、npm i -g mcpsnoop を実行してください。
Homebrew
brew install mcpsnoop
Go
go install github.com/kerlenton/mcpsnoop/cmd/mcpsnoop@latest
各プラットフォーム向けのビルド済みバイナリは Releases ページにあります。
mcpsnoop は bash、zsh、fish、PowerShell 向けの補完を提供しています。セットアップ手順については
mcpsnoop completion <shell> --help を実行してください。補完の有効化と、お使いの OS でのインストールパスについて説明しています。
コマンド
| コマンド | 機能 |
|---|---|
mcpsnoop -- <server> | stdio サーバーを透過的なシムとしてラップする |
mcpsnoop | ライブ TUI を開く |
mcpsnoop --metrics-listen <addr> | ヘッドレスハブを実行し、ライブ Prometheus メトリクスを公開する |
mcpsnoop http --target <url> | streamable-HTTP サーバーをプロキシする |
mcpsnoop export | セッションを json、html、text、har、otlp としてレンダリングする |
mcpsnoop check | エラー、無効なフレーム、ツール結果が自身の outputSchema に違反するなどの警告、ルーティングの不一致、ハングした呼び出し、遅延した結果、二重に実行された可能性のある呼び出し、ツールのドリフト、緩和された、または何も示さないアノテーション、レイテンシ予算のいずれかで CI を失敗させる |
mcpsnoop baseline | 信頼済みのツール定義を検査、承認、またはリセットする |
mcpsnoop diff | 2 つのキャプチャ済みセッション間でツールと呼び出しを比較する |
mcpsnoop open | 保存済みセッションを TUI で開く |
mcpsnoop mock <session> | キャプチャ済みセッションを stdio MCP サーバーとして再生する |
mcpsnoop replay <session> -- <server> | stdio または Streamable HTTP 経由で、記録済みセッションのクライアント側を使ってサーバーを駆動し、結果を記録と比較する |
mcpsnoop inventory | このマシン上で mcpsnoop を通じて実行されたすべてのサーバーを一覧表示する |
mcpsnoop stats | 保存されたすべてのキャプチャをサーバーとツールごとに 1 行に集約する |
mcpsnoop clients | 各 MCP クライアントが実際にワイヤー上で何を行ったかを、名前とバージョンごとに表示する |
mcpsnoop prune | 指定したカットオフより古い保存済みセッションログを削除する |
mcpsnoop wrap <server> | Claude Desktop のサーバーの 1 つを mcpsnoop 経由でルーティングする |
mcpsnoop unwrap <server> | そのサーバーのエントリを元の状態に戻す |
mcpsnoop remote <user@host> | SSH トンネルコマンドを出力する |
mcpsnoop demo | スクリプト化されたセッションを再生する |
完全なリストについては mcpsnoop help を、特定のコマンドのフラグについては mcpsnoop help <command> を実行してください。
比較
これらのツールはそれぞれ異なる問いに答えるものであり、ツールがどこに位置するかによって、どの問いに答えられるかが決まります。
| ツール | 位置 | 用途 |
|---|---|---|
| MCP Inspector | 独自のクライアントとして、あなたのサーバーに接続 | ブラウザまたはスクリプト可能な CLI から、サーバーを手動で試す |
| Snyk Agent Scan | 独自のクライアントとして、設定内のサーバーを起動または接続してツールを読み取る | マシン上のエージェント、MCP サーバー、スキルをプロンプトインジェクションや脆弱性についてスキャンする |
| MCP Observatory | 独自のクライアントとして、サーバーを起動してテスト、記録、検証する | 攻撃シミュレーション、スキーマドリフト、記録・再生・検証を備えた、CI でのセキュリティおよびリグレッションテスト |
| mcprec | ワイヤー上、クライアントとサーバーの間 | セッションを一度記録し、ネットワークなしでテストフィクスチャとして再生する |
| mcpsnoop | ワイヤー上、クライアントとサーバーの間 | 実際のクライアントとサーバーが何を言っているかを監視し、実際のクライアントのセッションを各ビルドに対して再生し、それで CI を失敗させ、OpenTelemetry としてエクスポートする |