mcp-supply-audit について
mcp-supply-auditは、MCPサーバーのレジストリエントリー、パッケージ、クライアント設定、ツール定義を静的に検査する開発中のプレリリースMCPサーバーです。インストール前の成果物レビューに使えますが、対象コードは実行せず、検出結果は安全性の保証ではなく確認の手掛かりです。
主な機能
- 01レジストリーとパッケージのメタデータ検査
- 02パッケージのアドバイザリーとインストールスクリプト検査
- 03類似名のなりすまし候補チェック
- 04MCP設定のリスクスキャン
- 05ツール定義の兆候チェック
活用シーン
- 01インストール前のMCPサーバー確認
- 02コピーしたクライアント設定の検査
- 03tools/listスナップショット内の不審な文言の確認
MCP 対応
FastMCPを通じて、stdio上で6種類の読み取り専用監査ツールを提供します。入力は名前または貼り付けたテキストで、ファイルパスは受け付けず、検査対象のコードも実行しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
mcp-supply-audit
MCP サーバーをソフトウェア成果物として監査します。対象は、レジストリエントリー、パッケージ、設定、ツール定義です。
MCP サーバーです。静的チェックのみを行います。検査対象のコードを実行することはありません。
ステータス:プレリリース、開発中です。 まだ公開されていません。ここに記載された内容は、セキュリティを保証するものではありません。
クイックスタート
インストールする前に、MCP サーバーのレジストリエントリー、パッケージ、設定、ツール定義を確認できます。
uv を使用する場合の Claude Code 向け設定:
claude mcp add mcp-supply-audit -- uvx mcp-supply-audit
バージョンを固定するには、代わりに uvx [email protected] を使用してください。scan_mcp_config は、スキャン対象の設定内で固定されていない形式を検出します(CF001)。
Claude Desktop の場合は、設定ファイルの mcpServers に以下を追加してください。
{
"mcpServers": {
"mcp-supply-audit": {
"command": "uvx",
"args": ["mcp-supply-audit"]
}
}
}
次に、以下のようなプロンプトを貼り付けます。
- 「インストールする前に、MCP サーバー
<namespace>/<name>を監査してください。」 - 「この MCP 設定をスキャンしてください:」に続けて、設定の JSON を貼り付けます。
- 「npm パッケージ
<name>のアドバイザリとインストールスクリプトを確認してください。」
プライバシー。 すべてのツールが受け取るのは、貼り付けられたテキストまたは名前のみであり、ファイルパスは受け取りません。設定スキャンのレポートには、環境変数、ヘッダー、引数の値、URL のパスやクエリは表示されません。サーバー名、キー名、引数の位置、および URL のスキーム、ホスト、ポートのみを表示します。貼り付けたテキストは他のメッセージと同様に、MCP クライアントとそのモデルに送信されるため、実際のシークレットは事前に削除してください。
サンプル:架空のサーバー4件の設定スキャンです。固定されていない npx パッケージ、平文 HTTP の URL、env に含まれるリテラルの API キーと / パスの引数、および bash -c を対象にしています。出力は scripts/demo.py のサマリー形式で、カバレッジ一覧は一部省略しています。
Severity counts: critical 0, high 3, medium 2, low 0, info 0
Assessment: findings_present
Findings (5):
[high] CF002: Remote server URL does not use https
at servers[1].url
[high] CF003: Credential-named env entry holds a literal value
at servers[2].env
[high] CF004: Server starts through a shell (sh) with an inline script
at servers[3].args[0]
[medium] CF001: Package runner (npx) runs a package with no version, not an exact version
at servers[0].args[1]
[medium] CF005: Path argument grants a filesystem root
at servers[2].args[2]
Checks that ran (16):
CF001:servers[0]
...
Skipped checks (12):
CF002:servers[0]: not_applicable
...
Notes:
- Servers scanned: 4. Servers skipped: 0.
- Absence of findings is not proof of safety. Only static checks were run; see coverage for which checks ran and which were skipped.
検出結果は確認のための指標であり、最終判断ではありません。スキップされたチェックも確認してください。
ソースをチェックアウトして実行する場合
このリポジトリをチェックアウトして uv sync を実行し、クライアントでリポジトリを指定してください。
claude mcp add mcp-supply-audit -- uv --directory /path/to/mcp-supply-audit run mcp-supply-audit
このプロジェクトの目的
ほとんどの MCP セキュリティスキャナーは、ツールの説明に重点を置いています。このプロジェクトでは、サーバーをサプライチェーン上の成果物として調べます。レジストリエントリーはパッケージおよびリポジトリと一致しているか、名前はよく知られた名前に似ていないか、パッケージバージョン固有のメタデータやアドバイザリには何が記載されているか、そしてコピーしようとしている設定は実際に何をするのかを確認します。
現在利用できる機能
FastMCP サーバーが stdio 経由で提供する6つのツールです(ツール一覧)。すべて読み取り専用で、パスではなく名前または貼り付けられたテキストを受け取ります。
audit_server:1つのサーバー(レジストリ名、またはpypi/npmを指定したパッケージ名)に適用される以下のチェックを、30秒の制限時間内で並行して実行し、統合レポートを返します。チェックが失敗またはタイムアウトした場合はスキップとして記載されますが、レポートの残りの部分は返されます。audit_registry_entry:MCP Registry エントリーの、パッケージとのリポジトリの整合性、所有者の一致、パッケージとバージョンの存在、所有権を示すマーカー、ステータス、リモート URL(テキストとして)を確認します。audit_package:PyPI または npm のパッケージバージョン1つについて、OSV.dev のアドバイザリ、公開取り消しまたは非推奨の状態、インストールスクリプト(npm のみ)、出所情報、公開時期(PyPI のみ)、宣言されたリポジトリを確認します。check_typosquat:日付付きの参照リストにある名前に似ているかどうかを確認します(厳選した PyPI と npm の名前。レジストリ名の場合は、MCP Registry からクロールした名前も対象です)。scan_mcp_config:MCP クライアント設定内のサーバーについて、バージョンが固定されていないランナー、平文 HTTP のリモート、ハードコードされたシークレット、シェルラッパー、広範なパス、レジストリ以外のソース、リスクのある環境変数を確認します。scan_tool_definitions:tools/listのスナップショットについて、不可視の Unicode、指示のような表現、ツール間の参照、情報流出を促す表現、エンコードされたデータ、その他の指標を確認します。
外部へのリクエストは registry.modelcontextprotocol.io、pypi.org、registry.npmjs.org、api.osv.dev のみに送信されます。
設計原則
- スキャン対象は決して実行しません。 静的解析とメタデータのみを使用します。ファイルシステムのパスを受け取るツールはありません。
- 入力はすべて悪意があるものとして扱います。 対象からのテキストはサニタイズされ、長さが制限され、
untrusted_textの下で引用された証拠としてのみ返されます。隠し文字は、目に見える\uXXXXエスケープとして表示されます。 - 検出に使用するのは決定論的なルールで、LLM は使用しません。 結果は再現可能で、ユニットテスト済みです。
- 検出結果は指標であり、断定ではありません。 各レポートには、実行されたチェックとスキップされたチェックがすべて記載され、検出結果がなくても安全の証明にはならないことが明記されます。
- ID ごとに、OWASP MCP Top 10(ベータ版、v0.1)に対応付けられています。
制限事項
静的チェックでは実行時の動作を確認できません。監査とテレメトリーの不足、シャドウサーバー、コンテキストの過剰共有は、このツールでは検出できません。
チェックごとの制限事項:レジストリチェック、 パッケージチェック、 タイポスクワッティングチェック、 設定チェック。
評価
docs/eval-baseline.md の件数は、2026-11-09 に測定したもので、ツール定義ルール TD001 から TD008 のみを対象としています。検出結果はレビューのための指標であり、断定ではありません。検出結果がなくても安全の証明にはなりません。
測定内容。 19 件の陽性例(取得して読み込んだソースから、1 つの tools/list スナップショットの対象となるもの)、その変異版 125 件、77 個のツールを持つ 9 台のサーバーからなる良性コーパスに対する静的検出です。実行は 2 回行いました。ルールを変更する前のベースラインと、同じテストデータで TD002 から TD004 を調整した後の実行です。後者はインサンプルです。
| ベースライン | 調整後(インサンプル) | |
|---|---|---|
| 期待されるルールが 1 つ以上発火 | 12/19 | 19/19 |
| 完全一致(発火したルールが期待されたルールと一致) | 6/19 | 15/15(集計対象のすべてのパターンでは 15/19) |
| 余分なルールの発火 | 0/19 | 0/19 |
| 良性の検出結果 | 良性コーパスはまだなし | 9 台のサーバーと 77 個のツールで 0 件 |
15/15 という結果は、ある程度は設定によるものです。TD004 の期待値のうち 4 件は、ルールで文書化された対象範囲外と判定され、分母から除外されました。この 4 件が、ちょうど一致しなかった 4 件です。
既知の回避手法(調整後、検出された変異版)。類似した字形の文字:TD002 1/14、TD003 0/5、TD004 0/4。単語の途中にスペースを入れる:TD002 6/14、TD003 1/5、TD004 2/4。
タイポスクワッティング(レジストリ層)。 フラグが付いた 51 組を手動でレビューしました。類似している可能性が高いものが 25 組、正当に異なるものが 10 組、判断が不明確なものが 16 組でした。不明確な組の扱いに応じて、適合率は 49% から 80% です(不明確な組を除くと 71%)。再現率は測定していません。レビュー担当者は 1 人で、ルールの作成者が名前のみから判断しました。
制限事項。
- 陽性テストデータは、ルールを読んだモデルが作成した、モデル執筆の言い換えです。そのため、実際の攻撃よりもルールの表現に近い可能性があります。
- 調整後の数値はインサンプルです。ベースラインがアウトオブサンプルの基準値です。
- 良性ツール 77 個のうち 66 個は、1 つの提供元のリファレンスサーバーから取得したもので、メール、チャット、シークレットを扱うツールは含まれていません。残りは作成者自身の 2 台のサーバーから取得したもので、開発時の陰性データとしても使用されました。良性の検出結果がゼロであっても、他のサーバーに対する偽陽性率を示すものではありません。
- 保留データによる評価は未実施です。スクリプトはありますが、コーパスはまだ収集されていません。
開発
uv sync
uv run pytest -q
uv run ruff check
uv run ruff format --check
セキュリティ
このプロジェクトの脆弱性を報告するには、SECURITY.md をご覧ください。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。