哪吒网络安全MCP

admin 2026-07-09 06:09:15 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 哪吒网络安全MCP是一个基于Go语言的开源MCP服务器,旨在将AI编程助手与CVE漏洞数据库桥接,使开发者在编码阶段即可实时查询漏洞信息。它聚合CIRCL、GitHubAdvisoryDatabase和MyCERT三大数据源,提供18个工具,支持本地stdio和云端Lambda两种部署模式。其核心设计是非阻塞启动,确保AI助手连接零等待。该项目可有效将安全检测左移,降低修复成本。 综合评分: 85 文章分类: 安全工具,漏洞分析,供应链安全,安全开发,解决方案


cover_image

哪吒网络安全MCP

原创

钟智强 钟智强

哪吒网络安全

2026年7月8日 11:24 马来西亚

在小说阅读器读本章

去阅读

| | | — | | CVE 漏洞情报  ·  MCP 服务器  ·  部署实战 NezhaCyberMCP 部署实战指南 让 AI 编程助手秒查 CVE 漏洞情报的 MCP 服务器 |

从零到一搭建 CVE 漏洞情报 MCP 服务器,打通 Claude Code / Cursor / VS Code Copilot 实时安全查询链路

基于 Go 语言的生产级 MCP 服务器  ·  本地开发 + 云端 Lambda 全场景

前言

在日常开发中,你是否遇到过这样的场景:AI 编程助手帮你生成了依赖配置,却没人告诉你这个第三方库是否存在已知漏洞?等安全扫描在 CI/CD 阶段才报出来,修复成本已经翻了好几倍。

NezhaCyberMCP 就是来解决这个问题的——它是一个基于 Go 语言的生产级 MCP(Model Context Protocol)服务器,将 AI 助手与持续更新的 CVE 漏洞数据库桥接起来,让你在编码阶段就能实时查询最新漏洞、按厂商/产品/CPE 搜索、做趋势分析、把软件资产清单与 CVE 匹配,从源头暴露供应链安全风险。

本文将手把手教你从零部署 NezhaCyberMCP,覆盖本地开发与云端 Lambda 两种场景。

一、项目简介与开发初衷

1.1 项目概览

| 属性 | 信息 | | — | — | | 项目名称 | NezhaCyberMCP | | 作者 | ctkqiang | | 开源协议 | MIT License (Copyright 2026) | | GitHub 仓库 | https://www.github.com/ctkqiang/NezhaCyberMCP | | 官方网站 | www.nezhacyber.xin/zh | | 编程语言 | Go | | 提交历史 | 46 次提交,最新提交 2026 年 7 月 7 日 |

1.2 它是什么

NezhaCyberMCP 的本质是一个 MCP(Model Context Protocol)服务器。它从 CIRCL、MyCERT 和 GitHub Advisory Database 三大数据源聚合安全公告数据,通过 MCP JSON-RPC 2.0 协议直接服务于 AI 助手。

目前支持的 AI 客户端包括:

▪Claude Code(Anthropic)

▪Cursor

▪VS Code Copilot

▪OpenAI Codex

▪Trae IDE

简单来说,配置好 NezhaCyberMCP 后,你可以在 AI 助手中直接提问“最近有哪些 CRITICAL 级别的 CVE?”,AI 会自动调用 MCP 工具查询并返回真实漏洞数据。

1.3 解决什么问题

传统的漏洞管理流程是:开发 → 构建 → 安全扫描 → 发现漏洞 → 修复 → 重新构建。漏洞发现得太晚,修复成本高。

NezhaCyberMCP 将这个链路前置:编码阶段 → AI 助手实时查询 CVE → 即时告警 → 当场修复。它让安全意识嵌入到开发最前端,而不是等到 CI/CD 阶段才发现问题。

1.4 设计理念:非阻塞启动

这是 NezhaCyberMCP 最核心的设计决策之一——MCP 服务器先启动完成握手,数据库在后台热注入。

这意味着:

1.  AI 助手连接 MCP 服务器时零等待——服务器瞬间就绪,立即响应握手请求

2.  数据库初始化、表迁移、首次数据同步在后台 goroutine 中异步执行

3.  数据库就绪后通过 SetDB() 热注入到 MCP 服务器,之后所有工具调用即可查询完整数据

这种设计保证了用户体验:无论数据库同步需要多长时间,AI 助手的连接和基础功能都不受影响。

二、架构说明

2.1 六层架构总览

NezhaCyberMCP 采用清晰的六层架构,从上到下依次是 AI 客户端层、传输层、MCP 协议层、持久化层、数据库层和数据摄入层:

| | | | — | — | | AI Client 层 MCP JSON-RPC 2.0 | Claude / Cursor / VS Code / Codex / Trae |

| | | | — | — | | Transport 层 传输层 | stdio (local)  |  SSE HTTP (Lambda) |

| | | | — | — | | MCP Protocol 层 协议 + 调度 | MCPServer + 18 Tools (mcp.go) Actions Dispatcher — actions.go 查询路由 |

| | | | — | — | | Persistence 层 Repository Pattern | GORM repositories (3 tables) Upsert / batch write / query |

| | | | — | — | | Database 层 持久化存储 | PostgreSQL / MySQL / SQLite Amazon Aurora DSQL (AWS) |

| | | | — | — | | Data Ingestion 层 + Scheduling | CirclService / GithubService / MycertService cron/v3 定时调度 |

| | | | — | — | | External Data Sources 外部数据源 | CIRCL API / GitHub API MyCERT Portal (HTML scraping) |

| | | — | | 📷  截图占位  六层架构图,可使用上方图示或 PlantUML 渲染后的 PNG。 |

各层职责说明:

▪AI Client 层:各类支持 MCP 协议的 AI 编程助手,通过 JSON-RPC 2.0 发起工具调用请求

▪Transport 层:本地模式使用 stdio(进程管道通信,无网络暴露);Lambda 云端模式使用 SSE over HTTP(监听 /sse 端点)

▪MCP Protocol 层:核心调度层,包含 MCPServer 实例和 18 个已注册工具,actions.go 负责查询路由分发

▪Persistence 层:基于 GORM 的 Repository 模式,管理三张数据表,提供 Upsert、批量写入和查询能力

▪Database 层:支持 PostgreSQL(推荐生产)、MySQL、SQLite(本地开发)和 Amazon Aurora DSQL(AWS 云端)

▪Data Ingestion 层:三个数据源服务 + cron/v3 定时调度,负责从外部拉取并写入漏洞数据

2.2 通信方式:MCP JSON-RPC 2.0

MCP 协议基于 JSON-RPC 2.0 标准。这是一种请求-响应模型——AI 助手按需调用工具,服务器返回结果。不涉及心跳机制,通信完全由 AI 助手端驱动。

本地模式(stdio):MCP 服务器作为子进程运行,通过标准输入/输出(stdin/stdout)与 AI 助手通信。无网络端口暴露,安全性最高,适合 Claude Desktop 等本地场景。

云端模式(SSE HTTP):在 AWS Lambda 上运行,通过 Server-Sent Events(SSE)over HTTP 提供服务。AI 助手连接 /sse 端点发起请求,适合团队共享或云端部署场景。

2.3 非阻塞启动流程

这是理解 NezhaCyberMCP 设计的关键。启动流程如下:

| | | — | | ● 启动时序 main()  │  ├─ NewMCPServer(nil)          ← 立即启动,不需要 DB  │     registerTools()  │     registerResources()  │     registerPrompts()  │  ├─ goroutine: BackgroundInit()  │     InitDatabase(ctx, cfg)  │     mcpServer.SetDB(db)      ← 就绪后热注入  │     MigrateAll(ctx)  │     RunNow(ctx)              ← 立即首次同步  │     advisoryJob.Start(ctx)   ← 调度 cron  │  └─ mcpServer.Run(ctx)         ← 阻塞 stdio 循环 |

| | | — | | 📷  截图占位  非阻塞启动流程时序图,可使用项目 docs/ 目录下的 sequence.puml 渲染。 |

流程解读:

1.  main() 首先调用 NewMCPServer(nil)——传入 nil 表示数据库尚未就绪,但 MCP 服务器立即启动并注册所有工具、资源和提示词

2.  同时启动一个后台 goroutine BackgroundInit(),依次完成数据库初始化 → 热注入 DB → 表迁移 → 首次数据同步 → 启动 cron 定时调度

3.  主线程进入 mcpServer.Run(ctx),阻塞在 stdio 循环上等待 AI 助手的请求

这个设计确保了 AI 助手连接时的零等待体验。

2.4 三种运行模式

| 模式 | 触发条件 | 传输方式 | 典型用途 | | — | — | — | — | | Local | IS_LOCAL=true | stdio (JSON-RPC 2.0) | Claude Desktop,本地开发调试 | | Lambda Sync | EventBridge cron 触发 | — | 定时数据同步任务 | | Lambda MCP | MCP_HTTP_MODE=true | SSE over HTTP (/sse) | 云端 MCP 端点,团队共享 |

▪Local 模式:最常用,适合个人开发者在本地运行,配合 Claude Desktop 或 Claude Code 使用

▪Lambda Sync 模式:不提供 MCP 服务,纯粹用于定时同步数据到云端数据库,适合生产环境中保持漏洞数据持续更新

▪Lambda MCP 模式:在云端提供 MCP 服务端点,多个 AI 客户端可以共享同一个漏洞数据库

2.5 三大数据源

NezhaCyberMCP 从三个安全情报源聚合数据:

| 数据源 | 端点 | 认证方式 | 同步频率 | | — | — | — | — | | CIRCL CVE Search API | vulnerability.circl.lu/api/ | 无需认证 | 每 3 小时(cron 可配) | | GitHub Advisory Database | api.github.com/advisories | Bearer Token (GITHUB_TOKEN) | 开关控制,默认关闭 | | MyCERT Advisory Portal | www.mycert.org.my | 无需认证(HTML 抓取) | 开关控制,默认开启 |

CIRCL 分页算法细节:每页拉取 100 条记录,请求间隔 500ms,最多 5 次重试,采用 2 秒指数退避策略。这保证了大量数据拉取时的稳定性和对上游 API 的友好性。

2.6 18 个 MCP 工具

NezhaCyberMCP 注册了 18 个 MCP 工具,分为四类:

查询工具(9 个):

| 工具名 | 功能 | | — | — | | get_cve | 根据 CVE ID 获取详细信息 | | search_cves | 搜索 CVE 漏洞 | | search_by_cpe | 按 CPE(通用平台枚举)搜索 | | bulk_get | 批量获取多个 CVE | | filter_by_severity | 按严重级别过滤 | | get_cwe | 获取 CWE(弱点枚举)信息 | | get_references | 获取参考链接 | | related_cves | 查询关联 CVE | | whats_new | 获取最新漏洞 |

分析工具(4 个):

| 工具名 | 功能 | | — | — | | vuln_trends | 漏洞趋势分析 | | top_vendors | 热门厂商排行 | | top_products | 热门产品排行 | | severity_distribution | 严重级别分布统计 |

资产匹配工具(1 个):

| 工具名 | 功能 | | — | — | | match_inventory | 将软件资产清单与 CVE 匹配 |

占位工具(4 个,尚未实现):

get_kev_status、get_epss、prioritize、match_sbom——这些工具已在协议层注册,但功能尚未实现,为未来扩展预留。

三、环境要求与前置准备

3.1 操作系统要求

| 操作系统 | 最低版本 | 备注 | | — | — | — | | macOS | 12 Monterey+ | 原生支持,推荐 | | Linux | Ubuntu 20.04+ / Debian 11+ | 服务器部署推荐 | | Windows | 10 / 11 | 需通过 WSL2 运行 |

3.2 软件依赖版本

| 软件 | 最低版本 | 用途 | | — | — | — | | Go | 1.22+(安装指南)/ 1.26.1+(开发) | 编译构建 MCP 服务器 | | Git | 2.x | 克隆仓库 | | Node.js | 18 LTS+ | 运行 Claude Code、Codex CLI、MCP Inspector | | npm | 9+ | 包管理,运行 MCP Inspector | | 数据库 | PostgreSQL 推荐 | 也支持 MySQL / SQLite / Aurora DSQL |

3.3 数据库准备

NezhaCyberMCP 支持四种数据库:

▪PostgreSQL(推荐生产环境):功能完整,性能稳定

▪MySQL:广泛使用,兼容性好

▪SQLite:适合本地开发快速测试,无需额外安装数据库服务

▪Amazon Aurora DSQL:AWS 云端无服务器数据库,适合 Lambda 部署

本地快速准备 PostgreSQL(以 macOS Homebrew 为例):

| | | — | | ● bash # 安装 PostgreSQL brew install postgresql@16   # 启动服务 brew services start postgresql@16   # 创建数据库和用户 createdb nezha_cyber |

| | | — | | 📷  截图占位  PostgreSQL 安装与数据库创建成功后的终端输出。 |

3.4 端口说明

▪本地 stdio 模式:无需开放任何网络端口,通信通过进程管道完成

▪SSE 模式:监听 PORT 环境变量指定的端口,默认 8080

3.5 前置检查清单

在开始安装前,建议逐项确认:

| | | — | | ● bash # 检查 Go 版本 go version                 # 预期: go version go1.22+ …   # 检查 Git 版本 git –version              # 预期: git version 2.x.x   # 检查 Node 版本 node –version             # 预期: v18.x.x 或更高   # 检查 npm 版本 npm –version              # 预期: 9.x.x 或更高   # 检查 PostgreSQL 连接(如果使用 PG) psql -d nezha_cyber -c “SELECT version();” |

| | | — | | 📷  截图占位  所有前置依赖版本检查通过的终端截图。 |

四、逐步安装配置教程

4.1 第一步:克隆仓库

| | | — | | ● bash # 克隆 NezhaCyberMCP 仓库 git clone https://github.com/ctkqiang/NezhaCyberMCP.git   # 进入项目目录 cd NezhaCyberMCP |

| | | — | | 📷  截图占位  git clone 成功后的终端输出,显示克隆进度和完成信息。 |

4.2 第二步:配置环境变量

项目根目录下有 .env.example 模板文件,复制一份进行编辑:

| | | — | | ● bash # 复制环境变量模板 cp .env.example .env |

编辑 .env 文件,根据你的实际环境填写配置:

| | | — | | ● bash · .env # ============================================ # 运行模式配置 # ============================================ # true = 本地模式(启用 cron 定时同步 + stdio 通信) IS_LOCAL=true   # ============================================ # 数据库配置(PostgreSQL 示例) # ============================================ DB_HOST=localhost          # 数据库主机地址 DB_PORT=5432               # 数据库端口 DB_USER=postgres           # 数据库用户名 DB_PASSWORD=your_password  # 数据库密码 DB_NAME=nezha_cyber        # 数据库名称 DB_TIMEZONE=Asia/Shanghai  # 时区(cron 调度使用)   # ============================================ # 可选:GitHub Advisory Database 同步 # ============================================ # 填入 GitHub PAT 即可启用 GitHub Advisory 数据源 # 不填则跳过 GitHub 数据同步(默认关闭) GITHUB_TOKEN=ghp_xxxxxxxxxxxx   # ============================================ # 日志配置 # ============================================ # 可选值: DEBUG / INFO / WARN / ERROR / VERBOSE LOG_LEVEL=INFO |

| | | — | | 📷  截图占位  编辑 .env 文件的编辑器界面截图。 |

关键配置说明:

▪IS_LOCAL=true:本地模式必填,启用 stdio 通信和 cron 定时同步

▪DB_* 系列变量:根据你的数据库实际信息填写

▪GITHUB_TOKEN:可选,如果你想同步 GitHub Advisory Database 数据,需要提供 GitHub PAT(Personal Access Token)。不填则该数据源默认关闭

▪LOG_LEVEL:开发调试时可设为 DEBUG,生产环境建议 INFO

4.3 第三步:构建二进制

| | | — | | ● bash # 构建项目,产出可执行文件 make build |

构建成功后,会在项目根目录下生成 ./advisory 可执行文件。

| | | — | | 📷  截图占位  make build 成功的终端输出,显示编译过程和最终生成的 advisory 文件。 |

如果你更喜欢手动构建(不使用 Makefile):

| | | — | | ● bash # 手动构建(等价于 make build) go build -o advisory . |

4.4 第四步:启动 MCP Inspector 验证

MCP Inspector 是官方提供的 MCP 服务器调试工具,可以直观地查看注册的工具、资源和提示词:

| | | — | | ● bash # 启动 MCP Inspector(会自动打开浏览器界面) make run # 等价于: npx @modelcontextprotocol/inspector ./advisory |

| | | — | | 📷  截图占位  MCP Inspector 浏览器界面:左侧显示 nezha-cyber 连接状态,右侧显示已注册的 18 个工具列表。 |

你也可以直接运行二进制文件(不通过 Inspector):

| | | — | | ● bash # 直接运行(stdio 模式,等待 AI 助手连接) ./advisory |

如果遇到权限问题:

| | | — | | ● bash # 赋予执行权限 chmod +x ./advisory   # 再次运行 ./advisory |

4.5 第五步:配置 AI 客户端

▸ 4.5.1 Claude Desktop 配置

编辑 Claude Desktop 的 MCP 配置文件:

▪macOS:~/Library/Application Support/Claude/claude_desktop_config.json

▪Windows:%APPDATA%\Claude\claude_desktop_config.json

| | | — | | ● json {   “mcpServers”: {     “nezha-cyber”: {       “command”: “/absolute/path/to/advisory”,       “env”: {         “IS_LOCAL”: “true”,         “DB_HOST”: “localhost”,         “DB_PORT”: “5432”,         “DB_USER”: “postgres”,         “DB_PASSWORD”: “your_password”,         “DB_NAME”: “nezha_cyber”       }     }   } } |

| | | — | | ⚠️  重要提醒 command 字段必须使用绝对路径,不能使用相对路径或 ~ 符号,否则 Claude Desktop 会报 “MCP server not connected” 错误。 |

| | | — | | 📷  截图占位  Claude Desktop 配置文件编辑界面,及重启后 Settings → Developer 中 nezha-cyber 已连接。 |

▸ 4.5.2 Claude Code 配置

Claude Code 支持通过命令行快速注册 MCP 服务器:

| | | — | | ● bash # 通过命令行注册 nezha-cyber MCP 服务器 claude mcp add nezha-cyber ./advisory |

注册后,Claude Code 会自动在当前项目中加载该 MCP 服务器。

| | | — | | 📷  截图占位  claude mcp add 命令执行成功的终端输出。 |

▸ 4.5.3 Trae IDE 配置

Trae IDE 同样支持 MCP 协议。在 Trae 的 MCP 配置文件中添加与 Claude Desktop 类似的配置即可。找到 Trae 的设置 → MCP Servers,添加新的服务器配置,command 指向你的 advisory 二进制路径,env 填入相应的环境变量。

▸ 4.5.4 OpenAI Codex 配置

OpenAI Codex CLI 也支持 MCP。在 Codex 的配置文件中添加 nezha-cyber 服务器条目,配置方式与上述类似:指定 command 为 advisory 二进制的绝对路径,在 env 中设置数据库连接参数。

| | | — | | 📷  截图占位  各 IDE 中 MCP 服务器配置完成的界面截图。 |

4.6 第六步:验证安装

配置完成后,在你的 AI 助手中尝试以下提问:

| | | — | | 💬  向 AI 助手提问 What are the latest CRITICAL CVEs? |

如果一切正常,AI 助手会自动调用 whats_new 工具,查询数据库中最新发布的 CRITICAL 级别漏洞,并返回真实的 CVE 编号、描述、严重级别等信息。

| | | — | | 📷  截图占位  在 Claude Desktop 中提问 “What are the latest CRITICAL CVEs?” 后,AI 调用 whats_new 返回漏洞数据的对话截图。 |

你也可以尝试其他查询:

| | | — | | 💬  更多示例提问 # 按厂商搜索 Search for CVEs related to Apache   # 按 CPE 搜索 Find vulnerabilities for cpe:2.3:a:nginx:nginx:1.21.0   # 趋势分析 Show me the vulnerability trends for the last 30 days   # 资产匹配 Match my software inventory against known CVEs |

4.7 第七步:Lambda 部署(可选:云端场景)

如果你需要在 AWS Lambda 上部署 NezhaCyberMCP,项目提供了专门的构建目标:

| | | — | | ● bash # 构建 x86_64 架构的 Lambda 包 make lambda            # 产出: bootstrap.zip   # 构建 arm64 Graviton2 架构的 Lambda 包(推荐,成本更低性能更好) make lambda-arm64      # 产出: bootstrap-arm64.zip |

| | | — | | 📷  截图占位  make lambda-arm64 构建成功的终端输出。 |

构建完成后,将 bootstrap.zip(或 bootstrap-arm64.zip)上传到 AWS Lambda 函数。根据你的需求配置:

▪数据同步模式:通过 EventBridge cron 定时触发,不设置 MCP_HTTP_MODE

▪MCP 服务模式:设置 MCP_HTTP_MODE=true,Lambda 会启动 SSE HTTP 服务器监听 /sse 端点

五、源码结构简要导读

5.1 技术栈一览

| 组件 | 技术选型 | 说明 | | — | — | — | | 编程语言 | Go 1.26.1+(构建需 1.22+) | 高性能、并发友好 | | MCP 协议 | go-sdk/mcp | JSON-RPC 2.0 实现 | | ORM | GORM | 支持 postgres/mysql/sqlite 驱动 | | AWS SDK | aws-sdk-go-v2 | Aurora DSQL、Secrets Manager、S3 | | 定时任务 | robfig/cron/v3 | 可配置的 cron 表达式 | | HTML 解析 | golang.org/x/net/html | 用于 MyCERT Portal 数据抓取 | | Landing 页面 | Vue/Nuxt | 独立部署的官网页面 | | 架构图 | PlantUML | 时序图和流程图渲染 |

5.2 目录结构

| | | — | | ● 目录树 NezhaCyberMCP/ ├── main.go                    # 程序入口,运行时模式选择(Local/Lambda) ├── go.mod                     # Go 模块定义与依赖声明 ├── Makefile                   # 构建/测试/lint/Lambda 打包命令集 ├── .env.example               # 环境变量模板 ├── docs/ │   ├── en/                    # 英文文档 │   │   ├── flow.puml          # 流程图(PlantUML 源文件) │   │   └── sequence.puml      # 时序图(PlantUML 源文件) │   └── zh/                    # 中文文档 │       ├── flow.puml │       └── sequence.puml ├── out/docs/                  # 渲染后的架构图/时序图 PNG ├── internal/ │   ├── functions/ │   │   └── actions.go         # MCP 工具实现 & DB 查询逻辑(核心) │   ├── job/ │   │   └── advisory_job.go    # cron 调度、数据库迁移、同步编排 │   ├── model/                 # GORM 数据模型(3 个表对应 3 个模型) │   ├── repository/            # 仓库层(3 个仓库,CRUD 操作) │   ├── services/ │   │   ├── mcp.go             # MCP 服务器核心(工具注册、协议处理) │   │   ├── circl.go           # CIRCL 数据源服务 │   │   ├── github.go          # GitHub Advisory 数据源服务 │   │   ├── mycert.go          # MyCERT 数据源服务 │   │   └── database.go        # 数据库初始化与连接管理 │   └── utilities/ │       ├── aws.go             # AWS 工具(凭证验证、DSQL 连接等) │       └── logger.go          # 日志工具 ├── test/                      # 测试文件 └── landing/                   # Vue/Nuxt 官网 Landing 页面(独立部署) |

5.3 关键模块解读

▸ main.go —— 程序入口

入口文件负责运行时模式选择。根据环境变量 IS_LOCAL、MCP_HTTP_MODE 等判断当前运行在哪种模式下,然后走不同的初始化路径。核心就是前文提到的非阻塞启动流程:先启动 MCP 服务器,再在后台 goroutine 中完成数据库初始化和数据同步。

▸ internal/services/mcp.go —— MCP 服务器核心

这是 MCP 协议的核心实现文件,负责:

▪创建 MCPServer 实例

▪注册 18 个工具(registerTools())

▪注册资源和提示词

▪处理 JSON-RPC 2.0 请求/响应

▪通过 SetDB() 接收热注入的数据库实例

▸ internal/functions/actions.go —— 工具实现与查询路由

所有 18 个 MCP 工具的具体实现都在这里。当 AI 助手调用某个工具时,actions.go 负责将请求路由到对应的查询逻辑,从数据库中检索数据并返回结构化结果。这是连接 MCP 协议层和持久化层的桥梁。

▸ internal/job/advisory_job.go —— 调度与同步编排

负责后台数据同步的生命周期管理:

▪数据库表迁移(MigrateAll)

▪首次立即同步(RunNow)

▪cron 定时调度启动(advisoryJob.Start)

▪协调三个数据源服务的同步时序

▸ circl.go / github.go / mycert.go —— 数据源服务

三个数据源各有独立的服务文件,分别处理:

▪circl.go:调用 CIRCL API,实现分页拉取(每页 100 条、500ms 间隔、5 次重试、指数退避)

▪github.go:调用 GitHub Advisory API,使用 Bearer Token 认证

▪mycert.go:抓取 MyCERT Portal HTML 页面并解析(使用 golang.org/x/net/html)

▸ internal/model/ —— 数据模型(三张表)

项目使用三张 GORM 模型表分别存储三个数据源的数据:

circl_cves 表(CIRCL 数据):

| 字段 | 说明 | | — | — | | cve_id (PK) | CVE 编号,主键 | | state | 漏洞状态 | | assigner | 分配者 | | title | 标题 | | description | 描述 | | severity | 严重级别 | | cwe_ids | CWE 编号列表 | | affected | 受影响产品 | | references | 参考链接 | | date_published | 发布日期 |

github_advisories 表(GitHub Advisory 数据):

| 字段 | 说明 | | — | — | | ghsa_id (PK) | GHSA 编号,主键 | | cve_id | 关联的 CVE 编号 | | summary | 摘要 | | description | 描述 | | severity | 严重级别 | | type | 类型 | | vulnerabilities | 漏洞详情 | | published_at | 发布时间 |

mycert_advisories 表(MyCERT 数据):

| 字段 | 说明 | | — | — | | advisory_id (PK) | 公告编号,主键 | | title | 标题 | | category | 分类 | | summary | 摘要 | | detail_url | 详情链接 | | full_content | 完整内容 | | published_at | 发布时间 |

5.4 Makefile 目标速查

| 目标 | 命令 | 说明 | | — | — | — | | make build | go build -o advisory . | 构建本地二进制,产出 ./advisory | | make run | npx @…/inspector ./advisory | 启动 MCP Inspector 调试 | | make lambda | 交叉编译 GOOS=linux amd64 | 构建 Lambda x86_64 包,产出 bootstrap.zip | | make lambda-arm64 | 交叉编译 GOOS=linux arm64 | 构建 Lambda arm64 包,产出 bootstrap-arm64.zip | | make test | go test ./test/… -v -count=1 | 运行测试套件 | | make lint | golangci-lint run | 代码静态检查 |

六、常见问题与排错(FAQ)

▸ Q1:make build 报错 “go: command not found”

原因:Go 语言环境未安装或未添加到系统 PATH 中。

解决方案

| | | — | | ● bash # 方式一:macOS 使用 Homebrew 安装 brew install go   # 方式二:从官方下载安装包 # 访问 https://golang.org/dl/ 下载对应平台的安装包 # 安装后确保 /usr/local/go/bin(或对应路径)在 PATH 中   # 验证安装 go version                 # 应输出: go version go1.22+ … |

▸ Q2:运行 ./advisory 报 “Permission denied”

原因:二进制文件没有执行权限。

解决方案

| | | — | | ● bash # 赋予执行权限 chmod +x ./advisory   # 再次运行 ./advisory |

▸ Q3:Claude Code / Desktop 显示 “MCP server not connected”

原因:MCP 配置文件中 command 字段使用了相对路径或 ~ 符号。

确保配置文件中 command 使用绝对路径。例如:

| | | — | | ● json {   “mcpServers”: {     “nezha-cyber”: {       “command”: “/Users/yourname/projects/NezhaCyberMCP/advisory”,       “env”: { … }     }   } } |

获取绝对路径的方法:

| | | — | | ● bash # 在项目目录下执行 realpath ./advisory # 输出: /Users/yourname/projects/NezhaCyberMCP/advisory |

如果你使用 Claude Code,也可以通过命令行重新注册:

| | | — | | ● bash claude mcp add nezha-cyber ./advisory |

▸ Q4:数据库连接失败

原因:数据库服务未启动,或连接参数配置错误。

排查步骤

| | | — | | ● bash # 1. 检查数据库服务是否运行 # macOS (Homebrew) brew services list | grep postgresql   # Linux (systemd) sudo systemctl status postgresql   # 2. 测试数据库连接 psql -h localhost -p 5432 -U postgres -d nezha_cyber -c “SELECT 1;”   # 3. 检查 .env 文件中的数据库配置 cat .env | grep DB_ |

确保 .env 中 DB_HOST、DB_PORT、DB_USER、DB_PASSWORD、DB_NAME 与实际数据库配置一致。

▸ Q5:MCP Inspector 中工具列表为空

原因:MCP 服务器启动失败或工具注册出错。

排查步骤

| | | — | | ● bash # 1. 将日志级别调为 DEBUG 重新启动 LOG_LEVEL=DEBUG ./advisory   # 2. 检查输出日志中是否有错误信息 #    特别关注数据库初始化和工具注册阶段的日志 |

▸ Q6:GitHub Advisory 数据没有同步

原因:GITHUB_TOKEN 环境变量未配置或 Token 无效。GitHub Advisory 数据源默认是关闭的。

解决方案

1.  在 .env 文件中填入有效的 GitHub Personal Access Token

2.  确保 Token 有读取 Advisory Database 的权限

3.  重启 MCP 服务器

| | | — | | ● bash # 生成 GitHub PAT: https://github.com/settings/tokens # 在 .env 中配置 GITHUB_TOKEN=ghp_your_valid_token_here |

▸ Q7:数据同步很慢或超时

原因:CIRCL API 数据量大,首次同步需要拉取全量数据。

说明:这是正常现象。CIRCL 分页算法每页 100 条,请求间隔 500ms,最多 5 次重试,2 秒指数退避。首次全量同步可能需要较长时间,后续增量同步会快很多。得益于非阻塞启动设计,同步期间 AI 助手仍可正常连接和使用已同步的数据。

▸ Q8:Lambda 部署后 MCP 端点无响应

原因:Lambda 函数未配置 MCP_HTTP_MODE=true,或 API Gateway / Function URL 未正确路由 /sse 端点。

解决方案

1.  确认 Lambda 环境变量中 MCP_HTTP_MODE=true

2.  确认 IS_LOCAL=false(Lambda 模式不应启用本地模式)

3.  如果使用 Aurora DSQL,确认 IS_AWS=true 并配置好 AWS 凭证

4.  检查 Lambda 日志(CloudWatch Logs)排查具体错误

七、总结与扩展建议

7.1 总结

NezhaCyberMCP 通过 MCP 协议将 CVE 漏洞情报能力直接注入 AI 编程助手的工作流,实现了从“事后扫描”到“编码时感知”的安全左移。它的核心价值在于:

1.  实时性:cron 定时同步保证漏洞数据持续更新(CIRCL 默认每 3 小时)

2.  零侵入:通过 MCP 协议无缝集成现有 AI 助手,无需改变开发习惯

3.  非阻塞:服务器秒级就绪,数据库后台热注入,AI 助手零等待

4.  多数据源:聚合 CIRCL、GitHub Advisory、MyCERT 三大情报源

5.  多数据库:支持 PostgreSQL / MySQL / SQLite / Aurora DSQL,灵活适配不同部署场景

6.  安全设计:无硬编码凭证、幂等写入、WithContext 防 goroutine 泄漏

7.2 生产部署建议

| 维度 | 建议 | | — | — | | 数据库 | 生产环境推荐 PostgreSQL,开启连接池,配置定期备份 | | 部署方式 | 团队共享推荐 AWS Lambda + Aurora DSQL;个人使用本地 stdio 即可 | | Lambda 架构 | 优先选择 arm64 Graviton2,性价比更高 | | 数据同步 | 生产环境建议拆分 Lambda Sync 模式单独运行同步任务,MCP 服务模式专注查询 | | GitHub Token | 生产环境建议启用 GitHub Advisory 数据源以获得更全面的漏洞覆盖 | | 日志级别 | 生产环境设为 INFO,排查问题时临时切换 DEBUG |

7.3 安全加固建议

NezhaCyberMCP 本身在安全设计上已经做得很到位:

▪无硬编码凭证:所有敏感信息从环境变量读取,不落盘

▪AWS 凭证验证:IsRunInAWS() 校验密钥非空且不含占位符

▪无 PII 存储:仅存储公开的 CVE 数据,不涉及个人隐私信息

▪goroutine 安全:所有查询使用 WithContext(ctx) 防止 goroutine 泄漏

▪幂等写入:OnConflict{UpdateAll:true} + CreateInBatches(100) + 事务,保证数据一致性

▪网络隔离:stdio 模式无网络暴露;SSE 模式监听 localhost,由 AWS 处理 TLS

在此基础上,生产环境还可以考虑:

▪为 PostgreSQL 配置 TLS 连接

▪使用 AWS Secrets Manager 管理数据库凭证(项目已内置 aws-sdk-go-v2 支持)

▪为 SSE 端点配置 API Gateway 鉴权

▪定期审计环境变量配置,避免凭证泄露

7.4 后续可扩展方向

NezhaCyberMCP 目前已注册但尚未实现的 4 个占位工具指明了未来方向:

▪get_kev_status:集成 CISA KEV(Known Exploited Vulnerabilities)目录,标记已被主动利用的漏洞

▪get_epss:集成 EPSS(Exploit Prediction Scoring System),提供漏洞被利用的概率评分

▪prioritize:基于 KEV + EPSS + CVSS 多维度优先级排序,帮助安全团队聚焦最紧急的漏洞

▪match_sbom:支持 SBOM(软件物料清单)标准格式输入,实现更精准的供应链漏洞匹配

此外,社区还可以考虑:

▪增加更多区域安全公告数据源(如 CNVD、CNNVD)

▪支持 Webhook 通知,新漏洞入库时主动推送告警

▪提供漏洞去重与关联分析,跨数据源合并同一漏洞的多源信息

▪集成到 CI/CD 流水线,构建时自动检查依赖漏洞

| | | — | | 🔗 项目链接 GitHub 仓库 github.com/ctkqiang/NezhaCyberMCP 官方网站  www.nezhacyber.xin/zh 开源协议  MIT License 如果这篇文章对你有帮助,欢迎点赞收藏,也欢迎到 GitHub 仓库给作者 ctkqiang 一个 Star ⭐ |


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:哪吒网络安全 钟智强 钟智强《哪吒网络安全MCP》

哪吒网络安全MCP 网络安全文章

哪吒网络安全MCP

文章总结: 哪吒网络安全MCP是一个基于Go语言的开源MCP服务器,旨在将AI编程助手与CVE漏洞数据库桥接,使开发者在编码阶段即可实时查询漏洞信息。它聚合CI
哪吒网络安全MCP 网络安全文章

哪吒网络安全MCP

文章总结: 哪吒网络安全MCP是一个基于Go语言的开源MCP服务器,旨在将AI编程助手与CVE漏洞数据库桥接,使开发者在编码阶段即可实时查询漏洞信息。它聚合CI
评论:0   参与:  0