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ámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|---|---|---|---|---|
host | string | sí | — | Nombre de host o dirección IP del dispositivo |
username | string | no | DEVICE_USERNAME | Usuario SSH |
port | int | no | 22 | Puerto SSH |
config_type | string | no | running | running o startup; startup no es compatible con JunOS o FortiOS |
device_type | string | no | — | eos, ios, nxos, junos o fortios |
Notas de FortiOS:
- Use
device_type=fortiospara recuperar la configuración conshow full-configuration. fortigatese acepta como alias defortios.- 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ámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|---|---|---|---|---|
host | string | sí | — | Nombre de host o dirección IP del dispositivo |
command | string | sí | — | El comando operativo de lectura a ejecutar |
username | string | no | DEVICE_USERNAME | Usuario SSH |
port | int | no | 22 | Puerto SSH |
device_type | string | no | — | eos, 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-configyshow startup-configno están permitidos aquí: use la herramientaget_configen su lugar.En FortiOS, los comandos
show,config,executeydiagnoseestán bloqueados aquí. Useget_config,run_pingorun_tracerouteen 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ámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|---|---|---|---|---|
host | string | sí | — | Nombre de host o dirección IP del dispositivo |
destination | string | sí | — | Dirección IP o nombre de host al que hacer ping |
username | string | no | DEVICE_USERNAME | Usuario SSH |
port | int | no | 22 | Puerto SSH |
count | int | no | — | Número de solicitudes de eco a enviar |
timeout | int | no | — | Tiempo de espera por sonda en segundos; compatible con FortiOS |
source | string | no | — | Dirección IP de origen o nombre de interfaz |
vrf | string | no | — | Nombre de VRF |
size | int | no | — | Tamaño de paquete en bytes |
outgoing_interface | string | no | — | Interfaz de salida; compatible con FortiOS |
device_type | string | no | — | eos, ios, nxos, junos o fortios — controla la sintaxis de ping |
Limitaciones de FortiOS:
vrfno es compatible en esta herramienta para FortiOS 7.4+.| jsonno 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ámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|---|---|---|---|---|
host | string | sí | — | Nombre de host o dirección IP del dispositivo |
destination | string | sí | — | Dirección IP o nombre de host al que hacer traceroute |
username | string | no | DEVICE_USERNAME | Usuario SSH |
port | int | no | 22 | Puerto SSH |
max_hops | int | no | — | Número máximo de saltos (TTL) |
timeout | int | no | — | Tiempo de espera por sonda en segundos |
probe | int | no | — | Número de sondas por salto |
source | string | no | — | Dirección IP de origen o nombre de interfaz |
vrf | string | no | — | Nombre de VRF |
outgoing_interface | string | no | — | Interfaz de salida; compatible con FortiOS |
device_type | string | no | — | eos, ios, nxos, junos o fortios — controla la sintaxis de traceroute |
Limitaciones de FortiOS:
vrf,max_hopsytimeoutno son compatibles en esta herramienta para FortiOS 7.4+.| jsonno 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:
- Llame con
confirm=falsepara inspeccionar la huella digital actual. - Después de verificar esa huella digital fuera de banda, llame nuevamente con
confirm=truepara escribirla enknown_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ámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|---|---|---|---|---|
host | string | sí | — | Nombre de host o dirección IP del dispositivo |
port | int | no | 22 | Puerto SSH |
confirm | bool | no | false | Cuando false, solo inspeccione la clave actual; cuando true, escríbala |
replace_existing | bool | no | false | Reemplace 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:
- Agente SSH — si
SSH_AUTH_SOCKestá configurado, el agente se usa automáticamente. No se necesita configuración. - 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_SOCKno está disponible para el proceso del servidor MCP. Configúrelo explícitamente en el bloqueenvde 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:
| Arquitectura | Ruta |
|---|---|
| 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:
| Valor | Descripción |
|---|---|
debug | Detalles de conexión, cadenas de comandos, recuentos de bytes |
info | Predeterminado: llamadas a herramientas, conexión/desconexión, éxito/fallo |
warn | Solo advertencias |
error | Solo 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.