内容
# 🛡️ Wazuh MCP Server
**Servidor MCP (Model Context Protocol) para Wazuh SIEM/XDR — integración directa con Hermes Agent.**
Servidor MCP de alto rendimiento que expone **101 herramientas** y **11 prompts guiados** para interactuar con la API del Wazuh Manager y el Indexer de OpenSearch. Diseñado para despliegue en producción sobre un VPS Contabo, permitiendo que [Hermes Agent](https://hermes-agent.nousresearch.com) (o Claude Desktop y cualquier cliente MCP) consulte agentes, vulnerabilidades, alertas, reglas, SCA, hardware y salud del cluster, y además realice threat hunting, análisis de incidentes, informes de compliance, enriquecimiento con threat intelligence e integraciones con Jira/TheHive/Slack, directamente desde Wazuh.
- **17 tools núcleo** (`server.py`) — probadas en producción, cliente thread-safe con pool de conexiones, JWT auto-refresh y autenticación por certificados.
- **84 tools extendidas + 11 prompts** (`wazuh_tools/`) — portadas de [adi5353/wazuh-mcp](https://github.com/adi5353/wazuh-mcp) (Apache-2.0) y adaptadas a la infraestructura de este proyecto. Carga tolerante a fallos: si un módulo extendido fallara, las 17 tools núcleo siguen operativas.
---
## 🏗️ Arquitectura
```
┌─────────────────┐ MCP (Streamable HTTP) ┌──────────────────┐
│ Hermes Agent │ ◄──────────────────────────► │ Wazuh MCP Server │
│ (Cliente MCP) │ Puerto 8090 │ (FastMCP) │
└─────────────────┘ └────────┬─────────┘
│
┌─────────────────┼─────────────────┐
│ │ │
┌─────▼─────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Wazuh │ │ OpenSearch │ │ Syscollector│
│ Manager │ │ Indexer │ │ (agentes) │
│ API │ │ (alertas, │ │ │
│ :55000 │ │ vulns) │ │ │
└───────────┘ │ :9200 │ └─────────────┘
└─────────────┘
```
### Componentes principales
| Archivo | Descripción |
|---------|-------------|
| `server.py` | **Servidor MCP principal (v2.0)**. Usa FastMCP + httpx con pool de conexiones, timeouts diferenciados, token JWT con refresh automático y cliente thread-safe. |
| `mcp_wazuh.py` | Implementación legacy/alternativa del cliente Wazuh MCP (compatible con mcporter). |
| `direct_api.py` | API HTTP directa sin dependencia MCP — endpoints REST simples para integración con n8n. |
| `http_wrapper.py` | Wrapper HTTP que expone herramientas MCP como endpoints REST (usa mcporter internamente). |
| `Dockerfile` | Imagen Python 3.12-slim con dependencias versionadas (fastmcp, httpx, uvicorn). |
| `docker-compose.yml` | Despliegue production-ready con límites de memoria, healthcheck, montaje de certificados y reinicio automático. |
### Stack tecnológico
- **Python 3.12** + **FastMCP 2.7.0** — servidor MCP con transporte HTTP
- **httpx 0.28.1** — cliente HTTP asíncrono con pool de conexiones
- **uvicorn** — servidor ASGI para el transporte HTTP
- **Docker** — contenedorizado para despliegue consistente
---
## 🔧 Herramientas MCP disponibles
### Agentes
| Herramienta | Descripción |
|-------------|-------------|
| `list_agents` | Lista todos los agentes con estado, versión, SO, IP y grupos |
| `get_agent_info` | Información detallada de un agente específico |
| `get_agents_summary` | Resumen con estadísticas de todos los agentes (activos, desconectados, por SO) |
| `get_agent_groups` | Grupos a los que pertenece un agente |
| `restart_agent` | Reinicia un agente específico |
### Vulnerabilidades (Indexer)
| Herramienta | Descripción |
|-------------|-------------|
| `get_agent_vulnerabilities` | Vulnerabilidades de un agente con filtro por severidad |
| `get_vulnerability_summary` | Resumen de CVEs únicos con desglose por severidad (usa collapse + aggregations) |
### Reglas
| Herramienta | Descripción |
|-------------|-------------|
| `list_rules` | Lista reglas con filtro por estado y grupo |
| `get_rules_groups` | Lista todos los grupos de reglas disponibles |
### Alertas (Indexer)
| Herramienta | Descripción |
|-------------|-------------|
| `search_alerts` | Búsqueda de alertas con query string, filtro por agente |
### Syscollector / SCA
| Herramienta | Descripción |
|-------------|-------------|
| `get_agent_sca` | Resultados del Security Configuration Assessment (SCA) |
| `get_agent_netaddr` | Interfaces de red del agente |
| `get_agent_hardware` | Información de hardware (CPU, RAM, placa base) |
| `get_agent_ports` | Puertos en escucha del agente (desde el Indexer) |
### Infraestructura
| Herramienta | Descripción |
|-------------|-------------|
| `get_manager_stats` | Estadísticas del Wazuh Manager |
| `get_cluster_nodes` | Nodos del cluster Wazuh |
| `get_indexer_health` | Salud del cluster OpenSearch (status, nodos, shards) |
---
## 🚀 Herramientas extendidas (84 tools en 21 dominios)
Portadas de [adi5353/wazuh-mcp](https://github.com/adi5353/wazuh-mcp) y adaptadas al cliente de este proyecto (ver [`wazuh_tools/NOTICE.md`](wazuh_tools/NOTICE.md)):
| Dominio | Tools destacadas |
|---------|------------------|
| **Alertas avanzadas** | `alert_summary`, `alert_timeline`, `search_by_mitre`, `search_by_source_ip`, `search_authentication_failures`, `get_alert_by_id` |
| **Threat Hunting** | `hunt_lateral_movement`, `hunt_persistence_mechanisms`, `hunt_data_exfiltration` |
| **Incidentes** | `incident_timeline`, `blast_radius_analysis`, `create_incident_report`, `tag_alert`, `bulk_suppress_rule` |
| **Vulnerabilidades** | `vulnerability_summary` (flota), `search_cve`, `prioritize_patches`, `get_agent_vulnerabilities_detailed` |
| **FIM** | `get_recent_fim_changes`, `search_fim_alerts`, `fim_summary`, `critical_file_changes` |
| **Compliance** | `compliance_summary` y `generate_compliance_report` (PCI-DSS, HIPAA, GDPR, NIST 800-53, TSC) |
| **SCA** | `get_sca_failed_checks`, `sca_alerts_summary`, `fleet_sca_weakest_agents` |
| **Inventario de flota** | `fleet_find_package`, `fleet_find_process`, `fleet_find_listening_port`, `get_agent_login_history`, `get_agent_packages`, `get_agent_processes` |
| **Reglas y decoders** | `search_rules`, `get_rule_details`, `test_log_against_rules`, `test_rule_coverage`, `list_decoders`, `get_custom_rules` |
| **CDB Lists** | `list_cdb_lists`, `add_to_cdb_list`, `remove_from_cdb_list`, `preview_cdb_list_impact` |
| **Active Response** | `get_active_responses`, `run_active_response`, `correlate_alert_with_response`, `active_response_effectiveness` |
| **MITRE ATT&CK** | `mitre_coverage_analysis`, `get_mitre_gaps` |
| **Threat Intel** | `enrich_ip` (VirusTotal + AbuseIPDB), `enrich_file_hash`, `enrich_ip_geo` (GeoIP gratuito) |
| **Supresión de ruido** | `list_suppressed_rules`, `noise_score_rule`, `expire_suppression` |
| **Reporting** | `generate_weekly_summary`, `generate_shift_handover`, `compare_alert_volume`, `detect_rule_anomalies` |
| **Integraciones** | `create_jira_ticket`, `create_thehive_case`, `update_ticket_status` |
| **Notificaciones** | `send_alert_to_slack`, `send_critical_alert_notify`, `email_compliance_report` |
| **Onboarding** | `generate_enrollment_command`, `list_never_connected_agents`, `agent_onboarding_checklist` |
| **Archive** | `search_archive_logs`, `search_archive_logs_by_agent` (forense) |
| **Cluster** | `get_cluster_health`, `check_event_queue_health` |
| **Agentes/Grupos** | `run_active_response`, `list_groups`, `get_group_agents`, `add_agent_to_group` |
Las integraciones externas (Jira, TheHive, Slack, SMTP, VirusTotal, AbuseIPDB) **degradan con elegancia**: si no configuras sus credenciales, las demás tools funcionan con normalidad.
### 🔐 Operaciones de escritura deshabilitadas por defecto
Las tools extendidas destructivas (`run_active_response`, `add_to_cdb_list`, `tag_alert`, `bulk_suppress_rule`, `add_agent_to_group`, `expire_suppression`, `remove_from_cdb_list`) requieren `WAZUH_ALLOW_WRITES=true`. Además, varias soportan `dry_run=True` (por defecto) para previsualizar el impacto sin aplicar cambios. La tool núcleo `restart_agent` no se ve afectada por este flag (mantiene su comportamiento original).
### 💬 Prompts MCP (workflows guiados)
| Prompt | Uso |
|--------|-----|
| `investigate_brute_force` | Investigación completa de fuerza bruta en 6 pasos |
| `weekly_soc_briefing` | Briefing ejecutivo semanal del SOC |
| `triage_alert` | Triaje estructurado de una alerta (TP/FP + severidad) |
| `cve_emergency_response` | Respuesta de emergencia a un CVE |
| `morning_briefing` | Briefing de inicio de turno |
| `incident_triage_full` | Triaje completo de incidente por agente o IP |
| `threat_hunt_session` | Sesión de threat hunt (lateral + persistencia + exfiltración) |
| `end_of_shift_handover` | Informe de relevo de turno |
| `daily_security_report` | **Reporte diario técnico** — métricas de alertas, amenazas activas, salud de infraestructura, vulnerabilidades y acciones prioritarias (12 tools orquestadas) |
| `weekly_security_report` | **Reporte semanal táctico** — tendencias, threat hunting, MITRE ATT&CK, gestión de vulnerabilidades, compliance y plan de acción (17 tools orquestadas) |
| `monthly_ciso_report` | **Reporte mensual ejecutivo CISO** — scorecard de postura, paisaje de amenazas, riesgos, compliance multi-framework, KPIs y recomendaciones estratégicas (25 tools orquestadas) |
---
## 📋 Variables de entorno
Copia `.env.example` a `.env` y configura los valores. **`.env` es el único archivo que hay que tocar**: nunca hace falta editar `docker-compose.yml`, el `Dockerfile` ni el código.
### Identidad de la instancia
Solo hay que cambiarlas si despliegas **más de una** instancia en el mismo host (ver [Varias instancias](#-varias-instancias-en-el-mismo-host)).
| Variable | Requerida | Default | Descripción |
|----------|-----------|---------|-------------|
| `COMPOSE_PROJECT_NAME` | ❌ | `wazuh-mcp` | Nombre del proyecto Compose. Único por instancia |
| `CONTAINER_NAME` | ❌ | `wazuh-mcp` | Nombre del contenedor. Único por instancia |
| `IMAGE_TAG` | ❌ | `wazuh-mcp:v2` | Etiqueta de la imagen. Puede compartirse entre instancias |
| `TOOL_PREFIX` | ❌ | *(vacío)* | Prefijo en los nombres de las tools. Solo si un mismo cliente MCP se conecta a dos instancias a la vez |
### Red y acceso
| Variable | Requerida | Default | Descripción |
|----------|-----------|---------|-------------|
| `WAZUH_HTTP_PORT` | ❌ | `8090` | Puerto por el que los clientes consultan el MCP. Único por instancia |
| `HEALTH_PORT` | ❌ | `8091` | Puerto de `/health` y `/metrics`. Único por instancia |
| `BIND_ADDR` | ❌ | `127.0.0.1` | `127.0.0.1` = solo esta máquina · `0.0.0.0` = toda la red. Ver [Acceso desde otras máquinas](#-acceso-desde-otras-máquinas) |
| `CERTS_DIR` | ❌ | `./certs` | Directorio del host con los `.pem`, se monta en `/certs` |
### Conexión a Wazuh y opciones
| Variable | Requerida | Default | Descripción |
|----------|-----------|---------|-------------|
| `WAZUH_URL` | ✅ | `https://localhost:55000` | URL base de la API del Wazuh Manager |
| `WAZUH_USER` | ✅ | — | Usuario con acceso a la API de Wazuh |
| `WAZUH_PASS` | ✅ | — | Contraseña del usuario de la API |
| `INDEXER_URL` | ✅ | `https://localhost:9200` | URL base del Indexer de OpenSearch |
| `INDEXER_USER` | ⚠️ | — | Usuario del Indexer (si no usas certificados) |
| `INDEXER_PASS` | ⚠️ | — | Contraseña del Indexer (si no usas certificados) |
| `INDEXER_CERT` | ⚠️ | — | Ruta al certificado cliente (alternativa a user/pass) |
| `INDEXER_KEY` | ⚠️ | — | Ruta a la clave privada del certificado |
| `INDEXER_CA` | ❌ | — | Ruta al CA bundle (opcional) |
| `VERIFY_SSL` | ❌ | `false` | Verificar certificados SSL (`true`/`false`) |
| `INDEXER_TIMEOUT` | ❌ | `30.0` | Timeout para consultas al Indexer (segundos) |
| `WAZUH_API_TIMEOUT` | ❌ | `15.0` | Timeout para consultas a la API de Wazuh |
| `MAX_CONNECTIONS` | ❌ | `20` | Conexiones máximas en el pool HTTP |
| `MAX_KEEPALIVE` | ❌ | `10` | Conexiones keep-alive máximas |
| `WAZUH_ALLOW_WRITES` | ❌ | `false` | Habilita las tools extendidas de escritura (active response, CDB, tagging) |
| `WAZUH_MAX_RESULTS_GLOBAL` | ❌ | `500` | Límite global de resultados en las tools extendidas |
| `WAZUH_TS_FIELD` | ❌ | `timestamp` | Campo de tiempo de los documentos de alertas (`timestamp` o `@timestamp`) |
| `VIRUSTOTAL_API_KEY` | ❌ | — | Enriquecimiento de IPs/hashes con VirusTotal |
| `ABUSEIPDB_API_KEY` | ❌ | — | Scoring de IPs con AbuseIPDB |
| `JIRA_URL` / `JIRA_USER` / `JIRA_API_TOKEN` / `JIRA_PROJECT_KEY` | ❌ | — | Creación de tickets en Jira |
| `THEHIVE_URL` / `THEHIVE_API_KEY` | ❌ | — | Creación de casos en TheHive |
| `SLACK_WEBHOOK_URL` o `SLACK_BOT_TOKEN` | ❌ | — | Notificaciones a Slack |
| `SMTP_HOST` / `SMTP_USER` / `SMTP_PASS` / `REPORT_EMAIL_TO` | ❌ | — | Envío de informes por email |
> ⚠️ **INDEXER_USER/INDEXER_PASS** o **INDEXER_CERT/INDEXER_KEY** — al menos un par es obligatorio para conectarse al Indexer.
>
> Ver `.env.example` para la lista completa comentada (patrones de índice, canales de Slack, password de enrolamiento, etc.).
---
## 🐳 Despliegue con Docker Compose
### Requisitos previos
- Docker y Docker Compose v2 en el host.
- Un usuario de la API de Wazuh y credenciales del Indexer (usuario/contraseña **o** certificados).
- Conectividad de red desde este host a Wazuh (`55000`) y al Indexer (`9200`).
No hace falta que el MCP esté instalado en el servidor Wazuh.
### Despliegue básico (una instancia)
```bash
git clone <repo-url> wazuh-mcp && cd wazuh-mcp
cp .env.example .env
nano .env # credenciales de Wazuh e Indexer
docker compose up -d --build
docker compose ps
```
Y ya está. El MCP queda escuchando en `http://127.0.0.1:8090/mcp`.
---
### 📍 ¿Dónde va instalado el MCP?
El MCP se conecta a Wazuh **por red**, así que puede estar en cualquier máquina. Hay dos escenarios y cada uno usa un archivo distinto:
#### Caso A — El MCP está en otra máquina (lo más habitual)
El servidor Wazuh está en otro host, o el MCP vive en un servidor de automatización junto a n8n.
En el `.env` pon las **direcciones reales** de Wazuh, nunca `localhost`:
```env
WAZUH_URL=https://192.168.1.50:55000
INDEXER_URL=https://192.168.1.50:9200
```
Y despliega con el archivo por defecto:
```bash
docker compose up -d --build
```
#### Caso B — El MCP está en el mismo servidor que Wazuh
Si quieres que el contenedor comparta la red de la máquina y pueda usar `localhost` para llegar a Wazuh:
```env
WAZUH_URL=https://localhost:55000
INDEXER_URL=https://localhost:9200
```
```bash
docker compose -f docker-compose.host.yml up -d --build
```
> Este modo usa la red del host directamente (solo Linux). No hay traducción de puertos: el servicio escucha en `WAZUH_HTTP_PORT` y `HEALTH_PORT` tal cual, así que esos puertos deben estar libres en el host.
> 💡 También puedes usar el Caso A estando en el mismo servidor: basta con poner la IP real del host en vez de `localhost`.
---
### 🌐 Acceso desde otras máquinas
Por defecto el servicio solo se puede consultar **desde el propio host** (`BIND_ADDR=127.0.0.1`). Es el valor seguro.
Si el cliente que consulta el MCP (n8n, un agente IA, otro servidor) está en **otra PC**, abre el acceso en el `.env`:
```env
BIND_ADDR=0.0.0.0
```
y recrea el contenedor:
```bash
docker compose up -d
```
Los clientes lo consultarán en `http://<IP_DEL_HOST_DEL_MCP>:8090/mcp`.
> ⚠️ **El MCP no tiene usuario ni contraseña propios.** Con `BIND_ADDR=0.0.0.0`, cualquiera que alcance ese puerto puede consultar tu Wazuh. Si lo abres a la red, protégelo con al menos una de estas medidas:
>
> - **Firewall** que solo acepte las IPs de los clientes legítimos (lo mínimo imprescindible).
> - **Red privada o VPN** entre el cliente y este host.
> - **Reverse proxy** (nginx, Caddy) con TLS y autenticación por delante, dejando `BIND_ADDR=127.0.0.1`. Es la opción más segura si el tráfico sale de la red local.
---
### 🔀 Varias instancias en el mismo host
Un cliente con dos Wazuh (por ejemplo producción y laboratorio) necesita dos MCP. Cada instancia es un **clon independiente del repo con su propio `.env`** — no se comparte nada.
```bash
git clone <repo-url> wazuh-mcp-prod
git clone <repo-url> wazuh-mcp-lab
```
En cada carpeta, `cp .env.example .env` y ajusta estos valores para que no choquen:
| Variable | Instancia 1 (prod) | Instancia 2 (lab) |
|---|---|---|
| `COMPOSE_PROJECT_NAME` | `wazuh-mcp-prod` | `wazuh-mcp-lab` |
| `CONTAINER_NAME` | `wazuh-mcp-prod` | `wazuh-mcp-lab` |
| `WAZUH_HTTP_PORT` | `8090` | `8092` |
| `HEALTH_PORT` | `8091` | `8093` |
| `TOOL_PREFIX` | `prod_` | `lab_` |
Más, evidentemente, las credenciales y URLs de cada Wazuh. Después, en cada carpeta:
```bash
docker compose up -d --build
```
Notas:
- **`IMAGE_TAG` puede ser el mismo** en ambas: el código es idéntico, solo cambia la configuración.
- **`TOOL_PREFIX`** solo hace falta si un **mismo** cliente MCP se conecta a las dos instancias a la vez; sin prefijos vería herramientas con nombres duplicados. Si cada instancia tiene su propio cliente, déjalo vacío.
- No hay límite de instancias: repite el patrón subiendo los puertos de dos en dos.
---
### Healthcheck
```bash
# Estado del contenedor
docker inspect $(grep CONTAINER_NAME .env | cut -d= -f2) --format='{{.State.Health.Status}}'
# Endpoint de salud (puerto HEALTH_PORT)
curl http://localhost:8091/health
# Endpoint MCP
curl -X POST http://localhost:8090/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
```
---
### Autenticación del Indexer con certificados
La forma habitual es usuario/contraseña (`INDEXER_USER` / `INDEXER_PASS`) y no requiere nada más. Si prefieres certificados:
1. Copia los `.pem` a un directorio de este host.
2. Indica ese directorio en `CERTS_DIR` — se monta dentro del contenedor como `/certs` en solo lectura.
3. Configura las rutas *internas* y vacía usuario/contraseña:
```env
CERTS_DIR=/etc/wazuh-indexer/certs # o ./certs si copiaste los .pem al proyecto
INDEXER_CERT=/certs/admin.pem
INDEXER_KEY=/certs/admin-key.pem
INDEXER_CA=/certs/root-ca.pem
INDEXER_USER=
INDEXER_PASS=
```
Las rutas `INDEXER_*` son siempre `/certs/...` (dentro del contenedor); lo que cambia según tu máquina es `CERTS_DIR`.
---
## 🔌 Conexión con Hermes Agent Gateway
### Configuración del perfil
En tu perfil de Hermes Agent, añade el servidor MCP al archivo de configuración:
```json
{
"mcpServers": {
"wazuh-siem": {
"type": "streamable-http",
"url": "http://<IP_DEL_VPS>:8090/mcp"
}
}
}
```
### Probar la conexión
Una vez configurado, Hermes Agent podrá invocar cualquiera de las herramientas MCP. Ejemplos de prompts:
- *"Muéstrame todos los agentes de Wazuh"*
- *"¿Cuántas vulnerabilidades críticas tiene el agente 001?"*
- *"Busca alertas de rootkit en las últimas 24 horas"*
- *"¿Cuál es el estado de salud del cluster OpenSearch?"*
- *"Dame el resumen de todos los agentes"*
---
## 🛠️ Desarrollo local
```bash
# Instalar dependencias
pip install -r requirements.txt
# Ejecutar en modo HTTP (recomendado)
python server.py http 8090 127.0.0.1
# Ejecutar en modo stdio
python server.py stdio
```
---
## 📁 Estructura del proyecto
```
wazuh-mcp/
├── server.py # Servidor MCP principal (17 tools núcleo + registro de extendidas)
├── wazuh_tools/ # 84 tools extendidas en 21 dominios + 11 prompts MCP
│ ├── __init__.py # Orquestador: register_all() con proxy de prefijos/colisiones
│ ├── compat.py # Clientes async con pool, JWT auto-refresh y certificados
│ ├── helpers.py # trim_alert, trim_vuln, time_window...
│ ├── prompts.py # 11 prompts de workflows guiados
│ ├── alerts.py, fim.py, threat_hunting.py, incidents.py, ... (21 módulos)
│ ├── LICENSE # Apache-2.0 del proyecto original
│ └── NOTICE.md # Atribución y lista de adaptaciones
├── mcp_wazuh.py # Cliente MCP alternativo (compatible mcporter)
├── direct_api.py # API HTTP directa para n8n
├── http_wrapper.py # Wrapper HTTP para herramientas MCP
├── Dockerfile # Imagen Docker (puertos internos fijos 8090/8091)
├── docker-compose.yml # Despliegue estándar (red bridge) — Caso A
├── docker-compose.host.yml # Despliegue en el propio servidor Wazuh — Caso B
├── requirements.txt # Dependencias pineadas (para instalación sin Docker)
├── .dockerignore # Exclusiones para el build
├── .env.example # Plantilla de variables de entorno
├── .gitignore # Exclusiones de Git
└── README.md # Este archivo
```
---
## 🔒 Seguridad
- **Operaciones de escritura deshabilitadas por defecto** — las tools extendidas destructivas requieren `WAZUH_ALLOW_WRITES=true` explícito, y las más peligrosas exigen además `dry_run=False`.
- **Nunca commitees `.env`** — contiene credenciales reales. Ya está en `.gitignore`.
- Los certificados `.pem` también están excluidos del repositorio.
- **El servicio no tiene autenticación propia.** Por defecto solo escucha en `127.0.0.1` (`BIND_ADDR`). Antes de abrirlo a la red, lee [Acceso desde otras máquinas](#-acceso-desde-otras-máquinas).
- Las credenciales del Indexer pueden usar autenticación por certificados en lugar de user/password.
- El token JWT de Wazuh se refresca automáticamente al expirar o recibir un 401.
---
## 📝 Licencia
MIT — Consulta el archivo `LICENSE` para más detalles.
Los módulos de `wazuh_tools/` derivan de [adi5353/wazuh-mcp](https://github.com/adi5353/wazuh-mcp) (Apache License 2.0). Se conserva la licencia original y la atribución en `wazuh_tools/LICENSE` y `wazuh_tools/NOTICE.md`.
---
## 🤝 Contribuciones
Este proyecto es parte del ecosistema Hermes Agent. Las contribuciones son bienvenidas mediante issues y pull requests en GitHub.
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器