Sentinel MCP Incident Triage to Teams
When a Microsoft Sentinel incident is created, the flow uses the Sentinel MCP (Preview) to pull enriched context (entities, related alerts, KQL summaries), posts a triage adaptive card to the SOC Teams channel, and writes the triage summary back to the incident. Speeds first-response triage with AI-assisted context.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This flow speeds SOC first-response triage. On a schedule it detects newly created Microsoft Sentinel incidents, uses the Sentinel MCP (Preview) connector to pull enriched triage context (entities, related alerts, KQL summaries), posts a triage Adaptive Card to the SOC Microsoft Teams channel, and writes the triage summary back to the incident as a comment.
Why it matters: Analysts spend minutes gathering context per incident. MCP-driven enrichment delivers a ready-made triage view in Teams instantly, and the write-back leaves an auditable triage note on the incident itself.
Build note - architecture adapted from the original draft. The original idea called for the standard Microsoft Sentinel connector (shared_azuresentinel) trigger When an incident is created + the UpdateIncident action. That connector is not provisioned in this environment (only shared_sentinelmcp and a Lansweeper add-on exist). The flow was therefore built connector-first where connectors exist (Sentinel MCP + Teams) and uses the Azure Resource Manager REST API for Microsoft Sentinel (Microsoft.SecurityInsights/incidents) via the built-in HTTP action - in place of the missing connector. A Recurrence poll substitutes the unavailable Sentinel event trigger.
Use Case
A SOC wants every newly created Sentinel incident to arrive in Teams pre-enriched for fast triage, with the triage context recorded back on the incident so the work is auditable and not duplicated.
Flow Architecture
Recurrence Poll For New Incidents
Recurrence (15 min)Substitute for the unavailable Sentinel event trigger
Initialize variables
Initialize variableCorrelation id, ARM incidents base URL, lookback timestamp, and triage marker
List New Sentinel Incidents
HTTP GET (ARM, ActiveDirectoryOAuth)Lists incidents created within the lookback window
Open Sentinel MCP Session
Sentinel MCP invokemcpdataexploration (JSON-RPC initialize)Opens one MCP session; Mcp-Session-Id reused in the loop
For Each Incident
Apply to eachPer incident: read comments, skip if already triaged, enrich via MCP, compose card, post to SOC channel, write triage back
Enrich Incident With MCP
Sentinel MCP invokemcpdataexploration (JSON-RPC tools/call)Pulls enriched context for the incident
Post Triage Card To SOC Channel
Teams PostCardToConversationPosts the triage Adaptive Card to the SOC channel
Write Triage Back To Incident
HTTP PUT (ARM)Writes the triage as an incident comment (+ marker)
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_ArmBaseUrl | String | https://management.azure.com | Azure Resource Manager base URL (audience = base + /) |
| flowlibs_AzureSubscriptionId | String | <configure> | Subscription containing the Sentinel workspace |
| flowlibs_AzureTenantId | String | <your-tenant-id> | Tenant for the ARM OAuth |
| flowlibs_AzureClientId | String | <configure> | Azure AD app (Sentinel Responder) client id |
| flowlibs_AzureClientSecret | String | <configure> | Azure AD app client secret |
| flowlibs_SentinelResourceGroup | String | rg-sentinel | Resource group of the Log Analytics workspace |
| flowlibs_SentinelWorkspaceName | String | law-sentinel | Log Analytics workspace name (Sentinel) |
| flowlibs_SocTeamsGroupId | String | <your-team-id> | SOC Teams Group (Team) id |
| flowlibs_SocTeamsChannelId | String | <your-channel-id> | SOC Teams Channel id |
| flowlibs_SentinelMcpToolName |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Microsoft Sentinel MCP (Preview) | shared_sentinelmcp | invokemcpdataexploration |
| Microsoft Teams | shared_teams | PostCardToConversation |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Poll frequency / lookback
- Change the Recurrence interval and flowlibs_IncidentLookbackMinutes together so the window matches the cadence.
- Severity routing
- Branch on properties/severity to post High/Critical incidents to a different channel.
- Auto-assign / status
- Extend the ARM write-back to PUT the incident with an owner or status (requires the incident etag + full body).
- Suppression
- Add a Filter array before the loop to skip known-benign titles/rules.
- Richer enrichment
- Adjust the MCP arguments and the configured tool to pull related alerts / hunting results.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Incident id (ARM resource name)
Incident resource name in the loop
EXPR.02Incidents base URL
ARM Microsoft.SecurityInsights base URL
EXPR.03Lookback cutoff
UTC cutoff for the incident poll
EXPR.04MCP session id (reused)
Captured once and reused in the loop
EXPR.05MCP enrichment result
Normalizes the MCP result with a fallback
EXPR.06Already-triaged check
True when no comment contains the triage marker
EXPR.07ARM auth audience
OAuth audience for the ARM REST calls
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.