Most servers that can change production stop at "here is the tool". This one splits its surface three ways — act, verify, roll back — so blocking an IP is followed by a tool that asks the agent whether the block is really there, and another that removes it. The 14 tools that change anything sit behind a separate scope that is off unless you grant it, and credentials found in alert `full_log` fields are redacted before they reach the model.
An MCP server in front of a Wazuh deployment, exposing 55 security tools across alerts, agents, vulnerabilities, threat analysis, compliance, cluster operations and active response. It reaches both the Wazuh Manager REST API and the Wazuh Indexer, and it runs the same way against a cloud model or a local one through Ollama, which is what makes an air-gapped SOC deployment possible.
- Alert work over the Indexer — filtering, searching, pattern analysis, and a period summary with no document limit; timestamps take ISO 8601 or relative date math such as `now-24h` — `get_wazuh_alerts`, `get_alerts_aggregated`, `analyze_alert_patterns`, `search_security_events`
- Agent state down to running processes, open ports and current configuration — `get_wazuh_agents`, `check_agent_health`, `get_agent_processes`, `get_agent_ports`, `get_agent_configuration`
- CVEs by severity, agent and package, with a critical-only view and a summary — `get_wazuh_vulnerabilities`, `get_wazuh_critical_vulnerabilities`, `get_wazuh_vulnerability_summary`
- Compliance scoring for PCI-DSS, HIPAA, SOX, GDPR, NIST and ISO 27001:2022, including Annex A control detail and gap analysis — `run_compliance_check`, `get_iso27001_gap_analysis`, `get_sca_policy_checks`
- Active response: block an IP, isolate a host, kill a process, disable a user, quarantine a file — `wazuh_block_ip`, `wazuh_isolate_host`, `wazuh_kill_process`, `wazuh_quarantine_file`
- A separate verification family that checks the action actually landed, and a rollback family that undoes it — `wazuh_check_blocked_ip`, `wazuh_check_agent_isolation`, `wazuh_unisolate_host`, `wazuh_restore_file`
- Cluster health, rule summaries, manager logs and connectivity checks — `get_wazuh_cluster_health`, `get_wazuh_rules_summary`, `search_wazuh_manager_logs`, `validate_wazuh_connection`
A Wazuh 4.8.0–4.14.7 deployment with API access, plus Docker 20.10+ with Compose v2. `WAZUH_HOST`, `WAZUH_USER` and `WAZUH_PASS` are the three required variables; the server listens on port 3000 and speaks Streamable HTTP at `/mcp`. The 14 state-changing tools need the `wazuh:write` scope, which is opt-in via `MCP_API_KEY_SCOPES` — a token with no scope claim gets read-only. `AUTH_SECRET_KEY` is mandatory once `ENVIRONMENT=production`, and the server refuses to start without it. Alert search and vulnerability tools additionally need Indexer credentials (`WAZUH_INDEXER_HOST`, `WAZUH_INDEXER_USER`, `WAZUH_INDEXER_PASS`).
One command plus a key — docker run -d --name wazuh-mcp-server --env-file .env -p 3000:3000 \ ghcr.io/gensecaihq/wazuh-mcp-server:latest, then supply credentials
