MCP-NVD服务器
一种用于通过其API查询NIST国家漏洞数据库(NVD)的模型上下文协议服务器实现。
服务介绍
NVD 数据库 MCP 服务器
这是一个 模型上下文协议 服务器实现,通过 API 查询 NIST 国家漏洞数据库 (NVD)。https://nvd.nist.gov/
作为先决条件,需要一个 NVD API 密钥。(在此请求)。
状态
与 Claude 桌面应用程序以及其他使用 stdio 和 sse 传输的符合 MCP 标准的主机和客户端兼容。
功能
- 通过 ID 查询特定的 CVE,并获取详细的漏洞数据。
- 通过关键词搜索 NVD 数据库,支持自定义结果选项。
- 支持 Server-Sent Events (SSE) 传输以实现实时通信。
- 与符合 MCP 标准的客户端(如 Claude 桌面应用)兼容。
工具
该服务器实现了以下工具来查询 NVD 数据库:
-
get_cve:- 描述: 通过其 ID 检索 CVE 记录。
- 参数:
cve_id(str): CVE ID(例如:CVE-2019-1010218)。concise(bool, 默认False): 如果为True,则返回简短格式。
- 返回: 包括分数、弱点和参考文献在内的详细 CVE 信息。
-
search_cve:- 描述: 通过关键词搜索 NVD 数据库。
- 参数:
keyword(str): 搜索词(例如:Red Hat)。exact_match(bool, 默认False): 如果为True,则要求完全匹配短语。concise(bool, 默认False): 如果为True,则返回较短的 CVE 记录。results(int, 默认10): 最大 CVE 记录数(1-2000)。
- 返回: 匹配的 CVE 列表及总数。
配置
-
创建或编辑位于以下位置的 Claude 桌面配置文件:
- 在 macOS 上:
~/Library/Application Support/Claude/claude_desktop_config.json - 在 Windows 上:
%APPDATA%/Claude/claude_desktop_config.json
- 在 macOS 上:
-
添加以下内容:
{
"mcpServers": {
"mcp-nvd": {
"command": "/path/to/uvx",
"args": ["mcp-nvd"],
"env": {
"NVD_API_KEY": "your-api-key"
}
}
}
}
-
将
/path/to/uvx替换为uvx可执行文件的绝对路径。可以在终端中使用which uvx命令找到路径。这确保在启动服务器时使用正确的uvx版本。 -
重启 Claude 桌面应用以应用更改。
开发
设置
git clone https://github.com/marcoeg/mcp-nvd
cd mcp-nvd
-
设置环境变量:
- 在项目根目录下创建一个
.env文件:NVD_API_KEY=your-api-key - 将
your-api-key替换为你的 NVD API 密钥。
- 在项目根目录下创建一个
-
安装依赖项:
uv sync
uv pip install -e .
使用 MCP Inspector 运行
cd /path/to/the/repo
source .env
npx @modelcontextprotocol/inspector uv \
--directory /path/to/repo/mcp-nvd run mcp-nvd
然后打开浏览器并访问 MCP Inspector 指示的 URL,通常是 http://localhost:8077?proxyPort=8078
在检查器中自由切换
stdio和sse传输类型。
使用 SSE 客户端进行测试
运行服务器:
cd /path/to/the/repo
source .env
uv run mcp-nvd --transport sse --port 9090
- 默认情况下在端口
9090上使用 SSE 传输运行。
运行客户端:
测试 get_cve:
uv run client.py http://localhost:9090/sse CVE-2019-1010218
测试 search_cve(默认10条结果):
uv run client.py http://localhost:9090/sse "search:Red Hat"
测试 search_cve(精确匹配,5条结果):
uv run client.py http://localhost:9090/sse "search:Microsoft Windows:exact:5"
Docker 设置
构建
docker build -t mcp-nvd:latest .
运行
使用 .env 文件:
docker run -d -p 9090:9090 -v /path/to/.env:/app/.env mcp-nvd:latest
使用环境变量:
docker run -d -p 9090:9090 -e NVD_API_KEY="your-key" mcp-nvd:latest
自定义端口:
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
测试:
uv run client.py http://localhost:9090/sse CVE-2019-1010218
注意事项
- 确保
.env文件中有NVD_API_KEY=your-key或者使用-e。 - 默认端口:
9090。
以下是格式化为代码块中的 Markdown 注释的摘要,适合包含在 docker-compose.yaml 或 README.md 文件中:
使用 Docker Compose 进行测试
此 docker-compose.yaml 位于 tests/ 目录中,定义了一个用于使用预构建的 Docker 镜像测试 MCP-NVD 服务器的服务。它适用于测试用例,类似于独立服务如 clickhouse,并假设镜像是事先构建好的而不是每次重新构建。
假设
- 预构建镜像:该服务使用一个标签为
mcp-nvd:test的预构建镜像,可以在本地或注册表中获取。该镜像是基于父目录中的Dockerfile构建的,该文件设置了使用uv并在端口 9090 上以 SSE 模式运行的 MCP-NVD 服务器。
如何构建镜像
要创建 mcp-nvd:test 镜像:
- 导航到项目根目录:
cd ./mcp-nvd - 使用 Dockerfile 构建镜像:
docker build -t mcp-nvd:test .- 这将根据
pyproject.toml和mcp_nvd/模块中的所有依赖项构建镜像,并将默认命令设置为运行服务器。
- 这将根据
运行服务
从 tests/ 目录:
cd tests
docker-compose up
- 访问:服务器运行在
http://localhost:9090。 - 停止:
docker-compose down。 - 环境:确保
NVD_API_KEY在../.env中或者使用docker-compose --env-file ../.env up。
在 Docker Compose 场景中运行 test_tools.py
要在 Docker 环境中运行单元测试 (test_tools.py):
- 启动服务:通过
docker-compose up确保mcp-nvd服务正在运行。 - 进入容器:
- 通过以下命令识别容器名称(例如
mcp-nvd-mcp-nvd-1):docker ps - 在容器内运行测试:
docker exec -it mcp-nvd-mcp-nvd-1 python /app/tests/test_tools.py - 注意:假设
test_tools.py已复制到镜像中的/app/tests/。如果不是,请修改 Dockerfile 以包括:
然后从根目录重建镜像COPY tests/ ./tests/docker build -t mcp-nvd:test .。
- 通过以下命令识别容器名称(例如
- 替代方案:针对容器化服务在本地运行测试:
cd tests python test_tools.py- 这将在服务运行时针对
http://localhost:9090进行测试。
- 这将在服务运行时针对
关键细节
- 端口: 暴露 9090 端口用于 SSE 访问。
- 日志: 存储在
log-data卷中(可选)。 - 镜像: 在运行
docker-compose之前必须构建一次,并标记为mcp-nvd:test。
感谢 @sidharthrajaram 提供的基于 SSE 的 MCP 客户端和服务器的工作模式: https://github.com/sidharthrajaram/mcp-sse