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 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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
- 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/omichelbraga/pnetlab-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server