mcpvet について
mcpvetは、MCPサーバー、エージェントスキル、クライアント設定、npmパッケージをインストール前に検査するセキュリティスキャナーです。証拠付きの静的検査に加え、任意のライブプローブでサーバー応答を比較できます。
主な機能
- 01対象を実行しない静的スキャン
- 02ツール、設定、スクリプト、マニフェストの検査
- 03機能リスクと類似名の検出
- 04証拠付きの決定的な判定
- 05任意のライブ整合性・フィンガープリント検査
活用シーン
- 01インストール前のMCPサーバー確認
- 02スキルディレクトリとクライアント設定の監査
- 03利用前のnpmパッケージメタデータ確認
- 04複数回のプローブによるstdioサーバー比較
MCP 対応
`mcpvet mcp`コマンドはstdio MCPサーバーを提供し、ローカルパス、npmパッケージメタデータ、stdioサーバーコマンドを検査するツールを備えます。プローブツールは指定されたコマンドを実行します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
2掲載時のツール一覧 · 3 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| path | string | はい | 審査するローカルディレクトリ:MCP サーバーディレクトリ、SKILL.md を含むスキルディレクトリ、またはクライアント MCP 設定を含むツリー |
詳細
mcpvet
MCP サーバーやエージェントスキルをインストールする前に検査します。
2026 年初頭、ClawHavoc の波により、わずか 12 アカウントから公開スキルマーケットプレイスに 1,184 件の悪意あるスキルが投稿されました。役立つエージェントスキルを装った認証情報窃取ツールやリバースシェルが、エージェント自身が持つ権限をそのまま引き継いでいました。インストールする MCP サーバーを監査している組織はごく少数で、スキルパックを監査している組織はほとんどありません。インストールをクリックすることが信頼性の判断となりますが、通常は何の証拠もないまま行われています。
mcpvet はインストール前のチェックツールです。ローカルの MCP サーバーディレクトリ、SKILL.md のスキルディレクトリ、クライアント設定ツリー、または npm パッケージ名を指定すると、検出結果ごとの証拠とともに、VETTED、REVIEW、DO-NOT-INSTALL のいずれかの判定を返します。スキャンは静的解析のみです。スキャン対象のコードはテキストとして読み取られ、実行、インポート、インストールされることはありません。
0.2.0 以降、明確に区別された別モードとしてライブモード(mcpvet probe)も利用できます。stdio サーバーコマンドを 2 回起動し、その応答を比較します。プローブの整合性、完全一致するハッシュのフィンガープリント照合、記録されたシグナルから算出するサーバーレベルのリスクスコアを確認します。ライブモードでは対象が実行されます。そのため、静的スキャンに統合せず、別のコマンドとして提供しています。
インストール
npx -y @reneturcios/mcpvet --version
npm install -g @reneturcios/mcpvet
docker run -i --rm ghcr.io/cloudcorprecords/mcpvet mcp
クイックスタート
mcpvet vet ~/src/some-mcp-server
mcpvet vet ~/skills/some-skill --json
mcpvet vet-package @modelcontextprotocol/[email protected]
mcpvet probe -- node ~/src/some-mcp-server/dist/index.js
mcpvet mcp
CLI の終了コード:判定が VETTED の場合は 0、REVIEW または DO-NOT-INSTALL の場合は 1、使用方法またはセットアップのエラーの場合は 2、レポートの送信前に読み取り側が出力パイプを閉じた場合は 141 です。
チェック項目
| チェック項目 | 検出対象 |
|---|---|
| ツール一覧 | 宣言されたツール(server.json、package.json、ツールマニフェスト)と、ソースコードで実際に登録されているツールの照合、およびリソースとプロンプト |
| 機能の組み合わせ | ファイルシステムの読み取りとネットワークへの外向き通信、環境変数へのアクセスと外向き通信、認証情報ストアへのアクセスと外向き通信、ツールの公開範囲から実行可能なシェル実行 |
| 設定監査 | クライアント設定(claude_desktop_config.json、.mcp.json、Cursor と VS Code の mcp.json):自動起動エントリー、バージョンが固定されていないパッケージでの npx -y、curl の結果をパイプで渡してシェルを起動する処理、シェルラッパー、認証情報らしきキーを取り込む広範な環境変数ブロック、環境変数全体の受け渡し |
| インストールスクリプト | package.json の preinstall、install、postinstall、prepare スクリプト。リモートダウンロードをシェルにパイプするなど、ドロッパーの形式は「重大」と判定されます |
| マニフェストの真正性 | package.json または server.json が存在するものの、解析不能、読み取り不能、サイズ超過でスキップ、または通常ファイルではない場合は、「存在するが監査されていない」として報告され、MANIFEST-UNPARSEABLE または MANIFEST-UNREADABLE の検出結果が記録されます。存在しないものとして扱われることはありません。解析前にバイトオーダーマークのプレフィックスを取り除くため、BOM 付きのマニフェストは通常どおり監査されます |
| 同梱スクリプト | リバースシェルの形式(ソケット接続、起動したシェル、およびそれらをつなぐパイプで構成されるリバースシェルを含む)、認証情報ストアの読み取りとネットワークリクエストの両方を行う単一ファイル、永続化の仕組み(セッションフック、スケジュールされたタスク、自動起動エントリー)、ダウンロードして実行するドロッパー |
| 説明文の言語 | ツールの説明、パッケージの説明、SKILL.md のテキストに含まれる、指示の上書き、ユーザーに操作を隠す、認証情報を外部に送信する、説明文からシェルコマンドを実行するといった指示や情報流出を促す文言 |
| ドキュメント内のダウンロードと実行 | パッケージ内のどこかにテキストとして記述されたダウンロードして実行する手順(SKILL.md の前提条件、README、その他のドキュメント、同梱スクリプトなど):リモートからのダウンロードをシェルやインタープリターにパイプまたは代入する処理、あるいはダウンロードと実行を同じ行で行う処理です。自動起動設定やインストールスクリプトにある同じ形式と同様、「重大」と判定されます。実行手順を伴わないダウンロードでは、この検出結果は記録されません |
| ネイティブバイナリ | パッケージに同梱されたコンパイル済みネイティブアーティファクト(.node、.dll、.so、.dylib ファイル、または prebuilds ディレクトリ)。ネイティブコードは静的テキストスキャンでは監査できないため、存在は NATIVE-BINARY 検出結果とともに「中」と判定され、判定結果は最低でも REVIEW となります。存在することは悪意の証拠ではなく(正当なパッケージの多くがビルド済みアドオンを同梱しています)、それだけで DO-NOT-INSTALL に引き上げられることもありません。ただし、サーバーを信頼する前にバイナリをレビューするか、パッケージをソースからビルドしてください。MALFEX imgdecode キャンペーンでは、まさにこの形式でペイロードが隠されていました。つまり、インストールスクリプトが一切ない状態で、require 時に読み込まれるネイティブアドオンが prebuilds/ に配置されていました |
| 不一致 | コードに存在しない宣言済みツール、コードに存在する未宣言のツール、server.json と package.json の名前またはバージョンの不一致 |
| バージョン固定 | バージョンフィールドの欠落、latest や * などの更新されるタグ、バージョンのないレジストリーエントリー、バージョンが固定されていないコンテナー参照 |
| タイポスクワット | 対象名とパッケージ名の編集距離が、既知の MCP サーバー名のリストにある名前から 1(長い名前では 2)であるもの |
| プローブの一貫性(ライブのみ) | サーバーを 2 回起動し、同じ質問(initialize、tools/list)を行います。2 回の同一プローブ間で、ID、ツールセット、説明、スキーマに差異があれば、差分を証拠としてシグナルに記録されます |
| フィンガープリント(ライブのみ) | 提示されたツールセットとツールの説明をハッシュ化し(正規化された JSON に対する sha256)、同梱のフィンガープリントファイルと比較します。一致は完全一致のみで、あいまい一致は行いません。各エントリーには出所が記録されています |
| リスクスコア | すべてのレポートには、記録されたシグナル(静的検出結果、またはプローブモードでのライブシグナル)から算出される 0〜100 のスコアが含まれます。スコアは読み取り時にシグナルリストから計算され、カウンターとして保持されることはありません。判定ルールに取って代わるものではなく、判定結果の参考として使用されます |
判定ルール
- DO-NOT-INSTALL:重大な指摘事項が1つ以上ある場合です。リバースシェル、認証情報窃取ツール、インストール時に実行されるドロッパー、curl の結果をシェルにパイプして自動起動する処理、スキルのドキュメントに記載されたダウンロード後の実行手順は、ここに分類されます。
- REVIEW:重大な指摘事項はなく、高または中の指摘事項が1つ以上ある場合です。危険な機能の組み合わせ、未申告のツール、タイポスクワッティング、環境変数を収集する設定、バージョンが固定されていない自動起動処理は、ここに分類されます。不完全なスキャンも、少なくともここに分類されます。マニフェストが存在するものの、解析または読み取りができなかった場合、スキャンは対象全体を確認できていないため、その状態では VETTED にはなりません。
- VETTED:重大、高、中の指摘事項がない場合です。情報および低レベルの指摘事項(自動起動処理の一覧そのものなど)も、証拠として報告されます。
判定結果はスキャン結果であり、安全性を保証するものではありません。VETTED は、スキャンしたファイル内で中レベル以上の指摘事項が見つからなかったことを意味します。サーバーが安全であることを証明するものではありません。
対象範囲の下限(v0.1.2):DO-NOT-INSTALL は、インストール可能な MCP バンドルに対する判定です。対象が MCP 対象ではない場合(種類が unknown、つまりサーバー、設定、スキルのいずれも主な対象でない場合、または mixed のモノレポルートで、重大な指摘事項がすべて特定された MCP バンドルの外部にある場合)、判定は REVIEW が下限となり、対象をサーバーまたはスキルのディレクトリに絞って審査するよう促す「MCP 対象ではない」という明示的な注記が付きます。指摘事項は引き続き証拠として報告されます。特定されたバンドル内に重大な指摘事項がある場合は、判定は DO-NOT-INSTALL になります。
ライブモード(probe)には独自の判定ルールがあり、意図的に上限が設けられています。スコアリングシグナル(パリティのずれまたはフィンガープリントの一致)が1つでもあれば判定は REVIEW となり、2回のプローブで問題がなければ VETTED、利用可能な証拠がなければ結論が出せないものとして REVIEW になります。ライブの証拠によって DO-NOT-INSTALL になることはありません。フィンガープリントの一致は人による確認の根拠であり、即時不合格を意味するものではありません。明示されている否定的な制御は2つあります。認証の理由でプローブが拒否された場合、そのプローブは合格として記録されます。認証情報を要求するサーバーは最低限の適切な動作をしているためです。タイムアウトではシグナルは記録されません。
MCP
mcpvet mcp は、次の3つのツールを備えた stdio MCP サーバーを提供します。
| ツール | 機能 |
|---|---|
| vet_path | インストール前に、ローカルの MCP サーバーディレクトリ、スキルディレクトリ、またはクライアント設定ツリーを審査します |
| vet_package | レジストリのメタデータのみを使用して、名前を指定した npm パッケージを審査します。tarball はダウンロードせず、コードも実行しません |
| probe_server | stdio サーバーコマンドをライブプローブします(2回起動)。プローブのパリティ、完全一致ハッシュによるフィンガープリント、算出されたリスクスコアを確認します。このツールは指定されたコマンドを実行します |
対象範囲と制限
- 設計上、静的解析のみを行います。mcpvet は対象を実行、インポート、インストールすることはなく、vet_package が tarball をダウンロードすることもありません。実行時にのみ発生する挙動は対象外です。機能とインベントリの確認には、展開したディレクトリを検査してください。
- ライブモードは唯一の例外で、呼び出しごとに明示的なオプトインが必要です。
probe(または probe_server MCP ツール)は、mcpvet を実行しているマシン上で指定されたコマンドを2回起動します。ローカルでの実行をすでに十分信頼しているコマンドに対してのみ実行してください。 - 0.2.0 に同梱されているフィンガープリントファイルは、mcpvet 独自のテスト用フィクスチャ(テストシードとしてラベル付けされ、scripts/gen-seeds.ts でフィクスチャサーバーをプローブして生成)を基に作成されており、実環境のサーバーを観測したものではありません。エントリーは記録された証拠に基づくもののみ追加され、それぞれに由来情報が付与されます。
- ツールのインベントリはパターンベースです。スキャナーが認識しない形式(動的登録、生成コード)で登録されたツールは見落とされる可能性があります。そのため、宣言されたマニフェストに一致する登録がない場合も、それ自体が検出事項になります。
- ファイルの走査は最大2,000ファイル、各ファイル512 KiBまでです。スキップされたものはすべてカウントされ、レポートの上限ブロックに記載されます。黙って除外されることはありません。スキップされたファイルが package.json または server.json の場合、マニフェスト自体が監査されていないため、判定は REVIEW が下限となります。
- 検査対象はディレクトリでなければなりません。通常ファイル、FIFO、デバイス、または存在しないパスは使用方法のエラーとなり、判定ではなく終了コード2で終了します。
- コンパイル済みのネイティブコードは、設計上このスキャナーでは解析できません。ネイティブアーティファクト(.node、.dll、.so、.dylib、または prebuilds ディレクトリ)を含むツリーには、中程度の NATIVE-BINARY 検出事項が付き、判定は少なくとも REVIEW になります。この検出事項が報告するのは存在の確認のみで、バイナリの動作については何も主張しません。
- タイポスクワッティングのリストは、よく知られた MCP サーバー名をまとめたスナップショットであり、最新のレジストリではありません。
- 静的テキストスキャンでは、パターンのリテラルとペイロードを区別できません。セキュリティスキャナー(またはテスト用フィクスチャコーパス)のソースには、検出対象と同じ形式が含まれるため、検出ツール自体を検査すると、そのパターン文字列が検出されます(Security Wave の各ファクトリーリポジトリでも確認されており、そのような重大な検出事項はすべて、パターンリテラルまたは意図的に仕込まれたフィクスチャとして手作業で検証されています)。スキャナーのソースに対する判定は、侵害を示すものではなく、REVIEW 相当の証拠として扱ってください。
Security Wave の一部です。hookcheck(永続化フック)、actionpin(Actions のピン留め)、injectcheck(エージェントが読み込むコンテンツへのプロンプトインジェクション)、tracewatch(可観測性と根本原因)、mcpvet(インストール前の検査)。
MIT。
mcpvet が時間の節約に役立った場合は、このリポジトリにスターを付けてください。他の開発者が見つけやすくなります。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。