Natural-Language Monitoring: Prometheus MCP + WorkBuddy Build AIOps Inspection Reports
Natural-language monitoring is only trustworthy when the AI is constrained to real data and read-only actions; this setup puts those constraints in the prompt itself. Teams already running Prometheus can try MCP-based AIOps with three containers and no changes to their existing stack.
Prometheus and Node Exporter collect Linux CPU, memory, disk, network, and load metrics. A Prometheus MCP Server wraps the Prometheus API as MCP tools, and WorkBuddy calls those tools to turn natural-language requests into PromQL queries. Docker Compose runs three containers: Prometheus on host port 19090, Node Exporter on the internal Docker network, and the MCP server on 8080. A curl query against the Prometheus API confirms both scrape jobs are up before WorkBuddy connects.
WorkBuddy connects through a custom MCP connector pointed at http://<server-ip>:8080/mcp. The test loaded 28 MCP tools, including query, range_query, and list_targets. A user then creates an 'expert' in WorkBuddy with a detailed system prompt that enforces read-only behavior, one PromQL query per call, real metrics only, and explicit disclosure of missing data.
The prompt also requires a Grafana-style HTML report with KPI cards, trend charts, resource details, AI diagnosis, and a conclusion. That HTML is a static snapshot, not a live dashboard. In the sample report, CPU was about 2.4%, memory about 45%, and root disk about 66.5%.
LLM-generated monitoring reports stay reliable only when the prompt forbids root-cause conclusions from a single metric and requires missing data to be labeled. That prompt does both, keeping the AI in the role of report generator.
Prompt engineering carries most of the operational weight here. The system prompt reads like an SRE checklist: read-only by default, one PromQL query per call, real metrics only, units and timezone specified, and a static snapshot declared up front.
Declaring the HTML a one-time snapshot is a deliberate honesty measure. A single range_query covers a fixed window, so labeling the report as static keeps expectations aligned with what the data can actually show.