tenable-vpr-mcp

tenable-vpr-mcp

MCP server for Tenable.io/One Vulnerability Management that provides read-only tools for querying scans, assets, plugins, and vulnerabilities, plus specialized reporting tools for VPR re-prioritization, CISA KEV/EPSS exposure, and scan delta comparisons.

Category
访问服务器

README

Tenable VPR MCP

MCP server for Tenable.io / Tenable One (Vulnerability Management API), built for pentest and exposure-management reporting workflows.

Most Tenable MCP servers (including Tenable's own hosted Hexa AI MCP) expose the API 1:1 as tools. This one does that too, but adds three tools that aren't available anywhere else on the Exchange today:

Why this one exists: compare_vpr_reprioritization

Tenable reports two ratings for the same finding:

  • CVSS-based severity (severity): the static, plugin-assigned bucket
  • VPR (vpr.score): threat-intel and exploitability-weighted score

When you re-scope a client's exposure using VPR instead of raw CVSS, some findings get escalated (low CVSS, actively exploited) and some get downgraded (high CVSS, no real-world exploitation activity). That before/after delta is exactly what you need to show in a CTEM / Tenable One POC deliverable, and building it by hand from raw exports is tedious.

compare_vpr_reprioritization pulls live findings from the vulnerability workbench and returns a sorted table (escalations first) plus a summary rollup, ready to drop into a report or slide.

{
  "summary": {"escalated": 4, "downgraded": 11, "unchanged": 52, "unrated": 2, "total_findings": 69},
  "findings": [
    {
      "plugin_id": 12345,
      "plugin_name": "Example Actively-Exploited RCE",
      "cvss_severity": "medium",
      "vpr_score": 9.4,
      "vpr_severity": "critical",
      "rerating": "escalated",
      "affected_assets": 5
    }
  ]
}

check_kev_epss_exposure

VPR is a Tenable proprietary score. This tool backs a re-prioritization argument with two independent, public data sources instead: the CISA KEV catalog (confirmed real-world exploitation) and FIRST.org EPSS (30-day exploitation probability). Each finding gets a signal: confirmed_exploited > high_probability > low_signal > no_cve_data, sorted most urgent first, plus a ransomware-association flag from KEV.

Note: this does one extra Tenable API call per distinct plugin (to resolve CVEs via workbenches.vuln_info), so keep limit modest for interactive use.

scan_delta

Compares a baseline scan against a re-test scan by plugin ID and buckets findings into fixed, still_open, and new_since_baseline, with a remediation-rate percentage. Built for the re-test report every pentest engagement ends with.

All tools

Tool Description
list_scans List scans, optionally by folder
get_scan_details Latest results for one scan (hosts, findings, severity counts)
list_assets List known assets (capped)
get_asset_details Full detail for one asset by UUID
search_vulnerabilities Workbench findings, filterable by severity / plugin family
get_plugin_details Plugin description, solution, CVEs, VPR drivers
list_tags Asset tag categories and values
list_agents Nessus Agent inventory and status
compare_vpr_reprioritization CVSS vs. VPR before/after comparison table
check_kev_epss_exposure CVSS/VPR findings cross-referenced against CISA KEV + EPSS
scan_delta Baseline vs. re-test comparison for remediation validation

This server is read-only by design: no scan launch, edit, or delete tools are exposed, so it's safe to point at a production tenant.

Filter arguments

search_vulnerabilities, compare_vpr_reprioritization, and check_kev_epss_exposure share two optional filters:

  • severity — a list of info / low / medium / high / critical. Case-insensitive; the server capitalizes them to the form the workbench API requires.
  • plugin_family — a list of family names (["Windows", "Web Servers"]) or numeric family IDs. Names are resolved to IDs on first use, since the workbench only filters on plugin.family_id. An unknown name raises before any API call is made.

Output

Every tool returns the same envelope, so credential, authentication, and API errors reach the client as readable text instead of a crash:

{"ok": true,  "data": ...}
{"ok": false, "error": "UnexpectedValueError: ..."}

compare_vpr_reprioritization and check_kev_epss_exposure return a summary rollup plus a findings list sorted most-urgent-first, in the shape shown in the compare_vpr_reprioritization example above. scan_delta returns fixed / still_open / new_since_baseline lists plus a summary with counts and remediation_rate_pct. The remaining tools return the Tenable API payload as-is under data.

Prerequisites

  • Python 3.10 or newer
  • A Tenable.io / Tenable One account that can generate API keys

Setup

See USAGE.md for full setup, client configuration, and example prompts. Quick version:

git clone https://github.com/Sabastiaz/tenable-vpr-mcp
cd tenable-vpr-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e .

export TIO_ACCESS_KEY=your_access_key
export TIO_SECRET_KEY=your_secret_key
# optional, defaults to https://cloud.tenable.com
export TIO_URL=https://cloud.tenable.com

tenable-vpr-mcp

Generate API keys in Tenable.io / Tenable One under Settings > My Account > API Keys. Never pass keys as CLI arguments; use environment variables only.

Claude Code

claude mcp add tenable-vpr -- tenable-vpr-mcp

(with TIO_ACCESS_KEY / TIO_SECRET_KEY set in your shell environment before running the command above).

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "tenable-vpr": {
      "command": "tenable-vpr-mcp",
      "env": {
        "TIO_ACCESS_KEY": "your_access_key",
        "TIO_SECRET_KEY": "your_secret_key"
      }
    }
  }
}

Limitations

  • The vulnerability workbench caps every query at 5,000 findings. This is a Tenable API limit, not a limit of this server — raising limit past 5,000 returns no more records. On a large tenant, filter by severity or plugin_family to keep each query under the cap, or the results are silently truncated. (pyTenable also marks the workbench module deprecated in favour of the exports API; moving to exports is the fix for full-tenant extraction and is not implemented yet.)
  • check_kev_epss_exposure issues one extra Tenable API call per distinct plugin to resolve CVEs via workbenches.vuln_info. Keep limit modest (20–30) for interactive use. Plugin CVE lookups are not cached between calls; the CISA KEV catalog is cached in-process for six hours.
  • Findings are aggregated per plugin, not per host. affected_assets is a host count; use get_scan_details or scan_delta when you need scan-scoped, per-host detail.
  • search_vulnerabilities and compare_vpr_reprioritization read tenant-wide state, not the results of one scan.
  • A VPR score of None is reported as unrated, not as low risk. Tenable does not score every plugin — end-of-life and configuration findings frequently have no VPR at all, so they need to be reviewed separately rather than sorted to the bottom.
  • No write operations (scan launch/configure, tag assignment, asset deletion) are implemented, by design.

Development

pip install -e ".[dev]"
pytest tests/ -v

(Quote the extras — unquoted .[dev] is a glob pattern in zsh.)

The suite runs with no live Tenable / CISA / FIRST.org calls:

File Covers
tests/test_findings.py Normalizing the workbench's flat records and integer severities
tests/test_vpr.py CVSS vs. VPR comparison and bucket boundaries
tests/test_kev.py KEV/EPSS signal classification and CVE extraction
tests/test_scan_diff.py Baseline vs. re-test bucketing
tests/test_server_filters.py Severity capitalization and family-name resolution
tests/fixtures.py Payloads captured verbatim from a live tenant

Keep tests/fixtures.py faithful to what the API actually returns. The workbench sends plugin_id / plugin_name / vpr_score at the top level and severity as an integer 0–4, not the nested, label-severity shape most Tenable API examples use — fixtures written in the nested shape pass while every live call fails.

demo.py exercises all 11 tools through their real code path with the Tenable client and KEV/EPSS lookups faked, so it needs no credentials:

python demo.py

License

MIT

推荐服务器

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 模型以安全和受控的方式获取实时的网络信息。

官方
精选