社員ブログ

2026.06.30 中の人の日常 NEW

【MiraiNet】AIを活用して脆弱性情報分析をしよう

はじめに

皆様こんにちは。技術部運用チームの水谷です。
以前、生成AIの領域でも「MCP」というものに注目している、というお話しをしたかと想います。(https://www.mirai.ad.jp/blog/20250702-2/

MCP(Model Context Protocol)は、生成AIと外部ツールを接続するための共通プロトコルです。AIそのものが直接外部サービスへ接続するのではなく、Claude Desktop や Cursor といった MCP クライアントを介して MCP サーバーを呼び出し、その先でAPIやデータベースへアクセスします。
自然言語によって指示を出せば、生成AIサービスの「外側」にあるものに対してアクセスし様々な処理を行うことができる……という点に、ちょっと将来性を感じているのです。

実はあれからも現在進行形で活用(実験?検証?遊び?)をしていたりします。

「如何にして日々の雑事を計算機に委ねるか(そして如何にして人間のみが成し得る仕事をし、付加価値を高めるか)」というのは永遠のテーマですね。多分。
というわけで面白そう/便利そうなMCPツールを見つけるたびに試してみたりするわけですが、先日 cve-mcp-server というものを知り、一通り試してみたところなかなか重宝するものでしたので構築手順も含め本日はご紹介したく思います。


cve-mcp-server とは

cve-mcp-server は、Claude Desktop や Cursor などの MCP クライアントから利用できる、セキュリティ情報収集用の MCP サーバーです。
Python(FastMCP)で実装されており、NVD・EPSS・CISA KEV・MITRE ATT&CK・Shodan・VirusTotal など 脆弱性調査で利用する主要な複数のサイトへ外部 API を用いて接続するツールを束ねています。

例えばCVEが一件発表され、その影響度などなど調査するだけでもCVSS や悪用確率、実攻撃の有無、パッチ情報などを複数サイトで調べ、突き合わせる必要があります。(つまりは「とても面倒くさい」のです)

cve-mcp-server を介せば、例えばチャットに「CVE-2025-59718 は緊急パッチが必要か?」と尋ねるだけで、AI が関連ソースを並列に照会し、複合リスクスコアや対応の優先度までまとめて返してくれます。
(ちなみに例示したCVEはFortiOSにおける認証回避の脆弱性として報告されたものですね……)

通信は外向き HTTPS のみで、SQLite によるキャッシュと監査ログも備えています。API キーは環境変数で管理され、キーなしでも一部ツールは動作します(NVD はレート制限の関係上、キー設定を推奨します)。


本稿の目的

本稿ではcve-mcp-server を Windows 環境で安定して起動し、Claude Desktop / Cursor などのクライアントから、自然言語で脆弱性情報の調査ができる状態にするところまでを目的にします。
GitHub公式ドキュメントでは、Python 3.10+、仮想環境、pip install -e ..env または MCP 設定の env を使う構成が案内されています。

私が試した限り、特に以下を明示すると安定するようです。

  • MCP 設定では Python 実行ファイルを絶対パスで指定します
  • cwdcve-mcp-server のプロジェクトルートに固定します
  • API キーは .env または MCP 設定の env に置きます
  • .env 読み込みに失敗する場合は CVE_MCP_ENV_FILE.env を明示します
  • SQLite キャッシュ用ディレクトリを作成できるパスにします

前提条件と免責

今回は以下条件で構築を進めます。なおGit、Python等については導入済みであるものとします。
(Macの人はごめんなさい。私は根っからのWindows派なのです……)

  • Windows 10 / 11
  • Python 3.10 以上
  • Git
  • PowerShell
  • Claude Desktop または Cursor
  • NVD、AbuseDB、など利用したいサービスの任意の API キー

API キーなしでも一部ツールは動作します。しかしNVD はレート制限が厳しいため NVD_API_KEY については取得の上設定することをお勧めします。

後はこの手の記事におなじみのあれですね。

「本稿の手順を実行し何等かの障害・損害が発生したとしても当方は一切責任を負いませんのでご了承ください。」


推奨ディレクトリ

以下ディレクリをインストール・作業ディレクトリとします。

C:Users\<ユーザー名>\Documents\cve-mcp-server

手順

準備が整ったら早速作業を進めていきましょう。
例では、ユーザー名を hogehoge として記載します。

1. リポジトリを取得

cd C:Users\hogehoge\Documents
git clone https://github.com/mukul975/cve-mcp-server.git
cd C:Users\hogehoge\Documents\cve-mcp-server

既に取得済みの場合は git pull で更新します。

cd C:Users\hogehoge\Documents\cve-mcp-server
git pull

2. Python 仮想環境を作成

グローバル Python に直接入れると、fastapigradio など他パッケージとの依存衝突が起きることがあります。MCP サーバー専用の仮想環境を使います。

cd C:Users\hogehoge\Documents\cve-mcp-server
py -3.10 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -e .

Python 3.10 が py -3.10 で見つからない場合は、実際の Python パスを指定します。

& "C:Users\hogehoge\AppData\Local\Programs\Python\Python310\python.exe" -m venv .venv

3. .env を作成

cd C:Users\hogehoge\Documents\cve-mcp-server
Copy-Item .env.example .env
notepad .env

.env には実キーを記載します。そのためGit にコミットしてはいけません!
※Gitには認証に関わる情報をコミットしない。最近、セキュリティ界隈でも話題になりましたね。

# 取得し記述した方がよいです
NVD_API_KEY=your-nvd-api-key

# 以下のAPIキーは任意です
GITHUB_TOKEN=your-github-token
ABUSEIPDB_KEY=your-abuseipdb-key
VIRUSTOTAL_KEY=your-virustotal-key
URLSCAN_KEY=your-urlscan-key
SHODAN_KEY=your-shodan-key
GREYNOISE_API_KEY=your-greynoise-api-key

CACHE_DB_PATH=C:Users\hogehoge\.cve-mcpcache.db
AUDIT_LOG_PATH=C:Users\hogehoge\.cve-mcpaudit.log
REQUEST_TIMEOUT=30
MAX_RETRIES=3

最低限動作させるためには NVD_API_KEY のみで問題ありません。
まずは最低限の動作で検証し、少しづつAPIキーを追加してもいいのではないでしょうか。
※なお上記例では、私が実際に導入している各種APIを挙げています。

4. キャッシュディレクトリを作成

起動時に SQLite キャッシュを作成するため、書き込み可能なディレクトリを用意します。

New-Item -ItemType Directory -Force C:Users\hogehoge\.cve-mcp

sqlite3.OperationalError: unable to open database file といったエラーが出る場合は、CACHE_DB_PATH の親ディレクトリが存在するか、書き込み権限があるかを確認してください。

5. 単体起動確認

まず MCP クライアントを使わず、PowerShell から Python の import と設定が読み込まれるかを確認します。

cd C:Users\hogehoge\Documents\cve-mcp-server
.\.venv\Scripts\Activate.ps1
python -c "import cve_mcp, cve_mcp.server; print('import ok')"
python -c "import cve_mcp.config as c; print('NVD_API_KEY', bool(c.NVD_API_KEY)); print('CACHE_DB_PATH', c.CACHE_DB_PATH)"

以下のような出力がされることを確認します

import ok
NVD_API_KEY True
CACHE_DB_PATH C:Users\hogehoge\.cve-mcp\cache.db

以下コマンドでMCPサーバーの起動確認をします

python -m cve_mcp.server

正常時は MCP サーバーとして待機するため、確認が出来たらは Ctrl + C で停止します。

6. Claude Desktop の MCP 設定

設定ファイルは通常、以下に存在すると思われます。

C:Users\hogehoge\AppData\Roaming\Claude\claude_desktop_config.json

推奨設定としては以下のようになります

{
  "mcpServers": {
    "cve-mcp": {
      "command": "C:Users\hogehoge\Documents\cve-mcp-server\.venv\Scripts\python.exe",
      "args": [
        "-m",
        "cve_mcp.server"
      ],
      "cwd": "C:Users\hogehoge\Documents\cve-mcp-server",
      "env": {
        "CVE_MCP_ENV_FILE": "C:Users\hogehoge\Documents\cve-mcp-server.env",
        "PYTHONUTF8": "1",
        "PYTHONIOENCODING": "utf-8"
      }
    }
  }
}

ポイント:

  • command.venv 内的 Python を絶対パスで指定します
  • cwdcve-mcp-server のルートにします
  • .env の読み込みが不安定な場合に備えて CVE_MCP_ENV_FILE を指定します
  • JSON 記法ですので、コメントや末尾カンマは書きません

設定変更後、 Claude Desktop を完全終了して再起動します

7. Cursor の MCP 設定

Cursor で使う場合は、MCP 設定に同様の定義を入れます。

設定ファイル例:

C:Users\hogehoge\.cursor\mcp.json

設定例:

{
  "mcpServers": {
    "cve-mcp": {
      "command": "C:Users\hogehoge\Documents\cve-mcp-server\.venv\Scripts\python.exe",
      "args": [
        "-m",
        "cve_mcp.server"
      ],
      "cwd": "C:Users\hogehoge\Documents\cve-mcp-server",
      "env": {
        "CVE_MCP_ENV_FILE": "C:Users\hogehoge\Documents\cve-mcp-server\.env",
        "PYTHONUTF8": "1",
        "PYTHONIOENCODING": "utf-8"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

既存の mcpServers がある場合は、cve-mcp のブロックだけを追加します。

8. 起動ログの正常例

ログに以下のような出力がされれば、設定は正常に行われています。

[cve-mcp] [info] Server started and connected successfully
[cve-mcp] INFO: HTTP Request: GET https://services.nvd.nist.gov/rest/json/cves/2.0?resultsPerPage=1 "HTTP/1.1 200 OK"
[cve-mcp] INFO: NVD API key validated (status 200)
[cve-mcp] [info] Message from server: ... "serverInfo":{"name":"cve-mcp","version":"1.27.0"}

特に、NVD API key validated (status 200) が出ていることを確認しましょう。このログは NVD_API_KEY を利用してNVDのAPIを叩いていることが確認できます。

9. 動作確認

早速、最近話題になった「Copy Fail」について聞いてみましょう

CVE-2026-31431 について、CVSS、EPSS、CISA KEV の状況を調べてください。

Claudeはものの数秒で以下のように回答してくれました。

トラブルシュート

ModuleNotFoundError: No module named ‘cve_mcp’ とログにでる

原因:

  • MCP 設定の Python と、pip install -e . した Python が違います
  • グローバル Python に入れたつもりで、別の Python が起動しています

確認:

& "C:Users\hogehoge\Documents\cve-mcp-server\.venv\Scripts\python.exe" -m pip show cve-mcp-server
& "C:Users\hogehoge\Documents\cve-mcp-server\.venv\Scripts\python.exe" -c "import cve_mcp; print(cve_mcp.__file__)"

対応:

cd C:Users\hogehoge\Documents\cve-mcp-server
.\.venv\Scripts\Activate.ps1
python -m pip install -e .

.env を読み込まない(APIキーを入れたのにアクセスできない等)

原因:

  • どの環境変数を読み込むか、は load_dotenv() が起動時のカレントディレクトリに依存します
  • MCP クライアントから起動したときの cwd が想定と違う場合、このエラーを見かけます

対応:

  • MCP 設定に "cwd": "C:Users\hogehoge\Documents\cve-mcp-server" を入れます
  • MCP 設定の env"CVE_MCP_ENV_FILE": "C:Users\hogehoge\Documents\cve-mcp-server\.env" を入れます
  • 確実にしたい場合は、MCP 設定の envNVD_API_KEY などを直接記述します

確認:

cd C:Users\hogehoge
& "C:Users\hogehoge\Documents\cve-mcp-server\.venv\Scripts\python.exe"
-c "import cve_mcp.config as c; print(bool(c.NVD_API_KEY)); print(bool(c.GITHUB_TOKEN)); print(bool(c.SHODAN_KEY))"

sqlite3.OperationalError: unable to open database file

原因:

  • CACHE_DB_PATH の親ディレクトリがありません
  • 書き込み権限がありません
  • パスに不正な文字や引用符が入っています

対応:

New-Item -ItemType Directory -Force C:Users\hogehoge\.cve-mcp

.env の例:

CACHE_DB_PATH=C:Users\hogehoge\.cve-mcp\cache.db
AUDIT_LOG_PATH=C:Users\hogehoge\.cve-mcp\audit.log

NVD が低速または rate limit になる

原因:

  • NVD_API_KEY が未設定です
  • API キーが読み込まれていません
  • 短時間に多数リクエストしています

対応:

python -c "import cve_mcp.config as c; print(bool(c.NVD_API_KEY))"

False の場合は .env または MCP 設定の env を見直してください。

出力が文字化けする

MCP 設定の env に以下を入れます。

{
  "PYTHONUTF8": "1",
  "PYTHONIOENCODING": "utf-8"
}

セキュリティ注意事項

くり返しになりますが、以下ご注意ください。

  • API キーはチャット、ログ、Git に貼らないでください
  • .env.gitignore 対象にしてください
  • 既に平文でAPIキーを共有・保存してしまった場合はローテーションしましょう
  • claude_desktop_config.jsonmcp.json にキーを直接書く場合は、ファイル権限とバックアップ範囲に注意してください
  • 可能なら .env + CVE_MCP_ENV_FILE に寄せることをお勧めします

まとめ

今日はcve-mcp-serverとその導入手順についてご紹介しました。
脆弱性調査という作業は、調べること自体が目的ではないのです。それは適切なリスク判断を行うための手段です。
MCPによって情報収集の手間を減らせれば、その分だけ「何を優先して対応すべきか」という本来人間が行うべき判断に時間を使えるようになります。

「とにかく楽したい」を旨に、これからもいろいろ試してみたいと思っています。今はまだ個人レベルの検証ではありますが、いつかはこれを業務に活かしてですね……

それではまたどこかでお会いしましょう。ごきげんよう。