mcp-eveng
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | Bind host | 127.0.0.1 |
| MCP_PORT | No | Bind port | 8000 |
| EVENG_HOST | No | EVENG server IP or hostname — no scheme or port | 127.0.0.1 |
| EVENG_PORT | No | EVENG server port | 443 |
| EVENG_HTML5 | No | EVENG html5 login flag (-1 auto, 0 Pro/HTML5-only, 1 native console) | -1 |
| MCP_API_KEY | No | If set, every request needs Authorization: Bearer <key> | |
| MCP_SSE_PATH | No | Mount path for the legacy SSE app | /sse |
| MCP_STATEFUL | No | Whether to enable streamable-http session persistence | true |
| MCP_HTTP_PATH | No | Mount path for the Streamable HTTP app | /mcp |
| MCP_LOG_LEVEL | No | DEBUG, INFO, WARNING, ERROR, or CRITICAL | INFO |
| EVENG_PASSWORD | No | Login password | eve |
| EVENG_PROTOCOL | No | http or https | https |
| EVENG_USERNAME | No | Login username | admin |
| EVENG_VERIFY_SSL | No | Verify TLS certs | false |
| MCP_TLS_KEY_PATH | No | TLS certificate's private key file (optional, requires MCP_TLS_CERT_PATH) | |
| MCP_ALLOWED_HOSTS | No | Comma-separated Host-header allowlist | localhost:* |
| MCP_TLS_CERT_PATH | No | TLS certificate file (optional, requires MCP_TLS_KEY_PATH) | |
| MCP_TLS_KEY_PASSWORD | No | Only needed if the private key is password-protected | |
| EVENG_TIMEOUT_SECONDS | No | HTTP request timeout | 30 |
| MCP_TOOLS_CONFIG_PATH | No | Path to per-tool enable/disable config file | tools.env |
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 |
|---|---|
| get_statusA | Get EVENG server status: CPU, RAM, disk usage and version info. |
| list_node_templatesA | List node templates EVENG knows about, with vendor context. By default only lists templates that have an image installed (so
you're only shown templates you could actually use). Pass
include_without_images=true to see the full catalog. Each result
includes a best-effort Args: include_without_images: Also list templates with no image installed (these can't be used to add a node yet). |
| get_node_templateA | Get details (available images, default options) for one node template. Includes a best-effort Args: template: Template id, e.g. "iol", "vios", "csr1000v". |
| list_network_typesA | List available network/cloud types (bridge, ovs, pnetX, ...) for lab networks. |
| list_folderB | List the folders and labs contained in an EVENG folder. Args: path: Folder path, e.g. "/" or "/User1/Folder 1". |
| add_folderB | Create a new folder inside an existing EVENG folder. Args: path: Parent folder path, e.g. "/User1". name: Name of the new folder to create. |
| move_folderA | Move or rename an existing folder. Args: path: Current full folder path, e.g. "/User1/Old Name". new_path: Destination full folder path, e.g. "/User1/New Name". |
| delete_folderA | Delete a folder, matched by path substring (case-insensitive). Search -> select -> confirm flow (see module docs). Only one folder can be deleted per call. Refuses to delete a folder that still has contents. Args: path: Folder path or a fragment of one, e.g. "/User1/Folder 1" or "Folder 1". Required. search_path: Folder to search from, default "/" (the whole server). selection: When multiple folders matched, the number or exact path of the one to delete. confirm: Set true on the final call to actually delete. |
| get_labA | Get metadata for a lab. Args: lab_path: Full path to the .unl lab file, e.g. "/User1/Lab 1.unl". |
| open_labA | Look up a lab by path or name substring, report its lock status, and suggest next steps. Read-only -- there is no "open for editing" session in EVE-NG's
API the way there is in its web GUI; every change (add a node, add
a network, edit metadata) is its own direct call, no prior "open"
needed. This just looks the lab up and reports what's there first.
Searches recursively under Args: name: Lab file name/path, or a fragment of one. Required. search_path: Folder to search from, default "/" (the whole server). selection: When multiple labs matched, the number or full name/path of the one to open. |
| create_labB | Create a new (empty) lab. Args: path: Destination folder, e.g. "/User1". name: Lab name (the ".unl" extension is added automatically). version: Free-form version string. author: Lab author. description: One-line description. body: Free-form lab notes/usage guide. |
| edit_labB | Edit an existing lab's metadata. Only supplied fields are changed. Args: lab_path: Full path to the .unl lab file. name: New name, if changing. version: New version, if changing. author: New author, if changing. description: New description, if changing. body: New body/notes, if changing. |
| share_labA | Share a lab with one or more users, added to whoever it's already shared with.
Otherwise: no matches cancels; more than 20 matches doesn't
list them (unwieldy) -- asks for a more specific search
instead; exactly one match proceeds directly, no prompt; more
than one (up to 20) is shown numbered, with an "all" option
at the end meaning every matched user, not necessarily
every user on the server. Pick via Existing shares are preserved -- this adds to whoever the lab
is already shared with, never replaces the list. Final
confirmation lists every user about to be newly added; reply
"accept" or "yes" ( Args: lab_path: Full path to the .unl lab file. search: Username fragment to search for, case-insensitive. Empty matches every user; "all" shares with everyone directly. selection: When multiple users matched, the number(s), exact username(s), or "all" (every matched user). confirm: Set true on the final call to actually apply. |
| move_labC | Move a lab to a different folder. Args: lab_path: Full path to the .unl lab file. new_path: Destination folder path. |
| delete_labA | Delete exactly one lab, matched by path OR name substring (case-insensitive). Search -> select -> confirm flow (see module docs). Searches
recursively under Args: name: Lab file name/path, or a fragment of one, to delete, e.g. "test", "test.unl", or "/User1/test.unl". Required. search_path: Folder to search from, default "/" (the whole server). selection: When multiple labs matched, the number or exact path/name of the one to delete. confirm: Set true on the final call to actually delete. |
| get_lab_topologyA | Get the full node/network connection topology of a lab. Args: lab_path: Full path to the .unl lab file. |
| get_lab_linksA | Get all ethernet/serial endpoints available in a lab (useful before wiring nodes). Args: lab_path: Full path to the .unl lab file. |
| list_lab_picturesC | List background pictures/annotations placed in a lab, or get one by id. Args: lab_path: Full path to the .unl lab file. picture_id: Specific picture id, or omit to list all. |
| list_labsA | Recursively list every lab under Always recursive -- listing a specific folder walks the tree starting there, not just that one level. EVE-NG's API has no recursive-listing endpoint, so this walks every folder in the tree itself, with loop protection (skips every ".." entry, never revisits a folder, and hard max_depth/max_folders ceilings). Args:
path: Folder to start from, default "/" (the whole server).
search: Case-insensitive substring to match against each
lab's path or file name -- same matching convention as
delete_lab/open_lab. Empty (the default) matches every
lab found under |
| list_lab_networksB | List all networks in a lab, or get a single network by id. Args: lab_path: Full path to the .unl lab file. network_id: Specific network id, or omit to list all. |
| add_lab_networkA | Add a network (bridge/cloud/ovs/pnetX) to a lab's canvas. If Args:
lab_path: Full path to the .unl lab file.
network_type: See |
| edit_lab_networkA | Edit an existing network by id. Only supplied fields are changed. Same partial-update pattern as Args: lab_path: Full path to the .unl lab file. network_id: Id of the network to edit (see list_lab_networks). name: New name, if changing. left: New canvas position from the left, if changing. top: New canvas position from the top, if changing. visibility: 0/1, if changing. This is what actually makes a node-to-node bridge render as a direct line, but only when set after the network is created and wired -- not at creation time. hideme: 0/1, if changing -- whether the network shows its own icon at all. style: Line style, if changing (e.g. "Solid"). icon: Icon filename, if changing. color: Line color, if changing. label: Text label, if changing. |
| delete_lab_networkA | Delete network(s) from a lab, matched by name substring (case-insensitive). Matches on name only, never id. Search -> select -> confirm flow (see module docs). More than one network can be selected/deleted per call here. Args: lab_path: Full path to the .unl lab file. name: Network name or a fragment of one to delete. Required. selection: When multiple networks matched, the number(s) and/or exact name(s) of the one(s) to delete, space/comma separated. confirm: Set true on the final call to actually delete. |
| list_lab_nodesA | List all nodes in a lab, or get a single node by id (includes console URL/status). Each node includes a best-effort Args: lab_path: Full path to the .unl lab file. node_id: Specific node id, or omit to list all nodes. |
| add_lab_nodeA | Add a node to a lab's canvas, resolving the template by search and auto-placing it.
Once resolved, fetches the template's own defaults (node type,
RAM, CPU, ethernet count, console type, icon, and every other
field it reports, e.g. QEMU-specific ones) and uses them for
anything you didn't specify -- this works the same way for every
vendor's templates. If the template has more than one image and
you didn't specify Canvas position auto-places when not given: left to right, 5 nodes per row, 100 units apart starting at (100, 100), wrapping to a new row 100 below; skips any grid slot within 50 units of an existing node on both axes. Args:
lab_path: Full path to the .unl lab file.
template: Template id, name, or vendor to search for -- a
fragment is enough, e.g. "vios", "cisco", or "juniper".
Empty lists every available template.
selection: When multiple templates matched, the number or
exact id/name of the one to use.
node_type: "qemu", "dynamips", or "iol". Defaults to the template's own type.
name: Node display name. Defaults to the template's name/prefix.
image: Image filename from |
| delete_lab_nodeA | Delete node(s) from a lab, matched by name substring (case-insensitive). Matches on name only, never id. Search -> select -> confirm flow (see module docs). More than one node can be selected/deleted per call here. Args: lab_path: Full path to the .unl lab file. name: Node name or a fragment of one to delete. Required. selection: When multiple nodes matched, the number(s) and/or exact name(s) of the one(s) to delete, space/comma separated. confirm: Set true on the final call to actually delete. |
| edit_lab_nodeA | Edit an existing node by id. Only supplied fields are changed. Covers every node field EVE-NG's own "Edit Node" dialog
exposes (see get_node_template's Targets exactly one node -- for ram/cpu/ethernet/icon/image across every node sharing a template at once, see edit_lab_nodes_by_template. For delay specifically with bulk ordering/incrementing across many nodes, see change_node_delay. EVE-NG requires a node to be stopped to edit it, on both PRO and Community (unlike connect_interface's wiring, which PRO allows on running nodes). This checks the node's current status first and stops it automatically if needed, before applying the edit -- you don't have to stop it yourself first. If Args:
lab_path: Full path to the .unl lab file.
node_id: Id of the node to edit (see list_lab_nodes).
name: New name, if changing.
icon: New icon filename, if changing.
image: New image filename, if changing -- must be one of
the template's own valid images (see get_node_template).
ram: New RAM in MB, if changing.
cpu: New vCPU count, if changing.
cpulimit: New CPU limit toggle (0/1), if changing.
ethernet: New ethernet interface count, if changing.
console: New console type ("telnet"/"vnc"/"rdp"/"rdp-tls"), if changing.
config: New config state ("Unconfigured"/"Saved"), if changing.
left: New canvas position from the left, if changing.
top: New canvas position from the top, if changing.
delay: New startup delay in seconds, if changing.
disable_offload: New disable-offload toggle (0/1), if changing.
sat: New satellite setting, if changing.
eth_format: New interface name format string, if changing.
eth_name: New explicit interface names list, if changing.
firstmac: New first interface MAC address, if changing.
qemu_version: New QEMU version, if changing.
qemu_arch: New QEMU architecture, if changing.
qemu_nic: New QEMU NIC model, if changing.
qemu_options: New custom QEMU options string, if changing.
rdp_user: New RDP username (rdp/rdp-tls console nodes), if changing.
rdp_password: New RDP password (rdp/rdp-tls console nodes), if changing.
confirm_duplicate_name: Set true to use |
| change_node_delayA | Change a node's startup delay (seconds before it auto-starts), one node or in bulk.
Otherwise
Every mode ends the same way: one more explicit confirmation
summarizing every node and its new delay, warning that each
will be stopped first (required regardless of PRO/Community,
same as Args:
lab_path: Full path to the .unl lab file.
node_id: Id of a single node to change. Overrides |
| edit_lab_nodes_by_templateA | Bulk-edit interfaces/cpu/memory/icon/image across nodes of exactly one template. Search by Once resolved, Then Whatever isn't supplied is prompted for one piece at a time -- each call re-derives everything fresh from what's currently given, there's no server-side session. Final confirmation always summarizes every affected node, the
template, and the change, and warns that every affected node
will be stopped first (required regardless of PRO/Community).
Reply "accept" or "yes" ( Args:
lab_path: Full path to the .unl lab file.
vendor: Vendor to search for, e.g. "cisco". At least this
or |
| get_node_interfacesA | Get a node's ethernet/serial interfaces and what they're wired to. Args: lab_path: Full path to the .unl lab file. node_id: Id of the node. |
| connect_interfaceA | Connect one node's interface to another node, or to an existing network. Exactly one target is required:
EVE-NG PRO allows wiring interfaces on running nodes;
Community requires every node involved to be stopped first.
This checks the server's edition automatically and, on
Community only, stops any running node(s) involved before
wiring them -- same stop-if-needed behavior as Args: lab_path: Full path to the .unl lab file. node_id: Id of the node whose interface is being connected. interface: Which interface on node_id -- name, index, or omit to auto-pick the first available one. target_node_id: For a node-to-node connection: id of the other node. target_interface: Which interface on target_node_id -- name, index, or omit to auto-pick the first available one. network_id: For a node-to-network connection: the network's id. network_name: For a node-to-network connection: the network's exact name (case-insensitive), if you don't already know its id. |
| start_nodeA | Start one node, or every node in the lab if Args: lab_path: Full path to the .unl lab file. node_id: Node id to start, or omit to start all nodes. |
| stop_nodeB | Stop one node, or every node in the lab if Args: lab_path: Full path to the .unl lab file. node_id: Node id to stop, or omit to stop all nodes. |
| wipe_nodeB | Wipe one node (or all nodes), deleting saved config/VLANs so it rebuilds from image. Args: lab_path: Full path to the .unl lab file. node_id: Node id to wipe, or omit to wipe all nodes. |
| export_nodeB | Export one node's (or all nodes') running config into the saved lab file. Args: lab_path: Full path to the .unl lab file. node_id: Node id to export, or omit to export all nodes. |
| list_toolsA | List every tool this MCP server currently advertises. Reflects tools.env -- a disabled tool never appears here, since it was never registered with the server at all, not just hidden behind an error if called. Useful as a single authoritative check of what's actually available right now. |
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/madmickstar/mcp_eveng'
If you have feedback or need assistance with the MCP directory API, please join our Discord server