Cisco PSIRT OpenVuln MCP Server

Cisco PSIRT OpenVuln MCP Server

A production-quality MCP server for querying Cisco security advisories via the PSIRT OpenVuln API v2, enabling LLM-powered interfaces to search, filter, and analyze Cisco vulnerability data.

Category
访问服务器

README

Cisco PSIRT OpenVuln MCP Server

A production-quality Model Context Protocol (MCP) server for querying Cisco security advisories via the PSIRT OpenVuln API v2. Built with Python and FastMCP, it enables LLM-powered interfaces like Claude Desktop and Kiro to search, filter, and analyze Cisco vulnerability data.

Features

  • 15 MCP tools covering all Cisco PSIRT OpenVuln API v2 endpoints
  • OAuth2 authentication with automatic token caching and refresh (client_credentials flow)
  • Multi-tier rate limiting — 5 calls/sec, 30 calls/min, 5,000 calls/day (client-side enforcement)
  • Server-side 429 retry — automatic retry with Retry-After header support (up to 3 attempts)
  • Input validation on all parameters with descriptive error messages
  • Pagination support across all list endpoints (page_index, page_size)
  • LLM-optimized responses — consistent structured envelope with summary truncation
  • Transport-agnostic — supports stdio (default) and SSE transports
  • Structured error handling — classified errors with user-friendly messages

Prerequisites

Installation

  1. Clone the repository:

    git clone <repository-url>
    cd openvuln-mcp-server
    
  2. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate  # On Windows: venv\Scripts\activate
    
  3. Install dependencies:

    pip install -r requirements.txt
    
  4. Configure credentials:

    cp .env.example .env
    

    Edit .env and fill in your Cisco API credentials:

    CISCO_CLIENT_ID=your_client_id_here
    CISCO_CLIENT_SECRET=your_client_secret_here
    

Getting Cisco API Credentials

  1. Go to the Cisco API Console and sign in (or create an account)
  2. Register a new application
  3. Enable the "Cisco PSIRT openVuln API" for your application
  4. Copy the generated client_id and client_secret
  5. Add them to your .env file or pass them as environment variables

Each user's credentials are independent — rate limits are tracked per client_id on Cisco's side.

Usage

stdio mode (default)

Standard transport for local MCP integrations (Claude Desktop, Kiro):

python main.py

SSE mode

HTTP-based Server-Sent Events transport for web or remote integrations:

python main.py --transport sse --port 8080

MCP Client Configuration

Claude Desktop / Kiro (stdio)

Add to your MCP client configuration file:

{
  "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 client

{
  "mcpServers": {
    "cisco-openvuln": {
      "url": "http://localhost:8080/sse"
    }
  }
}

Available Tools

# Tool Description Key Parameters
1 get_all_advisories Retrieve all published advisories with pagination page_index, page_size
2 get_advisory_by_id Look up a specific advisory by Cisco advisory ID advisory_id (max 100 chars)
3 get_advisory_by_cve Find advisories by CVE identifier cve_id (CVE-YYYY-NNNNN format)
4 get_advisory_by_bug_id Find advisories by Cisco Bug ID bug_id (CSCxxNNNNN format)
5 get_latest_advisories Get the N most recently published advisories number (1–100, default 5)
6 get_advisories_by_severity Filter advisories by severity level severity (critical/high/medium/low/informational)
7 get_advisories_by_severity_first_published Filter by severity and first-published date range severity, start_date, end_date
8 get_advisories_by_severity_last_published Filter by severity and last-updated date range severity, start_date, end_date
9 get_advisories_by_first_published Find advisories first published in a date range start_date, end_date (YYYY-MM-DD)
10 get_advisories_by_last_published Find advisories last updated in a date range start_date, end_date (YYYY-MM-DD)
11 get_advisories_by_product Search advisories by product name product_name
12 get_advisories_by_year Get advisories published in a specific year year (1995–current)
13 get_advisories_by_os_version Find advisories for a specific OS type and version os_type, version, platform_alias (optional)
14 get_os_version_data Get available OS version metadata os_type
15 get_platform_aliases List platform aliases for an OS type os_type (nxos/asa/ftd/fxos only)

All list-returning tools support page_index (1–100) and page_size (1–100) pagination parameters.

Running Tests

Run the full test suite:

pytest

Run with coverage:

pytest --cov=src --cov-report=term-missing

Run a specific test file:

pytest tests/test_validators.py

Run property-based tests (Hypothesis):

pytest tests/ -k "property"

Rate Limits

The server enforces client-side rate limiting to stay within Cisco API quotas:

Tier Limit Enforcement
Per-second 5 calls/sec Minimum 200ms between requests
Per-minute 30 calls/min Rolling 60-second sliding window
Per-day 5,000 calls/day Calendar day counter, resets at 00:00 UTC

When a rate limit is hit:

  • Per-second / per-minute: The server automatically sleeps until the next request is permitted
  • Per-day: Returns an error indicating the daily limit is exhausted, with seconds until reset
  • Server-side 429: Retries up to 3 times using the Retry-After header (default 60s if absent)

Project Structure

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

License

This project is licensed under the Apache License 2.0.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选