GNS3 MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GNS3_HOST | Yes | GNS3 server IP/hostname | |
| GNS3_PORT | Yes | GNS3 server port | 80 |
| GNS3_USER | Yes | GNS3 username | |
| HTTP_PORT | No | MCP server port for HTTP mode | 8000 |
| LOG_LEVEL | No | Logging level | INFO |
| MCP_API_KEY | No | API key for HTTP mode authentication | |
| GNS3_PASSWORD | Yes | GNS3 password | |
| GNS3_USE_HTTPS | No | Use HTTPS for GNS3 | false |
| GNS3_VERIFY_SSL | No | Verify SSL certs | true |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| gns3_connectionA | Manage GNS3 server connection CRUD-style connection management tool. Actions: - check: Check connection status (connection state, error details, last attempt time) - retry: Force immediate re-authentication (bypasses exponential backoff) - reconnect: Full reconnect - re-authenticate AND clear all console/SSH/notification sessions. Use after GNS3 server restart, project switch, or when sessions are stale. Args: action: Connection action to perform Returns: JSON with connection status or reconnection result Examples: # Check connection status >>> gns3_connection(action="check") {"connected": false, "server": "http://192.168.1.20:80", "error": "Connection timeout", "last_attempt": "08:15:42 30.10.2025"} |
| notificationA | Subscribe to GNS3 server event notifications and read buffered events. GNS3 streams real-time events: node state changes, link updates, log messages, etc. This tool subscribes to the stream in background and buffers events for on-demand reading. Actions: - subscribe: Start listening to notification stream (controller or project-level) - read: Read buffered events (supports diff/all/last modes with optional action filter) - unsubscribe: Stop listening and clear buffer - status: Check subscription status and buffer stats Event types (action field): Controller: compute., project., template.*, log.error, log.warning, log.info, ping Project: node.created/updated/deleted, link.created/updated/deleted, drawing.created/updated/deleted, snapshot.restored, ping Examples: # Subscribe to all events >>> notification(action="subscribe") |
| projectA | Manage GNS3 projects CRUD-style project management tool. Actions: - list: List all projects - open: Open a project by name - create: Create a new project and auto-open it - close: Close the currently opened project Args: action: Project action to perform name: Project name (required for open/create) path: Optional project directory path (create only) format: Output format for 'list' action Returns: JSON with ProjectInfo for created project, or list of projects Examples: # List all projects >>> project(action="list") >>> project(action="list", format="json") |
| nodeA | Manage GNS3 nodes (CRUD operations) v0.47.0: CRUD-style consolidation of create_node, delete_node, and set_node. v0.40.0: Enhanced with wildcard and bulk operation support. Actions: - list: List nodes in a project - create: Create new node from template at specified coordinates - delete: Delete node from project (WARNING: destructive, cannot be undone) - set: Configure node properties and/or control state (supports wildcards/bulk) Wildcard Patterns (for 'set' and 'delete'): - Single node: "Router1" - All nodes: "" - Prefix match: "Router" (matches Router1, Router2, RouterCore) - Suffix match: "*-Core" (matches Router-Core, Switch-Core) - Character class: "R[123]" (matches R1, R2, R3) - JSON array: '["Router1", "Router2", "Switch1"]' Validation Rules: - name parameter requires node to be stopped - Hardware properties (ram, cpus, hdd_disk_image, adapters) apply to QEMU/IOU/Docker/Dynamips - For IOU nodes, 'adapters' maps to 'ethernet_adapters' automatically - ports parameter applies to ethernet_switch nodes only - state_action values: start, stop, suspend, reload, restart Returns: Single node: Status message Multiple nodes: BatchOperationResult JSON with per-node success/failure Examples: # List nodes in project >>> node(action="list", project_id="abc-123") >>> node(action="list", project_id="abc-123", format="json") |
| consoleA | Execute console operations (BATCH-ONLY) v0.47.0: Batch-only console tool. Individual console tools removed (aggressive consolidation). IMPORTANT: Prefer SSH tools when available! Console tools are primarily for:
Two-phase execution:
Each operation supports all parameters from the underlying console tool:
Args: operations: List of operation dictionaries (see examples above) Returns: JSON with execution results: { "completed": [0, 1, 2], // Indices of successful operations "failed": [3], // Indices of failed operations "results": [ { "operation_index": 0, "success": true, "operation_type": "send_and_wait", "node_name": "R1", "result": {...} // Operation-specific result }, ... ], "total_operations": 4, "execution_time": 5.3 } Examples: # Multiple commands on one node: >>> console(operations=[ ... {"type": "send_and_wait", "node_name": "R1", "command": "show version\n", "wait_pattern": "Router#"}, ... {"type": "send_and_wait", "node_name": "R1", "command": "show ip route\n", "wait_pattern": "Router#"}, ... {"type": "read", "node_name": "R1", "mode": "diff"} ... ]) |
| linkA | Manage network connections (links) v0.47.0: Renamed from set_network_connections to link (CRUD consolidation). Actions: - list: List all links in a project - batch: Execute multiple connect/disconnect operations with two-phase validation Two-phase execution for batch operations prevents partial topology changes:
Connection Operations (for 'batch' action): Connect: {action: "connect", node_a, node_b, port_a, port_b, adapter_a, adapter_b} Disconnect: {action: "disconnect", link_id} Examples: # List links >>> link(action="list", project_id="abc-123") >>> link(action="list", project_id="abc-123", format="json") Returns: JSON with OperationResult (completed and failed operations) or list of links |
| node_fileA | Manage Docker node files (CRUD operations) v0.47.0: CRUD-style consolidation of get_node_file, write_node_file, and configure_node_network. Actions: - read: Read file from Docker node filesystem - write: Write file to Docker node filesystem (WARNING: does NOT restart node) - configure_network: Configure network interfaces (full workflow: write + restart) IMPORTANT: Use 'configure_network' for network configuration as it handles the complete workflow (write config → restart node → apply changes). Returns: JSON with file contents, confirmation message, or configured interfaces Examples: # Read file >>> node_file(action="read", node_name="A-PROXY", file_path="etc/network/interfaces") |
| project_docsA | Manage project documentation (CRUD operations) v0.47.0: CRUD-style consolidation of get_project_readme and update_project_readme. Actions: - get: Read project README/notes (markdown format) - update: Write project README/notes Project documentation typically includes: - IP addressing schemes and VLANs - Node credentials (usernames, password vault keys) - Architecture diagrams (text-based) - Configuration templates and snippets - Troubleshooting notes and runbooks Returns: JSON with project_id and markdown content or success confirmation Examples: # Get README >>> project_docs(action="get") >>> project_docs(action="get", project_id="a920c77d-6e9b-41b8-9311-b4b866a2fbb0") |
| export_topology_diagramA | Export topology diagram to SVG/PNG files on disk. For agents: use diagrams://{project_id}/topology resource for direct access without saving files. |
| drawingA | Manage drawings (CRUD operations) v0.47.0: CRUD-style consolidation of create_drawing, update_drawing, delete_drawing, and create_drawings_batch. Actions: - list: List all drawings in a project - create: Create new drawing (rectangle, ellipse, line, text) - update: Update existing drawing properties - delete: Delete drawing (WARNING: destructive, cannot be undone) - batch: Create multiple drawings with two-phase validation Returns: JSON with drawing info or batch operation results Examples: # List drawings >>> drawing(action="list", project_id="abc-123") >>> drawing(action="list", project_id="abc-123", format="json") |
| sshA | Execute SSH operations (BATCH-ONLY) v0.47.0: Batch-only SSH tool. Individual SSH tools removed (aggressive consolidation). v0.28.0: Local execution support with node_name="@" Local Execution Support:
SSH Proxy Services (v0.3.0):
Two-phase execution prevents partial failures:
Supported operation types:
Args: operations: List of operation dicts, each with: - type (str): Operation type (required) - node_name (str): Node name (or "@" for local execution) (required) - Additional params specific to operation type Returns: JSON with execution results including completed/failed indices Examples: # Configure session + run commands: >>> ssh(operations=[ ... {"type": "configure", "node_name": "R1", "device_dict": { ... "device_type": "cisco_ios", "host": "10.1.0.1", ... "username": "admin", "password": "cisco123" ... }}, ... {"type": "command", "node_name": "R1", "command": "show version"}, ... {"type": "command", "node_name": "R1", "command": "show ip route"} ... ]) |
| tftpA | Manage TFTP server files (CRUD-style) v0.3.0: TFTP server integration for device firmware/config file serving TFTP server runs on SSH proxy (port 69/udp) with root directory /opt/gns3-ssh-proxy/tftp. Provides read-write access for devices to upload/download files. Actions: - list: List all files in TFTP root directory - upload: Upload file to TFTP server (requires filename and content) - download: Download file from TFTP server (requires filename) - delete: Delete file from TFTP server (requires filename) - status: Check TFTP server status File Content Handling: - Upload: Provide raw bytes in content parameter (base64 encoded automatically) - Download: Returns file content as base64 encoded string Returns: JSON response with success status, action, and results Examples: # List TFTP files >>> tftp(action="list") { "success": true, "action": "list", "files": [ {"filename": "config.txt", "size": 1024, "modified": "2025-01-15 10:30:00"}, {"filename": "firmware.bin", "size": 5242880, "modified": "2025-01-14 09:15:00"} ] } |
| http_clientA | HTTP/HTTPS client for lab device web interfaces (CRUD-style) v0.3.0: HTTP client integration for accessing device APIs and web UIs Reverse HTTP/HTTPS proxy available at http://proxy:8023/http-proxy/:/ for external device web UI access without SSH tunnel. Actions: - get: Send HTTP GET request to device and return response - status: Check if device web interface is reachable (HEAD request) SSL Certificate Handling: - verify_ssl=False (default): Ignore self-signed certificates - verify_ssl=True: Verify SSL certificates (may fail for lab devices) Reverse Proxy Alternative: Instead of using this tool, you can also access device web UIs through the reverse proxy at http://proxy:8023/http-proxy/:/ Returns: JSON response with success status, action, and results Examples: # Get device web interface >>> http_client(action="get", url="http://10.1.1.1") { "success": true, "action": "get", "status_code": 200, "content": "...", "headers": {"content-type": "text/html", ...} } |
| query_resourceC | Universal resource query tool - access any GNS3 MCP resource. See tool implementation docstring for comprehensive URI pattern documentation. |
| search_toolsA | Discover GNS3 MCP tools (v0.47.0 - Tool Discovery) Search and filter available tools by category, capability, or resource URI. Returns tool metadata including description, actions, and applicable resources. Categories:
Capabilities:
Resource Mapping:
Returns: JSON with matching tools and their metadata Examples: # Find all CRUD tools >>> search_tools(capability="CRUD") |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| SSH Setup Workflow | Device-specific SSH configuration for 6 device types with multi-proxy support |
| Topology Discovery Workflow | Discover nodes, links, templates, drawings using resources - includes visual diagram guidance for agents |
| Troubleshooting Workflow | OSI model-based troubleshooting with README checks, diagnostic tools, log collection |
| Lab Setup Workflow | Create complete topologies (star/mesh/linear/ring/ospf/bgp) with nodes, links, IPs, and README documentation |
| Node Setup Workflow | End-to-end node setup: create, configure IP, document in README, establish SSH, connect to network |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Projects | List all GNS3 projects with their statuses and IDs |
| Templates | List all available GNS3 device templates (routers, switches, Docker containers, VMs) |
| Console sessions | List all console sessions (optionally filtered by ?project_id=xxx query parameter) |
| SSH sessions | List all SSH sessions (optionally filtered by ?project_id=xxx query parameter) |
| Main proxy status | Health status and version of the main SSH proxy on GNS3 host (default proxy for ssh_configure) |
| Lab proxy registry | All discovered SSH proxy containers in GNS3 lab projects - use proxy_id for routing through isolated networks |
| All proxy sessions | Aggregated list of ALL active SSH sessions from main proxy and lab proxies - global lab infrastructure view |
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/ChistokhinSV/gns3-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server