mcpField
E
EchelonGraph CVE & Exposure

EchelonGraph CVE & Exposure

リモート
echelongraph.ioセキュリティ83 日前に更新
リポジトリ公式サイト

EchelonGraph CVE & Exposure について

EchelonGraph MCPサーバーは、セキュリティチームや開発者向けに、CVE、エクスプロイト、修正版、インターネット上の露出状況を検索します。複数の脆弱性情報源を統合し、測定状態、対象範囲、鮮度も結果に付記します。

主な機能

  1. 01CVE情報と修正内容の検索
  2. 02EPSS履歴とベンダーアドバイザリの確認
  3. 03KEVの露出状況の照会
  4. 04製品バージョン、SBOM、ロックファイルの確認
  5. 05プロンプト、リソース、テンプレートの提供

活用シーン

  1. 01CVEに関連する露出範囲の評価
  2. 02製品バージョンの脆弱性該当確認
  3. 03プロジェクトのSBOMやロックファイルのレビュー
  4. 04最新のCISA KEV追加項目の整理

MCP 対応

MCPクライアントに、16個の読み取り専用ツール、5個のプロンプト、2個のリソース、1個のリソーステンプレートを公開します。ローカルのstdioまたはキー不要のStreamable HTTPエンドポイントで接続できます。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://mcp.echelongraph.io/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

パッケージ
npmechelongraph-mcp3.1.2

ツール

16
パラメーター型必須説明
fullbooleanいいえtrue:構造化結果の data は、長さにかかわらず回答全体です。指定しない場合、構造化結果の JSON が 30,000 文字を超えると data は切り詰められます(DATA CUT)。注記に記載された順序で、まず最長のリストの各項目から一部のフィールドだけが残り、次にリストの項目数が制限されます。data_truncated は true となり、truncated には切り詰められた各リスト、その総数、返された件数、および項目が簡略化されたかどうかが示されます。完全な data はプログラム向けです。Claude Code のように MAX_MCP_OUTPUT_TOKENS に基づいて構造化結果のサイズを制限するクライアントは、上限を超える回答を拒否する場合があります。

詳細

翻訳後に原文が更新されています。最新の内容は原文をご確認ください。

EchelonGraph MCP サーバー

Claude、Cursor、VS Code、Cline、およびあらゆるMCPクライアントで利用できるCVE とインターネットへの露出データです。EchelonGraphの無料公開フィードから直接取得します。

EchelonGraph の CVE Pulse(NVD + MITRE-CNA のNVD 登録前情報 + CISA-KEV + EPSS + GitHub GHSA を統合したスコア)に加え、CVE ごとのインターネットへの露出状況も提供します。EchelonGraph の KEV 露出レーダーが記録している、CVE に該当するバージョンを稼働させているインターネットに公開されたサービス(個別の ip:port)の数です。露出数は Shodan データから算出されます。Shodan データの所有者は Shodan であり、著作権を保有しています(© Shodan)。

16 個のツールで、単一の CVE(レコード、エクスプロイトコードと修正済みバージョン、情報源に記載された修正方法、EPSS 履歴、ベンダーのアドバイザリ、露出状況)の検索、CISA が KEV に追加した最新項目の一覧表示、製品またはパッケージのバージョンが影響を受けるかの確認、SBOM またはプロジェクトのロックファイルの確認、CWE とその CVE の参照ができます。すべての結果に測定方法(state、measured_at、method、coverage、freshness、notes)が示されるため、モデルが障害や未評価の検索結果を問題なしと誤認することはありません。

また、クライアントがスラッシュコマンドとして表示できる、すぐに使えるワークフローのプロンプトを 5 つ(triage_cve、kev_weekly_brief、am_i_affected、sbom_review、workload_triage。「Prompts」を参照)、リソースを 2 つ(echelongraph://methodology と echelongraph://sources)、リソーステンプレートを 1 つ(cve://{cve_id}。「Resources」を参照)提供します。

無料で API キー不要です。認証は不要で、読み取り専用です。サーバーは、ツールが応答するために必要な API 呼び出し以外のリクエストを行いません。

クイックスタート

ローカルサーバーは npx 経由で実行され、Node.js 20 以降が必要です。グローバルには何もインストールされません。以下の Claude Desktop ワンクリック拡張機能は、どちらも必要ありません。以下のブロックのいずれかをクライアントに追加し、クライアントを完全に終了して再起動した後、次のように尋ねてください:「CVE-2023-44487 は現在悪用されていますか?EchelonGraph のレーダーには、この CVE に該当する露出サービスがいくつ記録されていますか?」

Claude Desktop

接続方法は3つあります。最初の2つにはNode.jsは不要です。1つはお使いのマシンでサーバーを実行するワンクリック拡張機能、もう1つはホストされたエンドポイントへのカスタムコネクターです。3つ目はnpxを通じてサーバーを実行します。

1. Claude Desktopにインストール (ワンクリック、Node.js不要)。 リンクからClaude Desktop拡張機能のechelongraph-mcp.mcpbがダウンロードされます。これを開くか、Claude Desktopで「Settings → Extensions → Advanced settings → Install Extension」を選んでファイルを指定し、Installを選択します。Claude Desktopは同梱のNode.jsを使ってサーバーを実行し、独自の設定を書き込みます。PATHの設定もJSONの編集も不要です。更新するには、次のリリースのバンドルを同じ方法でインストールします。GitHubの新しいリリースにはすべてバンドルが含まれています(2.6.5までのリリースには含まれていません)。npmパッケージを公開するワークフローによってリリースのタグからビルドされ、SLSAビルド来歴アテステーションで署名されています。ダウンロードを確認するには、次を実行します。 gh attestation verify echelongraph-mcp.mcpb --repo echelongraph/echelongraph-mcp。

2. カスタムコネクター(インストール不要)。 Claude Desktopは、claude.aiアカウントのコネクターを使用します。「Customize → Connectors → + Add → Add custom connector」を選択します。名前にEchelonGraphを入力し、https://mcp.echelongraph.io/mcpを貼り付けて、No sign inを選択し、追加します。Node.jsもPATHの設定もJSONの編集も不要です。claude.aiで追加したコネクターはClaude Desktopにも表示されます。プランのルールはclaude.aiのものが適用されます(下の「リモート(インストール不要)」を参照)。

3. npxを通じてローカルサーバーを実行する。

  1. Node.jsを確認します。 ターミナル(macOS)またはPowerShell(Windows)でnode -vを実行します。v20以降が表示される必要があります。古いバージョンやcommand not foundが表示された場合は、https://nodejs.orgからLTSリリースをインストールするか、macOSではHomebrewを使ってbrew install nodeを実行します。

  2. 設定ファイルをテキストエディターで開きます。 「Settings → Developer → Edit Config」を選ぶと、claude_desktop_config.jsonが表示されます(macOS:~/Library/Application Support/Claude/claude_desktop_config.json、Windows:%APPDATA%\Claude\claude_desktop_config.json)。VS Code、Notepad、nanoなどのテキストエディターで開きます。macOSのTextEditでは、スマート引用符がオンの場合、"が曲線引用符(“ ”)に変換され、JSONがエラーなしで壊れます。これを防ぐには、「Edit → Substitutions → Smart Quotes」でオフにするか、別のエディターを使用してください。

  3. 置き換えずに統合します。 通常、このファイルはすでに存在し、Claude Desktop独自の設定(たとえば"preferences"オブジェクト)が含まれています。ファイル内の内容はすべて保持してください。最上位のキーとして、既存のキーと並べて"mcpServers"キーを追加します。"mcpServers"がすでにある場合は、その中に"echelongraph"エントリーを追加します。エントリー間のカンマに注意してください。preferencesの箇所に独自の設定を入れると、次のようになります。

    {
      "preferences": {
        "…": "the settings already in your file stay as they are"
      },
      "mcpServers": {
        "echelongraph": {
          "command": "npx",
          "args": ["-y", "echelongraph-mcp"]
        }
      }
    }
    

    ファイルの構文を確認するには、ターミナル(macOS)で次を実行します。

    node -e "JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'))" "$HOME/Library/Application Support/Claude/claude_desktop_config.json"
    

    または、PowerShell(Windows)で次を実行します。

    node -e "JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'))" "$env:APPDATA\Claude\claude_desktop_config.json"
    

    出力がなければ、有効なJSONです。SyntaxErrorはファイルが壊れていることを意味します(多くの場合、曲線引用符またはカンマの欠落が原因です)。ENOENTは、指定したパスにファイルがまだ存在しないことを意味します。

  4. 完全に終了してから、再度開きます。 ウィンドウを閉じただけでは、以前の設定が読み込まれたままです。macOSでは「Claude → Quit Claude」(⌘Q)を選びます。Windowsでは、システムトレイのClaudeアイコンを右クリックして「Quit」を選びます。初回起動時は、npxがパッケージをダウンロードするため、時間がかかる場合があります。

  5. 正常に動作したことを確認します。 「Settings → Developer」にechelongraphが実行中として表示され、チャットボックスのツールメニューに、下の「ツール」に記載されているEchelonGraphのツールが表示されます。その後、このセクションの冒頭にある質問をしてみてください。

Claude Desktop のトラブルシューティング
  • spawn npx ENOENT(またはサーバーが失敗として表示される)。macOS では、Dock から開いたアプリはシェルの PATH を引き継がないため、Claude Desktop は Homebrew(Apple シリコンの場合は /opt/homebrew/bin、Intel の場合は /usr/local/bin)または nvm が配置した npx を見つけられません。ターミナルで which npx を実行し、Claude Desktop の "command" にその絶対パスを指定して、"env" の PATH にそのファイルがあるフォルダーを指定してください(npx は同じフォルダーにある node を起動します)。Apple シリコンで Homebrew を使っている場合:

    {
      "mcpServers": {
        "echelongraph": {
          "command": "/opt/homebrew/bin/npx",
          "args": ["-y", "echelongraph-mcp"],
          "env": { "PATH": "/opt/homebrew/bin:/usr/bin:/bin" }
        }
      }
    }
    

    nvm の場合は、which npx が出力する完全なパスを使ってください(JSON では ~ は展開されません)。その後、Claude Desktop を完全に終了して再度開きます。Windows では、nodejs.org のインストーラーで Node.js をインストールすると、システム PATH に npx が追加されます。その後、Claude Desktop を完全に終了して再度開いてください。

  • サーバーがまったく表示されない。 ファイルが有効な JSON ではない(カンマの抜けや、曲線型の引用符がある)か、アプリが完全に終了していません。手順 2~4 を参照してください。

  • ログ。 macOS:~/Library/Logs/Claude/mcp-server-echelongraph.log(このサーバーの出力)および ~/Library/Logs/Claude/mcp.log(接続)。Windows:%APPDATA%\Claude\logs\。ファイル名は同じです。

Claude Code
claude mcp add --transport stdio echelongraph -- npx -y echelongraph-mcp

すべてのプロジェクトで利用できるようにするには、-- の前に --scope user を追加してください。プロジェクトの .mcp.json を通じて共有するには、--scope project を指定します。Claude Code は各結果の structuredContent をモデルに渡します。このサーバーでは、呼び出しで full: true が指定されない限り、文字数は 30,000 文字までに制限されます(「長い回答」を参照してください)。MAX_MCP_OUTPUT_TOKENS(デフォルトは 25,000 トークン)は、Claude Code がツールの出力に適用する上限です。この値を引き上げると、full: true の回答を受け取れるようになります。

Cursor

~/.cursor/mcp.json(すべてのプロジェクト)または .cursor/mcp.json(1 つのプロジェクト):

{
  "mcpServers": {
    "echelongraph": {
      "command": "npx",
      "args": ["-y", "echelongraph-mcp"]
    }
  }
}
VS Code

ワークスペースの .vscode/mcp.json(VS Code ではキーに mcpServers ではなく servers を使います):

{
  "servers": {
    "echelongraph": {
      "command": "npx",
      "args": ["-y", "echelongraph-mcp"]
    }
  }
}

または、ターミナルから:

code --add-mcp '{"name":"echelongraph","command":"npx","args":["-y","echelongraph-mcp"]}'
Windsurf、Cline、その他のクライアント

mcpServers ブロックを読み込むクライアント(Windsurf の mcp_config.json、Cline の MCP 設定、その他のほとんどのクライアント)は、上記の Cursor と同じブロックを使用します。

リモート(インストール不要)

同じ 16 個のツール、5 個のプロンプト、2 個のリソース、1 個のリソーステンプレートを、次の Streamable HTTP エンドポイントで提供しています。

https://mcp.echelongraph.io/mcp

API キー不要、サインイン不要、ステートレスで、両方のプロトコル世代に対応しています。ホスト型エンドポイントは稼働中です。https://mcp.echelongraph.io/health は、実行中のパッケージバージョンを含む {"status":"ok","version":…} を返します。

  • claude.ai(Free、Pro、Max、Team、Enterprise プラン): 「Customize」→「Connectors」→「+ Add」→「Add custom connector」の順に選択します。名前に EchelonGraph を指定し、URL を貼り付け、「No sign in」を選択して追加します。Team と Enterprise では、まずオーナーが組織に追加し、その後、各メンバーが接続します。Free プランで追加できるカスタムコネクターは 1 つです。

  • Claude Code:

    claude mcp add --transport http echelongraph https://mcp.echelongraph.io/mcp
    
  • Cursor(mcp.json):

    { "mcpServers": { "echelongraph": { "url": "https://mcp.echelongraph.io/mcp" } } }
    
  • VS Code(.vscode/mcp.json):

    { "servers": { "echelongraph": { "type": "http", "url": "https://mcp.echelongraph.io/mcp" } } }
    
  • Windsurf(mcp_config.json):

    { "mcpServers": { "echelongraph": { "serverUrl": "https://mcp.echelongraph.io/mcp" } } }
    

ホスト型エンドポイントは、同じ公開 API に対してこのパッケージのコード(以下の dist/http.js)を実行するため、回答は npm パッケージの回答と同じです。エンドポイントが参照・記録する内容については「プライバシー」を、クライアントごとの制限については「レート制限」を参照してください。

ツール

すべてのツールは読み取り専用(readOnlyHint: true)で、タイトルと outputSchema が定義されています。例として挙げる質問には、そのツールだけでクライアントが回答できます。

ツールタイトル回答する内容質問例
cve_summaryCVE フィードの概要重大度区分ごとのアクティブな CVE 数、どのソースからも重大度区分がない CVE 数(summary.none。summary.unscored としても再掲されます。まだスコアが付与されていない CVE であり、「なし」という評価ではありません)、同じ CVE を NVD の重大度ラベル別に数えた出典情報(summary.nvd_critical から summary.nvd_none)、合計に含まれない却下(取り下げ)済みレコード(summary.rejected)、フィードの最終更新日時を返します。フィードには重大な CVE がいくつあり、最終更新日時はいつですか?
search_cvesCVE を検索EchelonGraph のスコアと score_assessed を含む CVE の検索/フィルタリング(重大度、最小 CVSS、テキスト、並べ替え)を行います。limit と offset でページ分けできます。まだスコアが付与されていない各行は注記で示されます。Tomcat に言及する、CVSS が 9 以上の重大な CVE を見つけてください。
get_cveCVE の詳細1 件の CVE のレコードを返します。CVSS v3 と(スコアが付与されている場合は)v4、EchelonGraph のスコアとその信頼度、EchelonGraph がスコアを付与したかどうか(score_assessed)、EPSS、CISA-KEV のステータスとランサムウェアでの既知の利用状況、KEV に掲載された CVE の場合は CISA 独自のテキストをそのまま(kev_required_action は米国連邦政府の民間機関に CISA が求める措置であり、EchelonGraph の助言ではありません。kev_short_description、kev_notes_urls)、GitHub GHSA ID、参照情報、および公開日時、変更日時、updated_at の各時刻を返します。CVE-2024-3094 の CVSS、EPSS、CISA-KEV のステータスは何ですか?
cve_exposure1 件の CVE のインターネット露出状況KEV 露出レーダーから、CVE のインターネット露出状況を返します。露出サービス数(一意な ip:port の数。exposed_hosts フィールド)と国/製品別の内訳を含みます。EchelonGraph のレーダーには、CVE-2023-44487 の露出サービスがいくつ記録されていますか?
exposure_radar露出レーダーの合計露出レーダー全体の集計値を返します。CISA-KEV CVE を実行しているサービス数、Shodan(Shodan のクエリクレジットが少なくなると LeakIX)で検出され、その後 EchelonGraph 独自の識別チェックで確認された、認証不要のデータストアおよび可観測性 UI(このチェックは読み取り専用ではありません。Redis ではクライアント名を名乗り、ClickHouse ではクエリがサーバーのクエリログに記録されます)、漏洩した認証情報、シャドー AI、EchelonGraph 独自の Certificate Transparency フィードで検出された MCP サーバーの数を、RFC 9728 の判定結果、プロトコルの世代、トランスポート別に返します。各数値には集計対象の説明が付いており、ツールが説明できないフィールドは省略され、その旨が示されます。EchelonGraph のレーダーが確認した、認証不要のデータストアはいくつありますか?
kev_recentCISA KEV の最近の追加項目CISA の Known Exploited Vulnerabilities カタログに CISA が追加した CVE を、新しい順(kev_added_date)に返します。EchelonGraph が保有するカタログのコピーを使用し、CISA から 5 分ごとに取得します。期限、ベンダー、製品、ランサムウェアでの既知の利用状況、EchelonGraph の重大度、CVSS、EPSS、eg_kev_tier、our_first_seen_kev を含みます。日付範囲、ランサムウェア、ベンダーで絞り込み、limit と next_cursor でページ分けできます。last_successful_fetch_at(CISA のフィードを最後に正常取得した日時)が基準日時です。フィルターはリクエストヘッダーで渡され、URL には入りません。9 月 1 日以降に CISA が KEV に追加した CVE と、ランサムウェアでの既知の利用がある CVE はどれですか?
epss_history1 件の CVE の EPSS 変化履歴EchelonGraph が記録した、1 件の CVE の EPSS スコアの変化を返します。記録された変更ごとに 1 ポイント(series_kind は change_only)であり、日次系列ではありません。現在の値、すべての変更がポイントとして記録されるようになった時点を示す complete_since(それ以前は記録に変更が抜けているため、ポイントがないことは変化がなかったことを意味せず、系列が完全と呼ばれることはありません)、記録に含まれる FIRST のスコア日付と欠落している日付を示す coverage(days_missing、days_partial)、および記録を開始した日時を示す series_starts_at を含みます。それ以前にポイントがない場合は、変化がなかったのではなく、記録されていなかったことを意味します。EchelonGraph の記録では、CVE-2023-44487 の EPSS スコアはどのように変化しましたか?
check_affected影響を受けていますか?(特定バージョンの製品またはパッケージ)指定バージョンの製品(NVD CPE の製品トークン)またはレジストリパッケージ(ecosystem と package)が既知の CVE の影響を受けるかどうかを、echelongraph.io/am-i-affected を支えるマッチャーから返します。最初に assessed が示されます(false は未評価で、not_assessed_reason が示されます。この場合、件数が 0 でも「影響なし」を意味しません)。一致した CVE と、kev_listed、ransomware、epss_score、effective_score、score_assessed を返します。レジストリでの一致には fixed_in も含まれます。これは、該当するレコードの影響範囲に含まれない、現在のバージョンより上の最も低いバージョンです。重複する範囲を越えている場合は fixed_in_detail が示され、修正版が特定できない場合は fixed_in_reason とともに null になります。これは修正が存在しないという判断ではありません。判定できないアドバイザリは undetermined_count として数えられ、安全とは見なされません。照会内容はリクエストヘッダーで渡され、URL には入りません。openssl 3.0.0 は既知の CVE の影響を受けますか?npm の lodash 4.17.15 はどうですか?
check_sbomSBOM をアドバイザリコーパスと照合EchelonGraph のアドバイザリコーパス(OSV.dev のレコード)と依存関係リストを照合し、各コンポーネントについて affected、not_affected、undetermined、not_assessed のいずれかの判定と、それぞれの not_assessed_reason を返します。各行には、アドバイザリの照会に使用したパッケージ(matched_package)とその照合方法(matched_via。deb、apk、alpine の purl で upstream 修飾子がソースパッケージを示す場合は upstream。これが Debian と Alpine のファイルアドバイザリの照合方法です。それ以外は purl_name)が記されます。また各一致には fixed_in が含まれます。これは、コンポーネントのバージョンより上で、レコードのどの影響範囲にも含まれない最も低いバージョンです。越えた重複範囲は fixed_in_detail に示され、特定できない場合は fixed_in_reason とともに null になります。最大 2,000 件の一意な purl、または CycloneDX JSON/SPDX JSON ドキュメントを渡せます。MCP サーバーがドキュメントから purl を読み取り、それだけを最大 200 件ずつの POST リクエスト本文で順次 API に送信します。ドキュメント自体は送信されません。npm から実行する場合、サーバーはお使いのマシン上にあります。ホスト型エンドポイント(mcp.echelongraph.io)経由の場合は EchelonGraph のサーバー上にあり、ドキュメントはリクエスト本文として送信されます。API のコンポーネント単位のレート制限が 429 を返すと、ツールは指定された Retry-After の時間だけ待機します(呼び出しあたり最大 50 秒)。それを超える場合は、取得済みの結果を返します。未送信の purl は coverage.not_sent に計上され、理由は coverage.not_sent_reason に、一覧は data.not_sent_purls に示されます(full: true の場合は全件。一覧が DATA CUT で切り詰められる場合があります)。黙って破棄されることはありません。リリースを示す distro 修飾子のない deb、apk、rpm の purl は評価されず(distro_release_unknown)、EchelonGraph がリリースを推測することはありません。クリーンと見なされるのは not_affected のみです。ランキングもスコアもありません。この CycloneDX SBOM をアドバイザリコーパスと照合してください。
scan_manifestロックファイルをアドバイザリコーパスと照合プロジェクトのロックファイルまたはバージョン固定済みマニフェストを、同じアドバイザリコーパスと照合し、check_sbom と同じバッチルート、バッチ処理、50 秒の上限、Retry-After による待機を通じて、依存関係ごとに判定を返します。filename と content(ファイルのテキスト)からなる files を 1~20 件渡せます。合計文字数の上限は 5,000,000 です。形式はファイル名から判定されますが、format で指定することもできます。読み取り対象:requirements.txt(== と === の固定指定のみ。extras と markers は除去されます)、go.mod(単一行およびブロック形式の require。// indirect を含み、replace と exclude を適用)、package-lock.json と npm-shrinkwrap.json(lockfileVersion 1~3)、Cargo.lock、Gemfile.lock(プラットフォーム接尾辞を除去)、composer.lock(先頭の v を除去)、poetry.lock、gradle.lockfile。package.json、pyproject.toml、Pipfile、Gemfile、Cargo.toml、composer.json、build.gradle にはバージョン範囲が含まれるため拒否され、それぞれ渡すべきロックファイルが示されます。ビルドで選択されていないモジュールバージョンが記載されている go.sum も拒否されます。pom.xml、yarn.lock、pnpm-lock.yaml はまだ読み取れません。MCP サーバーはファイルを purl に変換し、purl のみを API に送信します。ファイル名とファイル内容は送信されません。npm から実行する場合、サーバーはお使いのマシン上にあります。ホスト型エンドポイント(mcp.echelongraph.io)経由の場合は EchelonGraph のサーバー上にあり、ファイルはリクエスト本文として送信されます。data.results には、一意な purl ごとに 1 行が格納されます。形式は check_sbom と同じで、各一致には kev_listed、epss_score、fixed_in が含まれます。未送信の各項目は、ファイル、行、reason とともに data.not_checked に記載され、coverage.not_checked_by_reason に計上されます。reason は version_unpinned(例:django>=4 のような範囲。範囲の下限をバージョンとして送信することはありません)、version_unresolved、local_path、vcs_source、unsupported_line のいずれかです。これらはクリーンではありません。このツールで確認できるバージョンが記載されていないファイルは、API を呼び出さず not_assessed を返します。クリーンと見なされるのは not_affected のみです。ランキングもスコアもありません。この package-lock.json をアドバイザリコーパスと照合してください。
cve_intelCVE の弱点、エクスプロイト、パッケージEchelonGraph による CVE ごとのエンリッチメントから、弱点、エクスプロイトコード、検出テンプレート(Nuclei テンプレートはシステムが影響を受けるかを確認するものであり、必ずしもエクスプロイトコードではありません。注記ではテンプレートを別に数えます)、影響を受けるパッケージ、修正済みバージョンを返します。cwes、エクスプロイト(最大 10 件、検証済みのものを優先)を格納する exploits、exploits_total、exploits_capped、exploits_by_kind、exploits_by_status、affected_packages、fixed_versions、timeline を含みます。各 affected_packages 行には fixed_branches が含まれます。これは、パッケージの影響を受けるすべての範囲とその修正を示します(introduced、および fixed、または記録上修正がない場合は last_affected)。それぞれ、その範囲を公開した OSV レコード(advisory_id、source)を、レコード内の順序で示します。インストール済みバージョンの修正バージョンは、それより上にある fixed のうち、その行のどの範囲にも含まれない最初のバージョンです。バージョンが範囲に含まれる場合は、その範囲の fixed を使い、そのバージョンを含む重複範囲を越えるまで確認します。fixed のない範囲を越える修正版はありません。バージョンの比較には、各エコシステムのバージョン順序を使用します。fixed_version は互換性のために保持されている、ある範囲に対する修正版であり、すべての範囲の修正版ではありません(CVE-2021-44228 の log4j-core では、2.12.2 は 2.4~2.12.1 の修正バージョンですが、2.14.1 の範囲は 2.15.0 で修正されています)。パッケージの範囲が読み込まれていない場合、fixed_branches は null です。バージョン範囲が記録されていない場合は [] であり、修正が存在しないという判断ではありません。verified_status は各参照に保存されたラベルであり、エクスプロイトが機能する保証ではありません。exploits が空でも、公開エクスプロイトが存在しない証拠にはなりません。API が読み取れなかったセクションは coverage.sections_failed に記載され、空のリストとして返されることはありません。CVE-2021-44228 の公開エクスプロイトコードはありますか?また、どのバージョンで修正されていますか?
cve_remediation1 件の CVE の修正方法ソースに記載された、1 件の CVE の修正方法を 1 つの回答にまとめて返します。すべてのテキストはソースに記載されたとおりに返され、EchelonGraph による検証は行われていません。cisa(KEV に掲載された CVE の場合、CISA の required_action、due_date、short_description、notes_urls をそのまま返します。CISA が指示する対象は米国連邦政府の民間機関であり、EchelonGraph の助言ではありません)、fixed_branches(影響を受ける各パッケージについて、すべての影響範囲とその修正)、vendor_remediations(CVE に言及するベンダーアドバイザリを最大 20 件。各アドバイザリの remediation_state と、CVE について記載された項目を含み、各項目には kind としてベンダー独自のカテゴリ vendor_fix、workaround、mitigation、no_fix_planned、none_available、other が付与されます)、NVD または CNA が Patch または Mitigation としてタグ付けした参照情報を格納する fix_references、patches、coverage、failed_sections、および CVE Pulse のページに表示される API の修正ステータス判定ルール fix_status を返します。インストール済みの ecosystem、package、version(すべて指定するか、すべて省略)を渡すと、さらに installed(そのバージョンの判定)と fixed_in(そのバージョンより上で、記録上のどの影響範囲にも含まれない最初のバージョン)を返します。特定できない場合は fixed_in_reason とともに null になります。remediation_state が none_in_source または not_parsed の場合、あるいはリストが空の場合も、修正が存在しないという判断ではありません。REJECTED CVE は not_assessed を返します。CVE-2021-44228 は、ソースにどのように記載されているとおりに修正されていますか?
get_cweCWE とその CVE1 件の CWE(弱点クラス)と、それに分類される CVE を返します。EchelonGraph が組み込んでいる MITRE CWE カタログからの name と description、total、order の指定に従った順序(CISA-KEV 掲載を優先し、その後 EchelonGraph のスコア順)で並ぶ 50 件の CVE の 1 ページを返します。total が 0 の場合は、EchelonGraph のフィードにある CVE がその CWE に分類されていないことを示します。CVE が存在しないという意味ではありません。CWE-79 に分類される CVE はどれですか?CISA-KEV 掲載を優先してください。
vendor_advisories_for_cve1 件の CVE のベンダーアドバイザリMicrosoft MSRC、Red Hat、Cisco、Palo Alto Networks、GitHub GHSA、その他 EchelonGraph が取得するフィードから、1 件の CVE に言及するベンダー公開アドバイザリを新しい順に最大 20 件返します。それぞれに remediation_kinds と remediation_state が含まれます。not_parsed は、EchelonGraph がそのベンダーの修正情報を読み取っていないことを示し、修正情報がないという判断ではありません。CVE-2024-3400 に言及するベンダーアドバイザリはどれですか?
get_vendor_advisoryベンダーアドバイザリの詳細1 件のベンダーアドバイザリの全内容を返します。説明、重大度、cve_ids と、そのうちここに CVE レコードがあるものの一覧 known_cve_ids、affected_products、remediation、references、さらにベンダーが記載する各修正情報を格納した remediations(ベンダー独自のカテゴリである kind、原文テキスト、URL)と remediation_state を含みます。これらのアドバイザリのうち 1 件について、影響を受ける製品、修正方法、参照情報を含む全内容を表示してください。
search_vendor_advisoriesベンダーアドバイザリを検索テキスト(タイトル、説明、ベンダー、アドバイザリ ID、製品、CVE ID)、ベンダー、重大度、CVE に言及しているかどうかでベンダーアドバイザリを検索します。検索テキストはリクエストヘッダーで送信され、URL には入りません。FortiOS のベンダーアドバイザリを、重大度が重大なものに限定して検索してください。
3 つのベンダーアドバイザリーツールは、vendor_published_at(ベンダーによる公開日)、our_first_seen_at
(EchelonGraph がアドバイザリーを初めて記録した日時)、withdrawn(ベンダーによる取り下げ)を返します。各項目は注記で説明され、検索結果からは除外されます。

また、それぞれのツールは、すべてのベンダーの期間を coverage で返します(一覧では vendor_windows、詳細では vendor_window):保持しているアドバイザリーの数、その中で最も古いものと新しいものの vendor_published_at、held_since、history_backfill です。held_since は、EchelonGraph がベンダーのアドバイザリーを読み取り始めた期間の開始時点です。それ以前に公開されたものは保持されていない可能性があります。履歴を読み取ったことがないベンダー(history_backfill が not_supported)の場合、これは保持されている最も古いアドバイザリーより数年後のこともあります。Cisco のポーラーが最初に読み取ったのは、Cisco が過去 90 日間に変更したアドバイザリーで、Red Hat と GitHub では過去 7 日間でした。そのため、ベンダーが後日改訂した古いアドバイザリーは保持されていても、それと同時期に公開されたアドバイザリーは保持されていないことがあります。 vendor_advisories_for_cve は vendors_not_fully_held に、回答にアドバイザリーが含まれていない各ベンダーのうち、EchelonGraph がアドバイザリーを 1 件も保持していないベンダー、held_since が CVE ID の年の 1 月 1 日より後、または不明なベンダー、あるいは履歴をまだ読み取り中のベンダーを列挙します。そのようなベンダーのアドバイザリーがないことは、そのベンダーが何も公開していないという判断の根拠にはなりません。

すべての数値は、それを生成した最後のチェック時点の情報です。CVE フィードはスケジュールに従ってソースからポーリングされます。各レーダーには独自のスケジュールがあり、実行中のみ更新されます。また、exposure_radar の freshness には、API が提供している場合、各レーダーの最後に完了したチェック(last_run_at)が示されます。

各ツールの回答の読み方

各ツールが返す内容と、各フィールドや数値が示すものについては、パッケージの docs/ フォルダーに収録されている以下のページをご覧ください。

  • cve_summary のカウントの読み方: summary.none はスコアがまだ付けられていない CVE の数であり、深刻度が None と評価された CVE の数ではありません。また、summary.nvd_critical から summary.nvd_none までは、出典情報として、NVD の深刻度ラベル(またはそれを代替する NVD 前のラベル)ごとに数を集計します。
  • get_cve と search_cves における EchelonGraph スコアの読み方: score_assessed: false はスコア未評価を意味し、スコアが 0 であることを意味しません。
  • patch_available が示す内容と、patch_evidence に記載される証拠(CVE レコード自体の修正に関する記述 cna_solution、description_fix を含む):false は修正の証拠が記録されていないことを意味し、修正が存在しないことを意味するものではありません。
  • cve_exposure のカウント方法: Shodan データのサンプルに含まれるバナーのバージョンから推定した ip:port サービスの数であり、マシンの数ではありません。また、レーダーの追跡対象外の CVE は 未評価であり、その 0 は測定結果ではありません。
  • exposure_radar のカウント方法: 5 つのレーダーそれぞれの数値と、各数値の集計対象。
  • check_affected の判定方法: count の前に assessed を確認してください。レジストリの一致結果における fixed_in は、その後のバージョンのうち、レコード内のどの影響対象範囲にも該当しない最も低いバージョンです。該当するものがない場合は null となり、その理由は fixed_in_reason に示されます。

プロンプト

クライアントがスラッシュコマンドとして表示できる、すぐに使えるワークフローです。各プロンプトでは、呼び出すツールとその順序を指定し、モデルに各結果の state、measured_at、method、coverage、notes をすべて読むよう指示します。not_assessed がクリーンと報告されることはありません。assessed: false の場合、カウントが 0 でも「影響なし」と報告されることはありません。また、各数値にはその measured_at が記載されます。プロンプトは API リクエストを行いません。

プロンプト引数モデルに求める処理
triage_cvecve_idget_cve(CVE が KEV に掲載されている場合は、CISA の期限 kev_due_date を含む)、cve_intel、vendor_advisories_for_cve、epss_history、cve_exposure を実行し、その後、悪用状況、可能性、到達可能性、パッチ、期限、判断を記載する判断テンプレートを作成します。パッチの行には、影響を受ける各範囲と、cve_intel の fixed_branches による修正内容を記載します。パッケージに該当する修正内容がない場合は、cve_intel がそのパッケージについて記録している fixed_version をパッケージごとに 1 つ(通常はアドバイザリの最後の範囲のもの)記載します。これを影響を受けるすべてのブランチに対する修正として扱わず、ブランチの修正内容を示す get_cve の Vendor Advisory または Patch タグ付き参照を案内します。
kev_weekly_briefdays(1〜365、既定値 7)days から開始日を算出し、その日付から kev_recent を 1 ページあたり 50 行で最後まで取得して、ベンダー別にランサムウェアのフラグと期限をまとめた概要を作成します。
am_i_affectedproduct、または ecosystem と package、versioncheck_affected を実行し、count の前に assessed を読み取り、未評価の場合の文言を使用します。
sbom_reviewsbom(CycloneDX または SPDX の JSON テキスト、最大 5,000,000 文字)ドキュメントを check_sbom に渡し(レート制限または残り時間の都合で送信されなかった purl は、もう一度渡します。data.not_sent_purls に記載されている場合はその値を使い、テキストまたは DATA CUT によってそのリストが途中で切れている場合は、注記に示された位置から順にドキュメントの purl を使います)、各コンポーネントの purl からエコシステム、パッケージ、バージョンを読み取ります。これは check_sbom のマッピングに従います(マッピング対象のすべての purl タイプに加え、Debian、Ubuntu、Alpine のリリースを示す distro 修飾子がある deb、apk、alpine、rpm が対象です。それ以外は不明として扱い、固定バージョンは指定しません。upstream 修飾子を持つ deb、apk、alpine purl は、その修飾子が示すソースパッケージとして扱います。この場合は、matched_via が upstream のとき、行の matched_package を使用し、その修正内容を purl の横にある修正リストに記載します)。影響を受ける各 CVE について get_cve と cve_intel を参照し、CISA-KEV 掲載、次に EPSS、次にスコアの順に並べた修正リストを作成し、各キーを明記します。テキスト内に一致結果がある場合、その固定バージョンには一致結果の fixed_in のみを使用します。これはインストール済みバージョンより高く、そのレコードの影響範囲に含まれない最も低いバージョンです。fixed_in が null の場合は「記録上、修正なし」と記載しますが、これは修正が存在しないことを示すものではありません。match_reason から固定バージョンを読み取ることはしません。コンポーネントに一致結果がない場合、または一致結果に fixed_in がない場合は、インストール済みバージョンより高い固定バージョンのみを記載します。まず、cve_intel 行の fixed_branches にある範囲のいずれにも含まれない、該当する最初の fixed を使います。fixed_branches のないパッケージでは、cve_intel の fixed_version を使います。これはパッケージごとに 1 つ(アドバイザリの最後の範囲のもの)であり、コンポーネントのブランチに対する修正とは限りません。それ以外の場合は、そのブランチの固定バージョンが結果に含まれていないことを示し、CVE のアドバイザリを案内します。
workload_triagesource(省略可:kubernetes、github_actions または images。既定では 3 つすべてを説明します)独自の Pod、CI ジョブのコンテナー、またはイメージの優先順位付けを行います。ワークロードを一覧表示し、独自のツールでその露出状況を判断して、各イメージダイジェストの SBOM を作成し、purl のみを check_sbom に渡します(ワークロード、名前空間、イメージ名、レジストリ名、認証情報、露出ラベルは送信されません。イメージ自身の pkg:oci/pkg:docker purl は除外されます)。行は CISA-KEV 掲載、次に呼び出し元が主張する露出状況(不明は未露出と同じ並びにはしません)、次に EPSS、次にスコアの順に並べ、各キーを明記します。CVE が 30 件を超えると、get_cve の呼び出しを停止します。not_assessed の行は件数に含め、問題なしとは報告しません。このプロンプトはワークロードデータを受け取りません。

リソース

resources/list で一覧表示される2つのリソースと、resources/templates/list で一覧表示される1つのリソーステンプレートがあります(たとえば、クライアントは cve://CVE-2024-3400 を読み取ります)。

リソース内容
echelongraph://methodology各エンベロープフィールドと state の値の意味、および各ツールの測定方法を説明します(Markdown)。
echelongraph://sourcesリソースの読み取り時に API がフィードについて報告する内容を示します。応答した1つのインスタンスの NVD ポーラーの interval、last_poll_at、poll_count、poll_errors(/api/v1/public/cves/summary から取得。2つのカウントはそのインスタンスが最後に起動してからの値で、再起動のたびにゼロに戻り、フィードの信頼性を示すものではありません)、および CISA KEV カタログの最終取得成功時刻と方法(/api/v1/public/kev/recent から取得)を示します。スケジュールを報告するエンドポイントがないフィードの名前を挙げ、それらのスケジュールはないと記載します(JSON)。
cve://{cve_id}get_cve が返す1つの CVE を、構造化された結果、エンベロープ、レコードとして JSON 形式で示します。JSON が30,000文字を超えると、data は get_cve の最初のテキストブロックと同様に切り詰められ、data_truncated は true になり、truncated には切り詰められた各リストが記載され、切り詰めによって省かれる内容を説明する DATA CUT で始まる注記が表示されます。get_cve の structuredContent.data には、full: true とともにレコード全体が格納されます。CVE ID ではない ID は、リクエストを送信する前に拒否されます。API に記録がない CVE は見つからないものとして扱われます。

結果が意味すること

すべてのツールは、次のいずれかの形式で応答するため、結果を読むモデルが障害を問題なしと誤認することはありません。

  • 成功 — 1 つ目のテキストブロックは API の JSON をそのまま示します(30,000 文字を超える場合は、適切な長さに切り詰めます。詳しくは下記の「長い回答」をご覧ください)。2 つ目は、呼び出しが成功したこと、応答したベース URL、見つかった内容を伝える 1 行の注記です。3 つ目は、すでに最初の 2 つで述べた内容を除いた、JSON 形式の構造化結果です(下記)。フィードにクエリに該当する情報が本当にない場合、注記ではその旨を言葉で伝えます(「検索した結果、何も見つかりませんでした……検索に失敗したわけではありません」)。測定されたゼロも測定結果だからです。例外は cve_summary と exposure_radar です。cve_summary では、応答が outputSchema の JSON 型と異なる型で送る poller フィールド(または JSON オブジェクトでも null でもない poller)を除外し、注記でそのフィールドについて説明します。exposure_radar では、各レーダーの内容を docs/exposure-radar.md に記載されたフィールドに絞り、各 kev_exposure.newest_kev の行に exposure_state を追加します。shadow_ai の件数は同ページの説明に従って再分類されます。また、poller ブロックには running と last_run_at だけが含まれ、実際の完了時刻がない場合はブロック自体が省略されます。このブロックのほかのフィールドは、レーダーではなく応答したサーバーインスタンスについて説明するものです。last_run_at は、レーダーのリーダーが Certificate Transparency(crt.sh)のサイクルを最後に完了した時刻であり、running は、その完了時刻が応答時刻から 30 分以内の場合に限り true になります。running が true の場合、注記ではレーダーのリーダーがその時刻にサイクルを最後に完了したと伝えます。false の場合は、その時刻以降にサイクルが完了していないと伝えます。last_run_at がない場合は、レーダーの最新状況が不明であると伝え、ブロックを省略します。旧バージョンの API では、リクエストを処理したサーバーインスタンスが応答し、フォロワーインスタンスはゼロ時刻 0001-01-01T00:00:00Z を指定した running: false を送信していました。これも最新状況が不明であることを意味し、レーダーが停止したと示すことはありません。
  • 失敗 — 検索が完了しなかった場合は、必ず MCP エラー結果(isError: true)になります。ホストに到達できなかった場合、ホストが非 2xx で応答した場合、タイムアウトを超えた場合、または 2xx で応答したものの本文が JSON オブジェクトではない場合が該当します。テキストには、ツール名、原因(ステータスコードまたはエラーの種類)、パス、ベース URL を記載し、これは検索結果ではないことを伝えます。2 つ目のテキストブロックは、メッセージの文を除いた構造化結果を JSON で示します(下記)。失敗が null フィールドを含む成功として表示されることはありません。

どちらの形式にも、下記の構造化結果が含まれ、最後のテキストブロックでも、先行するブロックですでに述べた内容を除いて繰り返されます。そのため、content だけをモデルに渡すクライアントでも、回答がどのように測定されたかを確認できます。最初のテキストブロック(API の JSON、または失敗内容)とその後の注記は、1.x で配置されていた場所にあります。

長い回答

モデルは読む文字数ごとにコストがかかり、クライアントによって結果のどの部分をモデルに渡すかも異なります。そのため、各部分には同じ上限である 30,000 文字を適用し、それぞれ個別の方法で切り詰めます。

  • Claude Code はテキストブロックではなく、モデルに structuredContent を渡し、MAX_MCP_OUTPUT_TOKENS(デフォルトで 25,000 トークン)に照らしてサイズを判定します。10,000 トークンを超えると警告し、上限を超えると結果をファイルに保存して、そのパスをモデルに渡します。2.7.x までは structuredContent.data に常に回答全体が含まれていました。2026-10-11 の本番環境での回答では、CVE-2021-44228 に対する get_cve の structuredContent は 65,540 文字で、最初のテキストブロックは 23,759 文字でした。Claude Code はこれをファイルに保存しました。3.0.0 以降は、構造化された結果は収まるように切り詰められます(下記参照)。Claude Code の起動環境で MAX_MCP_OUTPUT_TOKENS を設定すると、上限を引き上げられます。
  • テキストブロック(content)のみを渡すクライアントは、次の項目の後で説明するように、収まるように切り詰められた最初のテキストブロックを読み取ります。
  • 回答全体を、長さにかかわらず必要とするプログラムが structuredContent.data を読み取る場合は、full: true を渡します。すべてのツールで利用できます。ただし、Claude Code のように構造化された結果のサイズを判定するクライアントは、上限を超える回答を拒否することがあります。 構造化された結果です。その全体(エンベロープ、その注記、コンパクトな JSON としての data)が30,000文字を超え、呼び出しで full: true が指定されていない場合、ツールごとに定められた順序で data が切り詰められます。1行のサイズが大きい場合は、まずすべての行を簡略化し、すべての行を残します。check_sbom と scan_manifest では、各行の index、purl、verdict、not_assessed_reason、cve_ids、matched_package、matched_via と、各マッチの cve_id、kev_listed、ransomware、epss_score、effective_score、score_assessed、fixed_in、fixed_in_reason、さらにプロンプトがマッチから読み取るすべてのフィールドを残します。次に各行のマッチ数を同じ数まで減らし、最初のマッチを残します。切り詰められた行には matches_truncated を付与し、その行の合計数、およびすべてのマッチの KEV 掲載 CVE ID、ランサムウェア CVE ID、fixed_in バージョンを記載します。続いて各マッチを cve_id、kev_listed、ransomware、fixed_in、effective_score のみに簡略化し、その後、各行を index、purl、verdict、not_assessed_reason、cve_ids のみに簡略化します(行は簡略化された状態で残り、残った行は順番に詳細を戻します)。check_affected では、各マッチのスコア、フラグ、判定基準、fixed_in を残してから、さらに数を減らします。cve_remediation では、まず各項目の product_ids を削除し、次にテキストを削除します。各アドバイザリの状態、種類、URL、修正済みビルドは残します(get_vendor_advisory は各テキストを返します)。次に fixed_branches を簡略化し(その後、各パッケージの範囲数を上限まで減らし)、patches を簡略化します。その後 fix_references、patches、fixed_branches の順に切り詰め、アドバイザリは最後に切り詰めます。注記には、すべてのアドバイザリを列挙する vendor_advisories_for_cve が記載されます。search_cves では各行の説明とスコアを残し、その後スコアのみを残します。ベンダーアドバイザリのツールでは、まず affected_products を削除し、次に summary を削除します。この後になって初めて行が削除されます。check_sbom と scan_manifest では、まず not_checked、次に not_sent_purls を全件または全件なしで切り詰めます(注記に取得方法が記載されています)。続いて not_affected の行、次に not_assessed の行を削除します(data.summary にはすべての判定結果の件数が含まれます)。最後に、影響ありの行を末尾から削除します。check_affected では、まず excluded と undetermined のサンプルを削除し、すべてのマッチを列挙する cve_ids は最後に削除します。その他の行を返すツールでは末尾から行を削除します。ページングに対応したツールでは、残りの行を読み取るための offset または limit を記載します(search_cves と search_vendor_advisories では、data に全行をそのまま収められるページサイズも記載し、その行数は全行で数えます)。get_cve では、cpe_match と references の項目数をそれぞれ同じ上限まで減らし、その後 cpe_configurations を切り詰めます。exposure_radar では、日次系列と週次系列をそれぞれ切り詰め、新しい項目を残します。次にすべてのランキングを切り詰め、その後 kev_exposure.newest_kev を切り詰めます。続いて、data 直下のその他のリストも同じ方法で切り詰めます。リストが収まった後に残った容量は、それより前に空になったリストに戻され、収まるだけ項目が追加されます(通常のリストでは先頭から、系列では最新の項目から追加します)。文字列は短縮されず、値も変更されません(簡略化された行では、出力スキーマで任意とされているフィールドの一部が保持されるため、data の検証は引き続き通ります。切り詰め時に追加されるのは matches_truncated と fixed_branches_truncated のみです)。続いて、結果には data_truncated: true(それ以外のすべての成功時は false)が設定され、truncated には切り詰められた各リストが data 内のパスとともに記載されます。各リストには total、返された件数 returned が示され、項目が簡略化されている場合は thinned: true も含まれます。注記の末尾には DATA CUT で始まる文があり、何が切り詰められたか、残りの読み取り方法、および同じ呼び出しで full: true を指定すると data 全体が返されることを説明します。 最初のテキストブロックです。2.6.2 までは、サイズにかかわらず API の JSON がそのまま格納されていました。2026-10-04 の本番環境の応答では、デフォルトの search_cves で「openssl」を検索したページはテキストが 133,300 文字、CVE-2021-44228 の get_cve は 80,897 文字、Linux カーネル 5.10.0 の check_affected は 364,408 文字、kev_recent の最大ページは 105,925 文字、search_vendor_advisories の最大ページは 103,147 文字でした。そのため、API の JSON が 30,000 文字を超える場合は、最初のテキストブロックには、切り詰めた data ではなく、応答全体を切り詰めて格納します。これは full: true の有無にかかわらず同じです。まず同じ JSON を各行がそれぞれ 1 行に収まるように整形します。インデント以外の応答の文字は削られません。それでも長すぎる場合は、行のリストを返すツールでは、各行を指定フィールドだけに切り詰めます。優先度の高いフィールドが先に残ります(search_cves では、cve_id、severity、cvss_v3_score、echelongraph_score、score_assessed、epss_score、kev_listed、説明の先頭 200 文字などが残ります)。長い文字列はすべて末尾が「…」になります。行と並ぶリストは、第 1 階層で残される行フィールドより前に、また行がテキストから除かれるより前に切り詰められます。check_affected の excluded と undetermined のサンプルは最初の 10 件を残し、それぞれの cve_id と reason を保持します。また、cve_ids(各一致の cve_id を順番どおりに並べたもの)は最初の 10 件を残します。これにより、各 CPE 一致はテキストに残り、それぞれ少なくとも cve_id、kev_listed、ransomware、epss_score、effective_score、score_assessed を含みます(レジストリの一致では fixed_in も含まれます。上限の 200 件近くに達したレジストリリストでは、最後の一致が除かれることがあり、未判定 50 件とともに 200 件中 15 件が除かれる場合は、注記に件数が記載されます)。check_sbom の not_sent_purls は最初の 10 件を残します。注記には、未送信の PURL が入力のどの位置から続くかと、入力の PURL をどの順序で数えるかが記載されるため、リストを読み直さなくても、2 回目の呼び出しでそれらを送信できます。scan_manifest は check_sbom と同様に行を切り詰め、not_checked リストは最初の 20 件を残します。最も簡潔な形に切り詰めても長すぎる場合は、行がテキストから除かれます(check_sbom と scan_manifest では、最初に not_affected の行を、次に not_assessed の行を除きます)。注記には、それらを取得する方法として、次に呼び出す offset またはより小さい limit が記載されます。それ以外の応答では、各リストの先頭の項目が残ります(get_cve の cpe_match と references など)。注記の最後には TEXT CUT で始まる文が 1 つあり、最初のテキストブロックから除かれた内容と、どのツールが各行を返すかが記載されます。該当するツールは、get_cve、get_vendor_advisory、check_affected、および CVE の修正済みバージョンを返す cve_intel です。それらのツールの structuredContent.data では全体を取得できますが、各ツールの最初のテキストブロックも 30,000 文字を超えると切り詰められます。収まる応答は、これまでどおり整形済みの全内容が送信されます。同じ応答は常に同じ方法で切り詰められます。cve://{cve_id} リソースは get_cve のレコード全体を読み取り、get_cve の最初のテキストブロックと同じ方法で data を切り詰め、その旨を示します。data_truncated: true、切り詰めた各リストを示す truncated、および DATA CUT で始まる注記が含まれます。プロンプトが求めるのは、テキストに残る内容だけです。kev_weekly_brief は kev_recent を 1 ページ 50 行で読み取りますが、テキストにはページ全体が残ります。triage_cve は get_cve から CISA の期限を読み取ります。また、sbom_review は各一致の fixed_in を読み取り、cve_intel はコンポーネントに一致が残らない場合に fixed_branches を読み取ります。

構造化された結果

2.0.0 以降、成功・失敗を問わずすべての結果に structuredContent が含まれ、すべてのツールは tools/list で outputSchema として形状を宣言します。また、タイトルと、readOnlyHint: true、destructiveHint: false、idempotentHint: true、openWorldHint: true の注釈(クライアントが信頼できないものとして扱うヒント)も含まれます。

フィールド内容
statemeasured、not_assessed、failed、invalid_input のいずれかです(下記参照)。
measured_atAPI が示す、基になった観測が行われた日時です。回答に記載がない場合、または観測がない場合は null です。Go のゼロ値時刻にはなりません。
method数値の算出方法です。失敗時は null です。
coverage回答が対象とする範囲です。ツールが示せる内容は、cve_exposure では in_scope、search_cves ではリスト自身が示す件数、exposure_radar では回答したレーダー、check_affected では assessed、not_assessed_reason、検索経路、照合件数です。
freshnessAPI が提供する場合は、結果を生成したレーダーの最後に完了した確認日時(last_run_at)です。提供されない場合は null です。
notes注意事項を各1文で記載します。まずエンベロープ自体について必要な説明を記し、次にテキストブロックの注記を記載します。
data_truncated成功時のみです。data が切り詰められている場合(「長い回答」の「DATA CUT」を参照)は true、回答全体が含まれている場合は false です。
truncateddata_truncated が true の場合に、data 内で切り詰められた各リストを、そのパスとともに示します。total、returned、および項目の一部のフィールドだけが保持されている場合は thinned: true を含みます。
data成功時のみです。API の JSON です。full: true の場合は全体が含まれます。構造化された結果が既定の30,000文字を超える場合は切り詰められます(DATA CUT)。最初のテキストブロックには同じ JSON が含まれます。30,000文字を超える場合は、注記で示される回答全体の一部が含まれます(TEXT CUT)。
error失敗時のみです。kind、path、status、message が含まれます。

すべての結果の最後のテキストブロックには、この構造化された結果を JSON としてシリアライズしたものが含まれます。ただし、クライアントが content だけをモデルに渡す場合があるため、それより前のテキストブロックに逐語的に記載されている内容は除かれます。state、measured_at、coverage、freshness(成功時は data_truncated と truncated、失敗時は error)を、キー単位で同じ内容で保持します。成功時の最初のテキストブロックに含まれる data は省略されます。また、直前のテキストブロックに含まれる注記の文(失敗時はメッセージ)も省略されます。notes はエンベロープ自体について追加する文だけを保持し、該当する文がない場合は省略されます。cve_exposure のように、注記内で method を逐語的に引用している場合は、method も省略されます。したがって、テキストブロック全体で構造化された結果を表し、「長い回答」の「TEXT CUT」によって回答から省略された部分を除いて、内容に食い違いはありません。「DATA CUT」がある場合、最初のテキストブロックは切り詰められた data ではなく、回答全体から切り出されています。2.2.0 より前は、このブロックに注記全体が繰り返し含まれていたため、各注記が2回送信されていました。

state意味
measured要求された内容の測定結果です。エクスポージャーの件数が measured となるのは、回答に、その件数が観測された日時(measured_at)と算出方法(method)の両方が示されている場合のみです。エクスポージャーに関する回答には、今日のいつ観測されたかを示すものがないため、どちらのエクスポージャーツールの回答も measured にはなりません。
not_assessed回答に、要求された内容について日時の分かる測定結果が含まれていないため、回答内の件数は測定結果として提示されません。レーダーがこの CVE を検索していない、検索しているかどうかが回答に記載されていない、または件数の基となった観測日時が回答に記載されていない場合です。それでも、情報源に記録されている内容として、日時のない件数を伝えることはできます。exposure_state が exposed の場合の cve_exposure の exposed_hosts と、exposure_radar のラベル付き合計が該当します。各件数が何を表すかは、注記と、結果に含まれる場合は exposure_state に記載されます。
failed検索が完了しませんでした。該当結果が見つかったという意味ではありません。
invalid_inputこのサーバーまたは API によって入力が拒否されたため、検索は行われませんでした。該当結果が見つかったという意味ではありません。
各ツールの state、measured_at、coverage、freshness に何が格納されるかは、ツールごとに
docs/structured-results.md に記載されています。
各フィールドはすべて API が送信する値に基づいています。API が情報を示さない場合、そのフィールドは null となり、その旨が注記に記載されます。

フィールドがツールの outputSchema に適合しない成功レスポンス(スキーマで許可されない型のフィールド)は、error.kind が unexpected_shape の失敗として返され、転送されません。ただし、例外として cve_summary の poller フィールドが別の JSON 型の場合は、data から除外して注記に記載し、回答の残りの部分(summary を含む)は転送されます。API が後からフィールドを追加した場合、API の JSON をデータとして転送するすべてのツールはそのフィールドも転送します。一方、選択した項目のみを転送する exposure_radar と cve_intel は、そのフィールドを除外し、除外した項目を記載します。

プロトコルのバージョン

サーバーは stdio で Model Context Protocol の両方の世代に応答します。

  • 2026-07-28:server/discover で接続するクライアントは、2026-07-28、tools、prompts、resources の各機能、およびサーバーの指示を列挙した DiscoverResult を受け取り、その後、各リクエストをリクエストごとの _meta エンベロープとともに送信します。
  • 2025 以前:すべての 1.x SDK クライアントと同様に initialize で接続するクライアントは、2025-11-25、2025-06-18、2025-03-26、2024-11-05 のいずれかをネゴシエートします。サーバーが認識しないバージョンには、2025-11-25 で応答します。

接続の最初のメッセージによって、どちらの世代を使うかが決まります。SDK が構築するため、DiscoverResult に列挙されるのは 2026-07-28 のみです。2025 世代のバージョンには initialize を通じて接続します。どちらのハンドシェイクにも、パッケージ名とバージョン(serverInfo)が含まれます。また、すべての API リクエストには、User-Agent として echelongraph-mcp/<version> が含まれます。

どちらのハンドシェイクにも、サーバーの指示が含まれます。データは公開情報であること、Shodan のデータは Shodan のものであること、state、measured_at、freshness の意味、各結果がこれらを構造化結果とテキストの両方に含むこと、そしてエクスポージャーの数値は ip:port サービスの集計数であり、インターネット全体の調査ではないことが説明されています。

指示と各ツールの説明は、いずれも最大 2,048 文字です。Claude Code がモデルに読み込ませる前に各説明を切り詰める文字数(CLAUDE_CODE_MAX_MCP_DESCRIPTION_LENGTH のデフォルト値は 2048)に合わせているため、そこで切り詰めるクライアントを使っても文が失われません。各説明には、そのツールが返す内容と、ゼロ、false、失敗を検出結果と誤解しないためのルールが記載されています。各フィールドが何を数えるかの詳細はツールの outputSchema に、転送される数値については結果の注記にも記載されています。

プライバシー:情報の送信先

npm パッケージ(stdio)。 サーバーはお使いのマシン上で動作し、ツールが行う API 呼び出しごとに 1 回、単一のホスト ECHELONGRAPH_API_BASE(デフォルトは https://app.echelongraph.io)へ HTTPS リクエストを送信します(exposure_radar は 5 回、その他の各ツールは 1 回です)。テレメトリーはありません。EchelonGraph にも他の誰にも、それ以外の情報は送信されません。各リクエストには User-Agent echelongraph-mcp/<version> (+https://echelongraph.io/pulse/mcp) が含まれます。ECHELONGRAPH_MCP_UA を設定すると、そのトークンが先頭に追加され、API のアクセスログでバージョンごとの利用状況を集計できます。他の HTTPS リクエストと同様、リクエストはお使いのネットワークアドレスから API に届きます。

各ツールの入力情報の送信先:

入力送信先
CVE ID(get_cve、cve_exposure、epss_history、cve_intel、cve_remediation、vendor_advisories_for_cve)、CWE ID とページ(get_cwe)、ベンダーとアドバイザリ ID(get_vendor_advisory)URL パス。
search_cves:searchリクエストヘッダー X-EG-Search。URL には含まれません。severity、minimum CVSS、sort、limit、offset はクエリ文字列に含まれます。
search_vendor_advisories:queryリクエストヘッダー X-EG-Advisory-Search。URL には含まれません。vendor、severity、CVE filter、limit、offset はクエリ文字列に含まれます。
check_affected:product、version、ecosystem、packageリクエストヘッダー X-EG-Product、X-EG-Version、X-EG-Ecosystem、X-EG-Package。URL には含まれません。
cve_remediation:ecosystem、package、versionリクエストヘッダー X-EG-Ecosystem、X-EG-Package、X-EG-Version。URL には含まれません。CVE ID は URL パスに含まれます。
kev_recent:since、until、ransomware、vendor、limit、cursorリクエストヘッダー X-EG-Since、X-EG-Until、X-EG-Ransomware、X-EG-Vendor、X-EG-Limit、X-EG-Cursor。URL には含まれません。
check_sbom:purls、または sbom ドキュメントpurls は、それぞれ最大 200 件を POST ボディで送信します。CycloneDX または SPDX ドキュメントはお使いのマシン上で読み込まれ、そこに含まれる purls のみが送信されます。ドキュメント自体は送信されません。(ホスト型エンドポイントでは、代わりにドキュメントが EchelonGraph のサーバーに送信されます。詳細は以下をご覧ください。)
scan_manifest:filesファイルから読み込んだ purls は、それぞれ最大 200 件を POST ボディで送信します。ファイル名、ファイルのテキスト、チェック対象外のエントリは API に送信されません。npm から実行する場合、ファイルを読み込むサーバーはお使いのマシン上にあります。ホスト型エンドポイントでは EchelonGraph のサーバーが読み込み、ファイルはリクエストボディとして送信されます(詳細は以下をご覧ください)。
cve_summary、exposure_radar入力なし。

API は、ヘッダーで送信された検索への回答に no-store を指定するため、共有キャッシュに保持されません。また、URL を記録するリクエストログやトレーススパンに、そこで検索された内容が記録されることもありません。

ホスト型エンドポイント。 https://mcp.echelongraph.io/mcp へのリクエストは、まず EchelonGraph のサーバーに届き、そのサーバーが上記と同じ API を呼び出します。リクエストごとに、HTTP メソッドとパス、ステータス、所要時間、ボディサイズ、JSON-RPC メソッド、tools/call の場合はツール名、プロトコルバージョン、Origin ヘッダーが送信されたかどうか、お使いのクライアントの User-Agent の種類を記録します。ツール引数やクエリ文字列が記録されることはありません。check_sbom のドキュメント(または sbom_review プロンプトのドキュメント)は、ここでは他のツール引数と同様にリクエストボディに含まれるため、ドキュメント全体が EchelonGraph のサーバーに届きます。サーバーはメモリ上でそこから purls を読み取り、それらのみを API に送信し、ドキュメントをログに記録したり保持したりしません。ドキュメントをお使いのマシン上に保持するには、npm パッケージを実行するか、check_sbom に purls を渡してください。scan_manifest のファイルも同様です。ファイルのテキスト全体がリクエストボディに含まれ、EchelonGraph のサーバーがメモリ上で purls に読み替え、それらのみを API に送信します。ファイルをログに記録したり保持したりすることはありません。ロックファイルをお使いのマシン上に保持するには、npm パッケージを実行してください。クライアントがクライアントごとの上限を超えた場合、そのクライアントのアドレスキーが記録されます。クライアントの公開アドレスは、API が検証するトークンがある場合にのみ信頼するヘッダーで API に渡されるため、レート制限はホスト型サービスではなくお使いのクライアントに適用されます。API のアクセスログには、これらの呼び出しがそれぞれお使いのアドレス(IPv6 アドレスの場合は /64)と URL パスとともに記録されます。CVE、CWE、アドバイザリの検索では、問い合わせた ID が記録されます。クエリ文字列や、上記のヘッダーで送信された用語は記録されません(search_cves では、用語が指定されたかどうかとその長さは記録されますが、用語自体は記録されません)。また、check_sbom と scan_manifest の purls については、件数のみが記録され、内容は記録されません。

EchelonGraph のプライバシーポリシー:https://echelongraph.io/privacy。

レート制限

API キーは不要ですが、API は呼び出し元ごとに制限を設けています。呼び出し元は 1 つの IPv4 アドレス、または 1 つの IPv6 /64 ネットワークとして扱われ、すべてのリクエストが合算されます。60 秒間の制限は、/api/v1/public/cves とその配下のパスが 1 分あたり 12,000 件、CWE、ベンダーアドバイザリ、KEV、シャドー AI の各パスが 6,000 件、その他の公開パスが 600 件です。check_sbom と scan_manifest のバッチルートはコンポーネントごとにカウントされ、1 分あたり 1,200 コンポーネントです。制限を超えると、ツールは空のデータではなく失敗(state が failed、error.status が 429)を返します。check_sbom と scan_manifest は、1 回の呼び出しにつき 50 秒以内で 429 の Retry-After を待ち、取得できた結果を返します。残りは coverage.not_sent にカウントされます。ホステッドエンドポイントでは、クライアントアドレスごとに MCP リクエストが 1 分あたり 120 件追加され、64 KiB を超えるリクエストボディは拒否されます(check_sbom または scan_manifest の呼び出し、あるいは sbom_review プロンプトの場合は 6 MiB)。各制限の詳細と、各制限を超えた場合のツールの応答については、docs/rate-limits.md をご覧ください。これらの制限に関する API 独自のドキュメントはこちらです:https://echelongraph.io/pulse/api。

設定

npm パッケージ(stdio):

環境変数デフォルト用途
ECHELONGRAPH_API_BASEhttps://app.echelongraph.ioAPI のベース URL を上書きします(セルフホスト/プロキシ)。URL に認証情報が含まれている場合、結果にベース URL が表示される箇所ではマスキングされます。
ECHELONGRAPH_API_TIMEOUT_MS15000リクエストごとのタイムアウトです。応答に時間がかかりすぎた場合、空のデータではなく、検索失敗として報告されます。
ECHELONGRAPH_MCP_UA未設定このパッケージ独自の User-Agent の前に付加する製品トークン(例:my-monitor/1.0)です。これにより、モニターなどの自動呼び出し元と、サーバーを利用するユーザーを区別できます。単一のトークンではない値は無視されます。

HTTP エントリーポイントの dist/http.js(npm run start:http)は、POST /mcp で Streamable HTTP を使って同じツールを提供し、GET /health で稼働状態を確認できます。メモリが少ないコンテナーで起動する場合は、EchelonGraph のホステッドデプロイが 256 MiB で行うように、V8 のヒープ上限をコンテナーの制限より低く設定してください(node --max-old-space-size=104 --max-semi-space-size=16 dist/http.js)。設定しない場合、Node はシステムが報告するメモリ容量(コンテナーではホストのメモリ容量の場合があります)に基づいてヒープサイズを決めるため、V8 がガベージコレクションを実行する前にコンテナーが強制終了されることがあります。 上記の 3 つの環境変数を読み込み、さらに以下を使用します。

環境変数デフォルト用途
PORT8080リッスンするポートです。
MCP_RATE_LIMIT_PER_MIN120インスタンスごと、クライアントアドレスごとの 1 分あたりの MCP リクエスト数です。
MCP_MAX_BODY_BYTES65536SBOM(下記)を除き、読み込むリクエストボディの最大サイズです。
MCP_MAX_SBOM_BODY_BYTES6291456check_sbom または scan_manifest の tools/call、あるいは sbom_review の prompts/get で読み込むボディの最大サイズです。
MCP_LARGE_BODY_SLOTS2MCP_MAX_BODY_BYTES を超えるボディを同時に読み込んで処理する数です。これを超えると、Retry-After とともに 503 が返されます。
MCP_MAX_IN_FLIGHT64同時に処理するリクエスト数です。subscriptions/listen のストリームは含みません。次のリクエストは、ボディの読み込みを含めて待機します。
MCP_ADMISSION_WAIT_MS10000リクエストが処理されるまでの待機時間です。この時間を超えると、Retry-After とともに 503 が返されます。
MCP_H2C未設定1 の場合、HTTP/1.1 の代わりに HTTP/2 クリアテキスト(h2c、事前知識あり)で提供します。これは Cloud Run の --use-http2 が必要とする設定です。この場合、HTTP/1.1 リクエストには応答しません。h2c では、クライアントがリセットしたストリームの呼び出しは停止します。
ECHELONGRAPH_FORWARD_TOKEN、ECHELONGRAPH_FORWARD_HOST、MCP_REQUIRE_FORWARD_TOKEN未設定EchelonGraph のホステッドデプロイ専用です。API に各クライアントを識別させるためのトークンです。自分で実行する場合は未設定のままにしてください。その場合、API はすべてのリクエストをお使いのサーバーからのものとしてカウントします。

開発

npm install
npm run build      # tsc → dist/
npm test           # build, then the behavioural suite over both protocol eras, against a stub API (no network needed)
npm run smoke      # spawn the server + call cve_exposure against the production API

npm run smoke は、このパッケージの User-Agent を使って本番 API を呼び出します。API が自分たちのものとして認識する送信元アドレスを持つ自社ワークスペースから実行した場合、リクエストは自社のトラフィックとしてカウントされ、導入件数には含まれません。それ以外のマシンから実行すると、ECHELONGRAPH_MCP_UA を設定しない限り(例:ECHELONGRAPH_MCP_UA=my-smoke/1.0 npm run smoke)、外部の MCP 導入としてカウントされます。設定した場合、リクエストはそのトークンのファミリーに分類されます。npm test がマシンの外に通信することはありません。

npm test は、2026-07-28 の server/discover と 2025-06-18 の initialize をそれぞれ対象にテストスイートを実行し、さらに時代別のテストも実行します。dist/ ではなくインストール済みパッケージを対象に実行するには、ECHELONGRAPH_MCP_BIN にそのパッケージの echelongraph-mcp バイナリを設定してください。この場合、テストは npx と同様にバイナリを直接実行し、そのパッケージに含まれるファイルを読み込みます。

バージョン管理

セマンティックバージョニングを採用しています。メジャーバージョンではプロトコルの動作を変更するか、Node.js のバージョンをサポート対象から外します。マイナーバージョンではツールまたはフィールドを追加します。パッチバージョンではツールの構造を変えずに、文言または動作を修正します。すべてのリリースは、v<version> タグが付いたコミットから、公開リポジトリのリリースワークフローによって来歴アテステーション付きで npm に公開されます。バージョンごとの変更内容はCHANGELOG.mdをご覧ください。

3.0.2 以降、成功時の outputSchema は、名前が指定されていないトップレベルフィールドも許容します。そのため、マイナーリリースでフィールドが追加されても、以前に読み込んだツールリストを保持しているクライアントでエラーになりません。アップグレード後に「ツールの出力スキーマと一致しません」と表示される場合、そのクライアントはツールリストを読み込んだバージョンのスキーマに基づいて検証しています。再接続するか(Claude Code の場合:/mcp を実行してから echelongraph に再接続)、クライアントを再起動してください。各ツールの data スキーマは引き続き閉じたままです。その内部にフィールドが追加された場合も、再接続が必要です。

セキュリティ

脆弱性は公開 issue ではなく、[email protected] へ非公開で報告してください。ポリシー、サポート対象のバージョン、および対象範囲についてはSECURITY.mdをご覧ください。

ライセンス

コードは MIT ライセンスです。

CVE Pulse の編集物(EchelonGraph が CVE ソースをどのように統合するか、および EchelonGraph スコア)は © EchelonGraph であり、CVE Pulse の無料アクセス条件のもとで提供されています。統合対象のソースレコードは、それぞれの発行元の条件に従います。

露出件数は Shodan のデータに基づいています。Shodan のデータは Shodan が所有し、著作権も Shodan が保有しています(© Shodan)。EchelonGraph は、これらのデータの所有権も著作権も主張しません。

コメント

MCP は初めてですか?

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

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