Sentinel MCP Incident to ServiceNow Case
When a Sentinel incident exceeds a severity threshold, the flow uses the Sentinel MCP (Preview) to assemble a human-readable case narrative and IOC list, opens a ServiceNow security incident with that context, links the two, and keeps status in sync. Bridges Sentinel detections into the ITSM case system with rich 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 solution bridges Microsoft Sentinel incident detections into ServiceNow with rich, machine-assembled context. When a Sentinel incident at or above a configurable severity threshold is raised, the primary flow uses the Sentinel MCP (Preview) to assemble a human-readable case narrative and IOC list, opens a ServiceNow case with that context, links the two in a Dataverse mapping table, comments the case link back onto the Sentinel incident, and notifies the security Teams channel. A second scheduled flow keeps the ServiceNow case status synced back onto the Sentinel incident.
Why it matters: SOC analysts otherwise re-type incident context into the ITSM system. MCP-built narratives make ServiceNow cases complete and consistent from the moment they are opened, and the mapping + status-sync keeps both systems in agreement.
Tenant note: The standard Microsoft Sentinel connector (shared_azuresentinel) is not provisioned in this environment, so the incident trigger and incident-write operations are implemented with a built-in Request (HTTP) trigger (fired by a Sentinel automation rule) and Azure Resource Manager (ARM) REST calls. The Sentinel MCP (Preview) and Teams connectors are used connector-first.
Use Case
A SOC tracks investigations in ServiceNow and wants high-severity Sentinel incidents automatically cased — with a written narrative and IOC list — and wants the Sentinel incident to reflect the ServiceNow case status over time. Audience: IT Admins, Security Operations.
Flow Architecture
manual (Flow A)
Request (HTTP)Receives the Sentinel incident payload (incidentArmId, incidentNumber, title, description, severity, status, entities)
Initialize variables
Initialize variableCorrelation id, severity rank map, incident rank, threshold rank, incident ARM id
Check Severity Meets Threshold
ConditionProceed only when incident rank >= threshold rank; else log below-threshold
Initialize MCP Session
Sentinel MCP (Preview) invokemcpdataexplorationJSON-RPC initialize; capture Mcp-Session-Id
Assemble Case Narrative
Sentinel MCP (Preview) invokemcpdataexplorationtools/call the hunting tool to build the narrative + IOCs
Create ServiceNow Case
ServiceNow CreateRecordOpen the case (table from flowlibs_ServiceNowTable)
Create Link Record
Dataverse CreateRecordPersist the Sentinel<->ServiceNow mapping
Add Sentinel Comment
HTTP (ARM REST)PUT a comment on the Sentinel incident linking the ServiceNow case
Notify Teams
Teams PostMessageToConversationPost to the security channel
Status Sync (Flow B)
Recurrence (hourly) -> Dataverse ListRecords -> ServiceNow GetRecord -> condition -> ARM comment + Dataverse UpdateRecord + Teams postEnvironment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_SentinelSeverityThreshold | String | High | Minimum severity that opens a case. |
| flowlibs_ServiceNowTable | String | incident | ServiceNow table (use sn_si_incident for Security Incident Response). |
| flowlibs_ServiceNowInstanceUrl | String | https://REPLACE.service-now.com | Base URL for building a clickable case link. |
| flowlibs_SentinelSubscriptionId | String | <configure> | Azure subscription of the Sentinel workspace. |
| flowlibs_SentinelResourceGroup | String | rg-sentinel | Resource group of the workspace. |
| flowlibs_SentinelWorkspaceName | String | law-sentinel | Log Analytics / Sentinel workspace name. |
| flowlibs_SentinelMcpToolName | String | run_hunting_query | Sentinel MCP tool invoked for narrative/IOCs. |
| flowlibs_ArmBaseUrl | String | https://management.azure.com | ARM base (audience = base + /). |
| flowlibs_GraphTenantId | String | <your-tenant-id> | Service principal tenant for ARM ActiveDirectoryOAuth. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Microsoft Sentinel MCP (Preview) | shared_sentinelmcp | invokemcpdataexploration |
| ServiceNow | shared_service-now | CreateRecord GetRecord |
| Microsoft Dataverse | shared_commondataserviceforapps | CreateRecord UpdateRecord ListRecords |
| Microsoft Teams | shared_teams |
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.
- Security Incident Response table
- Set flowlibs_ServiceNowTable to sn_si_incident (instead of incident) if the Security Incident Response (SIR) module is licensed.
- Severity threshold
- Change flowlibs_SentinelSeverityThreshold (Informational/Low/Medium/High) to widen or narrow what gets cased.
- MCP tool
- Point flowlibs_SentinelMcpToolName at whichever hunting/knowledge tool the preview exposes in your tenant; the arguments are a KQL query over SecurityIncident.
- Bi-directional close
- Extend Flow B to also push a Sentinel status/close back when the ServiceNow case resolves (ARM PATCH on the incident).
- Assignment group / urgency
- Map Sentinel severity, tactics, or entities to ServiceNow assignment_group, urgency, and impact in Compose ServiceNow Body.
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.01Severity rank gate
Open a case only at/above the threshold
EXPR.02Rank lookup
Numeric rank of the incident severity
EXPR.03Incident ARM id (fallback build)
Rebuild the ARM id from env vars when omitted
EXPR.04MCP session reuse
Captured session id
EXPR.05ServiceNow create result
Also reads ['number'] and ['state']
EXPR.06ARM comment URI
PUT endpoint for the incident comment
EXPR.07State-change test (Flow B)
True when the ServiceNow state differs from last sync
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.