PNETLab MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PNETLAB_HOST | No | Base URL of the PNETLab server. | https://pnetlab.example |
| PNETLAB_PASSWORD | No | Local (offline) login password. | pnet |
| PNETLAB_USERNAME | No | Local (offline) login username. Prefer a dedicated mcp-user. | admin |
| PNETLAB_VERIFY_SSL | No | Set to 'false' to disable TLS verification for self-signed certs. | true |
| PNETLAB_HTML_CONSOLE | No | 1 = HTML5 console, 0 = native console; changes the console link scheme. | 1 |
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 |
|---|---|
| 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- 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/omichelbraga/pnetlab-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server