mcp nvd
A Model Context Protocol server implementation to query the NIST National Vulnerability Database (NVD) via its API.
A Model Context Protocol server implementation to query the NIST National Vulnerability Database (NVD) via its API.
A Model Context Protocol server implementation to query the NIST National Vulnerability Database (NVD) via its API. https://nvd.nist.gov/
As a prerequisite an NVD API key is required. (Request here).
Works with Claude Desktop app and other MCP compliant hosts and clients using both the stdio
and sse
transports.
The server implements the following tools to query the NVD Database:
get_cve
:cve_id
(str): The CVE ID (e.g., CVE-2019-1010218
).concise
(bool, default false
): If true
, returns a shorter format.Returns: Detailed CVE info including scores, weaknesses, and references.
search_cve
:
keyword
(str): Search term (e.g., Red Hat
).exact_match
(bool, default false
): If true
, requires an exact phrase match.concise
(bool, default false
): If true
, returns shorter CVE records.results
(int, default 10
): Maximum number of CVE records (1-2000).~/Library/Application Support/Claude/claude_desktop_config.json
On Windows: %APPDATA%/Claude/claude_desktop_config.json
Add the following:
{
"mcpServers": {
"mcp-nvd": {
"command": "/path/to/uvx",
"args": ["mcp-nvd"],
"env": {
"NVD_API_KEY": "your-api-key"
}
}
}
}
Replace /path/to/uvx
with the absolute path to the uvx
executable. Find the path with which uvx
command in a terminal. This ensures that the correct version of uvx
is used when starting the server.
Restart Claude Desktop to apply the changes.
uv
package manager (installation).
Clone the Repository:
git clone https://github.com/marcoeg/mcp-nvd
cd mcp-nvd
Set Environment Variables:
.env
file in the project root:
NVD_API_KEY=your-api-key
Replace your-api-key
with your NVD API key.
Install Dependencies:
uv sync
uv pip install -e .
cd /path/to/the/repo
source .env
npx @modelcontextprotocol/inspector uv
--directory /path/to/repo/mcp-nvd run mcp-nvd
```
Then open the browser to the URL indicated by the MCP Inspector, typically `http://localhost:8077?proxyPort=8078`
> Switch freely between `stdio` and `sse` transport types in the inspector.
### Testing with the SSE Client
#### Run the Server:
```bash
cd /path/to/the/repo
source .env
uv run mcp-nvd --transport sse --port 9090
- Runs with SSE transport on port 9090
by default.
Test get_cve
:
uv run client.py http://localhost:9090/sse CVE-2019-1010218
Test search_cve
(default 10 results):
uv run client.py http://localhost:9090/sse "search:Red Hat"
Test search_cve
(exact match, 5 results):
uv run client.py http://localhost:9090/sse "search:Microsoft Windows:exact:5"
docker build -t mcp-nvd:latest .
With .env
:
docker run -d -p 9090:9090 -v /path/to/.env:/app/.env mcp-nvd:latest
With env var:
docker run -d -p 9090:9090 -e NVD_API_KEY="your-key" mcp-nvd:latest
Custom port:
docker run -d -p 8080:8080 -v /path/to/.env:/app/.env mcp-nvd:latest uv run mcp-nvd --transport sse --port 8080 --host 0.0.0.0
docker logs <container_id>
# Expect: INFO: Uvicorn running on http://0.0.0.0:9090
Test:
uv run client.py http://localhost:9090/sse CVE-2019-1010218
.env
has NVD_API_KEY=your-key
or use -e
.9090
.Here’s the summary formatted as Markdown comments within a code block, suitable for inclusion in a file like docker-compose.yaml
or README.md
:
This docker-compose.yaml
, located in the tests/
directory, defines a service for testing the MCP-NVD server using a pre-built Docker image. It’s designed for a testing use case, similar to a standalone service like clickhouse
, and assumes the image is built beforehand rather than rebuilt each time.
mcp-nvd:test
, available locally or in a registry. The image is based on the Dockerfile
in the parent directory, which sets up the MCP-NVD server with uv
and runs it in SSE mode on port 9090.To create the mcp-nvd:test
image:
1. Navigate to the project root:
cd ./mcp-nvd
2. Build the image using the Dockerfile:
docker build -t mcp-nvd:test .
- This builds the image with all dependencies from pyproject.toml
and the mcp_nvd/
module, setting the default command to run the server.
From the tests/
directory:
cd tests
docker-compose up
- Access: The server runs at http://localhost:9090
.
- Stop: docker-compose down
.
- Environment: Ensure NVD_API_KEY
is in ../.env
or use docker-compose --env-file ../.env up
.
test_tools.py
in the Docker Compose ScenarioTo run the unit tests (test_tools.py
) within the Docker environment:
1. Start the Service: Ensure the mcp-nvd
service is running via docker-compose up
.
2. Exec into the Container:
- Identify the container name (e.g., mcp-nvd-mcp-nvd-1
) with:
docker ps
- Run the tests inside the container:
docker exec -it mcp-nvd-mcp-nvd-1 python /app/tests/test_tools.py
- Note: Assumes test_tools.py
is copied into the image at /app/tests/
. If not, modify the Dockerfile to include:
COPY tests/ ./tests/
Then rebuild the image with docker build -t mcp-nvd:test .
from the root.
3. Alternative: Run tests locally against the containerized service:
cd tests
python test_tools.py
- This tests against http://localhost:9090
while the service runs.
log-data
volume (optional).mcp-nvd:test
before running docker-compose
.Credits to @sidharthrajaram for its working pattern for SSE-based MCP clients and servers: https://github.com/sidharthrajaram/mcp-sse