Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
MCP_HOSTNoBind host127.0.0.1
MCP_PORTNoBind port8000
EVENG_HOSTNoEVENG server IP or hostname — no scheme or port127.0.0.1
EVENG_PORTNoEVENG server port443
EVENG_HTML5NoEVENG html5 login flag (-1 auto, 0 Pro/HTML5-only, 1 native console)-1
MCP_API_KEYNoIf set, every request needs Authorization: Bearer <key>
MCP_SSE_PATHNoMount path for the legacy SSE app/sse
MCP_STATEFULNoWhether to enable streamable-http session persistencetrue
MCP_HTTP_PATHNoMount path for the Streamable HTTP app/mcp
MCP_LOG_LEVELNoDEBUG, INFO, WARNING, ERROR, or CRITICALINFO
EVENG_PASSWORDNoLogin passwordeve
EVENG_PROTOCOLNohttp or httpshttps
EVENG_USERNAMENoLogin usernameadmin
EVENG_VERIFY_SSLNoVerify TLS certsfalse
MCP_TLS_KEY_PATHNoTLS certificate's private key file (optional, requires MCP_TLS_CERT_PATH)
MCP_ALLOWED_HOSTSNoComma-separated Host-header allowlistlocalhost:*
MCP_TLS_CERT_PATHNoTLS certificate file (optional, requires MCP_TLS_KEY_PATH)
MCP_TLS_KEY_PASSWORDNoOnly needed if the private key is password-protected
EVENG_TIMEOUT_SECONDSNoHTTP request timeout30
MCP_TOOLS_CONFIG_PATHNoPath to per-tool enable/disable config filetools.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

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

Tools

Functions exposed to the LLM to take actions

NameDescription
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 vendor label extracted from the template's description -- EVE-NG's API has no explicit vendor field.

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 vendor label extracted from the template's description -- EVE-NG's API has no explicit vendor field.

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 search_path; matching is a case-insensitive substring against path or file name, same as delete_lab. If more than one lab matches, they're listed and you pick one by number or full name/path (case-insensitive) via selection.

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.

search is a case-insensitive substring match against every EVE-NG username -- empty matches everyone. The literal word "all" is a shortcut that bypasses searching/selecting entirely and shares with every user that exists.

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 selection -- number(s), exact username(s), or "all".

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" (confirm) to apply -- same wording as every delete tool.

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 search_path (EVE-NG's API has no server-side search). Matching is a case-insensitive substring match against path or file name -- "test" matches "test.unl", "testing.unl", and "/User1/test.unl" alike. Only one lab can be deleted per call.

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 path (default: the whole server).

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 path.

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 network_type isn't given, fetches the current list of valid types and prompts for one instead of guessing or erroring -- reply with the exact name, or its number from that list. "cloud"/"cloud0" through "cloud9" (case-insensitive) are also accepted, resolved to "pnet0" through "pnet9" -- what EVE-NG's GUI calls Cloud0-Cloud9, a fixed set of exactly 10 (confirmed against EVE-NG's own documentation); the API itself only ever accepts the bare pnetN form.

Args: lab_path: Full path to the .unl lab file. network_type: See list_network_types for valid values, "cloud"/"cloud0"-"cloud9" for pnet0-pnet9, or omit to be shown the list. name: Network display name, default "NetX". left: Canvas position from the left. Numeric string, e.g. "380". top: Canvas position from the top. Numeric string, e.g. "153". hideme: 0 (default) renders as its own icon; 1 hides it. Note: not what makes a node-to-node connect_interface bridge render as a direct line -- that's visibility, set separately after wiring, not something you set here.

edit_lab_networkA

Edit an existing network by id. Only supplied fields are changed.

Same partial-update pattern as edit_lab/edit_lab_node. This is what connect_interface uses internally to set visibility=0 on a node-to-node bridge after wiring it -- confirmed (against a working reference implementation) to be a required separate step after creation and wiring, not something set at creation time.

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 vendor label extracted from its template's description -- EVE-NG's API has no explicit vendor field.

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.

template is a case-insensitive substring search against every template's id, name, and (best-effort) vendor -- not an exact id. Empty matches everything (lists them all); no matches cancels; exactly one match proceeds directly; more than one match lists them and asks you to call again with selection set to the number or exact id/name of the one you want.

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 image, this returns the list of images (status "selection_required") and asks you to pick one instead of guessing; with exactly one image, it proceeds directly.

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 get_node_template. Required if the template has more than one image; auto-filled if it has exactly one. config: "Unconfigured" or "Saved". left: Exact canvas position from the left, e.g. "100". Auto-placed if omitted. top: Exact canvas position from the top, e.g. "100". Auto-placed if omitted. ram: RAM in MB. Defaults to the template's default. console: "telnet" or "vnc". Defaults to the template's default. cpu: Number of vCPUs. Defaults to the template's default. ethernet: Number of ethernet interfaces/portgroups. Defaults to the template's default.

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 options for the full reference) -- name, icon, image, ram/cpu/cpulimit/ethernet, console/config, canvas position, delay, the QEMU-specific fields, disable_offload, sat, eth_format/eth_name, and rdp_user/rdp_password (for rdp/rdp-tls console nodes). Deliberately excludes uuid -- an identity field EVE-NG assigns itself, not something meant to be user-edited.

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 name is being changed and another node already has that exact name (case-insensitive), this does NOT rename it -- EVE-NG allows duplicate node names, but silently creating one seems worth avoiding by default. It returns status "confirmation_required" naming the conflicting node; call again with either a different name, or the same name plus confirm_duplicate_name=true to use it anyway.

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 name even if another node already has it.

change_node_delayA

Change a node's startup delay (seconds before it auto-starts), one node or in bulk.

node_id always means single-node mode, regardless of bulk: sets that one node's delay to delay (default 10).

Otherwise bulk=true is required, in one of two forms:

  • names given (a name, or list of names -- case-insensitive substring match against every node's name): every match gets an incrementing delay (increment, default 10) -- the first matched node gets increment seconds, the second increment*2, and so on, in the order the names were given.

  • names omitted: lists every node in the lab with its current delay (status "selection_required") and asks for order -- the list numbers, in the sequence you want increasing delays applied (e.g. "3,1,2"); node 3 gets increment seconds, node 1 gets increment*2, node 2 gets increment*3.

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 edit_lab_node). Reply "accept" or "yes" (confirm) to apply; anything else cancels. Nothing is stopped or changed before that.

Args: lab_path: Full path to the .unl lab file. node_id: Id of a single node to change. Overrides bulk if given. delay: New delay in seconds, for single-node mode. Default 10. bulk: Required (with node_id omitted) for multi-node mode. names: Node name or list of names to match (case-insensitive substring), for bulk mode. Omit to be shown every node and asked for order instead. increment: Delay increment in seconds between successive nodes, for bulk mode. Default 10. order: When bulk mode listed every node, the numbers from that list in the sequence you want increasing delays applied. confirm: Set true on the final call to actually apply.

edit_lab_nodes_by_templateA

Bulk-edit interfaces/cpu/memory/icon/image across nodes of exactly one template.

Search by vendor and/or template (case-insensitive substring, at least one required). More than one template matching: lists every match (numbered) and asks you to narrow further -- a more specific vendor/template, or template_selection (number or exact template id) -- repeat until exactly one remains. Never targets more than one template per call.

Once resolved, node_selection picks which of that template's nodes to target: "all", or number(s)/exact name(s) (space/comma separated).

Then component (interfaces/cpu/memory/icon/image) and value say what to change. For component="icon", value is unused -- icon_search narrows EVE-NG's icon catalog the same way template matches do, via icon_selection. For component="image", value is also unused -- image_search narrows this resolved template's own valid images (not a global catalog -- images are template-scoped), via image_selection.

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" (confirm) to apply; anything else cancels -- same wording as every delete tool.

Args: lab_path: Full path to the .unl lab file. vendor: Vendor to search for, e.g. "cisco". At least this or template is required. template: Template id/name fragment to search for, e.g. "vios". template_selection: When multiple templates matched, the number or exact template id of the one you want. node_selection: "all", or the number(s)/exact name(s) (space/comma separated) of the nodes to target. component: What to change: "interfaces", "cpu", "memory", "icon", or "image". value: New numeric value, for interfaces/cpu/memory. icon_search: Icon filename fragment to search for, for component="icon". icon_selection: When multiple icons matched, the number or exact filename of the one you want. image_search: Image filename fragment to search for, for component="image" -- searched within the resolved template's own valid images only. image_selection: When multiple images matched, the number or exact filename of the one you want. confirm: Set true on the final call to actually apply.

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: target_node_id (connects directly to another node -- EVE-NG has no dedicated "connect two nodes" API endpoint, so this creates a new bridge network behind the scenes and wires both nodes' interfaces to it, exactly what EVE-NG's own GUI does when you draw a line directly between two node icons; it renders as a plain line, not a separate network icon, because it ends up with exactly two node endpoints) or network_id/network_name (connects to a network you already created yourself, e.g. via add_lab_network -- this one stays visible on the canvas as its own icon, same as wiring a cloud/bridge manually in the GUI).

interface/target_interface accept an interface name (e.g. "Gi0/0"), a 0-based index, or can be omitted to auto-pick that node's first available (currently unconnected) ethernet interface. Scoped to ethernet interfaces only.

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 edit_lab_node.

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 node_id is omitted.

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 node_id is omitted.

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

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/madmickstar/mcp_eveng'

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