.github/skills/incident-investigation/SKILL.md
Use this skill when asked to investigate a security incident by ID from Microsoft Defender XDR or Microsoft Sentinel. Triggers on keywords like "investigate incident", "incident ID", "incident investigation", "analyze incident", "triage incident", or when an incident number/ID is mentioned with investigation context. This skill provides comprehensive incident analysis including metadata retrieval, alert listing, asset enumeration, evidence filtering, and deep entity investigation using Sentinel MCP tools and specialized skills.
npx skillsauth add scstelz/security-investigator incident-investigationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill performs comprehensive security investigations on incidents from Microsoft Defender XDR and Microsoft Sentinel. It retrieves incident details, lists alerts, enumerates assets and evidences, and then performs deep investigation on user-selected entities using appropriate tools and specialized skills.
Investigation Flow:
Before starting ANY incident investigation:
list_sentinel_workspaces MCP tool BEFORE presenting the investigation menu.github/skills/user-investigation/SKILL.md.github/skills/computer-investigation/SKILL.md.github/skills/ioc-investigation/SKILL.mdhxxps://evil[.]com, 203[.]0[.]113[.]42Incident ID Patterns:
| Pattern | Source | Tool to Use |
|---------|--------|-------------|
| Numeric (e.g., 12345, 98765) | Defender XDR / Sentinel | GetIncidentById |
| GUID format | Sentinel (internal) | Sentinel query_lake MCP tool |
| INxx-xxxxx format | Defender XDR | GetIncidentById |
⚠️ Sentinel → Defender XDR ID Mapping (Critical):
When an incident is discovered via Sentinel KQL (e.g., SecurityIncident or SecurityAlert tables), its IDs are Sentinel-local and will NOT work with the Triage MCP:
| Sentinel Field | Triage MCP Accepts? | Correct Field to Use |
|---------------|---------------------|---------------------|
| SecurityIncident.IncidentNumber | ❌ Returns "not found" | Use SecurityIncident.ProviderIncidentId |
| SecurityAlert.SystemAlertId | ❌ Returns "not found" | Extract parse_json(ExtendedProperties).IncidentId |
| SecurityIncident.ProviderIncidentId | ✅ | Pass directly to GetIncidentById |
Rule: When querying SecurityIncident for later Triage MCP drill-down, always project ProviderIncidentId alongside IncidentNumber. Use ProviderIncidentId for all GetIncidentById calls.
Date Range Rules:
2026-01-17T00:00:00Z to 2026-01-24T00:00:00Z)This phase retrieves and presents all incident information. Follow the exact structure below.
Retrieve and list the incident's metadata using GetIncidentById:
| Field | Description | |-------|-------------| | Title | Incident display name | | Description | Detailed incident description | | Status | Active, Resolved, Redirected | | Severity | High, Medium, Low, Informational | | Priority assessment | If available from incident data | | Classification | TruePositive, FalsePositive, BenignPositive, etc. | | Determination | Malware, Phishing, etc. | | Created Date | When incident was created | | First Activity Date | First malicious activity timestamp | | Last Updated Date | Most recent modification | | Assigned To | Analyst assigned to incident | | MITRE Categories | Tactics and techniques involved | | Tags | Labels applied to incident |
Use GetIncidentById with includeAlertsData=true to retrieve incident-specific alerts. This returns only alerts correlated to the incident.
⛔ DO NOT use ListAlerts to retrieve alerts for a specific incident. ListAlerts has NO incidentId parameter — it can only filter by createdAfter, createdBefore, severity, status. Calling it returns all tenant alerts (up to page size 10,000), not incident-specific ones. Any unsupported parameter (e.g., incidentId) is silently ignored.
If GetIncidentById(includeAlertsData=true) returns a truncated or excessively large response (e.g., incident has hundreds of correlated alerts from noise sources like Purview IRM or DLP), use RunAdvancedHuntingQuery as the fallback:
// Get alerts linked to the incident's primary user/entity
AlertInfo
| where Timestamp > datetime(<incident_created_minus_7d>)
| join kind=inner (
AlertEvidence
| where Timestamp > datetime(<incident_created_minus_7d>)
| where EntityType == "User"
| where AccountUpn =~ "<primary_user_upn>" or AccountObjectId == "<user_object_id>"
| distinct AlertId
) on AlertId
| project Timestamp, AlertId, Title, Severity, Category, AttackTechniques, DetectionSource, ServiceSource
| order by Timestamp asc
This approach bypasses the Triage MCP's alert cap and gives full control over date range and entity filtering.
For each alert, retrieve:
Presentation Rules:
Retrieve and list ALL assets involved in the incident by type:
Device Assets: | Field | Description | |-------|-------------| | Name | Device hostname | | Domain | AD domain | | Risk Level | Device risk assessment | | Exposure Level | Vulnerability exposure | | OS Platform | Operating system |
User Assets: | Field | Description | |-------|-------------| | Display Name | User's full name | | UPN | User Principal Name | | User Status | Account status | | Domain | User's domain | | Department | Organizational department |
App Assets: | Field | Description | |-------|-------------| | App Name | Application name | | App Client ID | OAuth client ID | | Risk | Application risk level | | Publisher | App publisher |
Cloud Resource Assets: | Field | Description | |-------|-------------| | Resource Name | Cloud resource identifier | | Status | Resource status | | Cloud Environment | Azure, AWS, GCP, etc. | | Type | Resource type |
Count assets by type ONLY after retrieving complete lists.
Retrieve evidences classified as malicious or suspicious only:
Processes (Top 10):
Files (Top 10):
IP Addresses (Top 10, Filtered):
203[.]0[.]113[.]42, evil[.]com. NEVER output clickable malicious indicators.URLs and DNS Domains (Top 10, Filtered):
hxxps://evil[.]com/path, hxxp://malware[.]net. NEVER output clickable malicious URLs.AD Domains:
For each evidence type: If more than 10 exist, note this after the table and provide Defender portal link.
This checkpoint MUST be completed before ANY entity investigation can proceed.
ALWAYS execute this step first, regardless of any other considerations:
list_sentinel_workspaces (MCP tool)
Store the result. This determines the workflow for Step 2.3.
Show a summary of the incident entities and assets from Phase 1:
🔴 DEFANG ALL URLs AND DOMAINS: When presenting URLs and DNS Domains to the user, ALWAYS use defanged format: hxxps://evil[.]com/path, hxxp://malware[.]net, evil[.]com. NEVER output clickable malicious URLs.
🔴 DEFANG ALL IPs: When presenting IPs to the user, ALWAYS use defanged format: 203[.]0[.]113[.]42. NEVER output clickable malicious indicators.
IF workspace_count == 1:
- Auto-select the single workspace
- Display: "Using Sentinel workspace: [NAME] ([ID])"
- Set SESSION_WORKSPACE_SELECTED = true
ELSE IF workspace_count > 1 AND SESSION_WORKSPACE_SELECTED == false:
- Display all workspaces with Name and ID
- ASK USER: "Which Sentinel workspace should I run my searches in? Select one or more, or choose 'all'."
- WAIT for user response
- Set SESSION_WORKSPACE_SELECTED = true after selection
ELSE IF workspace_count > 1 AND SESSION_WORKSPACE_SELECTED == true:
- Display: "Continuing with previously selected workspace: [NAME] ([ID])"
- DO NOT ask again
If SESSION_WORKSPACE_SELECTED == false after Step 2.3, STOP and ask the user to select a workspace.
Ask the user:
"Which assets and entities involved in the incident should be investigated in depth? Please select them by providing their numbers or names, or simply ask to analyze all of them. The more entities you select, the longer the analysis will take."
🔴 DO NOT OFFER OTHER OPTIONS: Only ask the user whether they want to investigate one or more of the incident entities and assets listed above in more depth.
Read the response.
Pre-flight check: Confirm SESSION_WORKSPACE_SELECTED == true before proceeding.
Proceed in accordance with the instructions described below for Phase 2-A, Phase 2-B, and Phase 2-C. When multiple investigation types are selected (users, devices, IoCs) run them in parallel as much as possible.
⛔ VERIFY BEFORE PROCEEDING:
SESSION_WORKSPACE_SELECTED == true (workspace explicitly selected by user)SELECTED_WORKSPACE_IDS array is populated with user's selectionIf any pre-requisite is FALSE: STOP and return to Phase 2.3 Workspace Selection Gate.
⚡ PARALLEL EXECUTION: When multiple users are selected, execute user investigations in parallel as much as possible.
📦 WORKSPACE CONTEXT: Pass the selected workspace(s) to all child skill invocations:
SELECTED_WORKSPACE_IDS from Phase 2.3 for all Sentinel queriesFor EACH user selected by the user:
🔴 REFERENCE THE SKILL FILE: Read and follow the complete workflow defined in:
.github/skills/user-investigation/SKILL.md
Key Steps (summary - see skill file for full details):
DO NOT copy the full workflow here - always read the skill file for the most current instructions.
⚡ PARALLEL EXECUTION: When multiple devices are selected, execute device data collection queries in parallel for ALL devices simultaneously. Run Defender alerts, compliance, logged-on users, vulnerabilities, network/process/file events queries concurrently.
For EACH device selected by the user:
🔴 REFERENCE THE SKILL FILE: Read and follow the complete workflow defined in:
.github/skills/computer-investigation/SKILL.md
Key Steps (summary - see skill file for full details):
DO NOT copy the full workflow here - always read the skill file for the most current instructions.
⚡ PARALLEL EXECUTION: When multiple IoCs are selected, execute ALL IoC investigation queries in parallel. Run threat intel lookups, Sentinel queries, and organizational exposure queries concurrently for all IoCs.
For EACH IoC selected by the user:
🔴 REFERENCE THE SKILL FILE: Read and follow the complete workflow defined in:
.github/skills/ioc-investigation/SKILL.md
Supported IoC Types:
| IoC Type | Detection Pattern | Key Investigation Points |
|----------|-------------------|-------------------------|
| URL | https?:// or domain pattern | Malicious indicators, phishing, threat intel, organizational exposure |
| IPv4 Address | \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} | Threat intel, network connections, geographic analysis |
| IPv6 Address | Contains multiple colons | Same as IPv4 |
| Domain | [a-zA-Z0-9][-a-zA-Z0-9]*\.[a-zA-Z]{2,} | DNS queries, email threats, reputation |
| MD5 Hash | 32 hex characters | File prevalence, malware analysis |
| SHA1 Hash | 40 hex characters | File prevalence, malware analysis |
| SHA256 Hash | 64 hex characters | File prevalence, malware analysis |
Key Steps (summary - see skill file for full details):
DO NOT copy the full workflow here - always read the skill file for the most current instructions.
After completing ALL selected entity investigations in Phase 2, you MUST:
☐ Step 3.1: Compile list of UNINVESTIGATED entities (exclude already-investigated items)
☐ Step 3.2: Present remaining entities to user with numbered list
☐ Step 3.3: Ask: "Would you like to investigate any of the remaining entities? Select by number/name, or say 'done' to conclude."
☐ Step 3.4: Wait for user response before concluding
After presenting investigation findings, ALWAYS end with:
📋 Remaining Uninvestigated Entities:
| # | Type | Entity | Notes | |---|------|--------|-------| | 1 | Device | [DEVICE_NAME] | [Risk level or relevant context] | | 2 | File | [FILENAME] | [Hash or detection status] | | 3 | URL | [DEFANGED_URL] | [Threat assessment] | | ... | ... | ... | ... |
Would you like to investigate any of these remaining entities? Select by number/name, type "all" to investigate everything, or say "done" to conclude the investigation.
IF user selects additional entities:
→ Return to Phase 2 (2-A, 2-B, or 2-C based on entity type)
→ After completion, return to Phase 3 again
ELSE IF user says "done" or declines:
→ Proceed to Final Summary
→ Provide recommendations
→ Offer to generate consolidated report
Purpose: Starts asynchronous security analysis of a user entity.
Parameters:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| userId | string | Yes | User's Azure AD Object ID (GUID) |
| startTime | string | Yes | ISO 8601 format start time |
| endTime | string | Yes | ISO 8601 format end time |
| workspaceId | string | No | Sentinel workspace GUID (optional if only one workspace) |
Time Window Options: 30 days (Comprehensive), 7 days (Standard), 1 day (Quick)
Returns: 202 Accepted with analysisId
Purpose: Retrieves results of an asynchronous entity analysis.
Parameters:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| analysisId | string | Yes | Analysis ID returned from analyze_*_entity |
Returns: 200 OK with analysis results when complete, or status if still processing
When a user requests an incident investigation:
Phase 1 - Incident Description:
GetIncidentById⛔ Phase 2 - Mandatory Workspace Selection:
list_sentinel_workspaces MCP tool FIRSTPhase 2-A - User Investigation:
.github/skills/user-investigation/SKILL.mdPhase 2-B - Device Investigation:
.github/skills/computer-investigation/SKILL.mdPhase 2-C - IoC Investigation:
.github/skills/ioc-investigation/SKILL.mdExport & Summary:
| Field | Type | Description |
|-------|------|-------------|
| investigation_metadata | object | Incident ID, timestamp, investigation phases completed |
| incident_details | object | Metadata, alerts, assets, evidences from Phase 1 |
| user_investigations | array | Results from Phase 2-A (user-investigation skill) |
| device_investigations | array | Results from Phase 2-B (computer-investigation skill) |
| ioc_investigations | array | Results from Phase 2-C (ioc-investigation skill - includes IPs, URLs, Files, Domains, Hashes) |
| summary | object | Key findings, risk assessment, recommendations |
{
"investigation_metadata": {
"incident_id": "<INCIDENT_ID>",
"investigation_timestamp": "<ISO_TIMESTAMP>",
"phases_completed": ["incident_description", "user_investigation", "device_investigation", "ioc_investigation"],
"total_elapsed_time_seconds": 300
},
"incident_details": {
"metadata": {
"title": "<INCIDENT_TITLE>",
"description": "<DESCRIPTION>",
"severity": "<SEVERITY>",
"status": "<STATUS>",
"classification": "<CLASSIFICATION>",
"determination": "<DETERMINATION>",
"created_date": "<TIMESTAMP>",
"first_activity_date": "<TIMESTAMP>",
"last_updated_date": "<TIMESTAMP>",
"assigned_to": "<ANALYST>",
"mitre_categories": ["<TACTIC1>", "<TACTIC2>"],
"tags": ["<TAG1>", "<TAG2>"]
},
"alerts": [
{
"name": "<ALERT_NAME>",
"severity": "<SEVERITY>",
"status": "<STATUS>",
"first_activity": "<TIMESTAMP>",
"last_activity": "<TIMESTAMP>"
}
],
"assets": {
"devices": [...],
"users": [...],
"apps": [...],
"cloud_resources": [...]
},
"evidences": {
"processes": [...],
"files": [...],
"ip_addresses": [...],
"urls": [...],
"ad_domains": [...]
}
},
"user_investigations": [
{
"upn": "[email protected]",
"user_id": "<GUID>",
"analysis_id": "<ANALYSIS_ID>",
"time_window": {
"start": "<ISO_TIMESTAMP>",
"end": "<ISO_TIMESTAMP>"
},
"findings": {...},
"risk_level": "High"
}
],
"device_investigations": [
{
"hostname": "<DEVICE_NAME>",
"device_id": "<GUID>",
"findings": {...}
}
],
"ioc_investigations": [
{
"ioc_type": "IP",
"value": "203.0.113.42",
"findings": {...}
},
{
"ioc_type": "URL",
"value": "https://example.com",
"findings": {...},
"threat_assessment": "Malicious"
}
],
"summary": {
"risk_assessment": "High",
"key_findings": [...],
"recommendations": [...]
}
}
| Issue | Solution |
|-------|----------|
| Incident not found | Verify incident ID format; try Sentinel query if Defender fails |
| User Object ID not found | Verify UPN is correct; check if user exists in Entra ID |
| analyze_user_entity returns error | Check userId is GUID format; verify time window ≤ 30 days |
| get_entity_analysis still processing | Poll again after 5-10 seconds; max 2 minutes |
| No workspace found | Use list_sentinel_workspaces MCP tool to get workspace ID |
| Device investigation fails | Verify device exists in Defender; check device ID type |
| IoC investigation timeout | Reduce date range; check IoC format |
If workspace ID is unknown, retrieve it first:
list_sentinel_workspaces (MCP tool)
Returns: List of workspace name/ID pairs
If there is more than one Sentinel workspace (as retrieved from list_sentinel_workspaces MCP tool), present the list - in terms of workspace names and IDs - to the user so that the user can select which workspace to use for the investigation.
Offer also to the user the possibility to use all existing workspaces.
If only one workspace is selected by the user, use the workspaceId of that workspace when calling investigation tools.
If the user asks to consider more than one workspace, use one by one the workspaceId of all of them when calling investigation tools.
| Tool | Time Window Options | |------|---------------------| | User Investigation | 30 days (Comprehensive), 7 days (Standard), 1 day (Quick) | | Computer Investigation | 30 days (Comprehensive), 7 days (Standard), 1 day (Quick) | | IoC Investigation | 30 days (Comprehensive), 7 days (Standard), 1 day (Quick) |
User Request: "Investigate incident 12345"
[00:00] Starting incident investigation for ID: 12345
### Incident Metadata
- **Title:** Multi-stage attack with credential theft
- **Severity:** High
- **Status:** Active
- **Classification:** TruePositive
- **Created:** 2026-01-20T10:30:00Z
- **MITRE Categories:** Initial Access, Credential Access, Lateral Movement
### Incident Alerts
| # | Alert Name | Severity | Status | Last Activity |
|---|------------|----------|--------|---------------|
| 1 | Suspicious sign-in from unusual location | High | New | 2026-01-23 |
| 2 | Credential theft attempt detected | High | InProgress | 2026-01-22 |
| ... | ... | ... | ... | ... |
### Incident Assets
**Devices:**
| Name | Domain | Risk Level | OS |
|------|--------|------------|-----|
| WORKSTATION-01 | contoso.com | High | Windows 11 |
| LAPTOP-EXEC | contoso.com | Medium | Windows 11 |
| SERVER-DC01 | contoso.com | Low | Windows Server 2022 |
**Users:**
| Display Name | UPN | Status | Department |
|--------------|-----|--------|------------|
| John Smith | [email protected] | Active | Finance |
| Admin Account | [email protected] | Active | IT |
| Jane Doe | [email protected] | Active | HR |
| Service Account | [email protected] | Active | IT |
### Incident Evidences
**IPs (after filtering - excluded private IPs):**
- `203[.]0[.]113[.]42` (Malicious - C2 communication)
- `198[.]51[.]100[.]10` (Suspicious - Data exfiltration)
- `192[.]0[.]2[.]50` (Suspicious - Unusual connection)
...
**URLs (after filtering - excluded managed domains):**
- `hxxps://evil-site[.]com/payload[.]exe` (Malicious)
- `hxxps://phishing[.]example[.]com/login` (Suspicious)
...
[01:30] Phase 1 completed (90 seconds)
Which users from the incident assets should be investigated deeply?
Available users:
1. [email protected] (Finance)
2. [email protected] (IT)
3. [email protected] (HR)
4. [email protected] (IT)
User selects: "1, 2"
[01:35] Starting parallel user analysis for 2 users...
- Getting user Object IDs from Graph API (parallel)
- Starting analyze_user_entity for [email protected] (Analysis ID: abc123-def456)
- Starting analyze_user_entity for [email protected] (Analysis ID: xyz789-ghi012)
- Polling for results (parallel)...
[02:15] All analyses complete
### User Analysis: [email protected]
**Risk Level:** High
**Key Findings:**
1. Sign-in from unusual location (IP: `203[.]0[.]113[.]42`, Country: Russia)
2. Multiple failed MFA attempts followed by success
3. Unusual file access pattern detected
...
### User Analysis: [email protected]
**Risk Level:** Medium
**Key Findings:**
1. Service account usage from new device
...
[02:20] Phase 2-A completed (45 seconds - parallel execution)
Which devices from the incident assets should be investigated deeply?
Available devices:
1. WORKSTATION-01 (High risk)
2. LAPTOP-EXEC (Medium risk)
3. SERVER-DC01 (Low risk)
User selects: "1"
[03:10] Starting device investigation for WORKSTATION-01...
- Following computer-investigation skill workflow
- Getting device IDs (Entra + Defender)
- Running parallel queries...
[04:30] Device investigation complete
### Device Analysis: WORKSTATION-01
**Key Findings:**
1. Malware execution detected (sha256: abc123...)
2. Outbound C2 communication to 203.0.113.42
3. Credential dumping tool found
...
[04:35] Phase 2-B completed (85 seconds)
Which IPs, URLs, Files, Domains, or Hashes should be investigated deeply?
Available IoCs:
1. 203[.]0[.]113[.]42 (IP - C2 communication)
2. 198[.]51[.]100[.]10 (IP - Data exfiltration)
3. hxxps://evil-site[.]com/payload[.]exe (URL - Malicious)
4. hxxps://phishing[.]example[.]com/login (URL - Suspicious)
5. abc123def456... (Hash - Malware)
User selects: "1, 3, 4, 5"
[04:40] Starting parallel IoC investigation for 4 IoCs...
- Following ioc-investigation skill workflow
- Running threat intel, Sentinel, and exposure queries in parallel for all IoCs
[05:30] All IoC analyses complete
### IP Analysis: 203[.]0[.]113[.]42
**Threat Assessment:** Malicious
**Key Findings:**
1. Known C2 infrastructure
2. Associated with threat actor APT-XYZ
...
### URL Analysis: hxxps://evil-site[.]com/payload[.]exe
**Threat Assessment:** Malicious
**Key Findings:**
1. Known malware distribution domain
2. 3 devices in organization accessed this URL
...
### URL Analysis: hxxps://phishing[.]example[.]com/login
**Threat Assessment:** Suspicious
**Key Findings:**
1. Phishing page mimicking corporate login
...
### Hash Analysis: abc123def456...
**Threat Assessment:** Malicious
**Key Findings:**
1. Known malware sample
...
[05:35] Phase 2-C completed (55 seconds - parallel execution)
[05:45] Investigation Summary
=========================
**Incident:** 12345 - Multi-stage attack with credential theft
**Total Investigation Time:** 4 minutes 10 seconds (optimized with parallel execution)
**Key Findings:**
1. Compromised user account ([email protected]) used for initial access
2. Malware deployed on WORKSTATION-01 establishing C2 channel
3. Credential theft attempt targeting admin account
4. Data exfiltration attempts detected
**Recommendations:**
1. 🔴 CRITICAL: Isolate WORKSTATION-01 immediately
2. 🔴 CRITICAL: Reset credentials for [email protected] and [email protected]
3. 🟠 HIGH: Block IP `203[.]0[.]113[.]42` at firewall
4. 🟠 HIGH: Block domain `evil-site[.]com`
5. 🟡 MEDIUM: Review all sign-ins for affected users in past 30 days
**Export:** temp/incident_investigation_12345_20260124.json
This skill orchestrates investigations by referencing specialized skills:
| Investigation Phase | Skill/Tool | Location/Reference |
|--------------------|------------|-------------------|
| Phase 1: Incident Description | Built-in workflow | This file (see Phase 1 section) |
| Phase 2-A: User Investigation | user-investigation skill | .github/skills/user-investigation/SKILL.md |
| Phase 2-B: Device Investigation | computer-investigation skill | .github/skills/computer-investigation/SKILL.md |
| Phase 2-C: IoC Investigation | ioc-investigation skill | .github/skills/ioc-investigation/SKILL.md (IPs, URLs, Files, Domains, Hashes) |
🔴 ALWAYS read the referenced skill file before executing that phase to ensure proper workflow execution.
development
Use this skill when asked to investigate a computer, device, endpoint, or machine for security issues, suspicious activity, malware, or compliance review. Triggers on keywords like "investigate computer", "investigate device", "investigate endpoint", "check machine", "device security", "endpoint investigation", or when a device name/hostname is mentioned with investigation context. This skill provides comprehensive device security analysis including Defender alerts, sign-in patterns, logged-on users, vulnerabilities, software inventory, compliance status, network activity, and automated investigation tracking for Entra Joined, Hybrid Joined, and Entra Registered devices.
development
Recommended starting point for new users and daily SOC operations. Quick 15-minute security posture scan across 7 domains: active incidents, identity (human + NonHuman), endpoint, email threats, admin & cloud ops, and exposure. 12 queries executed in parallel batches, producing a prioritized Threat Pulse Dashboard with color-coded verdicts (🔴 Escalate / 🟠 Investigate / 🟡 Monitor / ✅ Clear) and drill-down recommendations pointing to specialized skills. Trigger on getting-started questions like "what can you do", "where do I start", "help me investigate". Supports inline chat and markdown file output
development
Use this skill when asked to investigate a user account for security issues, suspicious activity, or compliance review. Triggers on keywords like "investigate user", "security investigation", "user investigation", "check user activity", "analyze sign-ins", or when a UPN/email is mentioned with investigation context. This skill provides comprehensive Entra ID user security analysis including sign-in anomalies, MFA status, device compliance, audit logs, security incidents, Identity Protection risk, and automated reports (HTML, markdown file, or inline chat).
development
Use this skill when asked to generate SVG data visualization dashboards from investigation data or skill reports. Triggers on keywords like "generate SVG dashboard", "create a visual dashboard", "visualize this report", "SVG from the report", "visualize results", "create SVG chart", "SVG from this data". Supports two modes: manifest-driven structured dashboards (from skill reports with svg-widgets.yaml) and freeform adaptive visualizations from ad-hoc investigation data. Component library includes KPI cards, score cards, bar charts, line charts, donut charts, waterfall charts, tables, recommendation cards, assessment banners. SharePoint Dark Theme default palette.