Skip to main content
Glama

ArubaOS-CX MCP Server (hpe-cx-mcp)

Un servidor Model Context Protocol (MCP) que expone los conmutadores Aruba CX (AOS-CX) a agentes de IA compatibles con MCP (Claude, VS Code Copilot, etc.). Convierte la API REST del conmutador (/rest/v10.x) y la CLI SSH en un conjunto seleccionado de herramientas seguras y estructuradas para la observabilidad, el diagnóstico y la configuración de un tejido de campus / centro de datos (VLANs, enrutamiento, BGP/OSPF, EVPN-VXLAN, VSX/VSF, acceso de puerto / 802.1X, NAE, ARC…).

El servidor se ejecuta como un contenedor Docker, habla MCP sobre streamable HTTP e incluye autenticación opcional con tokens Bearer con nombre y registro de auditoría JSON.


Inicio rápido

cd cx-mcp

# 1) Provide credentials (git-ignored)
cp .env.example .env                 # then edit: set ARUBA_DEFAULT_PASSWORD (and any source tokens)

# 2) Provide the device list (git-ignored)
cp inventory/inventory.example.yaml inventory/inventory.yaml   # then edit: your switches & IPs

# 3) Build and start
docker compose up -d --build

# 4) Watch it come up
docker compose logs -f hpe-cx-mcp    # wait for "✅ hpe-cx-mcp server is up and running"

El endpoint MCP queda disponible en http://<docker-host>:8002/mcp. Apunte su cliente MCP a esa dirección (ver §9). Los detalles completos y las notas por plataforma se encuentran en §3.


Related MCP server: API-Central

Tabla de contenido

  1. Qué hace este servidor

  2. Herramientas disponibles

  3. Instalación (macOS / Linux / Windows)

  4. Volúmenes

  5. Variables de entorno

  6. Gestión del inventario

  7. Seguridad: autenticación Bearer y registro de auditoría

  8. Gestión de tokens

  9. Conexión de un cliente MCP


1. Qué hace este servidor

  • Punto de entrada único a un parque de conmutadores AOS-CX descritos en un inventario.

  • Lectura (observación): interfaces, VLANs, tablas de enrutamiento/ARP/MAC, BGP/OSPF/EVPN, túneles VXLAN, estado de pila VSX/VSF, salud del hardware, registros, 802.1X / acceso de puerto, scripts NAE, reconocimiento de aplicaciones (ARC), configuraciones completas.

  • Escritura (configuración): servicios VLAN, loopbacks, puertos enrutados, VRFs, BGP, OSPF, EVPN/VXLAN, autenticación de puerto, MAC virtual, ARC — cada uno combinado con una herramienta de verificación verify_*.

  • Medidas de seguridad:

    • Por dispositivo access_mode (read-only por defecto; se deniegan las escrituras salvo que un dispositivo sea explícitamente read-write).

    • Operaciones acotadas por sitio (parámetro site) para actuar sobre un grupo de dispositivos.

    • Detección de comandos de escritura por SSH para bloquear cambios de configuración a través de la CLI en bruto en dispositivos de solo lectura.

  • Inventario dinámico: fusiona el archivo local con las fuentes de verdad NetBox / Nautobot, con resolución opcional de credenciales mediante HashiCorp Vault.


2. Herramientas disponibles

Las herramientas se agrupan por finalidad. Las herramientas de lectura requieren que un dispositivo sea accesible; las de escritura requieren además que el dispositivo sea read-write.

Inventario y sesiones

Herramienta

Función

list_devices

Listar los dispositivos del inventario (filtro opcional site).

list_sites

Listar los sitios y sus dispositivos asociados.

list_inventory_sources

Listar las fuentes configuradas y su prioridad (probe para probar la accesibilidad).

find_devices

Buscar dispositivos por nombre/sitio/tenant/etiqueta/campo personalizado en todas las fuentes.

resolve_device

Resolver un dispositivo por nombre o IP de gestión en todas las fuentes.

refresh_inventory

Recargar el archivo local y volver a obtener las fuentes externas.

run_on_site

Ejecutar un diagnóstico de solo lectura en cada dispositivo de un sitio.

logout

Cerrar las sesiones REST/SSH agrupadas (llamar al final de un flujo de trabajo).

Acceso en bruto (vías de escape)

Herramienta

Función

run_ssh_command / run_ssh_commands

Principal vía de escape de la CLI: ejecutar comandos CLI arbitrarios a través de SSH (salida no expuesta por REST).

run_cli_command

Respaldo para comandos show mediante /cli (REST/443) — usar cuando SSH/22 no esté disponible; /cli es limitado y rechaza muchos comandos.

get_cli_supported_commands

Intentar listar los comandos CLI admitidos mediante REST /cli.

get_raw_api

Realizar un GET en bruto contra una ruta REST arbitraria.

Sistema y hardware

get_system_info, get_hardware_health, get_boot_history, get_transceivers, get_ssh_config, get_logs.

Contenedores y licencias

get_containers (contenedores de aplicaciones en el conmutador: estado, imagen, límites de CPU/memoria, redes VRF), get_feature_pack (estado de licencias / suscripción: modo de gestión, validez, caducidad, control por funcionalidad).

Gestión en la nube

get_aruba_central (estado de conexión de HPE ANW Central / Aruba Central: conectado, instanciación, fuente de configuración, ubicación, VRF/IP de origen, conectividad Activate).

Estado L2 / L3

get_interfaces, get_loopbacks, get_routed_ports, get_vlan_interfaces, get_vlans, get_lldp_neighbors, get_mac_table, get_arp_table, get_routing_table, get_spanning_tree.

Protocolos de enrutamiento

get_bgp_neighbors, get_bgp_config, get_bgp_routes, get_ospf_overview, get_ospf_neighbors, get_ospf_interfaces.

EVPN / VXLAN

get_evpn_config, get_evpn_routes, get_evpn_multihoming, get_vxlan_config, get_vxlan_tunnels, get_vxlan_static_peers, get_evpn_vtep_neighbors.

Alta disponibilidad (VSX / VSF)

get_vsx_status, get_vsx_config, get_vsx_sync, get_vsf_status, get_vsf_config, get_maintenance_mode.

NAE (Network Analytics Engine)

get_nae_scripts, get_nae_script, get_nae_agents, get_nae_agent.

Acceso de puerto / AAA / 802.1X

get_port_access_clients, get_port_access_client_detail, get_port_access_auth_config, get_port_access_summary, get_port_access_policies, get_port_access_roles, get_port_access_gbps, get_gbp_role_maps, get_port_access_abps, get_radius_servers, get_tacacs_servers, get_aaa_authentication, get_aaa_accounting.

Reconocimiento y control de aplicaciones (ARC)

get_app_recognition, get_app_visibility.

Gestión de configuración

list_configs, get_config, get_full_config, compare_configs, manage_config (guardar / checkpoint / rollback).

Configuración (escritura) + pares de verificación

Cada herramienta configure_* tiene una herramienta de verificación verify_* asociada:

Configuración

Verificación

Alcance

create_vlan_service / delete_vlan_service

VLAN + SVI opcional

configure_loopback

verify_loopback

Dispatcher

Valores de scope

get_system

info, inventory, environment, capacity, boot, maintenance, containers, feature_pack, central, ssh

get_interfaces

physical, transceivers, loopbacks, routed, svi, lag

get_switching

vlans, mac, lldp, spanning_tree

get_routing

bgp_summary, bgp_neighbors, bgp_config, bgp_routes, ospf_overview, ospf_neighbors, ospf_interfaces, route_table, arp

get_overlay

evpn_config, evpn_routes, evpn_multihoming, vtep_neighbors, vxlan_config, vxlan_tunnels, vxlan_static_peers

get_redundancy

vsx_status, vsx_config, vsx_sync, vsf_status, vsf_config

get_access

clients, client_detail, auth_config, summary, roles, gbp, gbp_maps, abp, policies, radius, tacacs, authentication, accounting

get_automation

nae_scripts, nae_script, nae_agents, nae_agent

get_apps

recognition, visibility

get_config

running, startup, full, list, compare, raw

manage_inventory

sources, resolve, refresh, find

configure_interface

loopback, routed_port, vxlan, virtual_macaction: plan/apply/verify

configure_routing

ospf, bgp, vrf, evpnaction: plan/apply/verify

configure_security

port_auth, aaa, user_roles, app_recognitionaction: plan/apply/verify

configure_service

vlanaction: plan/apply/delete/delete_plan/verify

diagnose

device, evpn, client (paquete determinista de múltiples comprobaciones)

Además, 7 herramientas atómicas conservadas: list_devices, list_sites, get_logs, run_ssh_commands, manage_config, logout, rollback. Los dispatchers de escritura mantienen el ciclo de vida plan → apply → verify y la protección de solo lectura por dispositivo. Los campos de dominio se pasan en un objeto params (claves documentadas en el docstring de cada dispatcher).

Herramientas atómicas heredadas (CX_FLAT_TOOLSET=false). Se expone en su lugar el catálogo completo por herramienta descrito arriba, opcionalmente configurado por las tres capas siguientes. Úselo para una reversión instantánea al comportamiento anterior.

Divulgación progresiva, prefijos funcionales y seguridad de escritura (solo modo heredado)

Tres capas opcionales (activas solo cuando CX_FLAT_TOOLSET=false, cada una controlada por su propia variable de entorno — consulte §5) configuran cómo se exponen las herramientas heredadas:

1. Divulgación progresiva (CX_DEFERRED_TOOLS) — en lugar de anunciar el catálogo completo (más de 100 herramientas), el servidor publica solo ~27 herramientas de Nivel 1 (las herramientas de lectura/diagnóstico más usadas, las vías de escape, los orquestadores y las meta-herramientas). Todas las demás herramientas están diferidas (Nivel 2) y se alcanzan bajo demanda mediante dos meta-herramientas:

Meta-herramienta

Rol

search_tools

Descubre herramientas diferidas por palabra clave. Devuelve el nombre, la descripción, las etiquetas, el indicador write y los parámetros JSON-Schema de cada coincidencia.

invoke_tool

Ejecuta una herramienta diferida por nombre con un objeto arguments que coincida con su esquema. Devuelve {ok, tool, result}.

Esto mantiene la lista de herramientas del agente pequeña y económica, dejando toda la superficie accesible.

2. Prefijos funcionales (CX_TOOL_PREFIXES) — las herramientas anunciadas se renombran <dominio>__<herramienta> para agruparlas por dominio, p. ej. routing__get_bgp_neighbors, overlay__configure_evpn, service__create_vlan_service, meta__invoke_tool. Dominios: inventory, exec, system, interface, switching, routing, overlay, redundancy, security, app, nae, config, service, meta. invoke_tool acepta tanto el nombre con prefijo como el nombre simple.

3. Seguridad de escritura (CX_WRITE_SAFETY) — un flujo de trabajo vista-previa→aplicación con reversión:

Meta-herramienta

Rol

apply_plan

Aplica una escritura previsualizada mediante su dry_run_token. Vuelve a previsualizar para confirmar que el plan no ha cambiado (protección TOCTOU) y luego aplica y devuelve un rollback_id cuando el plan es reversible.

rollback

Deshace una escritura aplicada reversible mediante su rollback_id (reproduce las acciones inversas de la última creada a la primera; actualmente el flujo de trabajo de servicio VLAN).

Flujo de trabajo: llame a cualquier herramienta de escritura con apply=false (el valor predeterminado) para obtener un plan y un dry_run_token; luego llame a apply_plan(dry_run_token=…) para aplicar ese plan exacto. Las fusiones idempotentes de configure_* no tienen inverso automático y se notifican como unsupported por rollback. Cuando CX_REQUIRE_DRY_RUN_TOKEN=true, se rechaza una aplicación directa (apply=true) a través de invoke_tool — los llamadores deben pasar por la ruta vista-previa→apply_plan.


3. Instalación (macOS / Linux / Windows)

Requisitos previos

  • Docker y Docker Compose v2 (docker compose …).

    • macOS / Windows: Docker Desktop.

    • Linux: Docker Engine + el plugin de Compose.

  • Conectividad de red desde el host de Docker hasta las IPs de gestión de los switches (HTTPS/443 para REST, TCP/22 para SSH).

  • El acceso REST debe estar configurado en los dispositivos de destino y en la VRF correcta: en modo Read-Write para acceso de lectura y escritura, y en modo Read-only para acceso de solo lectura.

  • El acceso SSH también debe estar configurado en los dispositivos de destino para las herramientas que lo requieran.

Configuración (primera ejecución)

Los secretos y los ajustes específicos del despliegue viven fuera de docker-compose.yml, en archivos que están ignorados por git para que nunca se confirmen. Se incluyen dos plantillas: copie cada una y complétela:

cd cx-mcp

# 1) Credentials & external source tokens  →  .env  (git-ignored)
cp .env.example .env
#    then edit .env and set at least ARUBA_DEFAULT_PASSWORD

# 2) Device inventory  →  inventory/inventory.yaml  (git-ignored)
cp inventory/inventory.example.yaml inventory/inventory.yaml
#    then edit it: list your switches, their IPs and per-device access_mode

.env se inyecta en el contenedor mediante env_file: en docker-compose.yml. Contenido mínimo (consulte .env.example para la lista completa):

ARUBA_DEFAULT_USERNAME=admin
ARUBA_DEFAULT_PASSWORD=your-switch-password
ARUBA_API_VERSION=latest
# Optional external sources of truth (leave empty if unused):
NETBOX_URL=
NETBOX_TOKEN=
INFRAHUB_URL=
INFRAHUB_TOKEN=

Nunca confirme .env ni inventory/inventory.yaml — contienen credenciales reales e IPs de dispositivos. Solo las plantillas *.example están controladas por git.

Compilar e iniciar (todas las plataformas)

cd cx-mcp
docker compose up -d --build

El servidor escucha en http://<host>:8002/mcp (puerto del host 8002 → contenedor 8000, consulte docker-compose.yml). La imagen se compila como hpe-cx-mcp:latest y se ejecuta como el contenedor hpe-cx-mcp.

Compruebe que está en ejecución:

docker compose logs -f hpe-cx-mcp
# look for, in order:
#   "Uvicorn running on http://0.0.0.0:8000"
#   "✅ hpe-cx-mcp server is up and running on http://0.0.0.0:8000 — if your agent
#    already has an open MCP connection, reset it (MCP: Disconnect → Connect) …"

La línea ✅ … server is up and running se emite una vez que el listener está listo. Si el inicio falla, el servidor registra ❌ hpe-cx-mcp server failed to start seguido del traceback completo (y luego sale con código distinto de cero).

Nota: cada docker compose up -d --build recompila la imagen y reinicia el servidor, lo que invalida cualquier sesión MCP existente. Después de una recompilación, vuelva a conectar su cliente (MCP: Disconnect → Connect) para recoger las herramientas actuales.

Notas por plataforma

Linux

  • Las carpetas montadas por bind mount pertenecen a su usuario del host. El contenedor se ejecuta como uid 1000; si su usuario del host no es uid 1000, haga que las carpetas de escritura sean legibles/escribibles por uid 1000:

    mkdir -p logs secrets
    sudo chown -R 1000:1000 logs secrets
    chmod 700 secrets
  • Para alcanzar los switches en la red L2 local del host, puede descomentar network_mode: host en docker-compose.yml (solo Linux).

macOS (Docker Desktop)

  • El uso compartido de archivos lo gestiona la VM; los bind mounts funcionan sin configuración adicional y el re-mapeo de uid es automático — no se necesita chown manual en la mayoría de los casos.

  • network_mode: host no se admite de la misma manera que en Linux; mantenga la asignación ports: predeterminada (8002:8000).

Windows (Docker Desktop + WSL2)

  • Ejecute los comandos desde un shell de WSL2 o PowerShell. Se recomienda encarecidamente almacenar el proyecto dentro del sistema de archivos de WSL2 (p. ej. \\wsl$\… / ~/cx-mcp) para obtener permisos de archivo y rendimiento correctos.

  • Use barras diagonales en las rutas de volumen de docker-compose.yml (./inventory:/app/inventory:ro).

  • network_mode: host no está disponible; mantenga la asignación ports:.


4. Volúmenes

Tres carpetas del host se montan en el contenedor:

Ruta del host

Ruta del contenedor

Modo

Propósito

./inventory

/app/inventory

solo lectura (:ro)

Inventario de dispositivos (inventory.yaml). Solo lectura para que el servidor nunca pueda modificarlo.

./logs

/app/logs

lectura-escritura

Salida del registro de auditoría (audit.jsonl) cuando la auditoría está habilitada.

./secrets

/app/secrets

lectura-escritura

Tokens Bearer con nombre (.tokens, permisos 0600).

volumes:
  - ./inventory:/app/inventory:ro
  - ./logs:/app/logs
  - ./secrets:/app/secrets

El código de la aplicación está integrado en la imagen — solo se montan estas carpetas de datos. Después de cambiar cualquier *.py, recompile con docker compose up -d --build (un reinicio simple no es suficiente).

Propiedad (Linux): logs/ y secrets/ deben ser escribibles por el uid 1000 del contenedor. secrets/ debe tener permisos 0700 y su archivo .tokens lo escribe el propio servidor con permisos 0600.


5. Variables de entorno

Los secretos y los valores específicos del despliegue (credenciales, tokens de fuentes externas) se proporcionan a través del archivo .env ignorado por git, que docker-compose.yml carga mediante env_file: (copie .env.example a .env, consulte §3). Los indicadores operativos no secretos (MCP_*, CX_*, INVENTORY_FILE) se establecen directamente en docker-compose.yml bajo environment:. Los booleanos aceptan true/1/yes/on.

Transporte

Variable

Default

Description

MCP_TRANSPORT

streamable-http

Transporte MCP.

MCP_HOST

0.0.0.0

Dirección de enlace dentro del contenedor.

MCP_PORT

8000

Puerto de enlace dentro del contenedor (mapeado al host 8002).

CX_MCP_PATH

/mcp

Ruta URL protegida por el middleware de seguridad.

Credenciales de dispositivo y API (definidas en .env; se pueden anular por dispositivo en el inventario)

Variable

Default

Description

ARUBA_DEFAULT_USERNAME

admin

Nombre de usuario REST/SSH predeterminado.

ARUBA_DEFAULT_PASSWORD

(vacío)

Contraseña predeterminada. Obligatoria a menos que se establezca por dispositivo.

ARUBA_API_VERSION

v10.09

Versión predeterminada de la API REST (latest = detección automática).

ARUBA_SSH_PORT

22

Puerto SSH predeterminado.

Inventario y orígenes externos

Variable

Default

Description

INVENTORY_FILE

/app/inventory/inventory.yaml

Ruta al archivo de inventario (YAML/JSON/TOML).

NETBOX_URL / NETBOX_TOKEN

Conexión de origen NetBox (definida en .env).

NAUTOBOT_URL / NAUTOBOT_TOKEN

Conexión de origen Nautobot (definida en .env).

INFRAHUB_URL / INFRAHUB_TOKEN

Conexión de origen Infrahub (API GraphQL; definida en .env).

<NAME>_URL / <NAME>_TOKEN

Conexión genérica por origen con nombre.

VAULT_ADDR / VAULT_TOKEN

HashiCorp Vault para la resolución de credenciales.

Autenticación Bearer (opcional, DESACTIVADA por defecto)

Variable

Default

Description

CX_AUTH_ENABLED

false

Exigir un token Bearer válido en cada solicitud. Si se activa sin token aún, el servidor arranca en modo BLOQUEADO y rechaza toda solicitud MCP con HTTP 503 hasta que cree el primer token y reinicie.

CX_TOKENS_FILE

/app/secrets/.tokens

Ruta del almacén de tokens.

CX_TRUST_FORWARDED_FOR

false

Confiar en X-Forwarded-For (primer salto) para la IP del cliente. Establezca true solo detrás de un proxy inverso de confianza.

Registro de auditoría (opcional, DESACTIVADO por defecto)

Variable

Default

Description

CX_AUDIT_ENABLED

false

Emitir un registro JSON por cada llamada de herramienta.

CX_AUDIT_FILE

/app/logs/audit.jsonl

Archivo de salida (rotativo, 10 MB × 5).

CX_AUDIT_LEVEL

all

all = todas las llamadas; writes = solo herramientas que cambian el estado.

CX_AUDIT_STDOUT

false

También reflejar los registros en stdout (docker logs).

Divulgación progresiva, prefijos y seguridad de escritura (opcional)

Variable

Default

Description

CX_FLAT_TOOLSET

true

Contraer las ~101 herramientas atómicas en ~23 despachadores planos scope/action. Tiene prioridad: cuando está activado, se omiten las tres capas siguientes. Establezca false para volver a las herramientas atómicas heredadas.

CX_DEFERRED_TOOLS

false

(Solo modo heredado) Anunciar solo las herramientas de nivel 1; acceda al resto mediante search_tools / invoke_tool.

CX_TOOL_PREFIXES

false

(Solo modo heredado) Renombrar las herramientas anunciadas <domain>__<tool> (p. ej. routing__get_bgp_neighbors).

CX_INVOKE_WRITES

true

Permitir que las herramientas de escritura se ejecuten mediante invoke_tool.

CX_WRITE_SAFETY

false

Activar la vista previa dry_run_token + las metaherramientas apply_plan / rollback.

CX_REQUIRE_DRY_RUN_TOKEN

false

Rechazar un apply=true directo mediante invoke_tool; forzar la ruta vista previa → apply_plan.

CX_DRY_RUN_TTL

900

Vida útil (segundos) de un dry_run_token.

CX_SECRETS_DIR

<app>/secrets

Directorio para los almacenes de seguridad de escritura (.dry_run_plans.json, .rollback_journal.json). Establezca un directorio montado y escribible (p. ej. /app/logs).


6. Gestión del inventario

El archivo de inventario (inventory/inventory.yaml) declara los dispositivos y cómo acceder a ellos. Está ignorado por git (contiene IPs y credenciales reales); créelo una vez a partir de la plantilla incluida:

cp inventory/inventory.example.yaml inventory/inventory.yaml

Los valores del archivo anulan las variables de entorno. Formatos admitidos: YAML, JSON, TOML.

Ejemplo mínimo

defaults:
  username: admin
  password: "secret"
  api_version: latest        # auto-detect the newest REST version
  verify_ssl: false
  timeout: 30
  access_mode: read-only     # writes denied unless overridden per device

devices:
  Spine1:
    host: 192.0.2.21
    description: "Core switch"
    tags: [core, spine]
    site: campus-principal
    access_mode: read-write   # allow configuration changes on this device
  Access-01:
    host: 192.0.2.23
    site: campus-principal

Opciones por dispositivo

host (obligatorio), username, password, api_version, verify_ssl, timeout, tags, description, site, ssh_port, ssh_username, ssh_password, access_mode (read-only | read-write), vault (true para obtener credenciales de Vault).

Sitios

El concepto site es opcional y permite que las herramientas apunten a un grupo de dispositivos (list_devices(site=…), run_on_site(site, …)). Use un campo site: por dispositivo o un bloque sites: de nivel superior que agrupe dispositivos.

Opciones de origen del inventario

Hay varias formas de decidir de dónde proviene la lista de dispositivos:

  1. Solo local (predeterminado) — dispositivos del archivo:

    source: local        # may be omitted
  2. Origen externo único — extraer de una fuente de verdad:

    source: netbox
    sources:
      netbox:
        type: netbox            # netbox | nautobot | infrahub
        url: https://netbox.example.com
        token: "<api-token>"    # or via NETBOX_TOKEN env var
        verify_ssl: false
  3. Orígenes combinados con prioridad — un dispositivo presente en varios orígenes se toma del de mayor prioridad:

    source: [local, netbox]
    source_priority: [local, netbox]   # local wins over netbox

Prioridad de resolución de credenciales (de mayor a menor):

  1. Credenciales específicas del dispositivo definidas en la entrada del dispositivo.

  2. HashiCorp Vault (cuando vault está activado globalmente o por dispositivo).

  3. Variables de entorno / valores predeterminados del inventario.

Tras editar el inventario, aplique los cambios sin reconstruir mediante la herramienta refresh_inventory, o reinicie el contenedor.

Validación al arrancar (fail-fast)

El archivo de inventario se valida al arrancar. Si no se puede analizar (error de sintaxis YAML/JSON/TOML) o infringe el esquema esperado (p. ej. una clave source: mal indentada, o source definido con un valor que no es cadena/lista), el servidor registra un error específico en inglés y se niega a arrancar en lugar de ejecutarse silenciosamente con un inventario vacío o parcial:

❌ Inventory file '/app/inventory/inventory.yaml' failed validation — the server will NOT start.
   YAML syntax error: expected '<document start>', but found '<block mapping start>'
     in "<unicode string>", line 22, column 1
   Fix the inventory file, then restart the container.

El contenedor sale con un código de estado distinto de cero (visible en docker logs / docker compose ps). Corrija la línea indicada y reinicie. Notas:

  • Un archivo de inventario ausente es solo una advertencia (se puede montar más tarde) — el servidor sigue arrancando.

  • La accesibilidad de los orígenes externos (que NetBox / Nautobot / Infrahub estén caídos) no es fatal: el inventario local analizado sigue siendo utilizable y la combinación dinámica se degrada con elegancia.

  • La herramienta refresh_inventory en tiempo de ejecución aplica la misma validación pero nunca bloquea un servidor en ejecución: con un archivo incorrecto devuelve un error y conserva el inventario cargado anteriormente.


7. Seguridad: autenticación Bearer y registro de auditoría

Ambas funciones están desactivadas por defecto y son totalmente compatibles con versiones anteriores.

  • Autenticación (CX_AUTH_ENABLED=true): toda solicitud a /mcp debe llevar Authorization: Bearer <token>. Los tokens ausentes o no válidos reciben HTTP 401. El nombre del token se convierte en el actor registrado en el registro de auditoría, de modo que siempre se sabe quién hizo qué. Si la autenticación está activada pero aún no existe ningún token, el servidor arranca igualmente pero en modo BLOQUEADO: toda solicitud MCP se rechaza con HTTP 503 (fail-closed), de modo que los servicios quedan inaccesibles. Cree el primer token (véase §8) y reinicie el contenedor para desbloquearlo: el almacén de tokens se carga una sola vez al arrancar.

  • Auditoría (CX_AUDIT_ENABLED=true): una línea JSON por cada llamada de herramienta en logs/audit.jsonl, que incluye actor, src_ip, tool, category (lectura/escritura), device objetivo, arguments censurados, outcome, status_code HTTP y duration_ms. Los secretos (contraseñas/tokens) se enmascaran.

Active ambas:

# docker-compose.yml
CX_AUTH_ENABLED:  "true"
CX_AUDIT_ENABLED: "true"
docker compose up -d --build

8. Gestión de tokens

Los tokens se almacenan en secrets/.tokens (permisos 0600). Gestionelos dentro del contenedor en ejecución con la CLI incluida:

# Create a named token (prints the secret once — save it)
docker compose exec hpe-cx-mcp python cx_token_manager.py generate --name vscode-dev

# List tokens (names, descriptions, created — secret truncated)
docker compose exec hpe-cx-mcp python cx_token_manager.py list

# Show one token
docker compose exec hpe-cx-mcp python cx_token_manager.py show --name vscode-dev

# Revoke a token
docker compose exec hpe-cx-mcp python cx_token_manager.py revoke --name vscode-dev

Los tokens generados llevan el prefijo cx_. Use un token distinto por cliente/agente para obtener la atribución por actor en el registro de auditoría.

Primer token: cuando la autenticación está activada, el servidor arranca BLOQUEADO (HTTP 503 en toda solicitud) hasta que exista un token. Tras crear el primer token, aplíquelo sin reiniciar mediante la recarga en caliente (véase más abajo):

docker compose exec hpe-cx-mcp python cx_reload.py

(también funciona docker compose restart hpe-cx-mcp).

Recarga en caliente (sin reconstruir / sin reiniciar)

Los archivos de tokens e inventario se cargan en memoria al arrancar. Tras editar secrets/.tokens (mediante la CLI anterior) o inventory/inventory.yaml, aplique los cambios al servidor en ejecución enviándole una señal de recarga:

docker compose exec hpe-cx-mcp python cx_reload.py

Esto recarga ambos, los tokens y el inventario, en su lugar: añadir/revocar un token, o añadir/actualizar un dispositivo, surte efecto en la siguiente solicitud. El comando solo envía la señal; el resultado (recuentos, errores) se escribe en los registros:

docker compose logs --tail=20 hpe-cx-mcp

La recarga es manual y explícita: no hay vigilancia automática de archivos.

Si los clientes se conectan a través de un relé compartido, todas las llamadas aparecen bajo el token único del relé; para la atribución por agente, conéctese directamente a hpe-cx-mcp con tokens distintos.


9. Conexión de un cliente MCP

Apunte su cliente MCP al endpoint streamable-HTTP:

URL:  http://<docker-host>:8002/mcp

Cuando la autenticación está habilitada, añade el encabezado:

Authorization: Bearer cx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Ejemplo (estilo mcp.json de VS Code):

{
  "servers": {
    "hpe-cx-mcp": {
      "type": "http",
      "url": "http://localhost:8002/mcp",
      "headers": { "Authorization": "Bearer cx_xxxxxxxxxxxxxxxxxxxx" }
    }
  }
}
F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI assistants with direct access to multi-vendor network devices for tasks like configuration management, health checks, and topology discovery through 35 specialized tools. It enables natural language control over platforms including Cisco, Juniper, and Nokia using SSH, NETCONF, and SNMP protocols.
    11
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables conversational automation of HPE Aruba Central network operations through Claude Code. Provides 88 tools across monitoring, configuration, and operations domains for device migration, SSID management, switch provisioning, and GreenLake Platform integration.
    16
    2
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to interact with Cisco IOS-XE network devices over SSH using structured tools. Provides read and write capabilities for network management with built-in validation and security.
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for network operations that lets AI assistants interact with Cisco/Juniper network devices through safe, well-defined tools like compliance audits and configuration backups.
    MIT

View all related MCP servers

Related MCP Connectors

  • Connect MCP clients to 2,000+ AI models without managing provider API keys.

  • Manage SRG+ hubs, channels, content, assets, users, and workspaces from any MCP-aware AI agent.

  • Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.

View all MCP Connectors

Latest Blog Posts

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/legalla/hpe-cx-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server