rapid7/rapid7-bulk-export
Export and analyze Rapid7 InsightVM vulnerability, asset, policy, and remediation data via SQL queries
Changelog
0.7.0
Breaking
- The HTTP transport now requires inbound authentication. Docker and other
MCP_TRANSPORT=httpdeployments refuse to start untilMCP_AUTH_JWKS_URI,MCP_AUTH_ISSUERandMCP_AUTH_AUDIENCEare set, rather than serving vulnerability data to anyone who can reach the port.docker-compose.ymlpasses the three variables through. Stdio is unaffected.
Added
- Inbound authentication for remote mode. The HTTP transport validates OIDC bearer
tokens against any standards-compliant identity provider, configured from environment
(
MCP_AUTH_JWKS_URI,MCP_AUTH_ISSUER,MCP_AUTH_AUDIENCE) and read at startup with no image rebuild. Several issuers can be accepted at once. Stdio remains unauthenticated by design. See docs/authentication.md. - Read/write scope separation. The mutating tools —
start_rapid7_export,download_rapid7_export,load_rapid7_parquetandpurge_rapid7_data— require a write scope (MCP_AUTH_WRITE_SCOPE, defaultrapid7.write) on the HTTP transport; read tools stay available to any authenticated caller. Gating is inert on stdio. rapid7-refreshforeground entrypoint. A headless console script that creates, polls, downloads and loads the requested exports synchronously in a single process — no background threads that could die mid-write — for scheduled and hosted refresh. Exits non-zero and names the failed windows if any window fails. In hosted mode it publishes the finished database to Blob Storage as a versioned artifact.- Data-age annotation on hosted query results. When serving a Blob artifact, successful
query_rapid7responses carry a short data-age note sourced from a load-metadata table inside the data database. It is fail-soft and never breaks a query. Local output is unchanged. - Optional query time limit.
DUCKDB_QUERY_TIMEOUT_SECONDScancels a query that runs longer than the limit with an actionable message. Unset by default, so local queries run to completion as before; the Azure template sets 90 seconds. - Private hosting guide for Microsoft Copilot Studio. See docs/copilot-studio-hosting.md for an internal-ingress deployment with Blob artifact storage, a scheduled refresh job, and Key Vault–backed secrets.
0.6.3
Fixed
- Export status and download work again. v0.6.2 declared the export id in the
status query as
ID!. The Rapid7 export schema has noIDtype, so every status and download call failed withUnknown type 'ID'. The query now usesString!. Export creation was not affected.
Changed
- Bumped
pyjwt2.13.0 → 2.15.0 andurllib32.7.0 → 2.8.0.
0.6.1
Changed
- Adopted the Agent Plugins packaging format. The
repository now ships a root
plugin.json+mcp.jsonand askills/rapid7-bulk-export/directory. Kiro and other conformant clients install the MCP server and skill together as one power. Themanifest.json(MCPB) bundle for Claude Desktop connector install is unchanged. - Removed the legacy
power-rapid7-bulk-export/(POWER.md) layout, superseded by the Agent Plugins format for the same client. Existing installs of the old-format power keep working until they are re-pulled; re-install from the repository URL to move to the new format.
Added
PLUGIN_DATAsupport for the database location. WhenDATA_DIRis not set, the server now uses the plugin host'sPLUGIN_DATAdirectory (per-install, writable, survives updates) before falling back to~/.rapid7_mcp. An explicitDATA_DIRstill takes precedence, so existing installs are unaffected. This also benefits MCPB installs.
Fixed
- Reconciled the skill's tool references to the real prefixed tool names
(
query_rapid7,load_rapid7_parquet) so documentation matches the server.
0.6.0
Fixed
-
Multi-month remediation exports now load every window. Previously, requesting remediation data for a range longer than one month could silently load only a single 31-day window. The Rapid7 platform allows only one remediation export in flight at a time and splits a longer range into multiple exports; the tool created them without sequencing, so all windows collapsed onto one export ID and only one month's data was downloaded — and it could be any month in the requested range.
Impact: if you ran a remediation export covering more than 31 days on an earlier version, it may have loaded only part of your range. Re-run that export on 0.6.0 to get the complete data.
Changed
- Requesting a remediation range now starts a single background job that creates,
downloads, and loads each ≤31-day window in order and appends them into one
vulnerability_remediationtable.start_rapid7_export(export_type="remediation", …)returns a job ID; poll it withcheck_rapid7_export_status. Partial failures are explicit — the job reports exactly which windows loaded and which are missing so the missing range can be re-run.