ml-ai — Claude Code skill: what it does, how to install
Enables machine learning and AI features in Grafana Cloud. It helps set up Prophet forecasts, DBSCAN outlier alerts, and Sift root-cause investigations.
npx skills add grafana/skills --skill ml-ai -a claude-codeWhat ml-ai does
The skill equips coding agents with workflows for Grafana Cloud AI and ML APIs. It configures Prophet forecasting jobs and DBSCAN peer-group anomaly detection. Teams can replace rigid threshold alerting with dynamic bounds that follow daily seasonality. The skill also covers automated incident investigations with Sift and LLM Plugin setup.
Under the hood, the skill generates API calls against grafana-ml-app and grafana-sift-app, as well as provisioning files for grafana-llm-app. Alerts rely on generated metrics such as ml_forecast_upper and ml_outlier_score. Investigations trigger eight automated checks in Sift, linking findings directly to the incident view.
You need a Grafana Cloud Pro or Advanced stack and an API token with plugins:write permissions. Dynamic alerting will fail on new services. Prophet requires at least 14 days of metric history to compute a usable baseline.
What it helps with
- configure Prophet metric forecasting alerts without static thresholds
- detect outlier services using DBSCAN grouping on error rates
- run automated incident investigations across 8 Sift checks
- provision the LLM Plugin with OpenAI or other model providers
Example prompts for the agent
- Set up a Prophet forecast alert on CPU usage if it exceeds the upper bound by 10%
- Run a Sift root-cause investigation for the checkout service over the last 30 minutes
- Provision the LLM Plugin with gpt-4o for Grafana Assistant
How to install ml-ai
1Skills CLI (Vercel)
npx skills add grafana/skills --skill ml-ai -a claude-code2Manually: put the files in place
~/.claude/skills/ml-ai/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/ml-ai/
1Skills CLI (Vercel)
npx skills add grafana/skills --skill ml-ai -a codex2Manually: put the files in place
.agents/skills/ml-ai/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add grafana/skills --skill ml-ai -a cursor2Manually: put the files in place
.cursor/skills/ml-ai/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install grafana/skills ml-ai2Manually: put the files in place
.github/skills/ml-ai/SKILL.md1Skills CLI (Vercel)
npx skills add grafana/skills --skill ml-ai -a gemini-cli2Platform CLI
gemini skills install https://github.com/grafana/skills --path skills/grafana-cloud/ml-aiManually: put the files in place
.devin/skills/ml-ai/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add grafana/skills --skill ml-ai -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about ml-ai
How to install ml-ai in Claude Code?
Run npx skills add grafana/skills --skill ml-ai -a claude-code. The command places the skill file into ~/.claude/skills/ml-ai/SKILL.md.
What does ml-ai do?
It teaches coding agents how to interact with Grafana Cloud ML and AI tools. It covers Prophet metric forecasting, DBSCAN outlier jobs, Sift root-cause investigations, and LLM Plugin provisioning.
What prerequisites are needed for dynamic alerts?
You must have a Grafana Cloud Pro or Advanced stack and an API token with plugins:write. Forecasting jobs also need at least 14 days of stored metric history.
Source text
SKILL.md · Apache-2.0
---
name: ml-ai
license: Apache-2.0
description: Turn on AI + ML features in Grafana Cloud — Grafana Assistant (NL → PromQL/LogQL/TraceQL, dashboard build, incident investigation, MCP integration), Dynamic Alerting (Prophet forecasting + DBSCAN outlier detection), Sift (8-analysis automated root-cause), Knowledge Graph + RCA Workbench, and the LLM Plugin (OpenAI / Anthropic / Azure / Ollama / vLLM / LiteLLM). Use when you want anomaly alerts without static thresholds, natural-language querying, automated incident investigation, dashboards generated from a sentence, or a managed LLM proxy for plugins — even when the user says "alert when something looks weird", "explain this PromQL", "find the root cause", "make this a dashboard", or "wire Claude into Grafana" without naming any of these products.
---
# Grafana Cloud AI & ML
> **Docs**: https://grafana.com/docs/grafana-cloud/alerting-and-irm/machine-learning/
ML alerting + automated RCA + LLM-powered Assistant in one Grafana Cloud stack.
## Prerequisites
- Grafana Cloud stack (Pro / Advanced — most features GA, some in preview)
- API token with `plugins:write` for ML / Sift / LLM-plugin endpoints
- For Dynamic Alerting: at least 14 days (ideally 90d) of history for the metric you want to forecast
## Common Workflows
### 1. Forecasting alert with Dynamic Alerting
```bash
# 1. Create forecast job (Prophet — learns daily/weekly seasonality)
curl -X POST https://<stack>.grafana.net/api/plugins/grafana-ml-app/resources/ml/v1/forecast \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "cpu-forecast",
"metric": "avg(rate(node_cpu_seconds_total{mode=\"user\"}[5m]))",
"datasourceId": 1,
"interval": 300,
"trainingWindow": "90d",
"forecastWindow": "7d",
"algorithm": { "name": "prophet", "config": {} }
}'
# 2. Verify job is producing the predicted-value metric (may take a few minutes).
# <datasourceId> must match the datasourceId used above (find it via
# GET /api/datasources), or run the query from Explore instead.
curl -s -H "Authorization: Bearer <token>" \
'https://<stack>.grafana.net/api/datasources/proxy/<datasourceId>/api/v1/query?query=ml_forecast_upper{job="cpu-forecast"}' \
| jq '.data.result | length'
# Expect > 0
# 3. Add an alert that fires when actual exceeds the upper bound
# expr: avg(rate(node_cpu_seconds_total{mode="user"}[5m]))
# > ml_forecast_upper{job="cpu-forecast"} * 1.1
```
### 2. Outlier alert — one service deviates from peers
```bash
# 1. Create outlier job (DBSCAN — groups peers, flags the odd one)
curl -X POST https://<stack>.grafana.net/api/plugins/grafana-ml-app/resources/ml/v1/outlier \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{
"name": "service-error-outliers",
"metric": "sum(rate(http_requests_total{status=~\"5..\"}[5m])) by (service)",
"datasourceId": 1,
"interval": 300,
"algorithm": { "name": "dbscan", "sensitivity": 0.5, "config": { "epsilon": 0.5 } }
}'
# 2. Verify the score metric exists (<datasourceId> must match the
# datasourceId used above, or run the query from Explore instead)
curl -s -H "Authorization: Bearer <token>" \
'https://<stack>.grafana.net/api/datasources/proxy/<datasourceId>/api/v1/query?query=ml_outlier_score{job="service-error-outliers"}' \
| jq '.data.result | length'
# 3. Alert when ml_outlier_score{job="service-error-outliers"} > 0.8 for 5m
```
### 3. Run a Sift investigation
```bash
# 1. Trigger from API (or from Explore / Incident / OnCall)
curl -X POST https://<stack>.grafana.net/api/plugins/grafana-sift-app/resources/sift/v1/investigations \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{ "name":"checkout-spike","start":"2024-02-01T10:00:00Z","end":"2024-02-01T10:30:00Z",
"filters":{"service":"checkout","namespace":"production"} }'
# 2. The response includes an investigation ID — open it in the UI:
# https://<stack>.grafana.net/a/grafana-sift-app/investigations/<id>
# 3. Verify analyses ran — each of the 8 checks shows ✔ or ✖ with linked evidence.
```
See [`references/sift.md`](references/sift.md) for the full 8-analysis table.
### 4. Wire up the LLM Plugin
```yaml
# 1. Provision (provisioning/plugins/llm.yaml — see references/llm-and-graph.md)
apiVersion: 1
apps:
- type: grafana-llm-app
jsonData: { openAIUrl: https://api.openai.com, openAIModel: gpt-4o }
secureJsonData: { openAIKey: sk-... }
```
```bash
# 2. Restart Grafana, then verify the health endpoint reports the configured provider
curl -s -H "Authorization: Bearer <token>" \
https://<stack>.grafana.net/api/plugins/grafana-llm-app/health | jq
# Expect: {"status":"ok", ...}
# 3. Verify in a panel — open any panel, click the Assistant icon, ask "what does this query do?"
```
See [`references/llm-and-graph.md`](references/llm-and-graph.md) for Assistant capabilities, Knowledge Graph search syntax, and Adaptive Metrics recommendations.
## Resources
- [Machine Learning docs](https://grafana.com/docs/grafana-cloud/alerting-and-irm/machine-learning/)
- [Sift](https://grafana.com/docs/grafana-cloud/alerting-and-irm/machine-learning/sift/)
- [Grafana Assistant](https://grafana.com/docs/grafana-cloud/visualizations/grafana-assistant/)
- [LLM Plugin](https://grafana.com/grafana/plugins/grafana-llm-app/)
© grafana · Apache-2.0 · grafana/skills