GNS3 MCP Server
Allows configuring container networks and reading/writing files within GNS3 Docker nodes.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GNS3 MCP Serverlist all my GNS3 projects"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GNS3 MCP Server
Model Context Protocol (MCP) server for GNS3 network lab automation. Control GNS3 projects, nodes, and device consoles through Claude Desktop or any MCP-compatible client.
Version: 0.49.0
Features
15 Tools: CRUD-style GNS3 automation (v0.47.0: 53% consolidation from 32 tools)
25 Resources: Read-only data access (projects, nodes, links, sessions, topology reports)
CRUD Pattern: Consolidated tools with
actionparameters (project(action="open"),node(action="create"), etc.)Batch Operations: Console and SSH operations use batch-only APIs for atomic execution
Wildcard Support: Node operations support patterns (
*,Router*,R[123], JSON arrays)Project Management: Create, open, close GNS3 projects
Node Control: Start/stop/restart nodes with wildcard patterns and parallel execution
Console Access: Telnet console automation with pattern matching and grep filtering
SSH Automation: Network device automation via Netmiko (200+ device types)
Network Topology: Batch connect/disconnect links, create drawings, export diagrams
Docker Integration: Configure container networks, read/write files
Tool Discovery:
search_tools()with category/capability/resource filteringClaude Desktop Support: All resources accessible via tools (
query_resource,list_projects,list_nodes,get_topology)Security: API key authentication (HTTP mode), service privilege isolation, HTTPS support
Related MCP server: MCP Packet Tracer
Installation
Supported Platform: Windows only
Quick Start (Claude Code - Recommended)
Prerequisites:
Windows 10/11
GNS3 server running and accessible
Claude Code installed
uv package manager (for uvx): Install with
pip install uvor download from https://github.com/astral-sh/uv
Option 1: Using uvx (Recommended - Faster)
# Single command - no .env file needed!
claude mcp add --transport stdio gns3-mcp `
--env GNS3_HOST=192.168.1.20 `
--env GNS3_PORT=80 `
--env GNS3_USER=admin `
--env GNS3_PASSWORD=your-password `
--scope user `
-- uvx gns3-mcp@latest
# Verify installation
claude mcp get gns3-mcp
# Should show: Status: ✓ ConnectedOption 2: Using pip (Traditional)
# Step 1: Install package
pip install gns3-mcp
# Step 2: Add to Claude Code with credentials
claude mcp add --transport stdio gns3-mcp `
--env GNS3_HOST=192.168.1.20 `
--env GNS3_PORT=80 `
--env GNS3_USER=admin `
--env GNS3_PASSWORD=your-password `
--scope user `
-- gns3-mcp
# Step 3: Verify installation
claude mcp get gns3-mcp
# Should show: Status: ✓ ConnectedWhy uvx? 10-100× faster than pip, automatic dependency isolation, no venv management needed.
Installation by Editor
Claude Code Setup
STDIO Mode (Recommended)
STDIO mode is more secure - no HTTP service, no authentication needed, runs only when Claude Code is active.
Using uvx (Recommended):
# 1. Install uv (one-time setup)
pip install uv
# 2. Create .env file
@"
GNS3_HOST=192.168.1.20
GNS3_PORT=80
GNS3_USER=admin
GNS3_PASSWORD=your-password
"@ | Out-File -FilePath .env -Encoding ASCII
# 3. Add to Claude Code
claude mcp add --transport stdio gns3-mcp --scope user -- uvx gns3-mcp@latest
# 4. Verify
claude mcp get gns3-mcpUsing pip:
# 1. Install package globally
pip install gns3-mcp
# 2. Create .env file in project directory
@"
GNS3_HOST=192.168.1.20
GNS3_PORT=80
GNS3_USER=admin
GNS3_PASSWORD=your-password
"@ | Out-File -FilePath .env -Encoding ASCII
# 3. Add to Claude Code
claude mcp add --transport stdio gns3-mcp --scope user -- gns3-mcp
# 4. Verify
claude mcp get gns3-mcp
# Should show: Status: ✓ ConnectedEnvironment Variables:
Variable | Required | Description | Example |
| Yes | GNS3 server IP/hostname |
|
| Yes | GNS3 server port |
|
| Yes | GNS3 username |
|
| Yes | GNS3 password |
|
Claude Desktop Setup
Installation:
Download the latest
.mcpbpackage:From Releases
Or build locally:
just build(createsmcp-server\mcp-server.mcpb)
Install by double-clicking the
.mcpbfileConfigure credentials in Claude Desktop:
Open Claude Desktop
Go to Settings > Developer > Edit Config
Find
gns3-mcpserverAdd environment variables:
{ "GNS3_HOST": "192.168.1.20", "GNS3_PORT": "80", "GNS3_USER": "admin", "GNS3_PASSWORD": "your-password" }
Restart Claude Desktop
Check logs if issues occur:
C:\Users\<username>\AppData\Roaming\Claude\logs\mcp-server-GNS3 Lab Controller.log
Cursor Setup
Configuration File Location:
Project-specific:
.cursor\mcp.json(in project directory)Global:
%USERPROFILE%\.cursor\mcp.json
Using uvx (Recommended):
Install uv:
pip install uvCreate/edit
.cursor\mcp.json:
{
"mcpServers": {
"gns3-mcp": {
"command": "uvx",
"args": ["gns3-mcp@latest"],
"env": {
"GNS3_HOST": "192.168.1.20",
"GNS3_PORT": "80",
"GNS3_USER": "admin",
"GNS3_PASSWORD": "your-password"
}
}
}
}Using pip:
Install package:
pip install gns3-mcpCreate/edit
.cursor\mcp.json:
{
"mcpServers": {
"gns3-mcp": {
"command": "gns3-mcp",
"args": [],
"env": {
"GNS3_HOST": "192.168.1.20",
"GNS3_PORT": "80",
"GNS3_USER": "admin",
"GNS3_PASSWORD": "your-password"
}
}
}
}Restart Cursor
Windsurf Setup
Configuration File Location: %USERPROFILE%\.codeium\windsurf\mcp_config.json
Using uvx (Recommended):
Install uv:
pip install uvCreate/edit
mcp_config.json:
{
"mcpServers": {
"gns3-mcp": {
"command": "uvx",
"args": ["gns3-mcp@latest"],
"env": {
"GNS3_HOST": "192.168.1.20",
"GNS3_PORT": "80",
"GNS3_USER": "admin",
"GNS3_PASSWORD": "your-password"
}
}
}
}Using pip:
Install package:
pip install gns3-mcpCreate/edit
mcp_config.json:
{
"mcpServers": {
"gns3-mcp": {
"command": "gns3-mcp",
"args": [],
"env": {
"GNS3_HOST": "192.168.1.20",
"GNS3_PORT": "80",
"GNS3_USER": "admin",
"GNS3_PASSWORD": "your-password"
}
}
}
}Restart Windsurf
Note: Cursor and Windsurf use identical configuration formats.
Troubleshooting
Connection Issues:
# Test GNS3 server connectivity
curl http://192.168.1.20:80/v3/projects
# Check Claude Code MCP status
claude mcp get gns3-mcp
# View detailed logs (Claude Code)
# Check console output when running commandsCommon Issues:
"gns3-mcp not found": Ensure package is installed (
pip list | findstr gns3-mcp)"Connection refused": Verify GNS3 server is running and accessible
"Authentication failed": Check credentials in
.envfile"Socket is closed": SSH session expired, reconnect automatically on next command
For Claude Desktop issues: Check logs at:
C:\Users\<username>\AppData\Roaming\Claude\logs\mcp-server-GNS3 Lab Controller.logAdvanced Setup
HTTP Mode Configuration
HTTP mode requires a persistent service and API key authentication. Only use if you need the service always running or network access from other machines.
Prerequisites:
.envfile with GNS3 credentialsAPI key for authentication
Setup:
Add to
.env:# Generate with: python -c "import secrets; print(secrets.token_urlsafe(32))" MCP_API_KEY=your-random-token-hereConfigure Claude Code:
claude mcp add --transport http gns3-mcp http://127.0.0.1:8100/mcp/ --scope user` --header "MCP_API_KEY: your-random-token-here"Start server (in separate terminal):
gns3-mcp --transport http --http-port 8100
Note: If MCP_API_KEY is missing from .env, it will be auto-generated on first start and automatically saved to .env for persistence.
Windows Service Deployment
Run MCP server as a Windows service with WinSW and uvx (for HTTP mode).
📖 See PORTABLE_SETUP.md for detailed instructions.
Quick Setup:
# 1. Install uv (if not already installed)
pip install uv
# 2. Set environment variables from .env (requires Administrator)
.\set-env-vars.ps1
# 3. Install and start service (requires Administrator)
.\server.cmd installService Management:
# Check status
.\server.cmd status
# Start/stop/restart
.\server.cmd start
.\server.cmd stop
.\server.cmd restart
# After code updates
.\server.cmd reinstall # Reinstall service
# Remove service
.\server.cmd uninstall
# Development mode (direct run, no service)
.\server.cmd runKey Features:
✅ Portable: Works from any folder location (no hardcoded paths)
✅ No venv: Uses uvx for automatic isolation
✅ Secure: Credentials in Windows environment variables
✅ Simple: Automated setup with PowerShell script
User: GNS3MCPService (low privilege, optional)
Startup: Automatic
Logs:
mcp-http-server.logandGNS3-MCP-HTTP.wrapper.log
Manual Installation from Source
Requirements:
Python ≥ 3.10
GNS3 Server v3.x running and accessible
Setup:
# Install dependencies
pip install -r requirements.txt
# Create .env file
@"
GNS3_HOST=192.168.1.20
GNS3_PORT=80
GNS3_USER=admin
GNS3_PASSWORD=your-password
"@ | Out-File -FilePath .env -Encoding ASCII
# Run directly (STDIO mode - no authentication)
python gns3_mcp\cli.py --host 192.168.1.20 --port 80 --username admin --password your-password
# Or add to Claude Code (project-scoped)
claude mcp add --transport stdio gns3-mcp --scope project -- python "C:\full\path\to\gns3_mcp\cli.py"Build .mcpb package:
just build
# Creates: mcp-server\mcp-server.mcpbDocker Deployment
Run GNS3 MCP Server in Docker for isolated deployment, easier management, and multi-platform support.
Quick Start with Docker Compose
Prerequisites:
Docker Desktop installed
GNS3 server running and accessible
Network access to GNS3 server
Step 1: Download docker-compose.yml
curl -O https://raw.githubusercontent.com/ChistokhinSV/gns3-mcp/master/docker-compose.ymlStep 2: Create .env file
cat > .env <<EOF
GNS3_HOST=192.168.1.20
GNS3_PORT=80
GNS3_USER=admin
GNS3_PASSWORD=your-password
HTTP_PORT=8000
LOG_LEVEL=INFO
EOFOr copy from template:
curl -O https://raw.githubusercontent.com/ChistokhinSV/gns3-mcp/master/.env.example
mv .env.example .env
# Edit .env with your credentialsStep 3: Start services
# Start MCP server and SSH proxy
docker-compose up -d
# View logs
docker-compose logs -f
# Check health
curl http://localhost:8000/health
curl http://localhost:8022/healthStep 4: Configure Claude Desktop/Code
For Claude Code (HTTP mode):
claude mcp add --transport http gns3-mcp --url http://localhost:8000For Claude Desktop, add to MCP configuration:
{
"mcpServers": {
"gns3-mcp": {
"transport": {
"type": "http",
"url": "http://localhost:8000"
}
}
}
}Using Docker Run (without compose)
docker run -d \
--name gns3-mcp-server \
-p 8000:8000 \
-e GNS3_HOST=192.168.1.20 \
-e GNS3_PORT=80 \
-e GNS3_USER=admin \
-e GNS3_PASSWORD=your-password \
--restart unless-stopped \
chistokhinsv/gns3-mcp:latestContainer Management
# View logs
docker-compose logs -f gns3-mcp
docker-compose logs -f ssh-proxy
# Restart services
docker-compose restart
# Stop services
docker-compose down
# Update to latest version
docker-compose pull
docker-compose up -dEnvironment Variables
Variable | Required | Default | Description |
| Yes | - | GNS3 server IP/hostname |
| No |
| GNS3 API port |
| Yes | - | GNS3 username |
| Yes | - | GNS3 password |
| No |
| MCP server port |
| No |
| Logging level |
| No |
| Use HTTPS for GNS3 |
| No |
| Verify SSL certs |
See .env.example for complete list.
Architecture
The Docker deployment includes two containers:
gns3-mcp - Main MCP server (port 8000)
Provides MCP protocol access to GNS3
HTTP/SSE transport modes
Bridge network mode
gns3-ssh-proxy - SSH gateway (port 8022)
Enables SSH access to lab devices
Host network mode (required for isolated lab networks)
Netmiko-based automation
Troubleshooting
Container won't start:
docker-compose logs gns3-mcp
docker-compose logs ssh-proxyCannot connect to GNS3:
# Test from container
docker exec gns3-mcp-server curl -v http://192.168.1.20/v3/version
# Check connectivity
docker exec gns3-mcp-server ping -c 3 192.168.1.20Health check failing:
# Manual health check
curl -v http://localhost:8000/health
# Check container status
docker ps --filter name=gns3-mcpFor more details, see docs/DOCKER_HUB.md.
Documentation
CHANGELOG.md - Version history and release notes
DEPLOYMENT.md - SSH proxy deployment instructions
docs/architecture/ - Architecture documentation and C4 diagrams
License
MIT License
Author
Sergei Chistokhin (Sergei@Chistokhin.com)
Available Tools
15 toolsconsoleA
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:
Initial device configuration (enabling SSH, creating users)
Troubleshooting when SSH is unavailable
Devices without SSH support (VPCS, simple switches)
Two-phase execution:
VALIDATE ALL operations (check nodes exist, required params present)
EXECUTE ALL operations (only if all valid, sequential execution)
Each operation supports all parameters from the underlying console tool:
"send": Send data to console { "type": "send", "node_name": "R1", "data": "show version\n", "raw": false // optional }
"send_and_wait": Send command and wait for pattern { "type": "send_and_wait", "node_name": "R1", "command": "show ip interface brief\n", // optional (v0.49.0: omit for wait-only mode) "wait_pattern": "Router#", // optional "timeout": 30, // optional "raw": false, // optional "handle_pagination": true, // optional (v0.53.4: auto-handle --More--) "pagination_patterns": ["--More--", "---(more)---"], // optional (custom patterns) "pagination_key": " " // optional (default: space, can use "\n" for enter) } Wait-only mode (v0.49.0): Omit "command" to just wait for pattern without sending anything. Useful for monitoring boot sequences or waiting for specific output to appear.
"read": Read console output (NOTE: returns empty if nothing sent yet - this is normal) { "type": "read", "node_name": "R1", "mode": "diff", // optional: diff/last_page/num_pages/all "pages": 1, // optional, only with mode="num_pages" "pattern": "error", // optional grep pattern "case_insensitive": true, // optional "invert": false, // optional "before": 0, // optional context lines "after": 0, // optional context lines "context": 0 // optional context lines (overrides before/after) } IMPORTANT: Console buffer may be empty on first read (QEMU nodes don't output until prompted). Use 'send_and_wait' to explicitly send a command and read the response, or send commands first with 'send'.
"keystroke": Send special keystroke { "type": "keystroke", "node_name": "R1", "key": "enter" // up/down/enter/ctrl_c/etc }
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"} ... ])
# Same command on multiple nodes:
>>> console(operations=[
... {"type": "send_and_wait", "node_name": "R1", "command": "show ip int brief\n", "wait_pattern": "#"},
... {"type": "send_and_wait", "node_name": "R2", "command": "show ip int brief\n", "wait_pattern": "#"},
... {"type": "send_and_wait", "node_name": "R3", "command": "show ip int brief\n", "wait_pattern": "#"}
... ])
# Mixed operations:
>>> console(operations=[
... {"type": "send", "node_name": "R1", "data": "\n"}, # Wake console
... {"type": "read", "node_name": "R1", "mode": "last_page"}, # Check prompt
... {"type": "send_and_wait", "node_name": "R1", "command": "show version\n", "wait_pattern": "#"},
... {"type": "keystroke", "node_name": "R1", "key": "ctrl_c"} # Cancel if needed
... ])| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | List of console operations (send/send_and_wait/read/keystroke) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and excels. It explains batch-only behavior, two-phase execution, sequential processing, and caveats like empty buffer on first read for QEMU nodes. Version-specific features (v0.47.0 consolidation, v0.49.0 wait-only, v0.53.4 pagination) are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections: summary, use cases, execution phases, operation types (with sub-bullets), args, returns, and examples. It is front-loaded with the key guidance about SSH preference. Slightly verbose but justified given the complexity of operation types.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is highly complete given the tool's complexity (multiple operation types, batch execution, output schema). It covers the return format with a detailed JSON example, includes multiple comprehensive examples, and addresses edge cases like empty reads and wait-only mode. The output schema is provided in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the schema only describes 'operations' as a list of objects. The description adds immense value by fully documenting each operation type (send, send_and_wait, read, keystroke) with complete parameter details, defaults, version notes, and usage tips (e.g., wait-only mode, pagination handling).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool executes console operations as a batch-only interface, specifying the verb 'execute' and resource 'console operations'. It distinguishes from siblings by explicitly recommending SSH tools for general use and listing specific scenarios for console tools (initial config, troubleshooting, unsupported devices).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance: 'Prefer SSH tools when available' and lists primary use cases. It also details the two-phase execution process (validate all, then execute), giving clear operational guidelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
# Create rectangle
>>> drawing(action="create", drawing_type="rectangle", x=100, y=100, width=200, height=100)
# Create text label
>>> drawing(action="create", drawing_type="text", x=175, y=140, text="Router1", z=1)
# Update drawing position
>>> drawing(action="update", drawing_id="abc123", x=200, y=200)
# Delete drawing
>>> drawing(action="delete", drawing_id="abc123")
# Create multiple drawings
>>> drawing(action="batch", drawings=[
... {"drawing_type": "rectangle", "x": 100, "y": 100, "width": 200, "height": 100},
... {"drawing_type": "text", "x": 175, "y": 140, "text": "Router1", "z": 1}
... ])| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X coordinate (start point for line, top-left for others) | |
| y | No | Y coordinate (start point for line, top-left for others) | |
| z | No | Z-order/layer (default: 0 for shapes, 1 for text) | |
| rx | No | Horizontal corner radius (rectangle only) | |
| ry | No | Vertical corner radius (rectangle only) | |
| x2 | No | End X coordinate (line only) | |
| y2 | No | End Y coordinate (line only) | |
| svg | No | SVG content (for 'update') | |
| text | No | Text content (text only) | |
| color | No | Text color hex code (text only) | #000000 |
| width | No | Width in pixels (rectangle/ellipse only) | |
| action | Yes | Action: 'list' (list drawings), 'create' (new drawing), 'update' (modify), 'delete' (remove), or 'batch' (create multiple) | |
| format | No | Output format: 'table' (default) or 'json' (for 'list') | table |
| height | No | Height in pixels (rectangle/ellipse only) | |
| locked | No | Lock/unlock drawing (for 'update') | |
| drawings | No | List of drawing definitions (required for 'batch') | |
| rotation | No | Rotation angle in degrees (for 'update') | |
| font_size | No | Font size in points (text only) | |
| drawing_id | No | Drawing ID (required for 'update' and 'delete') | |
| fill_color | No | Fill color hex code | #ffffff |
| project_id | No | Project ID (required for 'list') | |
| font_family | No | Font family name (text only) | TypeWriter |
| font_weight | No | Font weight: 'normal' or 'bold' (text only) | normal |
| border_color | No | Border color hex code | #000000 |
| border_width | No | Border width in pixels | |
| drawing_type | No | Shape type for 'create': 'rectangle' (box), 'ellipse' (circle/oval), 'line' (connector), 'text' (label) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Warns about the destructive nature of delete and mentions two-phase validation for batch. With empty annotations, the description carries the full burden and adequately discloses key behaviors, though permissions and side effects are omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with a summary, actions list, return info, and examples. Front-loaded with purpose and no unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 26 parameters and 5 actions, the description covers all actions with examples and mentions return format. Output schema exists for detailed returns, so this is adequate. Could be more explicit about required parameters per action, but schema handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already has 100% coverage with descriptions. The description adds value through examples that demonstrate parameter combinations and usage patterns, which is beneficial for understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Manage drawings (CRUD operations)' and lists specific actions (list, create, update, delete, batch). This distinguishes the tool from unrelated siblings and covers all operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit actions and examples for when to use each action, making the usage context clear. However, it does not explicitly state when not to use or alternatives, though no competing tools exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| crop_x | No | ||
| crop_y | No | ||
| format | No | both | |
| crop_width | No | ||
| crop_height | No | ||
| output_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are empty, so description must disclose behaviors. It states exports to SVG/PNG but omits details like file overwrite behavior, directory creation, authentication needs, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loads purpose, provides alternative usage in second sentence. No extraneous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters (most undocumented), no annotations, and output schema present but not described, the description is insufficient for complete understanding of cropping behavior and edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. Description adds meaning for format (SVG/PNG) but does not explain crop parameters or output_path requirements beyond existence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'Export', resource 'topology diagram', target formats 'SVG/PNG', and destination 'files on disk'. Distinguishes from using diagrams:// resource for direct access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests using diagrams:// resource when direct access is sufficient, indicating when not to use this tool. No mention of alternative sibling tools like 'drawing'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"}
# Force re-authentication only
>>> gns3_connection(action="retry")
# Full reconnect (clears all sessions)
>>> gns3_connection(action="reconnect")
{"success": true, "sessions_cleared": {"console": 3, "notification": true}}| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action: 'check' (status), 'retry' (re-auth only), 'reconnect' (re-auth + clear all console/SSH/notification sessions) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses all behaviors: check returns connection status with error details, retry forces re-auth and bypasses exponential backoff, reconnect clears all sessions. Return values are exemplified, providing full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for actions, args, returns, and examples. Every sentence adds value, no fluff. It is concise yet comprehensive, front-loading the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool with one parameter and an output schema, the description covers all necessary aspects: action descriptions, return format, usage examples. It leaves no ambiguity for agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with one parameter. The description adds significant meaning beyond the schema: it explains what each action does (e.g., 'bypasses exponential backoff' for retry, 'clear all sessions' for reconnect) which helps the agent select the right action. Slight deduction for not adding new parameter details beyond actions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages GNS3 server connection with three specific actions (check, retry, reconnect). It distinguishes itself from sibling tools (ssh, notification, project, etc.) by focusing on connection management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use each action: check for status, retry for re-auth bypassing backoff, reconnect after server restart or project switch. It provides clear context and differentiates between the three actions, guiding the agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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/:/
Example: http://proxy:8023/http-proxy/10.1.1.1:443/ for HTTPS device
The reverse proxy handles SSL termination and provides persistent access
without needing to make API calls.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", ...} }
# Check device HTTPS API reachability
>>> http_client(action="status", url="https://10.1.1.2:443", verify_ssl=False)
{
"success": true,
"action": "status",
"reachable": true,
"status_code": 200
}
# Get JSON API with custom headers
>>> http_client(
... action="get",
... url="http://10.1.1.3/api/v1/status",
... headers={"Authorization": "Bearer token123", "Accept": "application/json"}
... )
{
"success": true,
"action": "get",
"status_code": 200,
"content": "{\"status\": \"online\", ...}",
"headers": {"content-type": "application/json"}
}
# Alternative: Use reverse proxy (no tool needed)
# Access: http://proxy:8023/http-proxy/10.1.1.1:443/dashboard| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Target URL (http:// or https://) | |
| action | Yes | Action: 'get' (HTTP GET request), 'status' (check reachability) | |
| headers | No | Optional custom HTTP headers | |
| timeout | No | Request timeout in seconds | |
| verify_ssl | No | Verify SSL certificates |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: read-only actions (get, status), SSL verification options, and the reverse proxy alternative. It also explains return format and shows example responses, ensuring transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections but is somewhat lengthy. It front-loads the purpose and actions, then adds details and examples, making it easy to scan. Could be slightly more concise but still good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple parameters, two actions, SSL, alternative proxy), the description covers all essential aspects: purpose, actions, SSL handling, alternative, return format, and examples. It is complete and leaves no major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds significant value by explaining action values, SSL details, timeout, and providing extensive examples that illustrate parameter usage and response structure beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is an HTTP/HTTPS client for lab device web interfaces with CRUD-style actions. It lists specific actions (get, status) and the resource (device web interfaces), distinguishing it from sibling tools like ssh or console.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool (accessing device APIs/web UIs) and offers an alternative (reverse proxy) for cases where the tool is not needed. It also explains SSL handling and shows example usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
VALIDATE ALL operations (check nodes exist, ports free, adapters valid)
EXECUTE ALL operations (only if all valid - atomic)
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")
# Connect two nodes (batch)
>>> link(action="batch", connections=[{
... "action": "connect",
... "node_a": "Router1",
... "node_b": "Router2",
... "port_a": 0,
... "port_b": 0,
... "adapter_a": 0,
... "adapter_b": 0
... }])
# Disconnect link (batch)
>>> link(action="batch", connections=[{"action": "disconnect", "link_id": "abc123"}])Returns: JSON with OperationResult (completed and failed operations) or list of links
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action: 'list' (list links) or 'batch' (batch operations) | |
| format | No | Output format: 'table' (default) or 'json' (for 'list') | table |
| project_id | No | Project ID (required for 'list') | |
| connections | No | List of connection operations (required for 'batch') |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It details the two-phase validation and atomic execution, the structure of connection operations, and return types. It does not mention potential side effects or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with sections (Actions, Connection Operations, Examples, Returns) but is somewhat verbose, including historical rename info. Most content is earned, but could be slightly more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (two actions, batch with validation) and high schema coverage plus output schema, the description covers all necessary aspects: actions, parameters, behavior (atomicity), examples, and return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant value by showing exact JSON structures for connection operations (e.g., node_a, port_a) and providing examples that clarify parameter usage beyond the schema-defined descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages network connections (links) and distinguishes it from siblings by focusing solely on link operations. The historical rename context adds clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two actions (list and batch) and their use cases, including the atomic two-phase execution for batch. However, it does not explicitly compare to sibling tools like gns3_connection or provide when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
# Create new node
>>> node(action="create", template_name="Alpine Linux", x=100, y=200)
>>> node(action="create", template_name="Cisco IOSv", x=300, y=400, node_name="R1", properties={"ram": 1024})
# Delete node
>>> node(action="delete", node_name="Router1")
# Start all nodes
>>> node(action="set", node_name="*", state_action="start")
# Stop all routers
>>> node(action="set", node_name="Router*", state_action="stop")
# Configure node properties
>>> node(action="set", node_name="R1", x=100, y=200, ram=2048)| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X coordinate (top-left corner of node icon) | |
| y | No | Y coordinate (top-left corner of node icon) | |
| z | No | Z-order layer for overlapping nodes | |
| ram | No | RAM in MB (QEMU nodes only) | |
| cpus | No | Number of CPUs (QEMU nodes only) | |
| name | No | New name (REQUIRES node stopped) | |
| ports | No | Number of ports (ethernet_switch nodes only) | |
| action | Yes | Action: 'list' (list nodes), 'create' (new node), 'delete' (remove node), or 'set' (configure/control node) | |
| format | No | Output format: 'table' (default) or 'json' (for 'list' action) | table |
| locked | No | Lock position to prevent GUI moves | |
| adapters | No | Network adapters (QEMU: adapters, IOU: ethernet_adapters) | |
| parallel | No | Execute operations concurrently (default: True for start/stop/suspend) | |
| node_name | No | Node name, wildcard pattern ('*', 'Router*', 'R[123]'), or JSON array ('["R1","R2"]'). Required for 'delete' and 'set' | |
| compute_id | No | Compute server ID (for 'create') | local |
| project_id | No | Project ID (required for 'list') | |
| properties | No | Override template properties for 'create' (e.g., {'ram': 512}) | |
| console_type | No | Console type: telnet/vnc/spice | |
| state_action | No | State control action for 'set': 'start' (boot), 'stop' (shutdown), 'suspend' (pause), 'reload' (reboot), 'restart' (stop then start) | |
| template_name | No | Template name (required for 'create', e.g., 'Alpine Linux', 'Cisco IOSv') | |
| hdd_disk_image | No | HDD disk image path (QEMU nodes only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses destructive nature of delete, wildcard/bulk support, and return types. Examples illustrate behavior, but error handling and edge cases could be more explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for actions, wildcards, validation, and examples. It is organized and front-loaded with purpose. However, it is somewhat lengthy (including version history and detailed patterns) and could be trimmed without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 20 parameters, no annotations, and presence of an output schema, the description covers actions, constraints, returns, and examples comprehensively. It lacks explicit error handling details but is otherwise complete for an AI agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds substantial meaning: explains wildcard patterns, validation rules linking parameters to actions, and which properties apply to which node types. Examples demonstrate usage far beyond the schema's short descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state the tool manages GNS3 nodes with CRUD operations. The actions list, wildcard patterns, and examples leave no ambiguity about its purpose, distinguishing it from sibling tools that manage different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit validation rules (e.g., name requires node stopped, hardware properties per node type) and action-specific details. It also includes wildcard patterns and parallel execution defaults. However, it lacks explicit comparison to sibling tools, though not critical since siblings are different resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
# Write file
>>> node_file(action="write", node_name="A-PROXY",
... file_path="etc/network/interfaces",
... content="auto eth0\niface eth0 inet dhcp")
# Configure network (recommended)
>>> node_file(action="configure_network", node_name="A-PROXY", interfaces=[{
... "name": "eth0",
... "mode": "static",
... "address": "10.199.0.254",
... "netmask": "255.255.255.0",
... "gateway": "10.199.0.1"
... }])| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action: 'read' (get file), 'write' (update file), or 'configure_network' (network config workflow) | |
| content | No | File contents (required for 'write') | |
| file_path | No | Path relative to container root (required for 'read' and 'write') | |
| node_name | Yes | Name of the Docker node | |
| interfaces | No | List of interface configs (required for 'configure_network') |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that 'write' does not restart the node and that 'configure_network' includes restart. It also describes return types (JSON with file contents, confirmation, or configured interfaces). However, it does not detail potential side effects or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bulleted actions, warnings, and examples. It is concise yet thorough, with every sentence providing necessary information. No redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a multi-action tool with 5 parameters and no annotations, the description covers all essential aspects: actions, inputs, warnings, return values, and examples. It provides sufficient context for an AI agent to correctly select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with all parameters described. The description adds value by providing context (e.g., file_path relative to container root, content required for write, interfaces required for configure_network) and concrete examples, which go beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages Docker node files with CRUD operations and specifies three distinct actions (read, write, configure_network). It distinguishes these actions with clear verbs and resources, and the examples further clarify usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends using 'configure_network' for network configuration as it handles the complete workflow, and warns that 'write' does not restart the node. This provides clear guidance on when to use each action, effectively differentiating them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
# Subscribe to specific project events
>>> notification(action="subscribe", project_id="abc-123")
# Read new events since last read
>>> notification(action="read")
# Read only node events
>>> notification(action="read", filter_action="node.")
# Read only log errors
>>> notification(action="read", filter_action="log.error")
# Check status
>>> notification(action="status")| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Read mode: 'diff' (new since last read, default), 'all' (entire buffer), 'last' (last N events) | diff |
| limit | No | Max events to return (default: 100) | |
| action | Yes | Action: 'subscribe' (start listening), 'read' (get events), 'unsubscribe' (stop), 'status' (check subscription) | |
| project_id | No | Project ID for project-level notifications. Omit for controller-level (all events). | |
| filter_action | No | Filter events by action prefix (e.g., 'node.updated', 'log.error', 'link.') |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits. It explains that the tool subscribes in the background, buffers events, and supports read modes (diff/all/last). However, it omits details like buffer capacity, behavior on duplicate subscription, or whether subscription persists across calls. This is adequate but leaves some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a brief overview, a bullet list of actions, a categorized list of event types, and multiple examples. Every section earns its place, and the most critical information (core actions) is front-loaded. No redundant or vague sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (subscribe/read/unsubscribe/status with filtering) and the presence of an output schema, the description covers all necessary context: actions, parameters, event types, examples, and project vs controller scope. It leaves no obvious gaps for an AI agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds significant value by explaining each action's purpose, providing the list of event types (e.g., node.created, log.error), and giving concrete examples. This goes beyond the schema property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Subscribe to GNS3 server event notifications and read buffered events.' It specifies the verb (subscribe/read/unsubscribe/status) and the resource (GNS3 server event notifications). The tool's function is distinct from its siblings (e.g., project, node, link), which focus on direct manipulation rather than event streaming.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use each action (subscribe, read, unsubscribe, status) with examples. It explains project-level vs controller-level subscription. However, it does not explicitly exclude scenarios or mention when not to use this tool over alternatives (e.g., fetching current state via project/node tools instead of streaming events).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
# Open existing project
>>> project(action="open", name="My Lab")
# Create new project
>>> project(action="create", name="Production Lab")
>>> project(action="create", name="Test Lab", path="/opt/gns3/projects")
# Close current project
>>> project(action="close")| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Project name (required for 'open' and 'create') | |
| path | No | Optional project directory path (for 'create') | |
| action | Yes | Action: 'list', 'open', 'create', or 'close' | |
| format | No | Output format: 'table' (default) or 'json' (for 'list' action) | table |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It lists actions and their outcomes (e.g., 'auto-open' for create) but does not disclose potential side effects or safety implications (e.g., whether close saves changes). This is adequate but leaves some behavioral aspects implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for actions, args, returns, and examples. It is front-loaded with the summary line. Though somewhat lengthy, each part serves a purpose and is not excessively verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's CRUD nature and the presence of an output schema mention, the description covers the key functionality. It lacks some behavioral details and does not reference sibling tools, but for a tool with this complexity, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value beyond the schema by explaining action-specific parameter requirements (e.g., name required for open/create) and providing examples that illustrate parameter usage in context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages GNS3 projects and enumerates specific actions (list, open, create, close), making the tool's purpose specific and unambiguous. It distinguishes itself from siblings by its focus on project-level operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage through examples and arg descriptions for each action. However, it does not explicitly mention when not to use this tool or suggest alternatives among siblings, such as project_docs for documentation-related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
# Update README
>>> project_docs(action="update", content="""
... # HA PowerDNS
... ## IPs
... - B-Rec1: 10.2.0.1/24
... - B-Rec2: 10.2.0.2/24
... """)| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action: 'get' (read README) or 'update' (write README) | |
| content | No | Markdown content (required for 'update') | |
| project_id | No | Project ID (uses current project if not specified) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description discloses main behaviors: read (get) and write (update) operations, expected input/output format (JSON with project_id and markdown), and includes examples. However, it doesn't specify whether update overwrites or merges content, or authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise, well-structured with clear sections: purpose, version, actions, typical content, returns, and examples. Every sentence adds value without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, full schema coverage, and presence of output schema, the description covers all necessary aspects: purpose, actions, parameters, typical content, and examples. An agent can correctly invoke the tool based on this description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds value through examples showing exact usage and format for each parameter, such as markdown content and default project_id behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages project documentation with CRUD operations, specifically actions 'get' and 'update'. It distinguishes from sibling tools like 'project' by focusing on documentation content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides typical use cases and content examples, but does not explicitly compare to alternative tools or state when to avoid using it. The implicit guidance is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_resourceC
Universal resource query tool - access any GNS3 MCP resource.
See tool implementation docstring for comprehensive URI pattern documentation.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | Resource URI to query (see tool description for supported patterns) | |
| format | No | Output format: 'table' (default, human-readable) or 'json' (structured) | table |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It labels itself a 'query tool' implying read-only, but does not explicitly state that it is non-destructive, what the return format is, or any effects. The referral to 'tool implementation docstring' is not part of the description and does not aid transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short (two sentences) and front-loaded with purpose, which is good. However, the second sentence directs users to external documentation rather than providing the information directly, reducing its immediate value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that no annotations exist and the tool has an output schema, the description should cover behavioral aspects and usage context. It fails to explain when to use this tool, what side effects (if any) occur, or how the output is structured. The presence of an output schema partially compensates, but the lack of usage guidance leaves it incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the two parameters. The description adds minimal meaning: 'uri' parameter description merely repeats the advice to see the tool description for patterns, which is not provided. 'format' parameter is adequately described in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it is a 'Universal resource query tool' for accessing 'any GNS3 MCP resource', clearly indicating the verb (query) and resource (any GNS3 MCP resource). However, it does not differentiate itself from sibling tools like 'project' or 'node', which also query specific resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus its siblings. It simply calls itself 'universal' without specifying that it is intended for generic or unsupported resource access, or when a specific tool is unavailable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
project: Project management (open, create, close)
node: Node management (create, delete, configure)
connection: Network connections and GNS3 server
console: Console access to devices
ssh: SSH access to devices
drawing: Topology visualization
resource: Resource query tools
docker: Docker-specific operations
docs: Documentation management
topology: Topology operations
management: Management operations
device-access: Device access (console/SSH)
visualization: Visual elements
discovery: Tool discovery
Capabilities:
CRUD: Supports create/read/update/delete operations via action parameter
batch: Supports batch operations (multiple operations in one call)
wildcard: Supports wildcard patterns (, Router, R[123])
parallel: Supports parallel execution
idempotent: Multiple executions produce same result
Resource Mapping:
projects://: project, list_projects, query_resource
nodes://{project_id}/: node, list_nodes, query_resource
links://{project_id}/: link, query_resource
drawings://{project_id}/: drawing, query_resource
sessions://console/: console, query_resource
sessions://ssh/: ssh, query_resource
topology://{project_id}: get_topology, query_resource
Returns: JSON with matching tools and their metadata
Examples: # Find all CRUD tools >>> search_tools(capability="CRUD")
# Find tools for working with nodes
>>> search_tools(category="node")
# Find tools that work with projects:// resources
>>> search_tools(resource_uri="projects://")
# Find batch operation tools
>>> search_tools(capability="batch")
# Find tools with wildcard support
>>> search_tools(capability="wildcard")| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Filter by category: project, node, console, ssh, drawing, resource, docker, connection, docs, management, device-access, topology, visualization, discovery | |
| capability | No | Filter by capability: CRUD, batch, wildcard, parallel, idempotent | |
| resource_uri | No | Find tools applicable to resource URI (e.g., 'projects://', 'nodes://{project_id}/') |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool returns tool metadata, lists possible values for categories and capabilities, and provides example calls. It does not explicitly state read-only or non-destructive behavior, but the nature of a search tool implies that. The version number and return format are given, adding transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but well-structured with headers, bullet lists, and code examples. Each section (categories, capabilities, resource mapping, examples) adds necessary detail. It is front-loaded with the main purpose and uses markdown formatting for readability. Could be slightly more concise, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (context signal: true), the description adequately covers the tool's behavior, input parameters, and return content. It includes categories, capabilities, and resource mappings, making it complete for a discovery tool. The examples illustrate typical usage patterns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining each parameter's purpose with example values and context, such as the list of categories and capabilities. It also shows how to use the resource_uri parameter with concrete URIs. This improves understanding beyond the schema's brief descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is a tool discovery function for GNS3 MCP tools, explaining that it searches and filters by category, capability, or resource URI. This distinctly sets it apart from sibling tools that manage specific entities (e.g., node, project). The title 'search_tools' and first sentence deliver a specific verb+resource combination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit categories, capabilities, and resource mappings, along with multiple examples showing how to filter. It does not explicitly state when not to use or alternatives, but the context is clear: use this tool to discover other tools. Given its meta-purpose, the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
Use node_name="@" in any operation for local execution on SSH proxy container
Mix local and remote operations in same batch
Useful for: connectivity tests before device access, ansible playbooks
SSH Proxy Services (v0.3.0):
TFTP Server: Available on port 69/udp at /opt/gns3-ssh-proxy/tftp (use tftp tool)
HTTP/HTTPS Reverse Proxy: Access device web UIs at http://proxy:8023/http-proxy/:/
HTTP Client Tool: Make GET requests to device APIs (use http_client tool)
Two-phase execution prevents partial failures:
VALIDATE ALL operations (check required params, valid types)
EXECUTE ALL operations (only if all valid, sequential execution)
Supported operation types:
"configure": Configure SSH session (equivalent to old ssh_configure)
"command": Execute command (equivalent to old ssh_command, supports local with "@")
"disconnect": Disconnect SSH session
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"} ... ])
# Same command on multiple nodes:
>>> ssh(operations=[
... {"type": "command", "node_name": "R1", "command": "show ip int brief"},
... {"type": "command", "node_name": "R2", "command": "show ip int brief"}
... ])
# Configuration commands:
>>> ssh(operations=[{
... "type": "command",
... "node_name": "R1",
... "command": [
... "interface GigabitEthernet0/0",
... "ip address 10.1.1.1 255.255.255.0",
... "no shutdown"
... ]
... }])
# Local execution - test connectivity before device access:
>>> ssh(operations=[
... {"type": "command", "node_name": "@", "command": "ping -c 2 10.1.1.1"},
... {"type": "command", "node_name": "@", "command": "ping -c 2 10.1.1.2"},
... {"type": "command", "node_name": "R1", "command": "show ip int brief"},
... {"type": "command", "node_name": "R2", "command": "show ip int brief"}
... ])| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | List of SSH operations (command/disconnect) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses two-phase execution (validate then execute), sequential processing, and batch-only constraint. Lacks explicit safety warnings about destructive commands, but the examples imply configuration changes. No annotations were provided, so description carries full burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections and enumerated examples, but includes some extraneous details (e.g., TFTP server path) that could be delegated to sibling tool descriptions. Overall effective despite length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers operation types, two-phase execution, local execution, proxy services, and return format. Given the tool's complexity and presence of an output schema, the description is thorough and leaves no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema only lists operations array with minimal description. The description adds detailed structure for each operation dict (type, node_name, additional params), operation types, and multiple examples, providing comprehensive meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states tool executes SSH operations in batch mode, enumerates operation types (configure, command, disconnect), and distinguishes from siblings like tftp and http_client.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly marks tool as batch-only, explains local execution use cases, and provides examples that mix local and remote operations. Alternatives like tftp and http_client are referenced for non-SSH tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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"} ] }
# Upload configuration file
>>> tftp(action="upload", filename="startup-config.txt", content=b"hostname Router1\n...")
{"success": true, "action": "upload", "message": "Uploaded startup-config.txt"}
# Download file
>>> tftp(action="download", filename="config.txt")
{"success": true, "action": "download", "content": "aG9zdG5hbWUgUm91dGVyMQo="}
# Delete file
>>> tftp(action="delete", filename="old-config.txt")
{"success": true, "action": "delete", "message": "Deleted old-config.txt"}
# Check TFTP server status
>>> tftp(action="status")
{
"success": true,
"action": "status",
"tftp_enabled": true,
"tftp_port": 69,
"tftp_root": "/opt/gns3-ssh-proxy/tftp",
"file_count": 5,
"total_size": 10485760
}| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action: 'list' (list files), 'upload' (upload file), 'download' (download file), 'delete' (delete file), 'status' (check TFTP server status) | |
| content | No | File content for upload (raw bytes) | |
| filename | No | Filename for upload/download/delete operations |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the server runs on port 69/udp, root directory /opt/gns3-ssh-proxy/tftp, read-write access, base64 handling for content, and JSON responses. This is sufficient for safe invocation, though file size limits are not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (version, details, actions, handling, examples). While slightly verbose with multiple examples, the information is organized and front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and complete input schema, the description covers all actions and parameters. Examples illustrate expected responses. No critical gaps are apparent for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage, but the description adds value by explaining each action's parameter requirements, providing examples, and clarifying that upload content should be raw bytes (with automatic base64 encoding). This enhances understanding beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Manage TFTP server files (CRUD-style)' and enumerates five specific actions (list, upload, download, delete, status). This distinguishes it from sibling tools like ssh or node, which perform unrelated functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, or when not to use it. While implied by its name, explicit usage guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
15 tool updates
v0.54.2- First observed
console - First observed
drawing - First observed
export_topology_diagram - First observed
gns3_connection - First observed
http_client - First observed
link - First observed
node - First observed
node_file - First observed
notification - First observed
project - First observed
project_docs - First observed
query_resource - First observed
search_tools - First observed
ssh - First observed
tftp
TDQS
Each tool has a clearly defined purpose: ssh and console are differentiated by use case (SSH preferred, console for initial setup), and all other tools cover distinct domains (project, node, link, drawing, file management, etc.). No two tools overlap in function.
Tool names generally use lowercase words with underscores for compound names (e.g., gns3_connection, project_docs, query_resource), which is consistent. However, there is no strict verb_noun pattern; many tools are single nouns (ssh, node, console, drawing). This is acceptable but not perfectly uniform.
With 15 tools, the set is well-scoped for managing GNS3 network simulation labs. It covers project, node, link, drawing, device access (SSH/console), TFTP, HTTP client, documentation, and tool discovery without being overwhelming or too sparse.
The tool set covers most core workflows: CRUD for projects, nodes, links, drawings; device access via console and SSH; file operations on Docker nodes; documentation; topology export; and auxiliary services (TFTP, HTTP). Minor gaps like template management or snapshot operations are missing but not critical for typical lab operations.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Create, browse, remix, collaborate on, and run durable AI workflow nodes from MCP hosts.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI-powered network engineering by providing natural language control over GNS3 network simulations. Supports creating projects, building network topologies, managing devices, controlling simulations, and analyzing network traffic through conversational AI interactions.4225MIT
- AlicenseNot gradedqualityDmaintenanceConnects Claude with Cisco Packet Tracer 9.x to control network topologies, configure devices with IOS commands, and run diagnostics via natural language.MIT
- AlicenseBqualityDmaintenanceAn MCP server that gives Claude and other LLM agents programmatic access to EVE-NG network labs, enabling creation, configuration, and management of virtual network topologies through natural language.142Apache 2.0
- AlicenseCqualityAmaintenanceEnables AI agents to control GNS3 network emulation labs. Supports building topologies, managing devices, capturing packets, and automating device CLIs.100MIT
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