onboarding
Onboard an Elastic Cloud organization: configure the `elastic` CLI's Cloud context and API key, establish a default region, then…
Investigate a specific Elastic Security detection alert: gather context, assess entity risk, classify the threat, document findings, and optionally acknowledge. Use when triaging a single known alert, performing SOC investigation, or following up after the security-alert-triage
Claude Code
$ npx -y skills add elastic/agent-skills --skill alert-analysis --agent claude-code
Codex
$ npx skills add elastic/agent-skills --skill alert-analysis -a codex -y
Cursor
$ npx skills add elastic/agent-skills --skill alert-analysis -a cursor -y
Gemini CLI
$ npx skills add elastic/agent-skills --skill alert-analysis -a gemini-cli -y
GitHub Copilot
$ npx skills add elastic/agent-skills --skill alert-analysis -a github-copilot -y
OpenCode
$ npx skills add elastic/agent-skills --skill alert-analysis -a opencode -y
Windsurf
$ npx skills add elastic/agent-skills --skill alert-analysis -a windsurf -y
name: security-alert-analysis description: > Investigate a specific Elastic Security detection alert: gather context, assess entity risk, classify the threat, document findings, and optionally acknowledge. Use when triaging a single known alert, performing SOC investigation, or following up after the security-alert-triage skill identifies a group to investigate. metadata: author: elastic version: 0.1.0 universal: true compatibility: Kibana 8.x or 9.x with matching Elasticsearch — self-managed, Elastic Cloud Hosted, or Elastic Cloud Serverless. Acknowledgement uses the Detection Engine API so it works on Serverless where direct writes to alert data streams are rejected. Requires the `elastic` CLI with `es` and `kb` support.
Investigate one Elastic Security alert (or one group of related alerts) end to end: gather context, classify the threat, document findings, and — after confirming scope with the analyst — acknowledge.
<!-- begin-partial: preamble -->
This skill executes Elasticsearch operations through the `elastic` CLI. If the [`elastic` CLI](https://github.com/elastic/cli#configuration) is not installed, tell the user what it is needed for. Do not guess credentials, call the HTTP API directly, or attempt other workarounds.
This skill references operations in HTTP-shorthand form (e.g., `GET /`, `GET /_cat/indices`, `GET /{index}/_mapping`, `GET /{index}/_settings/index.mode`, `POST /_query`). The [Operations](#operations) table at the end of this document maps each shorthand to the equivalent `elastic` CLI command — always use the CLI rather than calling the HTTP API directly.
<!-- end-partial: preamble -->
severity "critical" are NOT evidence.
not a single suspicious API call.
numbers, abbreviate IDs, or paraphrase error messages.
See [references/classification-guide.md](references/classification-guide.md) for detailed evidence-weighting criteria, the behavioral weight table, and common false positive sources.
Retrieve the alert document with `POST /.alerts-security.alerts-*/_search`. Filter to `kibana.alert.workflow_status` not in (`acknowledged`, `closed`), sort by `@timestamp` ascending, and take `size: 1` for the oldest unacknowledged alert — or filter by `_id` when the analyst provides a specific alert.
Capture:
Data needed: alert core fields and key entities to anchor the investigation.
Before gathering entity context, check whether other alerts share the same agent, user, or time window. Run a `POST /_query` against `.alerts-security.alerts-*`:
FROM .alerts-security.alerts-* METADATA _id
| WHERE kibana.alert.workflow_status == "open"
AND agent.id == "<agent_id>"
AND @timestamp >= "<alert_timestamp - 2h>" AND @timestamp <= "<alert_timestamp + 2h>"
| KEEP _id, @timestamp, kibana.alert.rule.name, kibana.alert.severity, kibana.alert.workflow_status
| SORT @timestamp ASC
| LIMIT 50Group related alerts by `agent.id` and a ~5-minute time window (one incident). Triage each group as a unit.
Also run a frequency check to assess false-positive risk:
FROM .alerts-security.alerts-*
| WHERE kibana.alert.rule.name == "<rule_name>"
AND @timestamp >= NOW() - 7 days
| STATS alert_count = COUNT(*) BY kibana.alert.workflow_statusA very high rule frequency (hundreds of alerts per day) is a strong false-positive signal.
Data needed: related alerts on the same entity and an environment-wide frequency count for the triggering rule.
**This is the most important step. Do not skip or shortcut it.** Complete all substeps before forming any classification opinion.
**Time-range rule:** alerts can be days or weeks old. NEVER use relative time such as `NOW() - 1 HOUR`. Extract the alert's `@timestamp` and anchor every context query with a roughly ±1 hour window around that timestamp.
Run 2–4 focused queries with `POST /_query` (not 10+). Use `KEEP` to limit columns and avoid dumping full documents.
**Process tree** — who spawned what:
FROM logs-endpoint.events.process-*
| WHERE agent.id == "<agent_id>"
AND @timestamp >= "<alert_timestamp - 5min>"
AND @timestamp <= "<alert_timestamp + 10min>"
AND process.parent.name IS NOT NULL
AND process.name NOT IN ("svchost.exe", "conhost.exe", "agentbeat.exe")
| KEEP @timestamp, process.name, process.command_line, process.pid,
process.parent.name, process.parent.pid
| SORT @timestamp ASC
| LIMIT 80**Network activity** — outbound connections, DNS:
FROM logs-endpoint.events.network-*
| WHERE agent.id == "<agent_id>"
AND @timestamp >= "<alert_timestamp - 15min>"
AND @timestamp <= "<alert_timestamp + 30min>"
| KEEP @timestamp, process.name, destination.ip, destination.port, dns.question.name
| SORT @timestamp ASC
| LIMIT 50**Index pattern reference:**
| Data type | Index pattern | | --------- | -------------------------------- | | Alerts | `.alerts-sec
Elastic Agent Skills — built by the people who built Elastic — deliver native platform expertise directly to your AI coding agent.
Onboard an Elastic Cloud organization: configure the `elastic` CLI's Cloud context and API key, establish a default region, then…
Provision and operate Elastic Cloud infrastructure: create, connect to, update, and delete Serverless projects (Elasticsearch,…
Explain Elasticsearch ML anomaly detection scores, model behavior, and result interpretation. Use when the user asks why a score…
Create and manage Elastic ML anomaly detection jobs via the API. Use when setting up jobs on an index or data stream, configuring…
Diagnose a non-green Elasticsearch cluster and surface the single most likely cause with remediation. Use when an operator…
Execute ES|QL (Elasticsearch Query Language) queries, use when the user wants to query Elasticsearch data, analyze logs,…
Diagnose why a program crashed on this machine, from a systemd-coredump core dump. Use when a process has segfaulted, aborted, or…
Set up, connect, validate, and repair Claude Desktop and MCP servers using Desktop Commander — inspecting and fixing mcp.json /…
Audit UniFi firewall policies for conflicts, redundancies, security gaps, and best practices. Use when asked to review firewall…
Add a custom domain to a Temps project and provision an automatic SSL/TLS certificate via Let's Encrypt, driven entirely from the…