mcpField
C
cisa-cybersecurity-mcp-server

cisa-cybersecurity-mcp-server

远程服务
github.com/cyanheads安全12 周前更新
代码仓库

关于 cisa-cybersecurity-mcp-server

cisa-cybersecurity-mcp-server 为安全团队提供 CISA 已知遭利用漏洞、ICS 公告、SSVC 决策点及最新警报的查询能力。它可批量核对 CVE,并结合 BOD 26-04 计算修复时间线,无需 API 密钥。

主要功能

  1. 01批量检查 CVE 是否列入 KEV
  2. 02按厂商、产品和期限搜索 KEV
  3. 03查询 SSVC 决策点与 BOD 26-04 时间线
  4. 04搜索和读取 ICS 安全公告
  5. 05获取 CISA 最新公告与警报

适用场景

  1. 01将扫描结果中的 CVE 与 KEV 清单核对
  2. 02识别厂商产品中逾期未修复的漏洞
  3. 03按资产暴露情况评估漏洞修复期限
  4. 04查找工业控制系统产品的安全公告

MCP 相关

通过 MCP 暴露 7 个工具和 2 个资源,支持 STDIO 与 Streamable HTTP。服务从公开的 CISA 数据源获取信息,无需密钥。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://cisa-cybersecurity.caseyjhand.com/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

安装包
npm@cyanheads/cisa-cybersecurity-mcp-server0.3.2

工具

7
参数类型必填说明
topicenum是要返回的参考区块:directives(BOD 26-04 Table 1 及其定义)、kev_fields、ssvc_values、sectors、advisory_id_formats、severity_bands 或 sources(此服务当前持有的数据)。directives | kev_fields | ssvc_values | sectors | advisory_id_formats | severity_bands | sources

详细介绍

@cyanheads/cisa-cybersecurity-mcp-server

通过 MCP 获取 CISA 已知遭利用漏洞、BOD 26-04 截止期限、SSVC 优先级排序,以及完整的 ICS 公告语料库(CSAF)。无需密钥。支持 STDIO 或 Streamable HTTP。

7 个工具 • 2 个资源

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework


概述

在一处获取 CISA 漏洞数据:包含修复截止期限的已知遭利用漏洞目录、每个 CVE 的 SSVC 决策点、追溯至 2010 年的 ICS 公告,以及 CISA 最新警报。一次调用即可对照 KEV 检查一批扫描发现的 CVE,查找某个供应商有哪些事项已逾期,并计算 BOD 26-04 时间线。无需 API 密钥。

工具
工具说明
cisa_list_reference解读输入词汇(BOD 26-04 时间线、KEV 字段、SSVC 值、行业、ID 格式、严重性等级),并报告服务持有哪些数据
cisa_check_cve_status一次调用即可对照 KEV 检查最多 200 个 CVE ID:截止期限、逾期状态、勒索软件和取证分级标记,以及引用的指令
cisa_search_kev按供应商、产品、CWE、加入日期、截止日期、逾期状态、勒索软件关联、取证分级、指令搜索 KEV
cisa_get_ssvc获取 CISA 发布的每个 CVE 的 SSVC 决策点,并根据指定的资产暴露情况计算 BOD 26-04 时间线
cisa_search_ics_advisories按供应商、产品、CVE、CWE、是否属于 KEV、CVSS、严重性、行业、系列、日期或自由文本搜索 ICS 公告
cisa_get_advisory查看一份 ICS 公告:受影响的产品版本、每个 CVE 的 CVSS 和 CWE、修复措施、行业、修订历史
cisa_get_alerts列出 CISA 公告、警报或 ICS 公告订阅源中的最新条目
资源
资源描述
cisa://kev/{cveId}按 CVE ID 查询一条 KEV 目录记录
cisa://advisory/{advisoryId}一条 ICS 公告,由 CSAF 2.0 展平而来

上述工具已完整覆盖这两种资源,因此仅使用工具的客户端也不会遗漏任何内容。

功能参考

cisa_list_reference 工具
  • 必需参数 topic:directives、kev_fields、ssvc_values、sectors、advisory_id_formats、severity_bands 或 sources;仅读取进程内状态,因此即使其他工具不可用,也能正常响应
  • directives 会附加 timelineTable(包含 BOD 26-04 表 1 的全部 16 行,以及 remediationTimelineDays 和 forensicTriageRequired)、definitions 和 supersedes;sources 会报告 KEV 的 catalogVersion、公告索引的 ready / documentCount / syncStatus、SSVC 缓存 TTL,以及已缓存的信息源时间范围

cisa_check_cve_status 工具
  • 每次调用最多接受 200 个 cveIds,根据缓存的 KEV 快照返回结果,不会请求上游;不在 KEV 中的 CVE 会返回 inKev: false,而不是报错
  • 每个 CVE 包含:dateAdded、dueDate、daysUntilDue、overdue、requiredAction、knownRansomwareCampaignUse、forensicTriage、cwes[]、条目备注中的所有 URL(按 kind 类型标注为 references[]),以及三态 directive(BOD 26-04、BOD 22-01 或 null);响应会附带 catalog 快照,以及计算截止日期所依据的 asOf 日期
  • detail: "summary" 会将每条 KEV 记录精简为分流所需字段(日期、截止状态、指令、供应商和产品标签、勒索软件和取证分流标记),让包含 200 个 CVE 的完整批次也保持简洁;默认值为 full

cisa_search_kev 工具
  • 过滤条件采用 AND 逻辑:vendorProject 和 product(CISA 自己的标签,而非 CPE 名称)、nameContains、cwe、cveIdPrefix、dateAddedFrom / dateAddedTo、dueBefore / dueAfter、overdue、ransomware、forensicTriage、directive(BOD 26-04 / BOD 22-01 / none);每页最多返回 100 条(默认 25 条),并提供不透明的 cursor;按 dateAdded(默认)或 dueDate 排序
  • 报告 totalCount 和 appliedFilters;若结果为零,会指出导致无匹配的过滤条件,以及移除该条件后可恢复的结果。nameContains 会折叠大小写和重音符号后搜索 a-z 和 0-9;通知中会列出被丢弃的其他字符
  • 类型化错误:catalog_unavailable(可重试)、invalid_date_range、empty_search_text

cisa_get_ssvc 工具
  • 每次调用最多接受 50 个 cveIds,分别进行实时 Vulnrichment 查询;另有 assetExposure 参数:publicly_exposed、not_publicly_exposed 或 unknown(默认值,返回两个分支)
  • 每个 CVE 包含:CISA 已发布时提供的 found、exploitation、automatable、technicalImpact、cvss 和 cwes,以及 bod2604.timelines[](tableRow、remediationTimelineDays、forensicTriageRequired);若 CVE 已列入 KEV,还会添加 kevAssigned,若已声明暴露情况,则还会添加 assignmentAgrees
  • 无 enrichment 数据的 CVE 会返回 found: false 和 guidance;仅当所有获取尝试均失败时,才会触发 enrichment_source_unavailable(可重试)

cisa_search_ics_advisories 工具
  • 对标题、供应商名称和产品名称进行全文 q 搜索,并支持 vendor、product(不区分大小写的子字符串)、cve、cwe、inKev、cvssMin / cvssMax、severity、sector、series(ICSA / ICSMA)、publisher(coordinator / other)、publishedFrom / publishedTo、revisedFrom / revisedTo 筛选;可按 revised(默认)、published、maxCvss 或 relevance(需要 q)排序;每页最多 50 条(默认 20 条),使用不透明的 cursor
  • 结果包含 advisoryId、最多 20 个 cves 及其 cveCount、kevCves、带有 severityDerived 的 maxCvss、sectors、url、csafUrl 和 attribution,以及 totalCount 和 appliedFilters;若无匹配结果,会指出导致无结果的筛选条件。如果尚未加载 KEV 快照,则不会返回 kevCves,并会说明原因
  • 类型化错误:mirror_not_ready、mirror_busy 和 catalog_unavailable(可重试),mirror_unavailable、invalid_cvss_range、invalid_date_range、relevance_sort_without_query、empty_search_text

cisa_get_advisory 工具
  • advisoryId(可带可选的修订后缀)、可选的 sections(advisory、summary、products、vulnerabilities、revisionHistory、references、acknowledgments)、用于选取漏洞条目的 cves,以及用于选取完全匹配且区分大小写的产品定义的 productIds;cves 和 productIds 会自动包含其对应的章节
  • 返回 kind: "full";如果不指定 sections 时读取内容超过 24,000 字节,则返回 kind: "outline"(包含各章节的字节数和 CVE ID);请使用 sections 再次调用
  • 不在索引中的 ID 会返回 found: false,并附带 guidance、indexCheckpoint 和 indexLastSyncedAt;说明中会提示该公告可能比索引更新
  • 类型化错误:mirror_not_ready 和 mirror_busy(可重试),mirror_unavailable、unknown_section、unknown_cve、cves_need_vulnerabilities_section、unknown_product_id、product_ids_need_products_section

cisa_get_alerts 工具
  • feed:advisories(默认)、alerts 或 ics;limit 最多为 30,即上游窗口大小;since(YYYY-MM-DD)用于筛选该窗口内的条目,无法获取窗口之外的条目
  • 条目包含 title、link、pubDate、summary(移除 HTML 后,最多 1,200 个字符;若被截断,则通过 summaryTruncated 标记);ICS 条目还包含供 cisa_get_advisory 使用的 advisoryId;window 会报告 itemCount、oldest、newest 和 upstreamWindowSize
  • 每个响应都包含 fetchedAt 和 stale;如果刷新失败,则会返回上一次的窗口数据并标记为过时,同时提供重试指引;过时的空结果不能证明没有发布任何内容。如果没有缓存的窗口,则返回 feed_unavailable(可重试)

cisa://kev/{cveId} 资源
  • 以 application/json 格式返回一条 KEV 记录,其结构与默认 detail: "full" 下的 cisa_check_cve_status 结果相同;不在 KEV 中的 CVE 会返回未找到错误
  • 列表返回最近添加的 30 条记录;cveId 根据快照补全,最多提供 100 条建议

cisa://advisory/{advisoryId} 资源
  • 以 application/json 格式返回一条扁平化公告;超过 24,000 字节时采用与 cisa_get_advisory 相同的提纲回退机制;模板不接受 sections、cves 或 productIds,因此请在收到提纲后改用该工具
  • 列表返回最近修订的 30 条公告;advisoryId 根据索引补全,最多提供 100 条建议

功能

基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输,可插拔的身份验证(none / jwt / oauth),可切换的存储方式(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志。

CISA 专属功能:

  • 四个公开数据源,无需账号或密钥:KEV JSON 源、Vulnrichment、CSAF ICS 公告仓库,以及 CISA 的 RSS 源
  • 这些数据源都不支持搜索,因此筛选在本地运行:KEV 数据来自定期轮询变更的内存快照;ICS 公告来自带有 FTS5 的 SQLite 索引。日期筛选接受 YYYY-MM-DD 格式的真实日历日期
  • KEV 刷新失败时会被拒绝,并继续使用上一个有效快照;若没有有效快照,读取操作会返回可重试的 catalog_unavailable
  • KEV、SSVC 和警报工具会从首次请求起提供服务,同时在后台建立公告索引
  • BOD 26-04 表 1 以数据形式提供,因此计算时间线时会查找已发布的决策节点。它不是合规性判定,并会与 CISA 的 KEV 截止日期并列报告,绝不会与之合并

适合 Agent 的输出:

  • 每个响应都包含来源信息:KEV catalog 版本和 asOf 日期、搜索所依据的索引检查点,以及每条公告的 url、csafUrl 和 attribution
  • 输出带有明确类型区分:三态 directive、有类型的 references[].kind、found / inKev 布尔值、上游从未发布某个评级区间时的 severityDerived,以及包含恢复提示的有类型错误原因
  • 空结果和上游数据缺口会说明原因:零结果搜索会指出导致结果为空的筛选条件;命中已知数据缺口的筛选也会说明情况(例如,行业说明仅从 2017 年开始提供、公告仅有 CVSS v2 数据、KEV 没有修订时间戳)。请参阅已知限制

开始使用

公共托管实例

可使用公共实例 https://cisa-cybersecurity.caseyjhand.com/mcp,无需安装。通过 Streamable HTTP 将任意 MCP 客户端指向该实例:

{
  "mcpServers": {
    "cisa-cybersecurity-mcp-server": {
      "type": "streamable-http",
      "url": "https://cisa-cybersecurity.caseyjhand.com/mcp"
    }
  }
}
自托管 / 本地运行

将以下内容添加到 MCP 客户端配置文件中。无需 API 密钥。

{
  "mcpServers": {
    "cisa-cybersecurity-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/cisa-cybersecurity-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

或使用 npx(无需 Bun):

{
  "mcpServers": {
    "cisa-cybersecurity-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/cisa-cybersecurity-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

或使用 Docker:

{
  "mcpServers": {
    "cisa-cybersecurity-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "MCP_TRANSPORT_TYPE=stdio",
        "-v", "cisa-mirror:/usr/src/app/.mirror",
        "ghcr.io/cyanheads/cisa-cybersecurity-mcp-server:latest"
      ]
    }
  }
}

对于 Streamable HTTP,设置传输方式并启动服务:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前置条件
  • Bun v1.4.0 或更高版本(或 Node.js v24+)。
  • 无需凭据。所有上游数据源均公开且无需密钥。
安装
  1. 克隆仓库:
git clone https://github.com/cyanheads/cisa-cybersecurity-mcp-server.git
  1. 进入目录:
cd cisa-cybersecurity-mcp-server
  1. 安装依赖:
bun install

配置

所有变量均为可选项;即使不设置任何变量,服务也能正常运行。

变量描述默认值
CISA_KEV_REFRESH_CRONKEV 刷新轮询的 Cron 表达式;off 可禁用。*/30 * * * *
CISA_CSAF_MIRROR_PATHICS 公告 SQLite 索引的路径。<user cache dir>/cisa-cybersecurity-mcp-server/csaf.sqlite3
CISA_CSAF_MIRROR_AUTO_INIT首次运行时在后台初始化索引。true
CISA_CSAF_REFRESH_CRON公告刷新的 Cron 表达式(启动时也会运行一次);off 可同时禁用两者。17 */6 * * *
CISA_VULNRICHMENT_CACHE_TTL_SECONDS缓存的 SSVC 记录的 TTL。21600
CISA_FEED_CACHE_TTL_SECONDS已解析 RSS 源窗口的 TTL。900
CISA_HTTP_TIMEOUT_MS每次上游请求的超时时间,单位为 ms。30000
MCP_TRANSPORT_TYPE传输方式:stdio 或 http。stdio
MCP_HTTP_PORTHTTP 服务端口。3010
MCP_SESSION_MODEHTTP 会话模式:stateless、stateful 或 auto。stateless
MCP_AUTH_MODE身份验证方式:none、jwt 或 oauth。none
MCP_LOG_LEVEL日志级别(debug、info、warning、error 等)。info
LOGS_DIR日志文件目录(仅适用于 Node.js)。<project-root>/logs
STORAGE_PROVIDER_TYPESSVC 缓存的存储后端:in-memory、filesystem 或 supabase。in-memory
OTEL_ENABLED启用 OpenTelemetry。false

完整的可选覆盖项列表请参阅 .env.example。

运行服务

本地开发
  • 构建并运行:

    # One-time build
    bun run rebuild
    
    # Run the built server
    bun run start:stdio
    # or
    bun run start:http
    
  • 运行检查和测试:

    bun run devcheck   # Lint, format, typecheck, security
    bun run test       # Vitest test suite
    bun run lint:mcp   # Validate MCP definitions against spec
    
ICS 公告索引

两个 ICS 工具和公告资源会读取 CSAF 语料库的本地 SQLite 索引,路径为 CISA_CSAF_MIRROR_PATH,默认位于用户缓存目录。首次运行时,服务会在后台构建索引;索引就绪前,这些功能会返回可重试的 mirror_not_ready,而 cisa_list_reference 使用主题 sources 时会显示进度。如果无法打开该路径,ICS 功能会返回不可重试的 mirror_unavailable,其他所有工具仍可正常工作。

多个进程共享同一索引时,会轮流进行同步。对于容器、CI,或在进程外初始化索引的情况(设置 CISA_CSAF_MIRROR_AUTO_INIT=false,并设置 CISA_CSAF_REFRESH_CRON=off,将刷新工作留给你处理),请直接运行脚本:

bun run mirror:init      # full build, idempotent, safe to re-run after an interrupt
bun run mirror:refresh   # requires a completed mirror:init; fetches changed documents only
bun run mirror:verify    # readiness, sync status, checkpoint, count, content version, SQLite integrity; non-zero on failure

临时性的 SQLite 锁会返回可重试的 mirror_busy;请稍后重试。部分刷新后,已应用的行仍可读取,失败的文档会在下次重试;sources 会报告 syncStatus: partial 和 failedDocumentCount,而 mirror:refresh 和 mirror:verify 会以非零状态码退出。

Docker
docker build -t cisa-cybersecurity-mcp-server .
docker run --rm -p 3010:3010 -v cisa-mirror:/usr/src/app/.mirror cisa-cybersecurity-mcp-server

Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/cisa-cybersecurity-mcp-server。默认会安装 OpenTelemetry 对等依赖项;构建时使用 --build-arg OTEL_ENABLED=false 可省略这些依赖项。镜像设置了 CISA_CSAF_MIRROR_PATH=/usr/src/app/.mirror/csaf.sqlite3;请在 /usr/src/app/.mirror 上挂载卷,使公告索引在容器重建后仍能保留;镜像中包含 mirror:* 脚本,可通过 docker exec <container> bun run mirror:refresh 运行。

项目结构

目录用途
src/index.tscreateApp() 入口:连接四个服务、安排刷新任务并注册接口。
src/config使用 Zod 解析并验证特定于服务的环境变量。
src/mcp-server/tools工具定义(*.tool.ts)。
src/mcp-server/resources资源定义(*.resource.ts)。
src/mcp-server/schemasKEV 和公告工具及资源共享的输出模式与渲染器。
src/reference静态参考数据:BOD 26-04 Table 1、规范行业名称、CVSS 分级。
src/services/kev-catalogKEV JSON 数据源:快照、派生索引、条件刷新。
src/services/vulnrichment按 CVE 获取 SSVC 补充信息,并使用 TTL 缓存。
src/services/csaf-mirrorICS 公告索引:模式、导入、规范化、查询。
src/services/cisa-feeds三个 RSS 数据源,解析后按 TTL 缓存。
scripts/构建、检查和 mirror:* 命令。
tests/与 src/ 对应的单元、集成、模糊测试和冒烟测试。

开发指南

开发指南和架构规则请参阅 CLAUDE.md/AGENTS.md,已构建系统的规范请参阅 docs/design.md。简要概括如下:

  • 处理器抛出异常,由框架捕获——工具逻辑中不要使用 try/catch
  • 使用 ctx.log 记录请求范围的日志,使用 ctx.state 存储租户范围的数据
  • 通过 src/mcp-server/*/definitions/index.ts 中的汇总文件注册新工具和资源
  • 包装外部数据源:验证原始数据 → 规范化为领域类型 → 返回输出模式;绝不伪造上游未提供的字段

贡献

欢迎提交问题。提交前请运行检查和测试:

bun run devcheck
bun run test

许可证

Apache-2.0——详情请参阅 LICENSE。

许可证适用于此代码,不适用于它提供的数据。KEV 条目属于美国政府作品,处于公有领域;Vulnrichment 使用 CC0-1.0 许可证,但 CSAF 仓库未声明许可证,且许多公告会转载供应商文本,因此在重新分发前,请查看每条公告 url 中的复用权利。本项目与 CISA 或国土安全部没有隶属关系,也未获其认可。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。