Skip to main content
Glama
moimran

EVE-NG MCP Server

by moimran

get_node_details

Retrieve comprehensive configuration, status, and connectivity details for a specific node in EVE-NG network labs to analyze and manage network emulation environments.

Instructions

Get detailed information about a specific node.

This tool retrieves comprehensive information about a node including its configuration, status, interfaces, and connectivity.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
argumentsYes

Implementation Reference

  • The main handler function for the 'get_node_details' MCP tool. It validates input, checks EVE-NG connection, retrieves node data via eveng_client.get_node(), formats comprehensive details (status, config, position, interfaces) into TextContent, handles errors.
    @mcp.tool()
    async def get_node_details(arguments: GetNodeDetailsArgs) -> list[TextContent]:
        """
        Get detailed information about a specific node.
    
        This tool retrieves comprehensive information about a node including
        its configuration, status, interfaces, and connectivity.
        """
        try:
            logger.info(f"Getting node details: {arguments.node_id} in {arguments.lab_path}")
    
            if not eveng_client.is_connected:
                return [TextContent(
                    type="text",
                    text="Not connected to EVE-NG server. Use connect_eveng_server tool first."
                )]
    
            # Get node details
            node = await eveng_client.get_node(arguments.lab_path, arguments.node_id)
    
            if not node.get('data'):
                return [TextContent(
                    type="text",
                    text=f"Node {arguments.node_id} not found in lab {arguments.lab_path}"
                )]
    
            node_data = node['data']
            status_icon = "🟢" if node_data.get('status') == 2 else "🔴" if node_data.get('status') == 1 else "⚪"
    
            # Format node information
            details_text = f"Node Details: {node_data.get('name', f'Node {arguments.node_id}')}\n\n"
    
            details_text += f"{status_icon} Basic Information:\n"
            details_text += f"   ID: {arguments.node_id}\n"
            details_text += f"   Name: {node_data.get('name', 'Unknown')}\n"
            details_text += f"   Template: {node_data.get('template', 'Unknown')}\n"
            details_text += f"   Type: {node_data.get('type', 'Unknown')}\n"
            details_text += f"   Image: {node_data.get('image', 'Unknown')}\n"
            details_text += f"   Status: {_get_status_text(node_data.get('status', 0))}\n\n"
    
            details_text += f"⚙️  Configuration:\n"
            details_text += f"   Console: {node_data.get('console', 'Unknown')}\n"
            details_text += f"   CPU: {node_data.get('cpu', 'Unknown')}\n"
            details_text += f"   RAM: {node_data.get('ram', 'Unknown')} MB\n"
            details_text += f"   Ethernet Interfaces: {node_data.get('ethernet', 'Unknown')}\n"
            details_text += f"   Serial Interfaces: {node_data.get('serial', 'Unknown')}\n"
            details_text += f"   Delay: {node_data.get('delay', 0)} seconds\n\n"
    
            details_text += f"📍 Position:\n"
            details_text += f"   Left: {node_data.get('left', 0)}%\n"
            details_text += f"   Top: {node_data.get('top', 0)}%\n"
    
            return [TextContent(
                type="text",
                text=details_text
            )]
    
        except Exception as e:
            logger.error(f"Failed to get node details: {e}")
            return [TextContent(
                type="text",
                text=f"Failed to get node details: {str(e)}"
            )]
  • Pydantic schema defining the input arguments for the get_node_details tool: lab_path (str) and node_id (str).
    class GetNodeDetailsArgs(BaseModel):
        """Arguments for get_node_details tool."""
        lab_path: str = Field(description="Full path to the lab (e.g., /lab_name.unl)")
        node_id: str = Field(description="Node ID to get details for")
  • Registration call for node management tools within the overall register_tools function. This invokes register_node_tools which defines @mcp.tool()-decorated get_node_details handler.
    register_node_tools(mcp, eveng_client)
  • Top-level registration of all MCP tools in the server startup, calling register_tools(mcp, eveng_client) which chains to node_management registration including get_node_details.
    register_tools(self.mcp, self.eveng_client)
  • Helper utility used by get_node_details to convert numeric node status codes (0-3) to readable strings like 'Running', 'Stopped'.
    def _get_status_text(status: int) -> str:
        """Convert node status code to human-readable text."""
        status_map = {
            0: "Stopped",
            1: "Starting",
            2: "Running",
            3: "Stopping"
        }
        return status_map.get(status, f"Unknown ({status})")

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/moimran/eveng-mcp'

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