Netmiko MCP Server
by ntunes
README.md
# Netmiko MCP Server
An MCP (Model Context Protocol) server for managing network devices via SSH using [Netmiko](https://github.com/ktbyers/netmiko). Features connection pooling, multi-vendor support, and concurrent operations.
## Features
- **Command Execution**: Run CLI commands on single or multiple devices
- **Configuration Management**: Push configuration changes with optional save/rollback
- **Device Inventory**: YAML-based device inventory with groups and tags
- **Connection Pooling**: Efficient connection reuse with health checks
- **Multi-Vendor Support**: Works with any device type supported by Netmiko
- **Concurrent Operations**: Execute commands on multiple devices in parallel
- **TextFSM Parsing**: Optional structured output parsing
## Installation
### From Source
```bash
git clone https://github.com/ntunes/netmiko-mcp-server.git
cd netmiko-mcp-server
pip install -e .
```
### With Docker
```bash
docker build -t netmiko-mcp .
```
## Configuration
### Device Inventory
Create a `config/devices.yaml` file with your device inventory:
```yaml
defaults:
timeout: 30
fast_cli: true
credentials:
production:
username: "${NETMIKO_USERNAME}"
password: "${NETMIKO_PASSWORD}"
secret: "${NETMIKO_SECRET}"
groups:
core_routers:
- core-rtr-01
- core-rtr-02
devices:
core-rtr-01:
host: "192.168.1.1"
device_type: "cisco_ios"
credential_profile: "production"
tags:
- core
- production
core-rtr-02:
host: "192.168.1.2"
device_type: "cisco_ios"
credential_profile: "production"
tags:
- core
- production
pool_settings:
max_connections_per_device: 3
connection_timeout: 300
health_check_interval: 60
```
### Environment Variables
Set credentials via environment variables:
```bash
export NETMIKO_USERNAME="admin"
export NETMIKO_PASSWORD="your_password"
export NETMIKO_SECRET="enable_secret"
```
Optionally set config file location:
```bash
export NETMIKO_MCP_CONFIG="/path/to/devices.yaml"
```
## Usage
### Running the Server
**Stdio transport (for Claude Desktop):**
```bash
python -m netmiko_mcp
```
**Streamable HTTP transport:**
```bash
python -m netmiko_mcp --transport streamable-http --port 8339
```
**With Docker:**
```bash
docker run -p 8339:8339 \
-e NETMIKO_USERNAME=admin \
-e NETMIKO_PASSWORD=secret \
-v ./config/devices.yaml:/app/config/devices.yaml:ro \
netmiko-mcp
```
**With Docker Compose:**
```bash
# Set credentials in .env or environment
export NETMIKO_USERNAME=admin
export NETMIKO_PASSWORD=secret
docker-compose up -d
```
### Claude Desktop Configuration
Add to your Claude Desktop configuration:
**For stdio transport:**
```json
{
"mcpServers": {
"netmiko": {
"command": "python",
"args": ["-m", "netmiko_mcp", "--config", "/path/to/devices.yaml"]
}
}
}
```
**For HTTP transport:**
```json
{
"mcpServers": {
"netmiko": {
"url": "http://localhost:8339/mcp"
}
}
}
```
## MCP Tools
### Command Execution
| Tool | Description |
|------|-------------|
| `send_command` | Execute a single command on one device |
| `send_command_parallel` | Execute the same command on multiple devices concurrently |
| `send_commands_sequence` | Execute multiple commands sequentially on one device |
### Configuration
| Tool | Description |
|------|-------------|
| `send_config` | Push configuration commands to one device |
| `send_config_parallel` | Push configuration to multiple devices concurrently |
### Inventory & Discovery
| Tool | Description |
|------|-------------|
| `list_devices` | List all devices with optional tag/type filtering |
| `get_device_info` | Get detailed device information and connection status |
| `list_groups` | List all device groups and their members |
| `test_connection` | Test connectivity to a device |
| `get_pool_status` | Get connection pool statistics |
| `get_device_types` | List all device types in inventory |
| `get_tags` | List all tags used across devices |
### Examples
**Execute a command:**
```
Use send_command on device "core-rtr-01" with command "show version"
```
**Execute on multiple devices:**
```
Use send_command_parallel on devices ["@core_routers"] with command "show ip interface brief"
```
**Push configuration:**
```
Use send_config on device "core-rtr-01" with config_commands ["interface Loopback0", "description Test"] and save_config true
```
## Supported Device Types
Any device type supported by Netmiko, including:
- `cisco_ios` - Cisco IOS
- `cisco_xe` - Cisco IOS-XE
- `cisco_xr` - Cisco IOS-XR
- `cisco_nxos` - Cisco NX-OS
- `arista_eos` - Arista EOS
- `juniper_junos` - Juniper JunOS
- `paloalto_panos` - Palo Alto PAN-OS
- `hp_procurve` - HP ProCurve
- `linux` - Linux SSH
See [Netmiko supported platforms](https://github.com/ktbyers/netmiko#supports) for the full list.
## Development
### Install Development Dependencies
```bash
pip install -e ".[dev]"
```
### Run Tests
```bash
pytest
```
### Run Linting
```bash
ruff check src/ tests/
mypy src/
```
## License
MIT
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues