mcp-nvd
Enables searching for vulnerabilities related to Red Hat products in the NVD database using keyword search functionality
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-nvdsearch for vulnerabilities related to Apache Log4j"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
NVD Database MCP Server
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).
Status
Works with Claude Desktop app and other MCP compliant hosts and clients using both the stdio and sse transports.
Related MCP server: MCP NVD Server
Features
Query specific CVEs by ID with detailed vulnerability data.
Search the NVD database by keyword with customizable result options.
Supports Server-Sent Events (SSE) transport for real-time communication.
Compatible with MCP-compliant clients like Claude Desktop.
Tools
The server implements the following tools to query the NVD Database:
get_cve:Description: Retrieves a CVE record by its ID.
Parameters:
cve_id(str): The CVE ID (e.g.,CVE-2019-1010218).concise(bool, defaultFalse): IfTrue, returns a shorter format.
Returns: Detailed CVE info including scores, weaknesses, and references.
search_cve:Description: Searches the NVD database by keyword.
Parameters:
keyword(str): Search term (e.g.,Red Hat).exact_match(bool, defaultFalse): IfTrue, requires an exact phrase match.concise(bool, defaultFalse): IfTrue, returns shorter CVE records.results(int, default10): Maximum number of CVE records (1-2000).
Returns: List of matching CVEs with total count.
Configuration
Create or edit the Claude Desktop configuration file located at:
On macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonOn 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/uvxwith the absolute path to theuvxexecutable. Find the path withwhich uvxcommand in a terminal. This ensures that the correct version ofuvxis used when starting the server.Restart Claude Desktop to apply the changes.
Development
Setup
Prerequisites:
Python 3.10 or higher.
An NVD API key (request here).
uvpackage manager (installation).
Clone the Repository:
git clone https://github.com/marcoeg/mcp-nvd
cd mcp-nvdSet Environment Variables:
Create a
.envfile in the project root:NVD_API_KEY=your-api-keyReplace
your-api-keywith your NVD API key.
Install Dependencies:
uv sync
uv pip install -e .Run with the MCP Inspector
cd /path/to/the/repo
source .env
npx @modelcontextprotocol/inspector uv \
--directory /path/to/repo/mcp-nvd run mcp-nvdThen open the browser to the URL indicated by the MCP Inspector, typically http://localhost:8077?proxyPort=8078
Switch freely between
stdioandssetransport types in the inspector.
Testing with the SSE Client
Run the Server:
cd /path/to/the/repo
source .env
uv run mcp-nvd --transport sse --port 9090Runs with SSE transport on port
9090by default.
Run the Client:
Test get_cve:
uv run client.py http://localhost:9090/sse CVE-2019-1010218Test 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 Setup
Build
docker build -t mcp-nvd:latest .Run
With .env:
docker run -d -p 9090:9090 -v /path/to/.env:/app/.env mcp-nvd:latestWith env var:
docker run -d -p 9090:9090 -e NVD_API_KEY="your-key" mcp-nvd:latestCustom 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.0Verify
docker logs <container_id>
# Expect: INFO: Uvicorn running on http://0.0.0.0:9090Test:
uv run client.py http://localhost:9090/sse CVE-2019-1010218Notes
Ensure
.envhasNVD_API_KEY=your-keyor use-e.Default port:
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:
Using Docker Compose for Testing
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.
Assumptions
Pre-built Image: The service uses a pre-built image tagged as
mcp-nvd:test, available locally or in a registry. The image is based on theDockerfilein the parent directory, which sets up the MCP-NVD server withuvand runs it in SSE mode on port 9090.
How to Build the Image
To create the mcp-nvd:test image:
Navigate to the project root:
cd ./mcp-nvdBuild the image using the Dockerfile:
docker build -t mcp-nvd:test .This builds the image with all dependencies from
pyproject.tomland themcp_nvd/module, setting the default command to run the server.
Running the Service
From the tests/ directory:
cd tests
docker-compose upAccess: The server runs at
http://localhost:9090.Stop:
docker-compose down.Environment: Ensure
NVD_API_KEYis in../.envor usedocker-compose --env-file ../.env up.
Running test_tools.py in the Docker Compose Scenario
To run the unit tests (test_tools.py) within the Docker environment:
Start the Service: Ensure the
mcp-nvdservice is running viadocker-compose up.Exec into the Container:
Identify the container name (e.g.,
mcp-nvd-mcp-nvd-1) with:docker psRun the tests inside the container:
docker exec -it mcp-nvd-mcp-nvd-1 python /app/tests/test_tools.pyNote: Assumes
test_tools.pyis 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.
Alternative: Run tests locally against the containerized service:
cd tests python test_tools.pyThis tests against
http://localhost:9090while the service runs.
Key Details
Port: 9090 is exposed for SSE access.
Logs: Stored in a
log-datavolume (optional).Image: Must be built once and tagged as
mcp-nvd:testbefore runningdocker-compose.
Credits to @sidharthrajaram for its working pattern for SSE-based MCP clients and servers: https://github.com/sidharthrajaram/mcp-sse
Available Tools
2 toolsget_cveC
Get a CVE based on the ID and return a formatted string with detailed attributes.
| Name | Required | Description | Default |
|---|---|---|---|
| cve_id | Yes | ||
| concise | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool returns a 'formatted string with detailed attributes,' which hints at read-only behavior but lacks specifics on permissions, rate limits, error handling, or data sources. For a tool with zero annotation coverage, this is insufficient to inform the agent about key operational traits like safety or performance constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, straightforward sentence that efficiently conveys the core action and output. It's front-loaded with the main purpose and avoids unnecessary words, making it easy to parse. However, it could be slightly more structured by separating usage notes or parameter hints, but overall, it's concise and effective for its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of retrieving CVE data, the lack of annotations, no output schema, and low schema description coverage, the description is incomplete. It doesn't address critical aspects like what 'detailed attributes' include, how errors are handled, or dependencies on external databases. For a tool with two parameters and no structured support, more context is needed to ensure reliable agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, meaning parameters are undocumented in the schema. The description mentions 'based on the ID' and 'concise' (implied by 'formatted string'), but it doesn't explain what 'cve_id' entails (e.g., format like 'CVE-2024-12345') or what 'concise' does (e.g., reduces output detail). With low coverage, the description adds minimal value beyond the schema, failing to compensate for the documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get a CVE based on the ID and return a formatted string with detailed attributes.' It specifies the verb ('Get'), resource ('CVE'), and output format ('formatted string with detailed attributes'), which is specific and actionable. However, it doesn't explicitly differentiate from its sibling tool 'search_cve', which likely searches for CVEs rather than retrieving a specific one by ID, leaving room for improvement in sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions retrieving a CVE by ID but doesn't clarify scenarios where this is appropriate compared to 'search_cve' or other potential tools. There's no mention of prerequisites, exclusions, or contextual cues for selection, leaving the agent with minimal usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cveC
Search CVEs by keyword and return formatted results matching the get_cve format.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | ||
| exact_match | No | ||
| concise | No | ||
| results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that results are 'formatted' to match 'get_cve format,' which adds some context about output behavior. However, it doesn't disclose critical behavioral traits such as whether this is a read-only operation, potential rate limits, authentication requirements, error handling, or what happens when no results are found. For a search tool with zero annotation coverage, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—a single sentence that efficiently communicates the core functionality. Every word earns its place: it specifies the action ('Search'), target ('CVEs'), method ('by keyword'), and output characteristic ('formatted results matching the get_cve format'). There's no wasted verbiage or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 parameters, no annotations, no output schema), the description is incomplete. It doesn't explain parameter meanings, behavioral constraints, or output details beyond referencing another tool's format. For a search function that likely returns structured data, more context is needed about what 'formatted results' entail and how parameters affect the search.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, meaning none of the 4 parameters have descriptions in the schema. The description only mentions 'keyword' generically and doesn't explain what 'exact_match', 'concise', or 'results' parameters do, their effects, or practical usage. It fails to compensate for the complete lack of schema documentation, leaving parameters largely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search CVEs by keyword and return formatted results matching the get_cve format.' It specifies the verb ('Search'), resource ('CVEs'), and scope ('by keyword'), but doesn't explicitly differentiate from its sibling tool 'get_cve' beyond mentioning the output format. This makes it clear but lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions the sibling tool 'get_cve' only in the context of output format, not as an alternative for different use cases. There are no explicit instructions on when to choose search_cve over get_cve or other potential tools, leaving the agent without contextual usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The two tools have clearly distinct purposes: get_cve retrieves a specific CVE by ID, while search_cve finds CVEs by keyword. There is no overlap in functionality, making it easy for an agent to choose the correct tool based on whether it needs a specific item or a broader search.
Both tools follow a consistent verb_noun pattern (get_cve and search_cve), using the same base noun 'cve' and descriptive verbs that clearly indicate their actions. This consistency enhances readability and predictability.
With only 2 tools, the server feels thin for the domain of CVE management, as it lacks essential operations like filtering by date, severity, or vendor, or updating/creating entries. While the tools cover basic retrieval and search, the scope is incomplete for typical security workflows.
The tool surface is severely incomplete for CVE management, missing critical operations such as filtering by parameters like date range or CVSS score, handling CVE updates or annotations, and providing bulk operations. This will likely cause agent failures when more complex queries or actions are needed.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
NVD MCP — wraps the NIST National Vulnerability Database API (free, no auth)
CVE lookups (NVD) and dependency-manifest audits (OSV) for AI agents. No API keys.
ZEN SecDB MCP server for CVE intelligence, CVSS/EPSS scoring, advisories, SSVC, and package audits.
Model Context Protocol server for Studex tools, notifications, and profile integrations
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol (MCP) server for querying the CVE-Search API. This server provides comprehensive access to CVE-Search, browse vendor and product、get CVE per CVE-ID、get the last updated CVEs.6103MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that retrieves CVE information from the National Vulnerability Database, allowing AI models to access up-to-date vulnerability data.17Apache 2.0
- AlicenseAqualityDmaintenanceA Model Context Protocol server providing security vulnerability intelligence tools including CVE lookup, EPSS scoring, CVSS calculation, exploit detection, and Python package vulnerability checking.89MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for accessing the CIRCL CVE SEARCH API, providing comprehensive vulnerability and security information.10MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/marcoeg/mcp-nvd'
If you have feedback or need assistance with the MCP directory API, please join our Discord server