Skip to main content
Glama
omichelbraga

PNETLab MCP Server

by omichelbraga

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PNETLAB_HOSTNoBase URL of the PNETLab server.https://pnetlab.example
PNETLAB_PASSWORDNoLocal (offline) login password.pnet
PNETLAB_USERNAMENoLocal (offline) login username. Prefer a dedicated mcp-user.admin
PNETLAB_VERIFY_SSLNoSet to 'false' to disable TLS verification for self-signed certs.true
PNETLAB_HTML_CONSOLENo1 = HTML5 console, 0 = native console; changes the console link scheme.1

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_labsA

List labs and subfolders in a workspace folder (default '/'). Returns each lab's name, full path (use with open_lab/get_lab), and last-modified time. Pass a folder path to list a subfolder.

list_running_labsA

List every currently-running lab session on the server (across all users): lab path, session id, pod, and running-node count. A lab shows here whenever it has an open pod — that's what blocks deleting its .unl ('error_lab_running').

get_labB

Get a lab's full topology: metadata, all nodes (with status and the interface index->name map you need for connect_nodes), and networks.

create_labC

Create a new lab and open it as the active session lab.

open_labA

Bind an existing lab to the session so subsequent tools operate on it. Usually unnecessary — every tool auto-opens its lab_path — but useful to switch the active lab explicitly.

delete_labA

Tear down a lab's running session — stops and wipes its nodes and unbinds it (PNETLab factory/destroy). By default the .unl file is KEPT on disk. Pass delete_file=true to ALSO permanently delete the .unl file from disk (irreversible). Works for labs at the workspace root or in a subfolder, and is not blocked by other running labs.

list_imagesA

List installed node templates/images (missing/uninstalled ones filtered out).

add_nodeA

Add a node to a lab. Common templates: 'vpcs' (type vpcs), 'i86bi_linux_l3' Cisco IOL router / 'i86bi_linux_l2' IOL switch (type iol), 'c3725' etc. (type dynamips). Use list_images for what's installed. Nodes are created with startup-config ENABLED so push_config loads on boot. Note: VPCS ignores startup-config — set its IP on the live console.

start_nodeC

Start a single node in a lab.

stop_nodeB

Stop a single node in a lab.

start_allC

Start all nodes in a lab.

stop_allC

Stop all nodes in a lab.

delete_nodeA

Delete a single node from a lab (and its links). Prefer deleting a node BEFORE re-wiring its neighbors — on PNETLab, editing links after the fact can drop interface bindings. Use get_lab to find the node_id.

wipe_nodeA

Wipe a node — clear its NVRAM/runtime state so it reboots fresh from the stored startup-config (PNETLab 'Wipe'). Use to factory-reset a device or force a pushed config to reload. Also frees a stuck console line.

get_node_statusB

Get a node's status (0=stopped,1=building,2=running), console URL, and interfaces.

push_configA

Push a startup-config to a node (stored; loads on next boot). For IOL L2 switches, include 'vtp mode transparent' before 'vlan N' or the VLAN won't persist. VPCS nodes ignore startup-config — configure their IP on the live console instead.

get_node_configB

Get a node's current startup-config text.

export_configA

Save a RUNNING node's live running-config into its stored startup-config (PNETLab 'Export CFG'), so changes made on the device (write mem) survive a wipe/reopen. The node must be running. Pass node_id=0 to export ALL running nodes at once. Also refreshes what get_node_config returns.

send_consoleA

Type commands on a node's LIVE console via the Guacamole tunnel — for what push_config CAN'T do: VPCS IPs, IOL dot1Q subinterface IPs (dropped from startup-config), live 'write mem', etc. Node must be running. Pass commands as a list of lines (each sent + Enter); for IOS include 'enable' and 'configure terminal' as needed, e.g. ['enable','configure terminal','interface e0/0.10','ip address 10.1.10.1 255.255.255.0','end','write memory']. For VPCS: ['ip 10.1.10.10/24 10.1.10.1','save']. This is write-only (no output is read back) — verify with export_config/get_node_config. Close any open browser console tab for the node first (one connection allowed).

read_consoleA

Read a node's LIVE console as a screenshot (the read side send_console lacks). Returns a PNG image of the current terminal for you to read. Optionally pass 'commands' (list of lines) to type first, then it captures the output — do type+read in ONE call to avoid console contention. Node must be running; close any open browser console tab for it. Great for verifying 'show' commands, ping results, and boot state.

connect_nodesA

Create a point-to-point link between two node interfaces. Interfaces may be given as an index or an interface name. IMPORTANT: IOL interfaces are indexed 0/16/32/48 (e0/0=0, e0/1=16, e0/2=32, e0/3=48); VPCS uses 0. You can pass 'e0/1' and it is converted automatically. Use get_lab to see each node's interface map. Do NOT connect nodes after editing them — wire the topology, then start.

disconnect_nodesA

Remove the link on a node's interface (deletes the underlying network). For a point-to-point link this disconnects BOTH ends, so you only pass one side. Interface may be an index or an 'e0/1'-style name (IOL 0/16/32/48). Use get_lab to see which interfaces are connected.

get_template_optionsA

Get a node template's add-node option schema — the valid/default fields for that image (e.g. ram, ethernet count, image filename, nvram). Use before add_node to pick correct parameters. Get template keys from list_images.

create_folderA

Create a workspace subfolder for organizing labs. path='/' for the root.

delete_folderA

Delete a workspace folder AND everything inside it (irreversible). Blocked with 'error_folder_running' if any lab under it is running.

download_labA

Export a lab to a .zip backup and save it to a local file. Pass save_path as a file or directory (defaults to the current directory). Returns the saved path. Round-trips with upload_lab.

upload_labA

Import a lab from a local .zip (previously produced by download_lab) into a workspace folder. Pass the local zip path and the destination folder (default '/'). The folder must already exist.

clone_labA

Clone an existing lab into the same folder under a new name (copies the whole topology + configs). Great for templating — duplicate a base lab N times. 'name' is the clone's new name (no .unl needed).

move_labA

Move a lab into another workspace folder. The destination folder must already exist (use create_folder first). Pass folder='/' for the root.

rename_labB

Rename a lab (changes its .unl filename). PNETLab sanitizes the new name (special characters are stripped). Pass the new name without .unl.

stop_labA

Fully stop a running lab across ALL its open sessions/pods (stops nodes and destroys the pods). Use this to clear 'error_lab_running' before deleting a lab that's still open — including one running under another user's session. Find running labs with list_running_labs.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

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/omichelbraga/pnetlab-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server