Skip to content
Development
Skill

/azure-kusto-irql

Compose IRQL (Incident Response Query Language) queries for Kusto cybersecurity investigations. Translates natural language hunting questions into composable IRQL pipelines using Get_*, Extract_*, and Enrich_* functions. WHEN: IRQL query, security hunt, threat hunting KQL,

From plugin
github-copilot-for-azure
25956 skills2 MCP

Claude Code

$ npx -y skills add microsoft/GitHub-Copilot-for-Azure --skill azure-kusto-irql --agent claude-code

SKILL.md

azure-kusto-irql.SKILL.md
name: azure-kusto-irql
description: "Compose IRQL (Incident Response Query Language) queries for Kusto cybersecurity investigations. Translates natural language hunting questions into composable IRQL pipelines using Get_*, Extract_*, and Enrich_* functions. WHEN: IRQL query, security hunt, threat hunting KQL, incident response query, compose hunting pipeline, failed logins, phishing investigation, lateral movement, process execution, file creation events."
license: MIT
metadata:
  author: Microsoft
  version: "0.0.0-placeholder"

IRQL -- Incident Response Query Language

Compose IRQL function pipelines from selector, extractor, and enricher building blocks. IRQL wraps raw KQL security tables behind intent-revealing, composable functions so analysts (and LLMs) can express hunts without memorizing schemas, cluster locations, or join keys.

Activation Triggers

Use this skill when the user:

  • Explicitly mentions IRQL, `Get_*`, `Extract_*`, or `Enrich_*` functions
  • Says "use IRQL" or "write an IRQL query"
  • Requests a composable hunting pipeline using known IRQL selectors

Do **not** activate for generic security queries (e.g. "find failed logins") unless the user explicitly asks for IRQL. Route those to `azure-kusto` instead.

**Not a natural-language-to-IRQL converter.** This skill composes IRQL function pipelines and may handle basic natural-language requests that map directly to known selectors and simple filters. For general NL-to-KQL or NL-to-IRQL conversion, use a dedicated query-generation skill (available separately).

IRQL Function Preflight

Before generating a pipeline, verify IRQL is available on the target database:

.show functions
| where Name startswith "Get_" or Name startswith "Extract_" or Name startswith "Enrich_"
| project Name

If no IRQL functions are found, inform the user that IRQL is not deployed on the target database and suggest using `azure-kusto` for raw KQL queries instead. IRQL functions are a prerequisite -- this skill does not deploy base IRQL selectors.

What IRQL Is

IRQL is a **function-based dialect on top of KQL**. It provides:

1. **Unified schema** -- disparate security tables project into consistent column names regardless of the underlying data source 2. **Composability** -- small functions chain via `| invoke` to build complex hunts from simple steps 3. **Portability** -- the same IRQL pipeline works across different clusters/databases; only the `Get_*` primitives need re-pointing

IRQL is not a separate language. It's KQL functions you invoke. Any valid KQL works alongside IRQL functions.

Deploying IRQL

IRQL functions are stored KQL functions (`.create-or-alter function`). They must already be deployed to the target database before this skill can generate pipelines.

**Public example cluster** (functions pre-deployed):

  • Cluster: `https://kc7001.eastus.kusto.windows.net`
  • Databases: `ValdyTimes`, `JoJosHospital`

To port IRQL to a new cluster/database, create `Get_*` selectors that project your source tables into the unified schema (column names below), then deploy extractors and enrichers. The extractors and enrichers work unchanged as long as the input schema matches.

Function Catalog

1. Selectors -- `Get_*`

Return projected, schema-unified views of source tables. Use the minimal form by default; use `_All` when extra columns are needed.

| Function | Columns | |---|---| | `Get_Event_Authentication` | `EnvTime`, `Hostname`, `ClientIp`, `Username`, `Result` | | `Get_Event_Authentication_All` | + `Description`, `UserAgent`, `PasswordHash` | | `Get_Email` | `EnvTime`, `EmailSender`, `EmailRecipient`, `Subject`, `Url` | | `Get_Email_All` | + `ReplyTo`, `Verdict` | | `Get_Employees` | `Name`, `ClientIp`, `Email`, `Username`, `Hostname`, `Role` | | `Get_Employees_All` | + `HireDate`, `UserAgent`, `Domain` | | `Get_Event_FileCreation` | `EnvTime`, `Hostname`, `Filename`, `Path` | | `Get_Event_FileCreation_All` | + `Username`, `Sha256`, `ProcessName` | | `Get_Event_NetworkInbound` | `EnvTime`, `ClientIp`, `Url` | | `Get_Event_NetworkInbound_All` | + `Method`, `UserAgent`, `StatusCode` | | `Get_Event_NetworkOutbound` | `EnvTime`, `ClientIp`, `Url` | | `Get_Event_NetworkOutbound_All` | + `Method`, `UserAgent` | | `Get_Dns_All` | `EnvTime`, `Domain`, `ClientIp` | | `Get_Event_Process` | `EnvTime`, `ProcessCommandLine`, `ProcessName`, `Hostname`, `Username` | | `Get_Event_Process_All` | + `ParentProcessName`, `ParentProcessHash`, `ProcessHash` | | `Get_SecurityAlerts_All` | `EnvTime`, `AlertType`, `Severity`, `Description`, `Indicators` | | `Get_Network_Connection_All` | `EnvTime`, `SourceIp`, `SourcePort`, `DestinationIp`, `DestinationPort`, `Protocol`, `Bytes` |

2. Extractors -- `Extract_*`

Derive a new column from an existing one. Invoke after a selector.

| Function | Input Column | Adds | |---|---|---| | `Extract_Email_Sender_Domain(T)` | `EmailSender` | `Domain` | | `Extract_Employee_Firstname(T)` | `Name` | `Firstname` | | `Extract_Event_Network_Domain(T)` | `Url` | `DomainName` |

3. Enrichers -- `Enrich_*`

Left-join helpers that attach context from a related table.

| Function | Key Column | Enriches With | |---|---|---| | `Enrich_Event_Authentication_Username(T)` | `Username` | Auth events for user | | `Enrich_Ip_Employee(T)` | `ClientIp` | Employee identity from IP | | `Enrich_Username_Employee(T)` | `Username` | Employee identity from username | | `Enrich_Ip_Domain(T)` | `ClientIp` | DNS domains resolved to IP | | `Enrich_Ip_Event_NetworkOutbound(T)` | `ClientIp` | Outbound network from IP | | `Enrich_Ip_Network_Connection(T)` | `ClientIp` | Network flows from IP |

4. External Enrichment

| Function | Source | Requirement | |---|---|---| | `Enrich_Sha256_VirusTotal(T)` | VirusTotal file report | API key + callout policy | | `Get_CISA_KEV()` / `Enrich_CISA_KEV(T)` | CISA KEV catalog | Callout policy |

Composition Rules

Selector -> Extract -> Filter -> Enrich -> Summarize/Pro
Read more
@microsoft
Ships withgithub-copilot-for-azure

GitHub Copilot for Azure is a set of extensions for Visual Studio, VS Code, and Claude Code designed to streamline the process of developing for Azure.

25956 skills2 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
259
Star history of microsoft/GitHub-Copilot-for-Azure on GitHub, a chart by star-history.com

Other skills on github-copilot-for-azure.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills12d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc13d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react3d252k
@facebook@facebookInstall Skill

Questions about azure-kusto-irql.

Which coding agents can use azure-kusto-irql?
azure-kusto-irql installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.