vmware-nsx
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| VMWARE_NSX_CONFIG | Yes | Path to the NSX configuration YAML file. | ~/.vmware-nsx/config.yaml |
| VMWARE_NSX_PROD_PASSWORD | No | The password for the VMware NSX Manager. Note: The environment variable name depends on the target name defined in your config (VMWARE_<TARGET_UPPER>_PASSWORD). |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_tier1_gateway | [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. Args: tier1_id: Unique id (alphanumerics, hyphens, underscores); becomes /infra/tier-1s/. display_name: UI display name. tier0_path: Parent Tier-0 path, e.g. "/infra/tier-0s/"; omit for a standalone gateway. edge_cluster_path: Required for NAT and other stateful services. route_advertisement: Comma-separated: TIER1_CONNECTED, TIER1_STATIC_ROUTES, TIER1_NAT, TIER1_LB_VIP, TIER1_LB_SNAT, TIER1_DNS_FORWARDER_IP, TIER1_IPSEC_LOCAL_ENDPOINT. target: NSX Manager target from config (default if omitted). |
| update_tier1_gateway | [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"}. Args: tier1_id: Gateway ID to update, as returned by list_tier1_gateways. display_name: New display name. Optional. tier0_path: New parent Tier-0 path, e.g. "/infra/tier-0s/". route_advertisement: Comma-separated types: TIER1_CONNECTED, TIER1_STATIC_ROUTES, TIER1_NAT, TIER1_LB_VIP, TIER1_LB_SNAT, TIER1_DNS_FORWARDER_IP, TIER1_IPSEC_LOCAL_ENDPOINT. target: NSX Manager target from config (default if omitted). |
| delete_tier1_gatewayA | [WRITE] Delete a Tier-1 gateway. WARNING: removes attached segments and NAT rules. Irreversible. Run get_tier1_gateway and list_nat_rules on the same tier1_id first to see what goes with it, and confirm with the user before deleting. Also removes the gateway's "default" locale-service first (the Policy API refuses to delete a Tier-1 that still has children); a missing locale-service is ignored. Returns a confirmation string, or an "Error: ..." string — not a dict. Args: tier1_id: Gateway ID to delete, as returned by list_tier1_gateways. target: NSX Manager target from config (default if omitted). |
| configure_tier0_bgp | [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. Args: tier0_id: Tier-0 gateway ID, as returned by list_tier0_gateways. local_as_num: Local AS number as a string, e.g. "65001". enabled: Enable or disable BGP on the locale-service (default True). ecmp: Enable ECMP for BGP routes (default True). inter_sr_ibgp: Enable inter-SR iBGP (default True). locale_service_id: Locale-service identifier (default "default"). target: NSX Manager target from config (default if omitted). |
| list_nsx_alarmsA | [READ] Get active NSX alarms at one severity, with feature, description, and entity. Returns the result envelope; check 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. Args: severity: Exact severity: LOW, MEDIUM, HIGH or CRITICAL (default MEDIUM). target: NSX Manager target from config (default if omitted). |
| get_transport_node_statusA | [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. Args: node_id: Transport node UUID, as returned by list_transport_nodes. target: NSX Manager target from config (default if omitted). |
| get_edge_cluster_status | [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. Args: cluster_id: Edge cluster UUID, as returned by list_edge_clusters. target: NSX Manager target from config (default if omitted). |
| get_nsx_manager_statusA | [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 Args: target: NSX Manager target from config (default if omitted). |
| list_segments | [READ] List all NSX network segments with type, subnet, admin state, and port count. Returns the result envelope: rows under 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. Args: target: NSX Manager target from config (default if omitted). |
| get_segment | [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. Args: segment_id: Segment ID — final component of /infra/segments/, as returned by list_segments. target: NSX Manager target from config (default if omitted). |
| list_tier0_gateways | [READ] List all Tier-0 gateways with HA mode and transit subnets. Returns the result envelope; check Args: target: NSX Manager target from config (default if omitted). |
| get_tier0_gateway | [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/") 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. Args: tier0_id: Tier-0 gateway ID, as returned by list_tier0_gateways. target: NSX Manager target from config (default if omitted). |
| list_tier1_gatewaysA | [READ] List all Tier-1 gateways with linked Tier-0 path and route advertisement. Returns the result envelope; check Args: target: NSX Manager target from config (default if omitted). |
| get_tier1_gateway | [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. Args: tier1_id: Tier-1 gateway ID, as returned by list_tier1_gateways. target: NSX Manager target from config (default if omitted). |
| list_transport_zonesA | [READ] List all NSX transport zones — the overlay/VLAN boundaries segments attach to. Use this first when building a segment: create_segment requires a transport_zone_path of "/infra/sites/default/enforcement-points/default/transport-zones/" 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. Args: target: NSX Manager target from config (default if omitted). |
| list_transport_nodesA | [READ] List all transport nodes (ESXi hosts and Edge nodes) with type and status. Returns the result envelope; check Args: target: NSX Manager target from config (default if omitted). |
| list_edge_clustersA | [READ] List all edge clusters with member count and deployment type. Returns the result envelope; check Args: target: NSX Manager target from config (default if omitted). |
| create_ip_poolA | [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 the created pool dict, else {"error", "hint"}. Then verify with get_ip_pool_usage; delete_ip_pool is the inverse. Args: pool_id: Unique id (alphanumerics, hyphens, underscores only); becomes /infra/ip-pools/. display_name: UI display name. start_ip: First allocatable IPv4 address, e.g. "192.168.1.10". end_ip: Last allocatable IPv4 address, e.g. "192.168.1.100". cidr: Subnet containing the range, e.g. "192.168.1.0/24". gateway_ip: Subnet default gateway, e.g. "192.168.1.1". target: NSX Manager target from config (default if omitted). |
| delete_ip_poolA | [WRITE] Permanently delete an IP address pool. Irreversible: consumers such as transport endpoints can no longer allocate, and NSX rejects the delete if the pool still has active allocations. Run get_ip_pool_usage on the same pool_id first to confirm it is unused, and confirm with the user before deleting. Returns a confirmation string, or an "Error: ..." string — not a dict. Args: pool_id: IP pool ID to delete, as returned by list_ip_pools. target: NSX Manager target from config (default if omitted). |
| create_nat_rule | [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. Args: tier1_id: Gateway ID, as returned by list_tier1_gateways. rule_id: Unique ID for the NAT rule. action: "SNAT", "DNAT" or "REFLEXIVE" (default "DNAT"). source_network: Source CIDR (required for SNAT). destination_network: Destination CIDR (required for DNAT). translated_network: Translated network/IP (required for all three). target: NSX Manager target from config (default if omitted). |
| delete_nat_rule | [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. Run list_nat_rules on the same tier1_id first to confirm the rule_id and review its action and networks, and confirm with the user before deleting. Returns a confirmation string, or an "Error: ..." string — not a dict. Args: tier1_id: Gateway that owns the rule, as returned by list_tier1_gateways. rule_id: NAT rule ID to delete, as returned by list_nat_rules. target: NSX Manager target from config (default if omitted). |
| list_nat_rulesA | [READ] List NAT rules on a Tier-1 gateway (USER section). Returns the result envelope; check Args: tier1_id: Gateway ID, as returned by list_tier1_gateways. target: NSX Manager target from config (default if omitted). |
| get_bgp_neighbors | [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. Args: tier0_id: Tier-0 gateway ID, as returned by list_tier0_gateways. target: NSX Manager target from config (default if omitted). |
| list_static_routes | [READ] List static routes on a Tier-0 or Tier-1 gateway. Returns the result envelope; check Args: tier1_id: Gateway ID (Tier-0 or Tier-1, per gateway_type), as returned by list_tier0_gateways / list_tier1_gateways. gateway_type: Either "tier0" or "tier1" (default "tier1"). target: NSX Manager target from config (default if omitted). |
| list_ip_poolsA | [READ] List all IP address pools with subnets and usage summary. Returns the result envelope; check Args: target: NSX Manager target from config (default if omitted). |
| get_ip_pool_usageA | [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"}. Args: pool_id: IP pool ID, as returned by list_ip_pools. target: NSX Manager target from config (default if omitted). |
| create_static_routeA | [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. Args: tier1_id: Gateway ID (Tier-0 or Tier-1, per gateway_type), from list_tier0_gateways / list_tier1_gateways. route_id: Unique id (alphanumerics, hyphens, underscores only). network: Destination network in CIDR notation, e.g. "10.0.0.0/8". next_hop: Next-hop IPv4 address, e.g. "192.168.1.254". gateway_type: Either "tier0" or "tier1" (default "tier1"). target: NSX Manager target from config (default if omitted). |
| delete_static_route | [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. Run list_static_routes on the same tier1_id first to confirm the route_id, destination and next hops, and confirm with the user before deleting. gateway_type must match where the route lives. Returns a confirmation string, or an "Error: ..." string — not a dict. Args: tier1_id: Gateway that owns the route (Tier-0 or Tier-1, per gateway_type), from list_tier0_gateways / list_tier1_gateways. route_id: Static route ID to delete, as returned by list_static_routes. gateway_type: Either "tier0" or "tier1" (default "tier1"). target: NSX Manager target from config (default if omitted). |
| create_segmentA | [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. Args: segment_id: Unique id (alphanumerics, hyphens, underscores only); becomes /infra/segments/. display_name: UI display name. transport_zone_path: Full path, e.g. "/infra/sites/default/enforcement-points/default/transport-zones/". vlan_ids: VLAN ID(s) for a VLAN-backed zone, e.g. "100,200". subnet: Gateway IP in CIDR for an overlay zone, e.g. "192.168.1.1/24" — the gateway address, not the network address. target: NSX Manager target from config (default if omitted). |
| update_segment | [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"}. Args: segment_id: Segment ID to update, as returned by list_segments. display_name: New display name. Optional. subnet: New gateway CIDR, e.g. "192.168.1.1/24". Optional. target: NSX Manager target from config (default if omitted). |
| delete_segmentA | [WRITE] Delete a network segment. WARNING: this disconnects all attached VMs. Irreversible. Run get_segment on the same segment_id first and check port_count — NSX refuses to delete a segment that still has attached ports — and confirm with the user before deleting. Returns a confirmation string, or an "Error: ..." string — not a dict. Args: segment_id: Segment ID to delete, as returned by list_segments. target: NSX Manager target from config (default if omitted). |
| get_logical_port_status | [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. Args: segment_id: Segment ID whose ports to inspect, as returned by list_segments. target: NSX Manager target from config (default if omitted). |
| get_segment_port_for_vmA | [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. Args: vm_display_name: VM display name as shown in vCenter/NSX inventory. target: NSX Manager target from config (default if omitted). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/zw008/VMware-NSX'
If you have feedback or need assistance with the MCP directory API, please join our Discord server