はじめに
皆様こんにちは。技術部運用チームの水谷です。
以前、生成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 実行ファイルを絶対パスで指定します
cwdをcve-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 に直接入れると、fastapi や gradio など他パッケージとの依存衝突が起きることがあります。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 を絶対パスで指定しますcwdはcve-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はものの数秒で以下のように回答してくれました。







