Tenable MSSP Portal MCP Server
Draft · awaiting reviewMCP server that runs Tenable queries and hosted Hexa AI MCP tools across the child containers of a Tenable MSSP Portal.
For Vulnerability prioritizationWorks with Any MCP client, Claude Code, Codex, Gemini CLIMaintained andrewspearson, last push 2026-06-23
MCP serverAn MCP server is a program that gives your AI client extra tools; the client's model decides when to call them. by andrewspearson · read from the code at eeb26b5 (v1.0.1) on 2026-10-21The date we last read the tool’s files. The code after “at” names the exact version (the git commit) we read; a newer version may differ. · Not run yet.Whether we have run the tool in our lab. “Did more than it said” means the run used rights its description does not name; “did no more than it said” means it stayed within them.
What the code shows, worst first. No run advice yet: the one word needs a read under the full rule.
Level 3. Persistence. Every child container a tool touches gets new API keys through this endpoint, which counts as new keys even though they are temporary and held in memory.
Level 2. Secrets. Reads a .env file from the working directory into the environment and uses the MSSP administrator key pair.
Before first useSettings for your AI client that limit the tool to the rights its task needs; derived from the code unless marked tested. derived from the code, not tested
- Limit action tools with the child-container allowlist file, pass the portal keys through the environment rather than a .env file, and call bulk_vm_cve_query only on explicit request.
What the code can reach, 0 to 3 per right; a dashed point means no evidence, never zero. The three readings
Is it for you?
- Made for
- Lets one MCP client use Tenable Hexa AI MCP Server tools across the child containers of an MSSP Portal through a scoped orchestration layer.
- Queries one or more CVEs across eligible in-scope child containers and produces a CSV report of the findings.
- Lists all child containers of the MSSP Portal with their license information.
- Use it when
- Query CVEs across the child containers connected to an MSSP Portal and compile the findings into a CSV report Vulnerability prioritization
- Apply a tested sequence of Hexa AI MCP tool calls to many hexa-licensed child containers in one batch
- Experiment with one official Tenable MCP tool on one child container licensed for hexa
- Review all MSSP child accounts as returned by Tenable, including their license data
- Not for
Nothing excluded by the author in the files read
- You need
- Tenable MSSP Portal API keys with Administrator privileges
- Child containers licensed with hexa for the Hexa AI MCP Server tools
- Child containers licensed with vm for the bulk_vm_cve_query tool
+3 more
Details: You need
Install
linked, not distributed: the Field Guide does not bundle agents or MCP serversUpstream
git clone https://github.com/andrewspearson/tenable-mcp-mssp.git cd tenable-mcp-mssp uv venv uv pip install . cp .env.example .env chmod 600 .env claude mcp add tenable-mcp-mssp -- /path/to/tenable-mcp-mssp/.venv/bin/python -m tenable_mcp_mssp.server
Quoted from README.md#L37-95 at the pinned commit; a quotation, not a command to copy.
Run it with least privilege
- note
derived from the code, not tested in the lab; limit action tools with the child-container allowlist file, pass the portal keys through the environment rather than a .env file, and call bulk_vm_cve_query only on explicit request
derived, not tested: proposed from the code analysis
The record · every value with its evidence
What we checked, and what we found.
Profile read at commit eeb26b5 on 2026-10-25: 49 facts, each with its quoted line confirmed by script; not installed, not run in the lab.Each fact was read from the tool's files at the checked version and links to the line it comes from. Where nothing was found, the page says so instead of assuming “none”.
Selected by criteria v0.1, approved by Ilja Schlak: awaiting approval. Each section opens with the answer; the file and line of every fact follow it.
What it can change the capability groups as upstream groups them, worst first
Changes, runs commands, according to the capabilities read.
| Group | What it covers | Effect | On by default |
|---|---|---|---|
| bulk_vm_cve_query | Runs the bulk VM CVE export by starting the module tenable_mcp_mssp.bulk_vm_cve_query_worker as a Python subprocess with a raw output file path. bulk_vm_cve_query.py L367-372, tenable_mcp_mssp/bulk_vm_cve_query.py#L367-372 at the checked commit | reads, runs commands | yes |
| run_tenable_mcp_tool_for_child | Runs one Tenable Hexa AI MCP Server tool on one child container licensed for hexa. README.md L132, README.md#L132 at the checked commit | reads, changes | yes |
| run_tenable_mcp_recipe_for_child | Validates a known sequence of Tenable Hexa AI MCP Server tool calls on one child container licensed for hexa. README.md L133, README.md#L133 at the checked commit | reads, changes | yes |
| run_tenable_mcp_recipe_across_child_containers | Runs a known official Tenable MCP recipe across a list of hexa-licensed child containers. server.py L120-125, tenable_mcp_mssp/server.py#L120-125 at the checked commit | reads, changes | yes |
| list_mssp_child_accounts | Lists the raw Tenable MSSP child account objects, including license data. server.py L51-60, tenable_mcp_mssp/server.py#L51-60 at the checked commit | reads | yes |
| list_available_tenable_mcp_tools | Discovers the Tenable Hexa AI MCP Server tool catalog for one child container licensed for hexa. README.md L130, README.md#L130 at the checked commit | reads | yes |
| get_child_container_scope | Shows the configured child container allowlist scope for action tools. README.md L131, README.md#L131 at the checked commit | reads | yes |
| get_bulk_vm_cve_query_status / _result | Checks the status of a server-managed bulk_vm_cve_query run and reads its final summary and artifact paths. README.md L136-137, README.md#L136-137 at the checked commit | reads | yes |
Where it sends data and who can connect to it
3 outside connections found in the files read: Tenable MSSP Portal API, Tenable hosted MCP server, Tenable Vulnerability Management exports.
- Tenable MSSP Portal API vendor API, always. Requests temporary API keys for a child container from the MSSP endpoint mssp/accounts/mssp-child-keys. child_api_keys.py L13, tenable_mcp_mssp/child_api_keys.py#L13 at the checked commit
- Tenable hosted MCP server vendor API, by default. Connects to Tenable's hosted MCP server over streamable HTTP and sends the access and secret keys in an API keys header. tenable_mcp_client.py L33-38, tenable_mcp_mssp/tenable_mcp_client.py#L33-38 at the checked commit
- Tenable Vulnerability Management exports vendor API, by default. The bulk worker requests a vulnerability export filtered by the given CVE IDs and iterates over the returned findings. bulk_vm_cve_query_worker.py L64, tenable_mcp_mssp/bulk_vm_cve_query_worker.py#L64 at the checked commit
Listens for no connections in the files read.
Other connections not ruled out: read in the documentation and the cited code, not searched in full.
How it runs generated from the files read, never drawn by hand
The server creates a FastMCP client that reaches Tenable's hosted MCP server over a streamable HTTP transport and sends the access and secret keys in an API keys header. tenable_mcp_client.py L30-39, tenable_mcp_mssp/tenable_mcp_client.py#L30-39 at the checked commit
Your AI client
Parts that live inside the AI client: skill instructions, client configuration.
- MCP client registration Client entry added with the client's mcp add command that launches the venv Python with -m tenable_mcp_mssp.server. README.md L91, README.md#L91 at the checked commit
Your machine
Programs and files on the machine where you run the tool.
- tenable_mcp_mssp.server Server entry point main() that configures logging, loads the child container scope and runs the FastMCP server. server.py L191-197, tenable_mcp_mssp/server.py#L191-197 at the checked commit
- bulk_vm_cve_query_worker Subprocess worker that runs the VM CVE export for one child container. bulk_vm_cve_query_worker.py L1, tenable_mcp_mssp/bulk_vm_cve_query_worker.py#L1 at the checked commit
- .env file Optional .env file that can supply the parent MSSP Portal credentials instead of real environment variables. AGENTS.md L7, AGENTS.md#L7 at the checked commit
Outside your machine
Remote services: vendor APIs, model providers, targets, telemetry endpoints. Data sent here leaves your machine.
- Tenable MSSP Portal and child container APIs Tenable MSSP Portal API endpoint mssp/accounts, which returns the child accounts. mssp_accounts.py L13, tenable_mcp_mssp/mssp_accounts.py#L13 at the checked commit
- Tenable Hexa AI MCP Server Tenable's hosted MCP server at https://cloud.tenable.com/mcp/. tenable_mcp_client.py L13, tenable_mcp_mssp/tenable_mcp_client.py#L13 at the checked commit
The six rights, read three waysThe six rights a tool can take (files, network, execution, secrets, persistence, approval), each read three ways and rated 0 to 3. 0 never means safe; “?” means no evidence. what the author says, what the code shows, what one lab run showed
Level 3 (privileged), read from the code. Not run in our lab yet.
0 contained · 1 scoped · 2 open · 3 privileged · ? no evidence · 0 never means safe · zero means: none declared (Declared), none found (Code), none observed (Lab)
Author says: the evidence
- Files · 1README.md L103 the author states that bulk query results are written as CSV into a results folder in the working directory
- Network · 1README.md L13 the author describes a wrapper around Tenable's hosted Hexa AI MCP server, plus Tenable export calls
- Secrets · 2README.md L26 the author requires MSSP Portal API keys with administrator rights, which is a broad token
- Persistence · 3server.py L40-41 the server instructions say that child API keys are generated, which means new API keys in each child container
Code shows: the evidence
- Files · 1bulk_vm_cve_query.py L34 every write goes under a relative results folder in the working directory, with no deletes
- Network · 1tenable_mcp_client.py L13 the only URL in the package is Tenable's hosted MCP server, and the Tenable clients use the library's default host
- Execution · 1bulk_vm_cve_query.py L367-370 starts the package's own worker module as a subprocess, without a shell
- Secrets · 2config.py L13 reads a .env file from the working directory into the environment and uses the MSSP administrator key pair
- Persistence · 3child_api_keys.py L13 every child container a tool touches gets new API keys through this endpoint, which counts as new keys even though they are temporary and held in memory
- Approval · 0none found: patterns hitl-v0.1 in 18 files at eeb26b5
Valid for commit eeb26b5 (v1.0.1) · checked 2026-10-21 · method reach-v0.1The published rules we follow: how tools are selected, how their rights are read and rated, how a lab run is done.
Limits and risks what the files say that fits nowhere else, and what this reading does not cover
- Each tool that acts on a child container generates temporary API keys for that child through the MSSP Portal when no unexpired key is cached, and holds them in process memory. child_credentials.py L180-188, tenable_mcp_mssp/child_credentials.py#L180-188 at the checked commit
- call_tenable_mcp_tool forwards the caller's tool name and arguments to Tenable's hosted MCP server through call_tool. tenable_mcp_client.py L80-82, tenable_mcp_mssp/tenable_mcp_client.py#L80-82 at the checked commit
- The rule to run bulk_vm_cve_query only on explicit request is written in the tool description; the handler starts the export on any call. server.py L151-160, tenable_mcp_mssp/server.py#L151-160 at the checked commit
- The child container allowlist is optional; when TENABLE_MCP_MSSP_CHILD_CONTAINER_SCOPE_FILE is unset or blank, all otherwise eligible child containers are allowed. README.md L109, README.md#L109 at the checked commit
- bulk_vm_cve_query builds its child list from every child account the MSSP account lister returns and counts all of them as queued. bulk_vm_cve_query.py L246-252, tenable_mcp_mssp/bulk_vm_cve_query.py#L246-252 at the checked commit
- Bulk runs write raw JSONL findings per child and an aggregate CSV under results/bulk-vm-cve-query/<run-id>/; run state in memory is lost on restart, the files stay on disk. AGENTS.md L25, AGENTS.md#L25 at the checked commit
- The server reads .env from its current working directory, which is the directory the MCP client starts it in. config.py L13, tenable_mcp_mssp/config.py#L13 at the checked commit
- Action tools block expired containers, malformed expiration data, missing child accounts and licenseType ao containers, also when they are on the allowlist. README.md L119, README.md#L119 at the checked commit
- Multi-child fan-out runs at a fixed concurrency of 10 child containers, and each child run times out after 600 seconds. AGENTS.md L23, AGENTS.md#L23 at the checked commit
- The child container allowlist is loaded once and cached with lru_cache for the life of the server process. child_container_scope.py L54-55, tenable_mcp_mssp/child_container_scope.py#L54-55 at the checked commit
- When the configured scope file cannot be read, scope loading stops with a ConfigurationError. child_container_scope.py L69-75, tenable_mcp_mssp/child_container_scope.py#L69-75 at the checked commit
- The author's design rule is that generated child keys stay in memory only and are never logged, returned, written or persisted. AGENTS.md L7, AGENTS.md#L7 at the checked commit
- Not covered: what it does at runtime. Other connections not ruled out: read in the documentation and the cited code, not searched in full.
What you need and what the documented installer does
| Kind | What |
|---|---|
| AI client | Any MCP client, Claude Code, Codex, Gemini CLI; sign-in: API key |
| Credentials | Tenable MSSP Portal API keys with Administrator privileges. README.md L26, README.md#L26 at the checked commit |
| Account | Child containers licensed with hexa for the Hexa AI MCP Server tools. README.md L27, README.md#L27 at the checked commit |
| Account | Child containers licensed with vm for the bulk_vm_cve_query tool. README.md L28, README.md#L28 at the checked commit |
| Runtime | Python 3.14 or newer. README.md L29, README.md#L29 at the checked commit |
| Other tools | uv or pip for the local installation. README.md L30, README.md#L30 at the checked commit |
| Setting | The parent keys must be set as TENABLE_MSSP_PORTAL_ACCESS_KEY and TENABLE_MSSP_PORTAL_SECRET_KEY in the environment or the .env file. config.py L14-15, tenable_mcp_mssp/config.py#L14-15 at the checked commit |
What the documented installer does
- The documented download is a git clone of the repository's default branch, without a tag or commit in the command. README.md L37, README.md#L37 at the checked commit
- Copies .env.example to .env inside the clone and sets it to mode 600 before the portal keys are entered. README.md L68-72, README.md#L68-72 at the checked commit
- Registers the server with claude mcp add, pointing at the clone's .venv Python and the module tenable_mcp_mssp.server. README.md L93-95, README.md#L93-95 at the checked commit
Lab runs one run is an observation, not a benchmark
About this entry
- Type
- MCP server · Defensive · works with Any MCP client, Claude Code, Codex, Gemini CLI
- Source
- github.com/andrewspearson/tenable-mcp-mssp · MIT · manifest
pyproject.toml - Version readThe install command installs exactly the version we checked (the pinned git commit), so what you get is what the card describes.
- eeb26b5 · v1.0.1 · last upstream push 2026-06-23 · no release since the pinned commit (current v1.0.1)
- In the catalog
- listed · added 2026-10-21 · last checked 2026-10-21 · next check 2027-01-19 · fresh
- ScannersA scan of the tool's files with a scanner for malicious patterns. “Pending” means it has not run yet.
- cisco-skill-scanner: not run, pending
- Changes
- none since the entry was added on 2026-10-21
Disagree?
Dispute a value with evidence (file, line, commit): write to hello@readbeforerun.ai. A dispute is checked against the pinned commit; a changed value is logged under Changes.
How this entry was checked, and how to cite it
Selected by the published criteria (method v0.1). What the author says comes only from author statements; what the code shows comes from the code and manifests at commit eeb26b5, each with one evidence line. A “?” means no evidence, never zero; zero never means safe.
The descriptive profile (what it does, can do, how it runs, what it needs) was read through the same isolated pipeline at commit eeb26b5 on 2026-10-25: one reader proposed every fact with a quoted line, a script confirmed each quoted line (49 of 49), and a second reader checked each sentence against its lines. Where nothing was found, the page says so instead of assuming “none”.
Known issues and limits: remote server-side behaviour stays “?”; the lab is not your production; static analysis can miss runtime behaviour.
Placement, badges or fast tracks are not for sale. The author is employed by an IT consultancy; the company has no influence on selection, execution or result.
Cite this:
Ilja Schlak. "Tenable MSSP Portal MCP Server". Agentic Security Field Guide, checked 2026-10-21, method reach-v0.1. https://readbeforerun.ai/catalog/andrewspearson-tenable-mcp-mssp/For maintainers
Badge for your README (reach 3 · not run yet):
[](https://readbeforerun.ai/catalog/andrewspearson-tenable-mcp-mssp/)Dispute a value with evidence (file, line, commit): write to hello@readbeforerun.ai. A dispute is checked against the pinned commit; a changed value is logged under Changes.
Claim the entry with a fieldguide.yaml in your repository: planned.