MCP server providing Claude/LLM agents with programmatic access to EVE-NG network labs
EVE-NG MCP server has solid naming conventions (all tools start with action verbs: list_, get_, create_, delete_, add_, start_, stop_) and comprehensive parameter schemas with types and descriptions. However, descriptions are inconsistent in depth and quality. Most tool descriptions are adequate (100-200 chars) but lack actionable guidance on when to use them vs. similar tools. Parameter descriptions are present but often generic (e.g., 'Full lab path' without format examples). Output schemas are not explicitly documented, responses are formatted as JSON strings rather than structured objects with declared fields. Error handling is minimal: most tools catch EveNGClientError and return plain text error messages without recovery guidance or error classification. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE). Composition is good: tools are single-purpose and chainable (e.g., list_images → add_node). Security: credentials injected via environment variables (correct pattern). Overall: functional but lacks LLM-optimization patterns for error recovery, output structure, and tool selection clarity.
Add a node (virtual device) to a lab. Specify the template (image name), name, RAM, CPU, and number of interfaces. Use 'list_images' first to see available templates.
Create a new lab on the EVE-NG server. Specify a name, optional description, and folder path.
Delete a lab from the EVE-NG server. This is irreversible.
Get detailed information about a lab including its nodes, networks, and topology. Returns lab metadata, all nodes with their status, and all networks.
List all available QEMU/Docker node images (templates) installed on the EVE-NG server. Returns template names and descriptions.
List all labs on the EVE-NG server. Returns lab names, filenames, and paths. Optionally specify a folder path to list labs in a subfolder.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels declared. LLMs cannot distinguish safe reads from destructive writes without explicit hints.
Output schemas not documented. Tools return formatted JSON strings rather than structured objects with declared field types. LLMs cannot plan downstream calls or extract specific fields reliably.
Error handling returns plain text messages without recovery guidance or error classification. 'Error listing labs: <exception>' tells LLM nothing about whether to retry, ask user, or abort.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | <=2025-11-25 | v2 |
Start all nodes in a lab simultaneously.
Start a single node in a lab. The node must already exist.
Stop all nodes in a lab simultaneously.
Stop a single node in a lab.
Destructive operations (delete_lab) lack confirmation or dry-run support. Agents can irreversibly delete labs without safeguards.
Parameter descriptions lack format guidance. 'Full lab path (e.g. `/My Lab.unl`)' is present but inconsistent. Some params (e.g., 'node_type' in add_node) have enum values in description but not as formal JSON Schema enum constraint.