Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

VMware NSX

PYPI · VMWARE-NSX-MGMT · SCANNED SEP 21

VMware NSX networking management with 33 MCP tools: segments, gateways, NAT, routing, IPAM.

Available components

−13 this week 61 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security50
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
  • 3 of 40 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency35
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • License check failed: the license (MIT License) isn't a recognized OSI-approved license. See how to fix → Fail
  • Actively maintained (last published 0 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability68
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 8033 tokens (~243/item across 33 items; 33 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management66
  • Stability check failed: the tool surface changed between 1.8.14 and 1.11.0: 0 tool removals, 5 breaking changes, 0 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 34 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the VMware NSX MCP server?

VMware NSX runs locally as a PyPI package, launched with uvx vmware-nsx-mgmt. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · vmware-nsx-mgmt

# add to Claude Code
claude mcp add vmware-skills-vmware-nsx -- uvx vmware-nsx-mgmt
// .cursor/mcp.json
{
  "mcpServers": {
    "vmware-skills-vmware-nsx": {
      "command": "uvx",
      "args": [
        "vmware-nsx-mgmt"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "vmware-skills-vmware-nsx": {
      "command": "uvx",
      "args": [
        "vmware-nsx-mgmt"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add vmware-skills-vmware-nsx -- uvx vmware-nsx-mgmt
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "vmware-skills-vmware-nsx": {
      "type": "local",
      "command": [
        "uvx",
        "vmware-nsx-mgmt"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add vmware-skills-vmware-nsx --command uvx --arg vmware-nsx-mgmt
# ~/.hermes/config.yaml
mcp_servers:
  vmware-skills-vmware-nsx:
    command: "uvx"
    args: ["vmware-nsx-mgmt"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "vmware-skills-vmware-nsx": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "vmware-nsx-mgmt"
      ]
    }
  }
}
# add to Vellum
assistant mcp add vmware-skills-vmware-nsx -t stdio -c uvx -a vmware-nsx-mgmt
// mcp.json
{
  "mcpServers": {
    "vmware-skills-vmware-nsx": {
      "command": "uvx",
      "args": [
        "vmware-nsx-mgmt"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 21 Sept 26 −15
    • Malware scan: pass → unverified security
  • 20 Sept 26 +15
    • Stability: fail → unverified security
    • Tool safety: pass → unverified security
    • Malware scan: unverified → pass security
    • Capabilities: pass → unverified functional
    • Tool coverage: 100 → unverified functional
    • Schema quality: Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. functional
    • Package version: 1.10.0 → 1.11.0 functional
  • 19 Sept 26 −15
    • Malware scan: pass → unverified security
    • Stability: 0.63 → fail security
    • Package version: 1.9.1 → 1.10.0 functional
  • 18 Sept 26 +15
    • Malware scan: unverified → pass security
  • 17 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Sept 26 −14
    • Malware scan: pass → unverified security
    • Package version: 1.9.0 → 1.9.1 functional
  • 14 Sept 26 +15
    • Malware scan: unverified → pass security
  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Analysed pypi/vmware-nsx-mgmt@1.11.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem pypi

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 40 packages
Packages resolved 40
Stale 3
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 33 exposed · ~7,833 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
configure_tier0_bgp ~251

[WRITE] Configure BGP settings on a Tier-0 gateway's locale-service. Use get_tier0_gateway first to confirm the tier0_id. Sets BGP *settings* only (local AS, ECMP, inter-SR iBGP); neighbor creation is a separate Policy API object not exposed here, so peering will not come up from this call alone. Returns the updated BGP config dict, else {"error", "hint"}. Then check get_bgp_neighbors for session state.

NameTypeReqDescription
ecmpbooleanEnable ECMP for BGP routes (default True).
enabledbooleanEnable or disable BGP on the locale-service (default True).
inter_sr_ibgpbooleanEnable inter-SR iBGP (default True).
local_as_numstringyesLocal AS number as a string, e.g. "65001".
locale_service_idstringLocale-service identifier (default "default").
targetNSX Manager target from config (default if omitted).
tier0_idstringyesTier-0 gateway ID, as returned by list_tier0_gateways.

No output schema declared.

No examples provided.

create_ip_pool ~302

[WRITE] Create an IP address pool with one static subnet and allocation range. IP pools supply addresses to NSX consumers such as tunnel endpoints. Run list_ip_pools first to avoid overlapping ranges; start_ip and end_ip must both fall inside cidr. The same pool_id overwrites (PUT). Returns {"created", "pool_id", "subnets_created", "subnets_failed"}. If the subnet failed it also has "error": the pool itself WAS created and needs cleaning up (the error says how). Other failures return {"error", "hint"}. Verify with get_ip_pool_usage; delete_ip_pool is the inverse.

NameTypeReqDescription
cidrstringyesSubnet containing the range, e.g. "192.168.1.0/24".
display_namestringyesUI display name.
end_ipstringyesLast allocatable IPv4 address, e.g. "192.168.1.100".
gateway_ipSubnet default gateway, e.g. "192.168.1.1".
pool_idstringyesUnique id (alphanumerics, hyphens, underscores only); becomes /infra/ip-pools/<pool_id>.
start_ipstringyesFirst allocatable IPv4 address, e.g. "192.168.1.10".
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

create_nat_rule ~270

[WRITE] Create a NAT rule on a Tier-1 gateway's USER NAT section. Run list_tier1_gateways for tier1_id and list_nat_rules to avoid an id clash — the same rule_id overwrites. The gateway must have an edge cluster (see create_tier1_gateway) or NAT cannot be realized, and TIER1_NAT advertisement must be set via update_tier1_gateway for the translated address to be reachable from outside. Returns the created rule dict, else {"error", "hint"}. Then confirm with list_nat_rules; delete_nat_rule is the inverse.

NameTypeReqDescription
actionstring"DNAT" (default), "SNAT", "REFLEXIVE", "NO_SNAT", "NO_DNAT", or "NAT64".
destination_networkDestination CIDR (required for DNAT).
rule_idstringyesUnique ID for the NAT rule.
source_networkSource CIDR (required for SNAT).
targetNSX Manager target from config (default if omitted).
tier1_idstringyesGateway ID, as returned by list_tier1_gateways.
translated_networkstringTranslated network/IP (required for all three).

No output schema declared.

No examples provided.

create_segment ~247

[WRITE] Create an overlay or VLAN-backed NSX network segment. Run list_transport_zones first for transport_zone_path; it decides whether subnet or vlan_ids applies — the wrong one is rejected. The same segment_id overwrites (PUT). Returns the created segment dict, else {"error", "hint"}. A segment with no gateway is isolated: link it with create_tier1_gateway, then verify with get_segment.

NameTypeReqDescription
display_namestringyesUI display name.
segment_idstringyesUnique id (alphanumerics, hyphens, underscores only); becomes /infra/segments/<segment_id>.
subnetGateway IP in CIDR for an overlay zone, e.g. "192.168.1.1/24" — the gateway address, not the network address.
targetNSX Manager target from config (default if omitted).
transport_zone_pathstringyesFull path, e.g. "/infra/sites/default/enforcement-points/default/transport-zones/<tz-id>".
vlan_idsVLAN ID(s) for a VLAN-backed zone, e.g. "100,200".

No output schema declared.

No examples provided.

create_static_route ~291

[WRITE] Create a static route on a Tier-0 or Tier-1 gateway via the Policy API. Use this for destinations not covered by connected or advertised routes, e.g. a VPN or external subnet. Run list_static_routes first to avoid an id clash — the same route_id overwrites (PUT). For the Tier-0 to advertise a Tier-1's static route upstream, the gateway needs TIER1_STATIC_ROUTES advertisement, set via update_tier1_gateway. Returns the created route dict, else {"error", "hint"}. Then confirm with list_static_routes; delete_static_route is the inverse.

NameTypeReqDescription
gateway_typestringEither "tier0" or "tier1" (default "tier1").
networkstringyesDestination network in CIDR notation, e.g. "10.0.0.0/8".
next_hopstringyesNext-hop IPv4 address, e.g. "192.168.1.254".
route_idstringyesUnique id (alphanumerics, hyphens, underscores only).
targetNSX Manager target from config (default if omitted).
tier1_idstringyesGateway ID (Tier-0 or Tier-1, per gateway_type), from list_tier0_gateways / list_tier1_gateways.

No output schema declared.

No examples provided.

create_tier1_gateway ~300

[WRITE] Create a Tier-1 gateway to route segments, optionally uplinked to a Tier-0. Use this before create_segment when the segment needs routing; get tier0_path from list_tier0_gateways and edge_cluster_path from list_edge_clusters first. Without route_advertisement, connected subnets stay unreachable from outside until it is set here or via update_tier1_gateway. The same tier1_id overwrites (PUT). Returns the created gateway dict, else {"error", "hint"}; verify with get_tier1_gateway.

NameTypeReqDescription
display_namestringyesUI display name.
edge_cluster_pathRequired for NAT and other stateful services.
route_advertisementComma-separated: TIER1_CONNECTED, TIER1_STATIC_ROUTES, TIER1_NAT, TIER1_LB_VIP, TIER1_LB_SNAT, TIER1_DNS_FORWARDER_IP, TIER1_IPSEC_LOCAL_ENDPOINT.
targetNSX Manager target from config (default if omitted).
tier0_pathParent Tier-0 path, e.g. "/infra/tier-0s/<t0-id>"; omit for a standalone gateway.
tier1_idstringyesUnique id (alphanumerics, hyphens, underscores); becomes /infra/tier-1s/<tier1_id>.

No output schema declared.

No examples provided.

delete_ip_pool ~253

[WRITE] Permanently delete an IP address pool; refuses while IPs are allocated. Irreversible: consumers such as transport endpoints can no longer allocate. Without confirm=True this only previews: it returns blast_radius (the pool's name, pool_usage, allocation_count, realized_allocation_count and allocated_ips, blockers, unmeasured) and deletes nothing. Show that to the user and get their decision. Do not set confirm=True on your own because the user asked to delete earlier: they have not seen the blast radius yet. confirm=True refuses while any IP is still allocated — in Policy ip-allocations or in NSX's pool_usage count, which also covers TEP addresses — or when either count could not be read. Returns {"action": "preview" | "deleted", "blast_radius": ...}, else {"error", "hint", "blast_radius"?}.

NameTypeReqDescription
confirmbooleanFalse (default) returns the blast radius and changes nothing. True applies it.
pool_idstringyesIP pool ID to delete, as returned by list_ip_pools.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

delete_nat_rule ~276

[WRITE] Permanently delete a NAT rule from a Tier-1 gateway's USER NAT section. Irreversible: traffic matched by the rule stops being translated immediately, which can break inbound (DNAT) or outbound (SNAT) connectivity. Without confirm=True this only previews: it returns blast_radius (the gateway, the rule's action, source/destination match and translation, enabled flag, blockers, unmeasured) and deletes nothing. Show that to the user and get their decision. Do not set confirm=True on your own because the user asked to delete earlier: they have not seen the blast radius yet. confirm=True refuses when the rule could not be read, and a rule_id not on that gateway is an error. Returns {"action": "preview" | "deleted", "blast_radius": ...}, else {"error", "hint", "blast_radius"?}.

NameTypeReqDescription
confirmbooleanFalse (default) returns the blast radius and changes nothing. True applies it.
rule_idstringyesNAT rule ID to delete, as returned by list_nat_rules.
targetNSX Manager target from config (default if omitted).
tier1_idstringyesGateway that owns the rule, as returned by list_tier1_gateways.

No output schema declared.

No examples provided.

delete_segment ~233

[WRITE] Delete a network segment; refuses while any port is attached. Irreversible. Without confirm=True this only previews: it returns blast_radius (the segment's name, gateway, subnets, port_count and port_ids, blockers, unmeasured) and deletes nothing. Show that to the user and get their decision. Do not set confirm=True on your own because the user asked to delete earlier: they have not seen the blast radius yet. confirm=True re-measures, then refuses, deleting nothing, while any port (a VM vNIC or router interface) is attached — it never disconnects them for you — or when the ports could not be read. Returns {"action": "preview" | "deleted", "blast_radius": ...}, else {"error", "hint", "blast_radius"?}.

NameTypeReqDescription
confirmbooleanFalse (default) returns the blast radius and changes nothing. True applies it.
segment_idstringyesSegment ID to delete, as returned by list_segments.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

delete_static_route ~308

[WRITE] Permanently delete a static route from a Tier-0 or Tier-1 gateway. Irreversible: traffic to the route's destination CIDR immediately falls back to remaining routes or is dropped. Without confirm=True this only previews: it returns blast_radius (the gateway, the route's network and next hops, blockers, unmeasured) and deletes nothing. Show that to the user and get their decision. Do not set confirm=True on your own because the user asked to delete earlier: they have not seen the blast radius yet. gateway_type must match where the route lives; a route_id not on that gateway is an error, and confirm=True refuses when the routes could not be read. Returns {"action": "preview" | "deleted", "blast_radius": ...}, else {"error", "hint", "blast_radius"?}.

NameTypeReqDescription
confirmbooleanFalse (default) returns the blast radius and changes nothing. True applies it.
gateway_typestringEither "tier0" or "tier1" (default "tier1").
route_idstringyesStatic route ID to delete, as returned by list_static_routes.
targetNSX Manager target from config (default if omitted).
tier1_idstringyesGateway that owns the route (Tier-0 or Tier-1, per gateway_type), from list_tier0_gateways / list_tier1_gateways.

No output schema declared.

No examples provided.

delete_tier1_gateway ~310

[WRITE] Delete a Tier-1 gateway; refuses while anything still depends on it. Irreversible. Without confirm=True this only previews: it returns blast_radius (name, tier0_path, the "default" locale-service and edge cluster the delete removes, dependents by kind, blockers, unmeasured) and deletes nothing. Show that to the user and get their decision. Do not set confirm=True on your own because the user asked to delete earlier: they have not seen the blast radius yet. confirm=True re-measures (read-only) and refuses, deleting nothing, while any remain: attached segments or Tier-1-scoped segments, NAT rules, static routes, service interfaces, extra locale-services, IPsec/L2 VPN services, a DNS forwarder, or a load balancer service attached to it — or when any of them could not be read. It never removes them for you. When clear, deletes the "default" locale-service, then the gateway. Returns {"action": "preview" | "deleted", "blast_radius": ...}, else {"error", "hint", "blast_radius"?}.

NameTypeReqDescription
confirmbooleanFalse (default) returns the blast radius and changes nothing. True applies it.
targetNSX Manager target from config (default if omitted).
tier1_idstringyesGateway ID to delete, as returned by list_tier1_gateways.

No output schema declared.

No examples provided.

get_bgp_neighbors ~198

[READ] Get BGP configuration and neighbor status for a Tier-0 gateway. Use this to verify dynamic routing after configure_tier0_bgp, or when troubleshooting north-south connectivity. Returns one dict (not the list envelope): tier0_id, locale-service info, BGP config (local AS, enabled, ECMP), neighbors (peer IP, remote ASN, timers) and realized session status (connection_state, in/out prefix counts). Only the gateway's FIRST locale-service is read; a gateway with none returns a hint, not an error. If sessions are down, check get_edge_cluster_status — BGP runs on the edge members. Static routes are listed separately by list_static_routes.

NameTypeReqDescription
targetNSX Manager target from config (default if omitted).
tier0_idstringyesTier-0 gateway ID, as returned by list_tier0_gateways.

No output schema declared.

No examples provided.

get_edge_cluster_status ~144

[READ] Check status of an edge cluster (member health, overall status). Use this after list_edge_clusters when north-south traffic, NAT or BGP looks broken — Tier-0/Tier-1 stateful services run on these members. Returns one dict (not the list envelope): cluster_id, edge_cluster_status, member_count and members (transport_node_id, transport_node_name, status). Member status only — why a member is degraded comes from get_transport_node_status.

NameTypeReqDescription
cluster_idstringyesEdge cluster UUID, as returned by list_edge_clusters.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

get_ip_pool_usage ~154

[READ] Get current IP allocations for one IP address pool. Use this after list_ip_pools to see how much of a pool is consumed — e.g. diagnosing TEP address exhaustion, or before delete_ip_pool, which cannot proceed while allocations remain. Returns a single dict (not the list envelope): pool_id, allocation_count and allocations (id, display_name, allocation_ip). An empty allocations list means the pool is unused, not that the query failed. On failure returns {"error", "hint"}.

NameTypeReqDescription
pool_idstringyesIP pool ID, as returned by list_ip_pools.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

get_logical_port_status ~175

[READ] Check realized state of all ports on a segment (first 50 ports). Use this after get_segment_port_for_vm has told you which segment a VM sits on, or before delete_segment to see whether ports are still attached. Returns per-port admin_state, attachment (type/id) and realized state: attached, realized_bindings_count, transport_node_ids. NSX does not expose a single UP/DOWN flag per segment port — an attached port with realized bindings on at least one transport node is healthy. Only the first 50 ports are returned. If bindings are missing everywhere, check get_transport_node_status.

NameTypeReqDescription
segment_idstringyesSegment ID whose ports to inspect, as returned by list_segments.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

get_nsx_manager_status ~131

[READ] Get NSX Manager cluster status (node health, control/management plane). Start any NSX health check here: if the manager cluster is degraded, every other reading is suspect. Returns one dict (not the list envelope): cluster_id, overall_status, control_cluster_status, mgmt_cluster_status, online_node_count and nodes. Only online nodes are listed, so a node missing from `nodes` is down rather than absent. Then list_nsx_alarms for what is actually firing.

NameTypeReqDescription
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

get_segment ~161

[READ] Get full details for one network segment, including its attached ports. Use after list_segments to inspect one segment. Returns one dict (not the list envelope): id, display_name, type, admin_state, subnets, transport_zone_path, connectivity_path (linked gateway), vlan_ids, port_count, and the first 50 ports only. A segment with attached ports cannot be deleted — check port_count before calling delete_segment. For per-port realized state use get_logical_port_status; to change the segment use update_segment.

NameTypeReqDescription
segment_idstringyesSegment ID — final component of /infra/segments/<id>, as returned by list_segments.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

get_segment_port_for_vm ~211

[READ] Find which segment(s) a VM is attached to via its VIF attachments. Start here for "why can this VM not reach the network?" — it is the only tool mapping a VM name onto NSX topology. Looks the VM up in the fabric inventory, fetches its VIFs, and matches segment ports by lport_attachment_id. Returns one dict (not the list envelope): VM info (external_id, host, power state) and matched_ports (segment id/name, port id/name). Matching is on exact display name, and empty matched_ports means no VIF is attached, not that the VM is missing. Then get_logical_port_status on the segment it names. VM power and placement are not managed here — use vmware-aiops.

NameTypeReqDescription
targetNSX Manager target from config (default if omitted).
vm_display_namestringyesVM display name as shown in vCenter/NSX inventory.

No output schema declared.

No examples provided.

get_tier0_gateway ~177

[READ] Get configuration details for one Tier-0 gateway (north-south edge router). Use after list_tier0_gateways to inspect HA configuration, or to build the tier0_path ("/infra/tier-0s/<id>") that create_tier1_gateway needs. For BGP peering state use get_bgp_neighbors instead. Returns one dict (not the list envelope): id, display_name, ha_mode, failover_mode, transit_subnets, internal_transit_subnets, rd_admin_field. Static config only — it does not say whether the gateway is currently forwarding.

NameTypeReqDescription
targetNSX Manager target from config (default if omitted).
tier0_idstringyesTier-0 gateway ID, as returned by list_tier0_gateways.

No output schema declared.

No examples provided.

get_tier1_gateway ~145

[READ] Get detailed info for one Tier-1 gateway. Use after list_tier1_gateways, and always before update_tier1_gateway — update is a PATCH, so you need the current values to know what you are changing. Returns a single detail dict (not the list envelope): id, display_name, tier0_path, failover_mode, route_advertisement_types, type. Attached segments are not listed here — use list_segments for those.

NameTypeReqDescription
targetNSX Manager target from config (default if omitted).
tier1_idstringyesTier-1 gateway ID, as returned by list_tier1_gateways.

No output schema declared.

No examples provided.

get_transport_node_status ~178

[READ] Get realized runtime status of one transport node (ESXi host or Edge node). Use after list_transport_nodes when a node looks degraded or overlay tunnels are suspect; for cluster-wide edge health use get_edge_cluster_status instead. Returns one dict (not the list envelope): node_id, status (UP, DEGRADED, DOWN, UNKNOWN), control_connection_status, mgmt_connection_status, tunnel_status (up/down/degraded counts, BFD counters) and pnic_status. Point-in-time only — no history. If tunnels are down on one segment only, follow up with get_logical_port_status rather than blaming the node.

NameTypeReqDescription
node_idstringyesTransport node UUID, as returned by list_transport_nodes.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

list_edge_clusters ~237

[READ] List all edge clusters with member count and deployment type. Returns the result envelope; check `truncated` before calling it complete. Page it: `limit` is the page size (1-1000, default 50; 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole collection, so it stays true on the last page of a walk. Use this first to resolve a cluster_id, then get_edge_cluster_status for member health. The id is also what create_tier1_gateway's edge_cluster_path is built from — a Tier-1 without an edge cluster cannot run NAT.

NameTypeReqDescription
limitintegerPage size, 1-1000 (default 50).
offsetintegerRows to skip; pass the previous response's `next_offset`.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

list_ip_pools ~233

[READ] List all IP address pools with subnets and usage summary. Returns the result envelope; check `truncated` before calling it complete. Page it: `limit` is the page size (1-1000, default 50; 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole collection, so it stays true on the last page of a walk. Use this first to resolve a pool_id, then get_ip_pool_usage for the actual allocations — the summary here does not tell you which addresses are taken. Run it before create_ip_pool to avoid overlapping ranges.

NameTypeReqDescription
limitintegerPage size, 1-1000 (default 50).
offsetintegerRows to skip; pass the previous response's `next_offset`.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

list_nat_rules ~265

[READ] List NAT rules on a Tier-1 gateway (USER section). Returns the result envelope; check `truncated` before calling it complete. Page it: `limit` is the page size (1-1000, default 50; 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole collection, so it stays true on the last page of a walk. Get tier1_id from list_tier1_gateways first. Use this before create_nat_rule to avoid an id clash, and before delete_nat_rule to confirm what a rule does. Only the USER section is listed — NSX-internal NAT is not shown.

NameTypeReqDescription
limitintegerPage size, 1-1000 (default 50).
offsetintegerRows to skip; pass the previous response's `next_offset`.
targetNSX Manager target from config (default if omitted).
tier1_idstringyesGateway ID, as returned by list_tier1_gateways.

No output schema declared.

No examples provided.

list_nsx_alarms ~335

[READ] Get active NSX alarms at one severity, with feature, description, and entity. Returns the result envelope; check `truncated` before calling it complete. Note: the NSX severity filter is an EXACT match — "MEDIUM" returns only MEDIUM alarms, not MEDIUM-and-above, so call it once per severity to build a full picture. Page it: `limit` is the page size (1-1000, 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole set, so it stays true on the last page of a walk. Unlike the other list tools this one defaults to the full 1000, because a health sweep that silently showed the first fifty alarms would be worse than a long one. Start a health check at get_nsx_manager_status, then come here, then drill into the entity the alarm names with get_transport_node_status or get_edge_cluster_status.

NameTypeReqDescription
limitintegerPage size, 1-1000 (default 1000 — every alarm at the severity).
offsetintegerAlarms to skip; pass the previous response's `next_offset`.
severitystringExact severity: LOW, MEDIUM, HIGH or CRITICAL (default MEDIUM).
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

list_segments ~295

[READ] List all NSX network segments with type, subnet, admin state, and port count. Returns the result envelope: rows under `items`, plus `returned`, `limit`, `total` (the collection's result_count, null when the API omits it), `truncated` and `hint`. Check `truncated` before calling this the complete set — when true, more rows exist. Every list tool here returns that shape. Page it: `limit` is the page size (1-1000, default 50; 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole collection, so it stays true on the last page of a walk. Use this first to resolve a segment_id, then get_segment for its ports and linked gateway, or get_logical_port_status for realized state. Distributed firewall rules are not here — use vmware-nsx-security.

NameTypeReqDescription
limitintegerPage size, 1-1000 (default 50).
offsetintegerRows to skip; pass the previous response's `next_offset`.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

list_static_routes ~321

[READ] List static routes on a Tier-0 or Tier-1 gateway. Returns the result envelope; check `truncated` before calling it complete. Page it: `limit` is the page size (1-1000, default 50; 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole collection, so it stays true on the last page of a walk. Use this before create_static_route to avoid an id clash, and before delete_static_route to confirm the destination and next hops. gateway_type must match where the route actually lives — querying the wrong tier returns an empty list, not an error. BGP-learned routes are not here; use get_bgp_neighbors.

NameTypeReqDescription
gateway_typestringEither "tier0" or "tier1" (default "tier1").
limitintegerPage size, 1-1000 (default 50).
offsetintegerRows to skip; pass the previous response's `next_offset`.
targetNSX Manager target from config (default if omitted).
tier1_idstringyesGateway ID (Tier-0 or Tier-1, per gateway_type), as returned by list_tier0_gateways / list_tier1_gateways.

No output schema declared.

No examples provided.

list_tier0_gateways ~255

[READ] List all Tier-0 gateways with HA mode and transit subnets. Returns the result envelope; check `truncated` before calling it complete. Page it: `limit` is the page size (1-1000, default 50; 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole collection, so it stays true on the last page of a walk. Use this first to resolve a tier0_id, then get_tier0_gateway for HA detail and the tier0_path that create_tier1_gateway needs, or get_bgp_neighbors for peering state. Tier-0s are not created by this skill — only Tier-1s are.

NameTypeReqDescription
limitintegerPage size, 1-1000 (default 50).
offsetintegerRows to skip; pass the previous response's `next_offset`.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

list_tier1_gateways ~254

[READ] List all Tier-1 gateways with linked Tier-0 path and route advertisement. Returns the result envelope; check `truncated` before calling it complete. Page it: `limit` is the page size (1-1000, default 50; 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole collection, so it stays true on the last page of a walk. Use this first to resolve a tier1_id — create_nat_rule, create_static_route, list_nat_rules and update_tier1_gateway all take one. A row with an empty tier0_path is standalone and cannot reach north-south. Then get_tier1_gateway for detail.

NameTypeReqDescription
limitintegerPage size, 1-1000 (default 50).
offsetintegerRows to skip; pass the previous response's `next_offset`.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

list_transport_nodes ~235

[READ] List all transport nodes (ESXi hosts and Edge nodes) with type and status. Returns the result envelope; check `truncated` before calling it complete. Page it: `limit` is the page size (1-1000, default 50; 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole collection, so it stays true on the last page of a walk. Use this first to resolve a node_id, then get_transport_node_status for that node's tunnels, controller connectivity and pNICs — the summary status here does not explain why a node is degraded.

NameTypeReqDescription
limitintegerPage size, 1-1000 (default 50).
offsetintegerRows to skip; pass the previous response's `next_offset`.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

list_transport_zones ~275

[READ] List all NSX transport zones — the overlay/VLAN boundaries segments attach to. Page it: `limit` is the page size (1-1000, default 50; 0 or negative is rejected), `offset` is how many rows to skip, and the response carries `next_offset` — pass that back as `offset` and stop when it is null. Do not loop on `truncated`: that says this page is not the whole collection, so it stays true on the last page of a walk. Use this first when building a segment: create_segment requires a transport_zone_path of "/infra/sites/default/enforcement-points/default/transport-zones/<id>" built from the id returned here. Returns the result envelope; each row has id, display_name and transport_type (OVERLAY_STANDARD, VLAN_BACKED, …). A VLAN-backed zone needs create_segment's vlan_ids, an overlay zone needs its subnet — passing the wrong one is rejected.

NameTypeReqDescription
limitintegerPage size, 1-1000 (default 50).
offsetintegerRows to skip; pass the previous response's `next_offset`.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

update_segment ~163

[WRITE] Update an existing network segment (partial update via PATCH). Only the fields you pass change. Use get_segment first, and prefer this over create_segment for an existing segment: create is a PUT and overwrites everything. Changing subnet re-addresses the gateway and can drop traffic for attached VMs, so check port_count first. Returns the updated segment dict, else {"error", "hint"}.

NameTypeReqDescription
display_nameNew display name. Optional.
segment_idstringyesSegment ID to update, as returned by list_segments.
subnetNew gateway CIDR, e.g. "192.168.1.1/24". Optional.
targetNSX Manager target from config (default if omitted).

No output schema declared.

No examples provided.

update_tier1_gateway ~250

[WRITE] Partially update an existing Tier-1 gateway via PATCH. Only the fields you pass change. Use get_tier1_gateway first — route_advertisement is sent as a whole list, so include every type you want kept. Prefer this over create_tier1_gateway for an existing gateway: create is a PUT and overwrites everything. Re-applying identical values is harmless. Returns the updated gateway dict, else {"error", "hint"}.

NameTypeReqDescription
display_nameNew display name. Optional.
route_advertisementComma-separated types: TIER1_CONNECTED, TIER1_STATIC_ROUTES, TIER1_NAT, TIER1_LB_VIP, TIER1_LB_SNAT, TIER1_DNS_FORWARDER_IP, TIER1_IPSEC_LOCAL_ENDPOINT.
targetNSX Manager target from config (default if omitted).
tier0_pathNew parent Tier-0 path, e.g. "/infra/tier-0s/<t0-id>".
tier1_idstringyesGateway ID to update, as returned by list_tier1_gateways.

No output schema declared.

No examples provided.

Common questions

What is the VMware NSX MCP server?

VMware NSX is an MCP server listed in the public MCP registry as io.github.vmware-skills/vmware-nsx. VMware NSX networking management with 33 MCP tools: segments, gateways, NAT, routing, IPAM. This page covers its PyPI package (vmware-nsx-mgmt).

Is the VMware NSX MCP server safe to use?

VMware NSX scores 61 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the VMware NSX MCP server expose?

VMware NSX exposes 33 tools: create_tier1_gateway, update_tier1_gateway, delete_tier1_gateway, configure_tier0_bgp, list_nsx_alarms, and 28 more. Their descriptions and schemas cost roughly 7,833 tokens of context every time the server is loaded.

Is the VMware NSX MCP server still maintained?

VMware NSX is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.