内容
# CTI MCP 服务器
网络威胁情报 MCP 服务器 — 通过模型上下文协议从多个来源提供实时的 CVE 和威胁情报数据。
## 来源
| 来源 | 类型 | 需要身份验证 |
|--------|------|---------------|
| CISA KEV | 已知漏洞利用漏洞 | 否 |
| GitHub Advisory | 漏洞数据库 | `GITHUB_TOKEN`(推荐) |
| NVD | 国家漏洞数据库 | `NVD_API_KEY`(推荐) |
| OSV.dev | 开源漏洞 | 否 |
| GitHub PoC | 概念验证漏洞利用 | `GITHUB_TOKEN`(推荐) |
## 环境变量
| 变量 | 必需 | 描述 |
|----------|----------|-------------|
| `NVD_API_KEY` | 推荐 | NVD API 2.0 密钥。没有它:5 请求/30 秒滚动(频繁 503)。有它:50 请求/30 秒。在 [nvd.nist.gov](https://nvd.nist.gov/developers/request-an-api-key) 请求 |
| `GITHUB_TOKEN` | 推荐 | GitHub 个人访问令牌。没有它:60 请求/小时。有它:5000 请求/小时 |
| `CTI_MCP_DB_PATH` | 可选 | 自定义 SQLite 数据库路径 |
### 获取 API 密钥
**NVD API 密钥:**
1. 访问 https://nvd.nist.gov/developers/request-an-api-key
2. 填写表单(免费,大约 5 分钟)
3. 您将通过电子邮件收到密钥
4. 设置:`export NVD_API_KEY="your-key-here"`
**GitHub 令牌:**
1. 访问 https://github.com/settings/tokens
2. 创建细粒度或经典个人访问令牌(公共数据不需要特殊范围)
3. 设置:`export GITHUB_TOKEN="ghp_your-token-here"`
## MCP 工具
### `get_recent_cves`
获取最近的 CVE,时间窗口内按严重程度过滤。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| `hours` | int | 24 | 时间窗口(小时) |
| `severity` | string | ALL | 过滤:CRITICAL, HIGH, MEDIUM, LOW, ALL |
| `limit` | int | 20 | 最大结果数(最大 100) |
```json
{ "hours": 24, "severity": "CRITICAL,HIGH", "limit": 50 }
```
### `get_kev_entries`
获取 CISA KEV(已知漏洞利用漏洞)目录条目。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| `recent_days` | int | 30 | 过滤到最近 N 天内添加的条目(0 表示所有) |
| `limit` | int | 50 | 最大结果数 |
```json
{ "recent_days": 2, "limit": 100 }
```
### `get_exploited`
获取最高风险的 CVE:正在利用(KEV)和/或具有公共 PoC 利用代码。按 CVSS 分数降序排列。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| `limit` | int | 20 | 最大结果数(最大 100) |
| `since_hours` | int | 0 | 时间窗口(小时)(0 = 所有时间) |
```json
{ "limit": 50, "since_hours": 168 }
```
### `generate_report`
生成完整的 HTML 威胁情报报告,包括部门、过滤器、KEV 条目和 CVE 详情。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| `hours` | int | 24 | 时间窗口(小时) |
| `format` | string | html | 输出格式:html 或 markdown |
```json
{ "hours": 24, "format": "html" }
```
### 其他工具
- `get_cve_details` — 获取特定 CVE 的完整详情
- `search_vulnerabilities` — 按关键词、产品或 CWE 搜索 CVE
- `refresh_sources` — 强制刷新所有或特定来源的数据
- `get_status` — 健康检查、缓存状态、令牌配置
## 健康检查
`get_status` MCP 工具提供完整的系统概览:
```json
{
"tokens": {
"github_token": "set",
"nvd_api_key": "set"
},
"cache": {
"cves_count": 4823,
"kev_count": 1247,
"populated": true
},
"sources": {
"nvd": { "status": "ok", "entry_count": 3421 },
"osv": { "status": "ok", "entry_count": 1287 }
},
"warnings": []
}
```
### AI 代理工作流
**在任何数据密集型操作之前**(`refresh_sources`、`generate_report`、批量查询),AI 代理**必须**首先调用 `get_status`:
1. **`warnings` 为空** → 一切正常,按常规进行
2. **`warnings` 不为空** → 检查并决定:继续执行(来源在没有密钥的情况下工作,只是速度较慢)或要求用户提供缺少的密钥以获得更好的结果
这可以防止在速率限制或配置错误的系统上浪费时间。
## Cron 作业示例(每日威胁报告)
```bash
# 通过 Hermes cron(no_agent 脚本)
hermes cron create \
--name "cti-threat-report" \
--schedule "0 9 * * *" \
--script "cti-report.py" \
--no-agent \
--deliver "telegram"
```
`cti-report.py` 脚本(在 `~/.hermes/scripts/` 中):
1. 通过标准输入/输出启动 `cti-mcp` 子进程
2. 调用 `refresh_sources` 获取最新数据
3. 调用 `generate_report`,时间窗口为 24 小时
4. 将 HTML 保存到 `~/projects/cti-mcp/reports/`
5. 输出 `MEDIA:` 路径以便 Telegram 交付
脚本接受可选的时间窗口参数:
```bash
python3 ~/.hermes/scripts/cti-report.py 168 # 每周报告
```
## 构建和运行
```bash
# 构建
go build -o cti-mcp ./cmd/cti-mcp
# 运行(stdio MCP 传输)
NVD_API_KEY="your-key" GITHUB_TOKEN="your-token" ./cti-mcp serve
```
## 架构
- **数据库:** SQLite(纯 Go `modernc.org/sqlite`,无 CGO)
- **传输:** MCP 标准输入/输出
- **缓存:** 带有每个来源 TTL 的后台刷新
- **来源:** 5 个独立提供商,每个提供商都有健康状态跟踪