gNMIBuddy
Recupera información esencial de la red desde dispositivos usando gNMI y modelos OpenConfig.
Documentación
🧪 gNMIBuddy
Una herramienta sobrediseñada y dogmática que recupera información esencial de red de los dispositivos utilizando gNMI y modelos OpenConfig. Diseñada principalmente para LLMs con integración de Model Context Protocol (MCP), también proporciona una CLI completa para uso directo.
Dogmática por diseño, sobrediseñada por pasión. gNMI y YANG exponen cantidades abrumadoras de datos con innumerables parámetros. Esta herramienta proporciona lo que considero la información más relevante para LLMs. Y a quién no le gusta construir soluciones complicadas.
🎯 Qué Hace
Recupera datos de red estructurados en formato JSON:
- 🔄 Enrutamiento: Protocolos BGP, ISIS y estados de vecinos
- 🔌 Interfaces: Estado, configuración y estadísticas
- 🏷️ MPLS: Etiquetas, tablas de reenvío y segment routing
- 🔒 VPN/VRF: Configuración L3VPN y route targets
- 📝 Registros: Registros de dispositivos filtrados con búsqueda por palabras clave
- 🏠 Topología: Vecinos de dispositivos y análisis de topología de red
Consulta la definición de la API para todas las APIs y opciones disponibles.
⚡ Requisitos previos
- Python
3.13+ uv, consulta la documentación para instalarlo.brewes recomendado para usuarios de macOS
- Dispositivos de red con gNMI habilitado.
Usuarios de Windows: El repositorio requiere un entorno similar a Unix. Usa WSL.
Compatibilidad de Dispositivos
Probado en:
- Cisco XRd Control Plane (
24.4.1.26I,25.3.1)
[!NOTE] La función
get_logs()solo funciona en IOS-XR.
Los dispositivos deben soportar gNMI y los modelos OpenConfig que se enumeran a continuación:
Dependencias de modelos OpenConfig
openconfig-system >= 0.17.1openconfig-interfaces >= 3.0.0openconfig-network-instance >= 1.3.0
[!NOTE] Si el modelo requerido para una función no se encuentra, gNMIBuddy devolverá un error. Si la versión del modelo es anterior a la requerida, continuará la ejecución pero advertirá al usuario sobre posibles errores.
Puedes usar el comando de capacidades para verificar los modelos soportados en un dispositivo específico. Si tienes muchos dispositivos, puedes usar la opción --device.
uvx --from git+https://github.com/jillesca/gNMIBuddy.git \
gnmibuddy device capabilities --all-devices
Archivo de Inventario de Dispositivos
gNMIBuddy identifica los dispositivos por nombre de host y busca sus direcciones IP y credenciales correspondientes en el archivo de inventario.
[!CAUTION] Sin un archivo de inventario de dispositivos, gNMIBuddy no puede operar.
Proporciona el inventario de dispositivos mediante --inventory PATH o establece la variable de entorno NETWORK_INVENTORY.
[!TIP] Almacena las variables de entorno en un archivo
.env.
El inventario debe ser una lista JSON de objetos Device con estos campos obligatorios:
name: Nombre de host del dispositivoip_address: IP para conexiones gNMInos: Identificador del sistema operativo de rediosxrsolo por ahora, úsalo incluso si tienes otro NOS. Se agregarán más más adelante.
Autenticación (elige un método):
- Usuario/Contraseña: Requiere los campos
usernameypassword - Basado en certificados: Requiere los campos
path_certypath_key
Esquema: src/schemas/models.py | Ejemplo: xrd_sandbox.json
[
{
"name": "xrd-1",
"ip_address": "10.10.20.101",
"nos": "iosxr",
"username": "cisco",
"password": "C1sco12345"
},
{
"name": "xrd-2",
"ip_address": "10.10.20.102",
"nos": "iosxr",
"path_cert": "/opt/certs/device.pem",
"path_key": "/opt/certs/device.key"
}
]
[!TIP] Valida tu inventario: Usa
gnmibuddy inventory validatepara verificar que tu archivo de inventario tenga el formato adecuado, direcciones IP válidas, campos obligatorios y configuración de autenticación antes de ejecutar comandos de red.
🚀 Inicio Rápido
🎯 Pruebas Instantáneas con MCP Inspector
La forma más rápida de probar gNMIBuddy:
# Replace `xrd_sandbox.json` with your actual inventory file
echo '#!/usr/bin/env bash' > /tmp/gnmibuddy-mcp-wrapper \
&& echo 'exec uvx --from git+https://github.com/jillesca/gNMIBuddy.git gnmibuddy-mcp "$@"' >> /tmp/gnmibuddy-mcp-wrapper \
&& chmod +x /tmp/gnmibuddy-mcp-wrapper \
&& NETWORK_INVENTORY=xrd_sandbox.json npx @modelcontextprotocol/inspector /tmp/gnmibuddy-mcp-wrapper
[!TIP] ¡Sin clonar el repositorio, sin configuración de cliente MCP! Si no tienes XRd, consulta Pruebas con DevNet Sandbox.
🔌 ¿Tienes un Cliente MCP? (VSCode, Cursor, Claude Desktop)
Recomendado: Sin instalación requerida - se ejecuta directamente desde GitHub usando uvx:
| Cliente MCP | Configuración |
|---|---|
| VSCode | 📋 Copiar configuración |
| Clientes MCP estándar | 📋 Copiar configuración |
Para Desarrollo - cuando necesitas probar cambios locales:
| Cliente MCP | Configuración |
|---|---|
| VSCode | 📋 Copiar configuración |
| Clientes MCP estándar | 📋 Copiar configuración |
La configuración de "Clientes MCP estándar" funciona con cualquier cliente MCP que siga la especificación MCP (Cursor, Claude Desktop, etc.). VSCode usa un formato diferente.
Configuración:
- Configuraciones uvx: Actualiza la ruta
NETWORK_INVENTORYa tu archivo de inventario - Configuraciones de desarrollo: Actualiza la ruta
NETWORK_INVENTORYycwda tu directorio de proyecto local
🛠️ Uso de CLI (Uso Directo de la Herramienta)
Para usuarios de CLI que quieran usar gNMIBuddy como herramienta de línea de comandos:
Ejecución única
# Run directly without installation
uvx --from git+https://github.com/jillesca/gNMIBuddy.git gnmibuddy --help
# Example with commands
uvx --from git+https://github.com/jillesca/gNMIBuddy.git gnmibuddy --inventory your_inventory.json device list
Instalar como herramienta persistente
# Install the tool globally
uv tool install git+https://github.com/jillesca/gNMIBuddy.git
# Use it directly
gnmibuddy --help
gnmibuddy device info --device R1
# Uninstall when no longer needed
uv tool uninstall gnmibuddy
# To get updates
uv tool upgrade gnmibuddy
El método uvx compila y ejecuta automáticamente la herramienta en un entorno aislado sin afectar tu sistema.
🐳 Ejecución como Contenedor
Compila y ejecuta gNMIBuddy como imagen de contenedor usando los objetivos Makefile proporcionados. El Makefile detecta automáticamente Docker o Podman (Docker preferido); anula con CONTAINER_ENGINE=docker o CONTAINER_ENGINE=podman si necesitas forzar uno.
El inventario de dispositivos se proporciona en tiempo de ejecución como un archivo montado.
# Build the image (no inventory needed)
make build
# Run it, mounting your inventory file read-only into the container
# or set the NETWORK_INVENTORY in a .env file
make run NETWORK_INVENTORY=/path/to/inventory.json
# Tail logs / stop the container
make logs
make stop
[!TIP] Ejecuta
make helppara el resto de los objetivos (restart,shell,clean,fresh).
Puedes probarlo localmente con modelcontextprotocol/inspector.
npx @modelcontextprotocol/inspector --transport http --server-url http://0.0.0.0:8000/mcp
Ejecución en Kubernetes
El contenedor espera un archivo de inventario de dispositivos en la ruta de la variable de entorno NETWORK_INVENTORY (/app/inventory.json por defecto). No hay un manifiesto de Kubernetes incluido — el mecanismo exacto depende de tu clúster — pero el requisito es genérico:
- Compila la imagen con cualquier compilador compatible con OCI (Docker, Buildah, Kaniko,
docker buildx, el paso de compilación de tu propio CI, etc.). ElContainerfilees estándar y no contiene datos específicos del dispositivo, por lo que la imagen resultante es segura para enviar a tu registro. - Almacena el inventario como un
Secretde Kubernetes. - Monta ese
Secretcomo volumen en el pod en/app/inventory.json(o móntalo en otro lugar y apuntaNETWORK_INVENTORYa esa ruta mediante el entorno del pod).
📖 Referencia de CLI
# Clone and setup (one-time only)
git clone https://github.com/jillesca/gNMIBuddy.git && cd gNMIBuddy
# Install dependencies
uv sync --frozen --no-dev
❯ uv run gnmibuddy.py --help
▗▄▄▖▗▖ ▗▖▗▖ ▗▖▗▄▄▄▖▗▄▄▖ ▗▖ ▗▖▗▄▄▄ ▗▄▄▄▗▖ ▗▖
▐▌ ▐▛▚▖▐▌▐▛▚▞▜▌ █ ▐▌ ▐▌▐▌ ▐▌▐▌ █▐▌ █▝▚▞▘
▐▌▝▜▌▐▌ ▝▜▌▐▌ ▐▌ █ ▐▛▀▚▖▐▌ ▐▌▐▌ █▐▌ █ ▐▌
▝▚▄▞▘▐▌ ▐▌▐▌ ▐▌▗▄█▄▖▐▙▄▞▘▝▚▄▞▘▐▙▄▄▀▐▙▄▄▀ ▐▌
An opinionated tool that retrieves essential network information from devices using gNMI and OpenConfig models.
Designed primarily for LLMs with Model Context Protocol (MCP) integration, it also provides a full CLI.
Help: https://github.com/jillesca/gNMIBuddy
Python Version: 3.13.4
gNMIBuddy Version: 0.1.0
Usage:
gnmibuddy.py [OPTIONS] COMMAND [ARGS]...
📋 Inventory Requirement:
Provide device inventory via --inventory PATH, set NETWORK_INVENTORY env var, or use .env file (configurable with --env-file PATH)
Options:
-h, --help Show this message and exit
-V, --version Show version information
--log-level LEVEL Set logging level (debug, info, warning, error)
--module-log-help Show detailed module logging help
--all-devices Run on all devices concurrently
--inventory PATH Path to inventory JSON file
-e, --env-file PATH Path to .env file for configuration (default: .env in project root)
--max-workers NUMBER Maximum number of concurrent workers for batch operations (--all-devices, --devices, --device-file)
Commands:
device (d) Device Information
capabilities Get gNMI capabilities from a network device
info Get system information from a network device
list List all available devices in the inventory
profile Get device profile and role information
network (n) Network Protocols
interface Get interface status and configuration
mpls Get MPLS forwarding and label information
routing Get routing protocol information (BGP, ISIS, OSPF)
vpn Get VPN/VRF configuration and status
topology (t) Network Topology
neighbors Get direct neighbor information via LLDP/CDP
adjacency Get network-wide IP adjacency analysis for complete topology
network Get complete network topology information. Queries all devices in inventory.
ops (o) Operations
logs Retrieve and filter device logs
validate Validate all collector functions (development tool)
inventory (i) Inventory Management
validate Validate inventory file format and schema
Examples:
gnmibuddy.py device info --device R1
gnmibuddy.py network routing --device R1
gnmibuddy.py --all-devices device list
gnmibuddy.py inventory validate --inventory inventory.json
gnmibuddy.py --env-file production.env device list
gnmibuddy.py --env-file dev.env --log-level debug device info --device R1
Run 'gnmibuddy.py COMMAND --help' for more information on a command.
🤖 Desarrollo
Pruebas Rápidas con MCP Inspector
Recomendado: Usa uvx (sin necesidad de clonar el repositorio):
# Replace `xrd_sandbox.json` with your actual inventory file
echo '#!/usr/bin/env bash' > /tmp/gnmibuddy-mcp-wrapper \
&& echo 'exec uvx --from git+https://github.com/jillesca/gNMIBuddy.git gnmibuddy-mcp "$@"' >> /tmp/gnmibuddy-mcp-wrapper \
&& chmod +x /tmp/gnmibuddy-mcp-wrapper \
&& NETWORK_INVENTORY=xrd_sandbox.json npx @modelcontextprotocol/inspector /tmp/gnmibuddy-mcp-wrapper
EOF
Para desarrollo local (probar cambios no confirmados):
# Run from your gNMIBuddy project directory (where pyproject.toml is located)
cd /path/to/your/gNMIBuddy && \
NETWORK_INVENTORY=your_inventory.json \
npx @modelcontextprotocol/inspector \
uv run --frozen gnmibuddy-mcp
Configuración del Cliente MCP
Elige el enfoque que se adapte a tus necesidades:
| Caso de Uso | VSCode | Clientes MCP estándar |
|---|---|---|
| Producción/Pruebas | 📋 Copiar configuración | 📋 Copiar configuración |
| Desarrollo Local | 📋 Copiar configuración | 📋 Copiar configuración |
La configuración de Clientes MCP estándar funciona con Cursor, Claude Desktop y cualquier otro cliente que siga la especificación MCP. VSCode requiere un formato específico.
Requisitos de configuración:
- Configuraciones uvx: Solo actualiza la ruta
NETWORK_INVENTORYa tu archivo de inventario - Configuraciones de desarrollo: Actualiza tanto la ruta
NETWORK_INVENTORYcomocwda tu directorio de proyecto local
🧪 Pruebas con DevNet Sandbox
¿No tienes dispositivos de red? Usa el DevNet XRd Sandbox, sigue las instrucciones para levantar una red de segment routing con gNMI configurado.
Usa el archivo de inventario xrd_sandbox.json para conectarte a los dispositivos XRd que se ejecutan en DevNet Sandbox.
Si gNMI no está habilitado, puedes habilitarlo con los siguientes comandos:
# If you cloned the repo
# Enable gRPC on the DevNet XRd Sandbox
ANSIBLE_HOST_KEY_CHECKING=False \
uvx --from "ansible-core==2.19.2" --with "paramiko,ansible" \
ansible-playbook ansible-helper/xrd_apply_config.yaml -i ansible-helper/hosts
Pruebas con Agentes de IA
¿Quieres ver cómo esta herramienta MCP se integra con agentes de IA reales? Consulta sp_oncall - un grafo de agentes que usan gNMIBuddy para demostrar escenarios reales de operaciones de red.
📋 Formato de Respuesta
gNMIBuddy proporciona respuestas estructuradas y consistentes para todas las operaciones de red. El formato de respuesta depende de si te diriges a un solo dispositivo o a múltiples dispositivos.
Operaciones de Dispositivo Único
Las operaciones de dispositivo único devuelven un objeto NetworkOperationResult con información detallada sobre la operación, incluidos estado, datos, metadatos y manejo de errores.
@dataclass
class NetworkOperationResult:
device_name: str
ip_address: IPAddress
nos: NetworkOS
operation_type: str
status: OperationStatus
data: Dict[str, Any] = field(default_factory=dict)
metadata: Dict[str, Any] = field(default_factory=dict)
error_response: Optional[ErrorResponse] = None
feature_not_found_response: Optional[FeatureNotFoundResponse] = None
Operaciones por Lotes
Las operaciones por lotes (usando --all-devices, --devices o --device-file) devuelven un objeto BatchOperationResult que contiene:
results: Una lista de objetosNetworkOperationResult, uno por cada dispositivosummary: Estadísticas agregadas sobre la operación por lotesmetadata: Metadatos adicionales de la operación por lotes
@dataclass
class BatchOperationResult:
results: List[NetworkOperationResult] # One result per device
summary: BatchOperationSummary
metadata: Dict[str, Any] = field(default_factory=dict)
Para más detalles, consulta la definición del esquema de respuesta.
🏗️ Arquitectura
Organización de Esquemas
gNMIBuddy utiliza un enfoque de esquemas centralizados para los contratos de datos:
src/schemas/: Contiene todos los modelos de datos compartidos y contratos de respuesta.src/collectors/: Recopiladores de datos de telemetría de red que siguen patrones de OpenTelemetry.src/processors/: Procesadores de transformación de datos que siguen patrones de OpenTelemetry.
Estos esquemas sirven como contratos entre diferentes partes del sistema, asegurando consistencia en:
- Interfaces CLI y API.
- Respuestas de operaciones de red.
- Manejo de errores y reporte de estado.
- Integración de herramientas MCP.
Pipeline de Procesamiento de Datos
La aplicación sigue una arquitectura inspirada en OpenTelemetry:
Raw gNMI Data → Collector → Processor → Schema → Response
- Recopiladores obtienen datos de los dispositivos de red mediante gNMI.
- Procesadores transforman datos sin procesar en formatos estructurados y amigables para LLMs.
- Esquemas aseguran contratos de datos consistentes en todo el sistema.
- Respuestas proporcionan salida estandarizada para interfaces CLI, API y MCP.
⚙️ Variables de Entorno
gNMIBuddy admite variables de entorno para configuración, que funcionan tanto para uso CLI como para servidor MCP. Las variables de entorno se pueden cargar desde:
- Argumentos de línea de comandos (mayor prioridad)
- Variables de entorno del sistema operativo
- Archivos
.env(por defecto:.enven la raíz del proyecto) - Valores predeterminados (menor prioridad)
Soporte de Archivos .env
gNMIBuddy carga automáticamente variables de entorno desde un archivo .env en la raíz del proyecto. Puedes especificar un archivo .env personalizado usando la opción --env-file:
# Use default .env file
gnmibuddy device list
# Use custom environment file
gnmibuddy --env-file production.env device list
Ejemplo:
# .env file
# Network configuration
NETWORK_INVENTORY=/path/to/inventory.json
# Logging configuration
GNMIBUDDY_LOG_LEVEL=debug
GNMIBUDDY_MODULE_LEVELS=src.cmd=warning,src.inventory=debug
GNMIBUDDY_STRUCTURED_LOGGING=true
GNMIBUDDY_LOG_FILE=/custom/log/path.log
GNMIBUDDY_EXTERNAL_SUPPRESSION_MODE=development
# MCP debugging
GNMIBUDDY_MCP_TOOL_DEBUG=true
Configuración Global
| Variable | Descripción | Valores | Default |
|---|---|---|---|
NETWORK_INVENTORY | Ruta del archivo de inventario de dispositivos | Ruta de archivo | - |
GNMIBUDDY_LOG_LEVEL | Nivel de registro global | debug, info, warning, error | info |
GNMIBUDDY_MODULE_LEVELS | Niveles de registro específicos por módulo | module1=debug,module2=warning | - |
GNMIBUDDY_LOG_FILE | Ruta de archivo de registro personalizada (anula la secuencial) | Ruta de archivo | logs/gnmibuddy_XXX.log |
GNMIBUDDY_STRUCTURED_LOGGING | Habilitar registro JSON | true, false | false |
GNMIBUDDY_EXTERNAL_SUPPRESSION_MODE | Supresión de bibliotecas externas | cli, mcp, development | cli |
GNMIBUDDY_MCP_TOOL_DEBUG | Habilitar depuración de herramientas MCP | true, false | false |
Archivos de registro secuenciales: gNMIBuddy crea automáticamente archivos de registro numerados (gnmibuddy_001.log, gnmibuddy_002.log, etc.) para cada ejecución en el directorio logs/. El número más alto siempre corresponde a la ejecución más reciente.
[!NOTE] Las variables de entorno sirven como valores predeterminados y pueden ser anuladas por argumentos de línea de comandos como
--log-levely--module-log-levels.
Para opciones detalladas de configuración de entorno y uso avanzado, consulta Guía de configuración de entorno
Para documentación completa de variables de entorno de registro, consulta README de registro
⚙️ Operaciones por lotes y concurrencia
gNMIBuddy admite ejecutar comandos en múltiples dispositivos simultáneamente con controles de concurrencia configurables para optimizar el rendimiento y evitar la limitación de velocidad.
Opciones de operaciones por lotes
Selección de dispositivos:
--device DEVICE: Operación en un solo dispositivo--devices device1,device2,device3: Lista de dispositivos separada por comas--device-file path/to/devices.txt: Lista de dispositivos desde archivo (uno por línea)--all-devices: Ejecutar en todos los dispositivos del inventario
Controles de concurrencia:
--max-workers N: Máximo de dispositivos concurrentes a procesar (predeterminado: 5)--per-device-workers N: Máximo de operaciones concurrentes por dispositivo (predeterminado: varía según el comando)
Comprendiendo los niveles de concurrencia
gNMIBuddy opera con dos niveles de concurrencia:
- Concurrencia a nivel de dispositivo (
--max-workers): Cuántos dispositivos procesar simultáneamente - Concurrencia por dispositivo (específica del comando): Cuántas operaciones ejecutar simultáneamente en cada dispositivo
Total de solicitudes concurrentes = max_workers × operaciones_por_dispositivo
Ejemplos
# Process 3 devices, 2 operations per device = 6 total requests
uv run gnmibuddy.py --max-workers 3 ops validate --devices xrd-1,xrd-2,xrd-3 --per-device-workers 2