aldoleiva1/MCP-Svr-OpenVulnAPI
GitHub: aldoleiva1/MCP-Svr-OpenVulnAPI
基于 Python 和 FastMCP 构建的 Cisco PSIRT openVuln API 服务器,使 LLM 应用能够以自然语言查询和分析 Cisco 安全漏洞公告。
Stars: 1 | Forks: 0
# Cisco PSIRT OpenVuln MCP Server
一个生产级的 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 服务器,通过 PSIRT OpenVuln API v2 查询 Cisco 安全公告。它使用 Python 和 FastMCP 构建,使 Claude Desktop 和 Kiro 等 LLM 驱动的界面能够搜索、过滤和分析 Cisco 漏洞数据。
## 功能
- **15 个 MCP 工具**,覆盖所有 Cisco PSIRT OpenVuln API v2 端点
- **OAuth2 身份验证**,支持自动 token 缓存和刷新(client_credentials 流程)
- **多层速率限制** — 5 次调用/秒,30 次调用/分钟,5,000 次调用/天(客户端执行)
- **服务端 429 重试** — 支持 Retry-After 头的自动重试(最多 3 次尝试)
- 所有参数均提供**输入验证**,并带有描述性的错误信息
- 所有列表端点均支持**分页**(page_index,page_size)
- **针对 LLM 优化的响应** — 一致的结构化封装,支持摘要截断
- **传输不可知** — 支持 stdio(默认)和 SSE 传输
- **结构化错误处理** — 带有用户友好消息的分类错误
## 前置条件
- **Python 3.10+**
- **Cisco API Console 凭证**(client_id 和 client_secret) — 参见 [获取 Cisco API 凭证](#getting-cisco-api-credentials)
## 安装说明
1. **克隆仓库:**
git clone
cd openvuln-mcp-server
2. **创建虚拟环境:**
python -m venv venv
source venv/bin/activate # 在 Windows 上使用:venv\Scripts\activate
3. **安装依赖:**
pip install -r requirements.txt
4. **配置凭证:**
cp .env.example .env
编辑 `.env` 并填入您的 Cisco API 凭证:
CISCO_CLIENT_ID=your_client_id_here
CISCO_CLIENT_SECRET=your_client_secret_here
## 获取 Cisco API 凭证
1. 前往 [Cisco API Console](https://apidocs-prod.cisco.com/) 并登录(或创建账户)
2. 注册一个新应用
3. 为您的应用启用 **"Cisco PSIRT openVuln API"**
4. 复制生成的 `client_id` 和 `client_secret`
5. 将它们添加到您的 `.env` 文件中,或作为环境变量传递
每个用户的凭证是独立的 —— Cisco 端的速率限制是按 client_id 进行跟踪的。
## 使用方法
### stdio 模式(默认)
用于本地 MCP 集成(Claude Desktop, Kiro)的标准传输:
```
python main.py
```
### SSE 模式
用于 Web 或远程集成的基于 HTTP 的 Server-Sent Events 传输:
```
python main.py --transport sse --port 8080
```
## MCP 客户端配置
### Claude Desktop / Kiro (stdio)
添加到您的 MCP 客户端配置文件中:
```
{
"mcpServers": {
"cisco-openvuln": {
"command": "python",
"args": ["main.py"],
"cwd": "/path/to/openvuln-mcp-server",
"env": {
"CISCO_CLIENT_ID": "your_client_id",
"CISCO_CLIENT_SECRET": "your_client_secret"
}
}
}
}
```
### SSE 客户端
```
{
"mcpServers": {
"cisco-openvuln": {
"url": "http://localhost:8080/sse"
}
}
}
```
## 可用工具
| # | 工具 | 描述 | 关键参数 |
|---|------|-------------|----------------|
| 1 | `get_all_advisories` | 检索所有已发布的公告(支持分页) | `page_index`, `page_size` |
| 2 | `get_advisory_by_id` | 根据 Cisco 公告 ID 查找特定公告 | `advisory_id`(最多 100 个字符) |
| 3 | `get_advisory_by_cve` | 根据 CVE 标识符查找公告 | `cve_id`(CVE-YYYY-NNNNN 格式) |
| 4 | `get_advisory_by_bug_id` | 根据 Cisco Bug ID 查找公告 | `bug_id`(CSCxxNNNNN 格式) |
| 5 | `get_latest_advisories` | 获取最近发布的 N 条公告 | `number`(1–100,默认为 5) |
| 6 | `get_advisories_by_severity` | 根据严重级别过滤公告 | `severity`(critical/high/medium/low/informational) |
| 7 | `get_advisories_by_severity_first_published` | 根据严重级别和首次发布日期范围过滤 | `severity`, `start_date`, `end_date` |
| 8 | `get_advisories_by_severity_last_published` | 根据严重级别和最后更新日期范围过滤 | `severity`, `start_date`, `end_date` |
| 9 | `get_advisories_by_first_published` | 查找在特定日期范围内首次发布的公告 | `start_date`, `end_date`(YYYY-MM-DD) |
| 10 | `get_advisories_by_last_published` | 查找在特定日期范围内最后更新的公告 | `start_date`, `end_date`(YYYY-MM-DD) |
| 11 | `get_advisories_by_product` | 根据产品名称搜索公告 | `product_name` |
| 12 | `get_advisories_by_year` | 获取特定年份发布的公告 | `year`(1995–当前年份) |
| 13 | `get_advisories_by_os_version` | 查找特定 OS 类型和版本的公告 | `os_type`, `version`, `platform_alias`(可选) |
| 14 | `get_os_version_data` | 获取可用的 OS 版本元数据 | `os_type` |
| 15 | `get_platform_aliases` | 列出特定 OS 类型的平台别名 | `os_type`(仅限 nxos/asa/ftd/fxos) |
所有返回列表的工具均支持 `page_index`(1–100)和 `page_size`(1–100)分页参数。
## 运行测试
运行完整的测试套件:
```
pytest
```
运行覆盖率测试:
```
pytest --cov=src --cov-report=term-missing
```
运行特定的测试文件:
```
pytest tests/test_validators.py
```
运行基于属性的测试(Hypothesis):
```
pytest tests/ -k "property"
```
## 速率限制
服务器执行客户端速率限制,以保持在 Cisco API 配额范围内:
| 层级 | 限制 | 执行方式 |
|------|-------|-------------|
| 每秒 | 5 次调用/秒 | 请求间至少间隔 200ms |
| 每分钟 | 30 次调用/分钟 | 滚动的 60 秒滑动窗口 |
| 每天 | 5,000 次调用/天 | 日历日计数器,在 UTC 时间 00:00 重置 |
当达到速率限制时:
- **每秒/每分钟**:服务器会自动休眠,直到允许下一次请求
- **每天**:返回错误,指出每日配额已耗尽,并附带距离重置的剩余秒数
- **服务端 429**:使用 `Retry-After` 头进行最多 3 次重试(如果不存在则默认为 60 秒)
## 项目结构
```
openvuln-mcp-server/
├── main.py # Entry point: loads env, parses args, starts server
├── src/
│ ├── __init__.py
│ ├── server.py # FastMCP server and 15 tool registrations
│ ├── oauth2_client.py # OAuth2 client_credentials with token caching
│ ├── rate_limiter.py # Multi-tier rate limiter
│ ├── api_client.py # HTTP client with auth, rate limiting, retry
│ ├── validators.py # Input validation functions
│ ├── response_formatter.py # LLM-optimized response formatting
│ ├── constants.py # URLs, limits, validation rules
│ └── exceptions.py # Custom exception hierarchy
├── tests/
│ ├── test_validators.py
│ ├── test_oauth2_client.py
│ ├── test_rate_limiter.py
│ ├── test_api_client.py
│ ├── test_response_formatter.py
│ └── test_tools.py
├── .env.example # Credentials template
├── requirements.txt # Python dependencies
└── README.md
```
## 许可证
该项目基于 [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) 授权。
标签:LLM集成, MCP服务, OAuth2, Python, RESTful API, 实时处理, 提示词优化, 无后门, 漏洞查询, 逆向工具