mcpField
R
reachvuln

reachvuln

ローカル
github.com/CloudCorpRecordsセキュリティ01 週間前に更新

reachvuln について

reachvulnは、コードからの到達可能性に基づいて脆弱性レポートを並べ替えるローカルツールです。開発者向けに、指定されたインポート関係とエントリーポイントを分析し、明示的な深刻度の重みと到達性の係数で評価します。

主な機能

  1. 01インポートグラフから到達性を算出
  2. 02脆弱なパッケージのエクスポートを照合
  3. 03到達性で検出項目を分類
  4. 04固定ルールで検出項目を順位付け
  5. 05入力を検証し件数を返却

活用シーン

  1. 01スキャナーの検出項目の修正順を決定
  2. 02アプリのエントリーポイントから到達可能な項目を特定
  3. 03未使用パッケージと到達可能な脆弱性を区別
  4. 04指定されたモジュール情報で脆弱性を順位付け

MCP 対応

MCPクライアントにrank_vulns_by_reachツールを提供します。脆弱性の検出結果、モジュールのインポート、エントリーポイントを受け取り、順位付け結果と到達性の件数を返します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"cloudcorprecords-reachvuln": {
"command": "npx",
"args": [
"-y",
"@reneturcios/reachvuln"
]
}
}
}
起動コマンドnpx -y @reneturcios/reachvuln

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@reneturcios/reachvuln0.1.0
ocighcr.io/cloudcorprecords/reachvuln:0.1.0

ツール

1

掲載時のツール一覧 · 1 週間前に更新

パラメーター型必須説明
modulesarrayはいモジュールとそのインポート:{path, imports}
entry_pointsarrayはいエントリーポイントとなるモジュールパス
vulnerabilitiesarrayはい検出結果:{id, package, severity, vulnerable_exports}

詳細

reachvuln

脆弱性スキャナーのレポートに指摘事項が200件あっても、それは対応リストにはなりません。そのパッケージの大半は、コードから一度も読み込まれない可能性があります。実際に読み込まれるパッケージでも、脆弱性のあるエクスポートをインポートしているとは限りません。reachvuln は、レポートをこの問いに沿って並べ替えます。指摘事項、モジュールとそのインポート、エントリーポイントが与えられたとき、実際に到達可能な指摘事項はどれでしょうか?

到達可能性は、与えられたインポートグラフに基づいて計算されます。package が別のモジュールの path と一致するインポートはローカルエッジで、それ以外は外部パッケージのインポートです。到達可能なモジュールは、エントリーポイントと、ローカルエッジをたどってそこから到達できるすべてのモジュールです。幅優先で探索し、循環にも安全に対処するため、循環インポートの連鎖が無限にループすることも、その先にあるものを見落とすこともありません。

到達可能なモジュールのいずれかがそのパッケージをインポートし、かつ指摘事項に vulnerable_exports の指定がない(そのパッケージをインポートすれば該当)か、そのインポートの names に vulnerable_exports と少なくとも1つ共通する項目がある場合、指摘事項は到達可能です。いずれかのモジュールがそのパッケージをインポートしているものの、到達可能の条件を満たさない場合は imported_unreachable です。つまり、そのパッケージはツリー内にありますが、到達可能なモジュールのいずれも脆弱性のあるエクスポートに触れる形でインポートしていません。どのモジュールもそのパッケージをインポートしていない場合は not_imported です。到達可能な指摘事項では、reached_via に条件を満たす到達可能なモジュールのパスを重複なくソートして列挙します。それ以外の場合は空になります。

順位付けは固定された算術に基づいており、ヒューリスティックではありません。重大度の重みは critical が40、high が30、medium が20、low が10です。到達可能な指摘事項では重みに3を掛け、インポート済みだが到達不能な指摘事項では1を掛け、未インポートの指摘事項では0を掛けます。指摘事項は、ランクスコアの降順、重大度の重みの降順、id の昇順で並びます。また、結果には3つの分類それぞれの件数も含まれます。

検証は厳格で、問題のあるパスを示します。vulnerabilities、modules、entry_points が欠けている、または型が正しくない場合、指摘事項の id が欠けている、空である、または重複している場合、package が欠けている、または空の場合、severity が列挙型の範囲外の場合、あるいは vulnerable_exports の型が正しくない場合が該当します。また、モジュールの path が欠けている、空である、または重複している場合、imports が欠けている場合、インポートの package または names が正しくない場合、エントリーポイントがモジュールのパスのいずれでもない場合も該当します。インポートの names の項目は空文字列でも構いません。その場合、脆弱性のあるエクスポートと一致することはありません。脆弱性のあるエクスポート自体は空であってはなりません。不明な追加フィールドは無視され、入力が無効な場合は部分的な結果を返しません。計算は純粋かつローカルで行われ、ネットワークも設定もリポジトリも読み込みません。

CLI

npx @reneturcios/reachvuln rank --input args.json
npx @reneturcios/reachvuln --version

args.json には引数オブジェクト全体を記述します。

{
  "vulnerabilities": [
    {
      "id": "CVE-1",
      "package": "lodash",
      "severity": "high",
      "vulnerable_exports": ["merge"]
    }
  ],
  "modules": [
    {
      "path": "src/app.ts",
      "imports": [{ "package": "lodash", "names": ["merge"] }]
    }
  ],
  "entry_points": ["src/app.ts"]
}

結果は JSON として出力されます。

{
  "ranked": [
    {
      "id": "CVE-1",
      "package": "lodash",
      "severity": "high",
      "reachability": "reachable",
      "rank_score": 90,
      "reached_via": ["src/app.ts"]
    }
  ],
  "counts": {
    "reachable": 1,
    "imported_unreachable": 0,
    "not_imported": 0
  }
}

終了コード:成功時は 0、実行時エラー(読み取り不能または無効な入力ファイル、無効な入力を含む)では 1、使用方法のエラーでは 2 です。

MCP サーバー

npx -y @reneturcios/reachvuln mcp

MCP クライアントの設定:

{
  "mcpServers": {
    "reachvuln": {
      "command": "npx",
      "args": ["-y", "@reneturcios/reachvuln", "mcp"]
    }
  }
}
ツール
  • rank_vulns_by_reach — 脆弱なパッケージとエクスポートがエントリポイントから到達可能かどうかに基づいて、脆弱性の検出結果を順位付けします。

    • vulnerabilities(配列、必須、空でも可)— 各検出結果は {id, package, severity, vulnerable_exports} です。id は空でない一意の文字列、package は空でない文字列、severity は critical、high、medium、low のいずれかです。vulnerable_exports は空でない文字列の任意の配列で、デフォルトは [] です。
    • modules(配列、必須、空でも可)— 各モジュールは {path, imports} です。path は空でない一意の文字列、imports は {package, names} の配列です。package は空でない文字列、names は必須の文字列配列です(要素は空でもかまいません)。
    • entry_points(配列、必須、空でも可)— エントリポイントとなるモジュールパスです。各要素は、いずれかのモジュールの path と一致する必要があります。

    {ranked, counts} を返します。各順位項目は、固定された順序で {id, package, severity, reachability, rank_score, reached_via} となり、counts は {reachable, imported_unreachable, not_imported} となります。

Docker

docker run -i ghcr.io/cloudcorprecords/reachvuln
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/reachvuln rank --input /w/args.json

開発

npm install
npm run build   # tsc -> dist/
npm test        # tsx --test test/*.test.ts (pure local, no network)
npm run dev     # run the CLI from source

ライセンス

MIT — Copyright (c) 2026 Rene Turcios

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。