关于 cisa-cybersecurity-mcp-server
cisa-cybersecurity-mcp-server 为安全团队提供 CISA 已知遭利用漏洞、ICS 公告、SSVC 决策点及最新警报的查询能力。它可批量核对 CVE,并结合 BOD 26-04 计算修复时间线,无需 API 密钥。
主要功能
- 01批量检查 CVE 是否列入 KEV
- 02按厂商、产品和期限搜索 KEV
- 03查询 SSVC 决策点与 BOD 26-04 时间线
- 04搜索和读取 ICS 安全公告
- 05获取 CISA 最新公告与警报
适用场景
- 01将扫描结果中的 CVE 与 KEV 清单核对
- 02识别厂商产品中逾期未修复的漏洞
- 03按资产暴露情况评估漏洞修复期限
- 04查找工业控制系统产品的安全公告
MCP 相关
通过 MCP 暴露 7 个工具和 2 个资源,支持 STDIO 与 Streamable HTTP。服务从公开的 CISA 数据源获取信息,无需密钥。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://cisa-cybersecurity.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-cisa-cybersecurity https://cisa-cybersecurity.caseyjhand.com/mcp{"mcpServers":{"cyanheads-cisa-cybersecurity":{"type":"http","url":"https://cisa-cybersecurity.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-cisa-cybersecurity":{"type":"http","url":"https://cisa-cybersecurity.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-cisa-cybersecurity":{"type":"http","url":"https://cisa-cybersecurity.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-cisa-cybersecurity":{"serverUrl":"https://cisa-cybersecurity.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
7| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| topic | enum | 是 | 要返回的参考区块: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。
概述
在一处获取 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+)。
- 无需凭据。所有上游数据源均公开且无需密钥。
安装
- 克隆仓库:
git clone https://github.com/cyanheads/cisa-cybersecurity-mcp-server.git
- 进入目录:
cd cisa-cybersecurity-mcp-server
- 安装依赖:
bun install
配置
所有变量均为可选项;即使不设置任何变量,服务也能正常运行。
| 变量 | 描述 | 默认值 |
|---|---|---|
CISA_KEV_REFRESH_CRON | KEV 刷新轮询的 Cron 表达式;off 可禁用。 | */30 * * * * |
CISA_CSAF_MIRROR_PATH | ICS 公告 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_PORT | HTTP 服务端口。 | 3010 |
MCP_SESSION_MODE | HTTP 会话模式: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_TYPE | SSVC 缓存的存储后端: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.ts | createApp() 入口:连接四个服务、安排刷新任务并注册接口。 |
src/config | 使用 Zod 解析并验证特定于服务的环境变量。 |
src/mcp-server/tools | 工具定义(*.tool.ts)。 |
src/mcp-server/resources | 资源定义(*.resource.ts)。 |
src/mcp-server/schemas | KEV 和公告工具及资源共享的输出模式与渲染器。 |
src/reference | 静态参考数据:BOD 26-04 Table 1、规范行业名称、CVSS 分级。 |
src/services/kev-catalog | KEV JSON 数据源:快照、派生索引、条件刷新。 |
src/services/vulnrichment | 按 CVE 获取 SSVC 补充信息,并使用 TTL 缓存。 |
src/services/csaf-mirror | ICS 公告索引:模式、导入、规范化、查询。 |
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 或国土安全部没有隶属关系,也未获其认可。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。