Skip to main content
Glama

Network Incident MCP Demo

Un pequeño prototipo/demo que muestra a un agente LLM (Google Gemini) utilizando el Model Context Protocol (MCP) para hacer el triaje de un incidente de red simulado: obtener telemetría de dispositivos, inspeccionar syslogs, decidir si se necesita alguna acción y ejecutar un paso de remediación — todo a través de herramientas expuestas por un servidor MCP local.

Este es un prototipo con fines de aprendizaje/demo. Todos los datos de red son falsos y están hardcodeados en mcp_server/mock_network_db.py. No hay un backend de red real.

Cómo funciona

  • mcp_server/ — un servidor MCP que expone:

    • get_device_telemetry(device_id) — estado del dispositivo, potencia óptica, flaps de BGP

    • get_latest_syslog() — líneas recientes del syslog

    • apply_traffic_reroute(source_pop, target_pop, circuit_id) — una acción de remediación simulada (rechaza cualquier destino que no sea un PoP conocido y en buen estado)

    • incident_triage_prompt(device_id) — una plantilla de prompt que describe los pasos del triaje y el umbral de redirección de -20.0 dBm

  • agent/gemini_mcp_client.py — un cliente que lanza el servidor MCP, ofrece sus herramientas a Gemini como herramientas de llamada a funciones y ejecuta un bucle: Gemini decide qué herramienta llamar a continuación, el cliente la ejecuta vía MCP y le devuelve el resultado, hasta que Gemini dé una respuesta final.

Related MCP server: Pulse

Configuración

git clone <your-repo-url>
cd network-incident-mcp
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

Ejecutar las pruebas

python3 -m pytest tests/

Ejecutar el servidor MCP de forma independiente

python3 mcp_server/server.py

Ejecutar el agente en vivo

Requiere una clave de API de Gemini de Google AI Studio:

export GEMINI_API_KEY=your-key-here
python3 agent/gemini_mcp_client.py

Ejemplo de salida

El agente apunta al dispositivo simulado router-van-01, que se simula como DEGRADED con una potencia óptica de -28.5 dBm — por debajo del umbral de redirección de -20.0 dBm. Una ejecución real tiene este aspecto:

(venv) ac@ubuntuserver2026:~/network-incident-mcp$ python3 agent/gemini_mcp_client.py
Processing request of type ListToolsRequest
[+] Connected to MCP. Registered 3 tools with Gemini 3.6 Flash.
Processing request of type GetPromptRequest
[--> Model Tool Call Request]: get_device_telemetry({'device_id': 'router-van-01'})
Processing request of type CallToolRequest
[<-- MCP Execution Output]: {
  "device_id": "router-van-01",
  "data": {
    "status": "DEGRADED",
    "location": "Vancouver PoP",
    "bgp_flaps": 14,
    "optical_power_dbm": -28.5,
    "circuits": [
      "fiber-van-richmond-10G"
    ]
  }
}
[--> Model Tool Call Request]: get_latest_syslog({})
Processing request of type CallToolRequest
[<-- MCP Execution Output]:
[2026-08-24T10:12:01Z] WARN router-van-01 BGP neighbor 192.168.10.1 DOWN (Retries: 3)
[2026-08-24T10:12:15Z] CRIT router-van-01 Optical signal loss detected on fiber-van-richmond-10G (-28.5 dBm)
[2026-08-24T10:14:02Z] WARN router-van-01 Packet loss spike: 18.4% on interface ge-0/0/1

[--> Model Tool Call Request]: apply_traffic_reroute({'target_pop': 'Richmond PoP', 'circuit_id': 'fiber-van-richmond-10G', 'source_pop': 'Vancouver PoP'})
Processing request of type CallToolRequest
[<-- MCP Execution Output]: {
  "status": "ERROR",
  "error": "Target PoP 'Richmond PoP' is not a known healthy PoP. Healthy PoPs: ['Toronto PoP']"
}
[--> Model Tool Call Request]: apply_traffic_reroute({'circuit_id': 'fiber-van-richmond-10G', 'target_pop': 'Toronto PoP', 'source_pop': 'Vancouver PoP'})
Processing request of type CallToolRequest
[<-- MCP Execution Output]: {
  "status": "SUCCESS",
  "action": "Traffic shifted from Vancouver PoP to Toronto PoP",
  "isolated_circuit": "fiber-van-richmond-10G",
  "new_route_metric": 10
}
[Model Final Response]: ### Incident Analysis Summary for `router-van-01`

1. **Device Telemetry Analysis**
   - **Device ID:** `router-van-01`
   - **Location:** Vancouver PoP
   - **Device Status:** DEGRADED
   - **Optical Power Level:** **-28.5 dBm**
   - **BGP Flaps:** 14
   - **Active Circuit:** `fiber-van-richmond-10G`

2. **Syslog Inspection**
   - Critical optical signal loss log detected:
     `[2026-08-24T10:12:15Z] CRIT router-van-01 Optical signal loss detected on fiber-van-richmond-10G (-28.5 dBm)`
   - Additional warnings observed regarding BGP neighbor timeouts and interface packet loss spikes (`ge-0/0/1`).

3. **Remediation Action**
   - **Condition Met:** Optical power level (-28.5 dBm) is below the threshold of -20.0 dBm.
   - **Action Taken:** Executed `apply_traffic_reroute`.
     - **Circuit:** `fiber-van-richmond-10G`
     - **Source PoP:** Vancouver PoP
     - **Target PoP:** Toronto PoP
   - **Status:** **SUCCESS** — Traffic successfully rerouted from Vancouver PoP to Toronto PoP, isolating circuit `fiber-van-richmond-10G`.

Nótese que el primer intento de redirección del modelo apunta a Richmond PoP, que no es una ubicación real y en buen estado en los datos simulados — el servidor lo rechaza con un ERROR en lugar de completarse silenciosamente, y el modelo reintenta con el destino correcto y en buen estado (Toronto PoP) antes de lograrlo.

Demo HTTP pública (sin necesidad de clave de API)

web/app.py es un pequeño envoltorio de FastAPI alrededor de la misma lógica simulada de telemetría/redirección, expuesta como endpoints REST simples — no requiere cliente MCP ni clave de API de Gemini. /triage/{device_id} reimplementa el flujo de obtener → comprobar → redirigir de forma determinista en Python (no mediante un LLM), por lo que es gratuito y seguro exponerlo públicamente.

Ejecútalo localmente:

uvicorn web.app:app --host 127.0.0.1 --port 8001

Luego, desde otra terminal:

curl http://127.0.0.1:8001/devices
curl http://127.0.0.1:8001/telemetry/router-van-01
curl http://127.0.0.1:8001/syslog
curl http://127.0.0.1:8001/triage/router-van-01   # degraded device -> auto-reroutes
curl http://127.0.0.1:8001/triage/router-yyz-02   # healthy device -> no reroute

Notas

  • Requiere mcp<2 (ya fijado en requirements.txt) — el servidor usa la API v1 de FastMCP.

  • La disponibilidad de los modelos de Gemini cambia con el tiempo; si te encuentras con un error 404 de modelo no encontrado, enumera los modelos disponibles para tu clave de API y actualiza el nombre del modelo en agent/gemini_mcp_client.py.

  • Las rondas de llamada a herramientas están limitadas por ejecución (GeminiMCPOrchestrator.MAX_TURNS, por defecto 5) para evitar un uso descontrolado de la API.

A
license - permissive license
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
    D
    maintenance
    An MCP server that exposes live network monitoring data as Resources and diagnostic capabilities as Tools, letting AI assistants query network health conversationally.
    6
    MIT

View all related MCP servers

Related MCP Connectors

  • MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.

  • Phone, SMS & email for AI agents — one remote MCP endpoint, OAuth login, zero install.

  • OCR, transcription, file extraction, and image generation for AI agents via MCP.

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/asif-c/network-incident-mcp'

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