\
NVD MCP服务器-Azure函数(Python)
遥控器 MCP(模型上下文协议) 暴露的服务器 NIST国家漏洞数据库(NVD) API作为AI可调用工具。基于Azure Functions和Python构建,通过以下方式部署 azd.
NVD API密钥是 可选的 -服务器在没有一个的情况下以较低的速率限制工作(5个请求/30s未经身份验证,50个请求/3os经过身份验证)。获取免费钥匙 nvd.nist.gov/developers/request-a-pai-key.
可用的MCP工具
| 工具 | 说明 |
|---|---|
search_cves | 按关键字、严重性、CWE、CPE、日期范围、KEV成员资格等搜索CVE数据库 |
get_cve | 检索特定CVE的完整详细信息(CVSS评分、受影响的配置、参考) |
get_cve_history | 获取CVE记录的NVD更改历史记录——显示分数、状态或分析何时更新 |
search_cves_by_cpe | 通过CPE 2.3名称查找影响特定产品的所有CVE |
get_recent_cves | 获取过去N天内发布的CVE,可根据严重性或KEV状态进行筛选 |
search_cpes | 按名称搜索CPE产品条目——使用此项查找其他工具的确切CPE URI |
get_kev | 通过关键字/日期/勒索软件过滤实时获取CISA已知漏洞目录 |
Quickstart-GitHub代码空间(零本地安装)
该仓库包含一个预配置的开发容器,其中自动安装了所有工具(Python、azd、az、func、Node、Azurite、MCP Inspector)。
](https://codespaces.new/KnowledgeRatio/nvd-mcp-func)
或者在VS Code中本地打开:
- 安装 开发容器扩展
- 克隆仓库并在VS Code中打开它
- 出现提示时,单击 在容器中重新打开
一切在 在本地运行 和 部署到Azure 这些部分将在容器内工作,而无需在您的机器上安装任何东西。
______________________________________________________________________
先决条件
- python 推荐3.12(与部署的函数运行时匹配),支持3.11+本地开发
- Azure功能核心工具 >=
4.0.7030 - Azure开发者命令行界面(
azd) - Azure命令行界面(
az) - (适用于Azurite本地存储模拟器)
- VS代码+ Azure功能扩展 (可选)
在macOS上安装必备组件
最简单的方法是通过 家酿:
# Install Homebrew if you don't have it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Install tools
brew install azure-developer-cli
brew install azure-cli
brew tap azure/functions
brew install azure-functions-core-tools@4
brew install node在Windows上安装必备组件
winget install Microsoft.Azd
winget install Microsoft.AzureCLI
winget install OpenJS.NodeJS.LTS
npm install -g azure-functions-core-tools@4 --unsafe-perm true在本地运行
1.启动存储模拟器
npx azurite --location ~/.azurite --silent2.创建虚拟环境并安装依赖项
cd src
python -m venv .venv
# Windows
.venv\Scripts\pip install -r requirements.txt
# macOS / Linux
.venv/bin/pip install -r requirements.txt3.配置本地设置
# macOS / Linux
cp src/local.settings.json.example src/local.settings.json
# Windows PowerShell
Copy-Item src/local.settings.json.example src/local.settings.json编辑 src/local.settings.json 并可选择填写您的NVD API密钥:
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "python",
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"PYTHON_ISOLATE_WORKER_DEPENDENCIES": "1",
"NVD_API_KEY": ""
}
}注: local.settings.json 是合法的,永远不会被承诺。4.启动Functions主机
cd src
func startMCP服务器将在 http://localhost:7071/runtime/webhooks/mcp.
从客户端连接
VS Code-GitHub Copilot代理模式
打开 .vscode/mcp.json。单击 开始 上方 local-mcp-function 服务器入口。然后问Copilot:
Search for critical CVEs related to log4jGet the full details for CVE-2021-44228MCP检查员
npx @modelcontextprotocol/inspector将运输设置为 Streamable HTTP,URL到 http://localhost:7071/runtime/webhooks/mcp,然后单击 连接.
部署到Azure
1.登录Azure
azd auth login2.创造一个azd环境
azd env new 3.设置所需的环境变量
# Required: choose a supported region (see infra/main.bicep for the full allowed list)
azd env set AZURE_LOCATION # e.g. uksouth, swedencentral, eastus
# Required: set to true to deploy with VNet + private endpoints, false for public access
azd env set VNET_ENABLED false之前只选择一种身份验证模式 azd up:
| 模式 | 要设置的环境变量 | 行为 |
|---|---|---|
| 基于密钥(默认) | 无 | MCP webhook使用功能系统密钥认证 |
| Entra(EasyAuth) | azd env set ENTRA_AUTH_ENABLED true | 预提供钩子创建/重用应用程序注册和设置 ENTRA_APP_CLIENT_ID;webhook身份验证委托给EasyAuth |
| 未经身份验证(仅限开发人员) | azd env set MCP_UNAUTHENTICATED_ACCESS true | MCP webhook无需身份验证即可公开访问 |
不要同时设置这两个ENTRA_AUTH_ENABLED=true和MCP_UNAUTHENTICATED_ACCESS=true如果两者都设置,则预提供挂钩将优先处理未经身份验证的访问。
快速验证:
azd env get-values多个订阅? 如果您的帐户有多个订阅,请同时运行: ``shell azd env set AZURE_SUBSCRIPTION_ID ``4.(可选)设置您的NVD API密钥
azd env set NVD_API_KEY 如果跳过此步骤,服务器将在未经身份验证的情况下针对NVD(较低的NVD速率限制)进行部署和工作。您可以稍后添加密钥。
5.部署
azd up这提供了一个资源组,其中包含:
- Azure Functions应用程序(灵活消费计划)
- Azure密钥保管库(存储NVD API密钥(如果提供))
- Azure存储帐户
- 应用洞察+日志分析工作区
- 用户分配的托管身份
如果 VNET_ENABLED=true,功能应用程序公共网络访问被禁用,MCP端点只能从专用网络访问。6.连接到远程MCP服务器
您的端点格式:
https://.azurewebsites.net/runtime/webhooks/mcp
基于密钥的模式(默认)
获取系统密钥:
az functionapp keys list \
--name \
--resource-group \
--query "systemKeys.mcp_extension" -o tsv在VS Code中,单击 开始 上 remote-mcp-function 在 .vscode/mcp.json 并提供功能应用名称+系统密钥。
进入模式ENTRA_AUTH_ENABLED=true)
使用承载令牌作为作用域 api:///user_impersonation 而不是 x-functions-key.
az account get-access-token \
--scope "api:///user_impersonation" \
--query accessToken -o tsv配置您的MCP客户端以发送:
Authorization: Bearer
未验证模式(MCP_UNAUTHENTICATED_ACCESS=true)
不需要身份验证标头。仅用于孤立的开发场景。
部署后更新NVD API密钥
az keyvault secret set \
--vault-name \
--name NVD-API-KEY \
--value 功能应用程序在下次调用时自动解析密钥库引用(最多缓存约24小时;重新启动应用程序以立即生效)。
此命令需要RBAC权限才能写入密钥库机密(例如, Key Vault Secrets Officer).当前模板默认为最小权限,不会自动将此角色分配给部署用户。秘密管理
| 上下文 | 密钥的存储方式 |
|---|---|
| 本地 | src/local.settings.json (忽略) |
| Azure | Azure密钥库密钥;Function App在运行时使用用户分配的托管身份通过密钥库引用读取它——原始密钥永远不会出现在应用程序配置中 |
| 部署 | azd env set NVD_API_KEY 写信给 .azure/*/env.json (根忽略了 .gitignore,但在您的计算机上仍为明文) |
有用的命令
# Redeploy code without reprovisioning infrastructure
azd deploy
# View live function logs
az webapp log tail --name --resource-group
# Tear down all Azure resources
azd down源代码
| 文件 | 目的 |
|---|---|
| src/function_app.py | MCP工具定义(search_cves, get_cve, get_cve_history, search_cves_by_cpe, get_recent_cves, search_cpes, get_kev) |
| src/nvd-service.py | NVD REST API客户端和CISA KEV目录提取器 |
| 基础设施/主要设施 | Azure基础架构(功能、密钥库、存储、监控) |
| infra/app/keyvault.bicep | 密钥库资源和RBAC角色分配 |
NVD API参考
- CVE API —
GET /cves/2.0 - CVE历史API —
GET /cvehistory/2.0 - CPE API —
GET /cpes/2.0 - 请求API密钥
- CISA KEV目录 --实时JSON提要
