netdev-ssh-mcp

Servidor MCP para interactuar con dispositivos de red (switches, routers) a través de SSH. Soporta Arista EOS, Cisco NX-OS y Cisco IOS/IOS-XE. Expone operaciones de dispositivos de red como herramientas para usar con Claude Code y Claude Desktop (y otros clientes MCP)

Documentación

netdev-ssh-mcp

Servidor MCP para interactuar con dispositivos de red (switches, routers, firewalls) a través de SSH. Soporta Arista EOS, Cisco NX-OS, Cisco IOS/IOS-XE, Juniper JunOS y FortiGate FortiOS. Expone operaciones de dispositivos de red como herramientas para usar con Claude Code / Claude Desktop / Codex (y otros clientes MCP)

Herramientas

get_config

Recupera la configuración en ejecución o de inicio de un dispositivo Arista, Cisco Nexus, Cisco Catalyst, Juniper JunOS o FortiGate FortiOS. Los valores sensibles (contraseñas, secretos, nombres de comunidades SNMP, claves BGP/OSPF/TACACS/RADIUS/IKE) se reemplazan automáticamente con hashes SHA-256 deterministas:

enable secret [h:a3f4b2c1d5e6]
snmp-server community [h:f9e1d2b4c3a7] ro
username admin privilege 15 secret [h:a3f4b2c1d5e6]

El mismo valor secreto siempre produce el mismo hash, por lo que las configuraciones de diferentes dispositivos se pueden comparar y diferenciar de forma segura: hashes idénticos significan secretos idénticos.

ParámetroTipoObligatorioPredeterminadoDescripción
hoststringNombre de host o dirección IP del dispositivo
usernamestringnoDEVICE_USERNAMEUsuario SSH
portintno22Puerto SSH
config_typestringnorunningrunning o startup; startup no es compatible con JunOS o FortiOS
device_typestringnoeos, ios, nxos, junos o fortios

Notas de FortiOS:

  • Use device_type=fortios para recuperar la configuración con show full-configuration.
  • fortigate se acepta como alias de fortios.
  • FortiOS no admite config_type=startup.

run_show_command

Ejecuta comandos operativos de lectura en un dispositivo de red y devuelve la salida. Para Arista/Cisco/JunOS, el comando debe comenzar con show. Para FortiOS, el comando debe comenzar con get. Agregue | json para salida estructurada donde sea compatible, o | no-more para deshabilitar la paginación en la salida de texto.

ParámetroTipoObligatorioPredeterminadoDescripción
hoststringNombre de host o dirección IP del dispositivo
commandstringEl comando operativo de lectura a ejecutar
usernamestringnoDEVICE_USERNAMEUsuario SSH
portintno22Puerto SSH
device_typestringnoeos, ios, nxos, junos o fortios

Ejemplos de comandos:

show bgp summary | json
show interfaces status | json
show lldp neighbors detail | json
show inventory | json
show version | json
show ip route | json
get system status
get router info routing-table all

show running-config y show startup-config no están permitidos aquí: use la herramienta get_config en su lugar.

En FortiOS, los comandos show, config, execute y diagnose están bloqueados aquí. Use get_config, run_ping o run_traceroute en su lugar.

run_ping

Ejecuta un comando ping en el dispositivo de red y devuelve la salida. Útil para verificar la accesibilidad desde la perspectiva del dispositivo, por ejemplo, probar la conectividad a un peer BGP, next-hop o destino de gestión.

Use device_type para seleccionar la sintaxis de comando correcta para la plataforma de destino. Si se omite, se usa la sintaxis EOS/IOS (palabras clave repeat, size). En FortiOS, la herramienta usa execute ping-options ..., ejecuta execute ping y luego restablece las opciones dentro de la misma sesión SSH.

ParámetroTipoObligatorioPredeterminadoDescripción
hoststringNombre de host o dirección IP del dispositivo
destinationstringDirección IP o nombre de host al que hacer ping
usernamestringnoDEVICE_USERNAMEUsuario SSH
portintno22Puerto SSH
countintnoNúmero de solicitudes de eco a enviar
timeoutintnoTiempo de espera por sonda en segundos; compatible con FortiOS
sourcestringnoDirección IP de origen o nombre de interfaz
vrfstringnoNombre de VRF
sizeintnoTamaño de paquete en bytes
outgoing_interfacestringnoInterfaz de salida; compatible con FortiOS
device_typestringnoeos, ios, nxos, junos o fortios — controla la sintaxis de ping

Limitaciones de FortiOS:

  • vrf no es compatible en esta herramienta para FortiOS 7.4+.
  • | json no es compatible para la salida operativa de FortiOS.

run_traceroute

Muestra la ruta salto a salto desde el dispositivo hasta un destino y la latencia por salto. Útil para localizar dónde se rompe la conectividad, verificar que el tráfico siga la ruta esperada e identificar qué salto introduce latencia.

Use device_type para garantizar la sintaxis correcta. En IOS, vrf debe preceder al destino en el comando: especificar device_type=ios maneja esto automáticamente. En FortiOS, la herramienta usa execute traceroute-options ..., ejecuta execute traceroute y luego restablece las opciones dentro de la misma sesión SSH.

ParámetroTipoObligatorioPredeterminadoDescripción
hoststringNombre de host o dirección IP del dispositivo
destinationstringDirección IP o nombre de host al que hacer traceroute
usernamestringnoDEVICE_USERNAMEUsuario SSH
portintno22Puerto SSH
max_hopsintnoNúmero máximo de saltos (TTL)
timeoutintnoTiempo de espera por sonda en segundos
probeintnoNúmero de sondas por salto
sourcestringnoDirección IP de origen o nombre de interfaz
vrfstringnoNombre de VRF
outgoing_interfacestringnoInterfaz de salida; compatible con FortiOS
device_typestringnoeos, ios, nxos, junos o fortios — controla la sintaxis de traceroute

Limitaciones de FortiOS:

  • vrf, max_hops y timeout no son compatibles en esta herramienta para FortiOS 7.4+.
  • | json no es compatible para la salida operativa de FortiOS.

trust_host_key

Obtiene la clave de host SSH que presenta actualmente un dispositivo y, opcionalmente, la agrega al archivo known_hosts configurado. Úselo en dos pasos:

  1. Llame con confirm=false para inspeccionar la huella digital actual.
  2. Después de verificar esa huella digital fuera de banda, llame nuevamente con confirm=true para escribirla en known_hosts.

Si la clave de host de un dispositivo ha cambiado legítimamente, llame con replace_existing=true después de verificar la nueva huella digital.

ParámetroTipoObligatorioPredeterminadoDescripción
hoststringNombre de host o dirección IP del dispositivo
portintno22Puerto SSH
confirmboolnofalseCuando false, solo inspeccione la clave actual; cuando true, escríbala
replace_existingboolnofalseReemplace una clave existente que no coincida después de la verificación

Nombre de usuario predeterminado

Establezca DEVICE_USERNAME para evitar especificar username en cada llamada de herramienta:

export DEVICE_USERNAME=admin

El parámetro de herramienta username tiene prioridad si se proporciona.

Autenticación

Los métodos de autenticación se prueban en orden:

  1. Agente SSH — si SSH_AUTH_SOCK está configurado, el agente se usa automáticamente. No se necesita configuración.
  2. Contraseña — se establece mediante la variable de entorno DEVICE_PASSWORD (ver más abajo).

Al menos un método debe estar disponible en el momento de la llamada.

Nota de Claude Desktop: Claude Desktop es una aplicación GUI y no hereda el entorno de su shell, por lo que SSH_AUTH_SOCK no está disponible para el proceso del servidor MCP. Configúrelo explícitamente en el bloque env de la configuración (ver la sección de Claude Desktop a continuación). Claude Code se ejecuta en la terminal y hereda el entorno de su shell, por lo que no se necesita configuración adicional allí.

Contraseña mediante variable de entorno

Establezca DEVICE_PASSWORD antes de iniciar el servidor:

export DEVICE_PASSWORD=mysecret
netdev-ssh-mcp

La contraseña nunca se pasa a través de parámetros de herramienta o del protocolo MCP: se lee una vez del entorno en el momento de la llamada y se aplica a todas las conexiones realizadas por el proceso del servidor.

Verificación de clave de host SSH

La verificación de clave de host SSH está habilitada de forma predeterminada. El servidor usa el archivo known_hosts de OpenSSH del usuario actual:

  • macOS y Linux: ~/.ssh/known_hosts
  • Windows: %USERPROFILE%\\.ssh\\known_hosts

Puede anular la ruta con cualquiera de las siguientes opciones:

  • indicador de línea de comandos: --known-hosts /path/to/known_hosts
  • variable de entorno: SSH_KNOWN_HOSTS

Si un dispositivo no está presente en known_hosts, las llamadas de herramienta fallan con un error claro que incluye la huella digital presentada y sugiere usar trust_host_key.

Para deshabilitar la verificación de clave de host por completo, use cualquiera de las siguientes opciones:

  • indicador de línea de comandos: --insecure-skip-host-key-check
  • variable de entorno: SKIP_HOST_KEY_CHECK=true

Deshabilitar la verificación es inseguro y solo debe usarse como una vía de escape temporal.

Instalación

macOS (Homebrew)

brew install --cask krisiasty/tap/netdev-ssh-mcp

El binario se instala en $(brew --prefix)/bin/netdev-ssh-mcp. El prefijo depende de la arquitectura del Mac:

ArquitecturaRuta
Apple Silicon (M1/M2/M3/M4)/opt/homebrew/bin/netdev-ssh-mcp
Intel/usr/local/bin/netdev-ssh-mcp

Ejecute brew --prefix para confirmar cuál se aplica a su máquina.

Compilar desde el código fuente

Requiere Go 1.26 o posterior.

go build -o netdev-ssh-mcp .

Para instalar el binario en /usr/local/bin después de compilar (macOS y Linux):

sudo install -m 0755 netdev-ssh-mcp /usr/local/bin/

Integración

En los ejemplos a continuación, reemplace <path-to-binary> con la ruta completa al binario. Si se instaló mediante Homebrew, ejecute brew --prefix para determinar la ruta correcta (/opt/homebrew en Apple Silicon, /usr/local en Intel) y luego agregue /bin/netdev-ssh-mcp.

Claude Code

Agregue un .mcp.json local al proyecto en la raíz de su repositorio:

{
  "mcpServers": {
    "netdev-ssh-mcp": {
      "command": "<path-to-binary>"
    }
  }
}

Con un nombre de usuario predeterminado:

{
  "mcpServers": {
    "netdev-ssh-mcp": {
      "command": "<path-to-binary>",
      "env": {
        "DEVICE_USERNAME": "admin"
      }
    }
  }
}

Claude Code se ejecuta en la terminal y hereda el entorno de su shell, por lo que SSH_AUTH_SOCK está disponible automáticamente: no se necesita configuración adicional para la autenticación con agente SSH.

Alternativamente, usando autenticación con contraseña:

{
  "mcpServers": {
    "netdev-ssh-mcp": {
      "command": "<path-to-binary>",
      "env": {
        "DEVICE_USERNAME": "admin",
        "DEVICE_PASSWORD": "mysecret"
      }
    }
  }
}

Alternativamente, registre el servidor globalmente con la CLI de Claude Code:

claude mcp add netdev-ssh-mcp <path-to-binary>

Claude Desktop

Edite ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "netdev-ssh-mcp": {
      "command": "<path-to-binary>"
    }
  }
}

Claude Desktop no hereda el entorno de su shell, por lo que SSH_AUTH_SOCK debe establecerse explícitamente. Obtenga la ruta del socket actual desde su terminal:

echo $SSH_AUTH_SOCK

Luego agréguela a la configuración:

{
  "mcpServers": {
    "netdev-ssh-mcp": {
      "command": "<path-to-binary>",
      "env": {
        "DEVICE_USERNAME": "admin",
        "SSH_AUTH_SOCK": "/private/tmp/com.apple.launchd.XXXXX/Listeners"
      }
    }
  }
}

Tenga en cuenta que la ruta del socket cambia en cada reinicio y debe actualizarse en la configuración en consecuencia.

Alternativamente, usando autenticación con contraseña:

{
  "mcpServers": {
    "netdev-ssh-mcp": {
      "command": "<path-to-binary>",
      "env": {
        "DEVICE_USERNAME": "admin",
        "DEVICE_PASSWORD": "mysecret"
      }
    }
  }
}

Reinicie Claude Desktop después de editar la configuración.

Ejemplos de indicaciones

  • Muéstrame la configuración en ejecución de 10.0.0.1
  • Compara las configuraciones en ejecución de n9k-1 y n9k-2 y resume las diferencias
  • Verifica el estado de los vecinos BGP en arista1 y dime si alguna sesión está caída
  • Obtén el estado de las interfaces de 10.0.0.1 y lista las interfaces que estén caídas
  • Revisa la configuración en ejecución de 10.0.0.1 y señala cualquier problema de seguridad
  • Obtén los vecinos LLDP de 10.0.0.1 y dibuja un diagrama de topología
  • ¿Cómo se reenvía el tráfico a 192.168.100.0/24 en 10.0.0.1?
  • Verifica la consistencia de NTP en 10.0.0.1, 10.0.0.2 y 10.0.0.3
  • Descubre los vecinos de spine-1 mediante LLDP/CDP y verifica la configuración de la estructura EVPN
  • Dime qué comandos exactos usar para corregir los problemas de configuración que detectaste
  • Verifica si todos los problemas detectados anteriormente están corregidos ahora
  • Haz ping a 10.0.0.2 desde 10.0.0.1 y dime si es accesible
  • Verifica si arista1 puede alcanzar todos sus peers BGP haciendo ping a cada uno
  • Haz ping a 8.8.8.8 desde el VRF de gestión en n9k-1
  • Haz traceroute desde arista1 a 10.0.0.2 y muéstrame la ruta
  • Ejecuta un traceroute desde spine-1 a cada uno de sus peers BGP e identifica rutas asimétricas

Ofuscación

Los valores sensibles se ofuscan por defecto en la salida de get_config y run_show_command. La herramienta run_ping no se ve afectada: la salida de ping no contiene valores sensibles. Para desactivar la ofuscación, pasa --no-obfuscate:

netdev-ssh-mcp --no-obfuscate

En un archivo de configuración MCP, pásalo mediante args:

{
  "mcpServers": {
    "netdev-ssh-mcp": {
      "command": "<path-to-binary>",
      "args": ["--no-obfuscate"]
    }
  }
}

Registro

El servidor registra en stderr (nunca en stdout, que está reservado para el protocolo MCP). El nivel de registro está controlado por la variable de entorno LOG_LEVEL:

ValorDescripción
debugDetalles de conexión, cadenas de comandos, recuentos de bytes
infoPredeterminado: llamadas a herramientas, conexión/desconexión, éxito/fallo
warnSolo advertencias
errorSolo errores
LOG_LEVEL=debug netdev-ssh-mcp

Autor

Krzysztof Ciepłucha

Descargo de responsabilidad

Esta herramienta fue diseñada y construida con la asistencia de herramientas de IA. Las decisiones de diseño, la arquitectura y todo el código han sido revisados y verificados por un humano. El proyecto pasa por comprobaciones de seguridad automatizadas, escaneo de vulnerabilidades y análisis estático de código en cada commit.

Dicho esto, este software se proporciona tal cual, sin garantías. Puede contener errores. Úsalo bajo tu propio riesgo.

Licencia

Licenciado bajo la Apache License, Versión 2.0. Consulta LICENSE para más detalles.