The section your link pointed to isn't on MSTICPy's page any more, so we've brought you to the top.
MSTICPy is a Python library for InfoSec investigation and hunting in Jupyter Notebooks, supporting data queries, threat intelligence enrichment, and visualization.
import msticpy as mp
mp.init_notebook()
qry_prov = mp.QueryProvider("OpenObserve")
qry_prov.connect(
connection_str="https://localhost:5080",
user="admin",
password="[PLACEHOLDER]",
verify=True,
)
df = qry_prov.exec_query(
'search "error"',
days=1,
limit=100,
timeout=120,
)
qry_prov = mp.QueryProvider("Cybereason")
qry_prov.connect(
instance="cr1",
tenant_id="...",
client_id="...",
client_secret="[PLACEHOLDER]",
)
df = qry_prov.exec_query(
"{}",
page_size=100,
timeout=120,
retry_on_error=True,
)
DataProviders:
OpenObserve:
Args:
connection_str: "https://your-openobserve-host:5080"
user: "your-username"
password:
KeyVault:
verify: true
timeout: 300
from msticpy.analysis.outliers import identify_outliers, plot_outlier_results
import numpy as np
data = np.random.rand(100, 7)
feature_columns = [f'feature{i}' for i in range(1, 8)]
clf, X_outliers, y_pred_outliers = identify_outliers(data, data, contamination=0.1, max_features=0.4)
plot_outlier_results(
clf,
data,
data,
X_outliers,
feature_columns=feature_columns,
plt_title="Isolation Forest Anomaly Detection for Multi Dimension Features"
)
import msticpy as mp
mp.init_notebook()
mp.load_user_session("my_config.yaml", verbose=True)
# qry_prov_sent, qry_prov_md, mssentinel now available as variables
expanded_df = raw_df.mp_pivot.dict_to_dataframe(col="my_nested_column")
%load_ext msticpy.aiagents.mp_docs_rag_magic
%%ask
What are the three things that I need to connect to Azure Query Provider?
query_provider.connect(client_id='<client_id>', client_secret='<secret>')
qry_prov.exec_query(query_string, fail_if_partial=True)
from msticpy.nbtools import QueryEditor
QueryEditor()
qry_prov = QueryProvider("MSSentinel", max_threads=10)
qry_prov.connect(workspace="WS1")
qry_prov.add_connection(workspace="WS2", alias="WS2")
results = qry_prov.exec_query(query="SecurityAlert | take 5")
qry_prov = QueryProvider("VelociraptorLogs", data_paths=["~/my_logs"])
qry_prov.connect()
tables = qry_prov.list_queries()
process_info = qry_prov.vc_prov.velociraptor.Windows_Forensics_ProcessInfo()
import msticpy as mp
mp.load_plugins(plugin_paths=["./my_custom_providers", "./shared_plugins"])
qry_prov = mp.QueryProvider("OSQueryLogs", data_paths=["/var/osquery/logs"])
qry_prov.connect()
df = qry_prov.osquery.processes()
from msticpy.data.drivers.sentinel_query_reader import download_and_write_sentinel_queries
download_and_write_sentinel_queries(query_type="Hunting", yaml_output_folder="./sentinel_hunt")
from msticpy.sectools import ThreatIntLookup
pdlookup = ThreatIntLookup()
pdlookup.init(provider='Pulsedive')
pddetail = pdlookup.explore(query="ioc=pulsedive.com or threat=AgentTesla")
import msticpy as mp
mp.set_logging_level("INFO")
tilookup.lookup_iocs(data, progress=False)
sentinel.connect()
sentinel.create_dynamic_summary(
name='My_XYZ_Summary',
description='Summarizing the running of the XYZ job.',
data=summary_df,
tactics=['discovery', 'exploitation'],
techniques=['T1064', 'T1286'],
search_key='host.domain.dom',
)
qry_prov = mp.QueryProvider('MSSentinel')
query = """
SecurityEvent
| where EventID == {event_id}
| where TimeGenerated between (datetime({start}) .. datetime({end}))
| where Computer has "{host_name}"
"""
qp_host = qry_prov.Param('host_name', 'str', 'Name of Host')
qp_start = qry_prov.Param('start', 'datetime')
qp_end = qry_prov.Param('end', 'datetime')
qp_evt = qry_prov.Param('event_id', 'int', None, 4688)
qry_prov.add_custom_query(
name='get_host_events',
query=query,
family='Custom',
parameters=[qp_host, qp_start, qp_end, qp_evt]
)
matches = qry_prov.search(
search='syslog',
table='Syslog',
param='hostname'
)
context_lookup = ContextLookup()
result = context_lookup.lookup_observable('10.0.0.1', providers=['ServiceNow'])
ContextProviders:
ServiceNow:
Primary: True
Args:
TenantId: <tenant_id>
AuthKey: 'auth_key'
AuthId: 'auth_id'
Provider: "ServiceNow"
from msticpy.common.utility import defang_ioc, refang_ioc
defanged = defang_ioc('http://evil.com')
refanged = refang_ioc('hXXp://evil[.]com')
process_tree(ProcessID='{123e4567-e89b-12d3-a456-426614174000}')
mp.init_notebook(config="~/configs/all_ti_provs.yaml")
cust_schema = { 'process_name': 'ImageFileName', 'process_id': 'PID', 'parent_id': 'PPID', 'time_stamp': 'CreateTime' }
df.mp_plot_process(schema=cust_schema)
import msticpy as mp
mp.search("riskiq")
ti_lookup.lookup_iocs(["192.168.1.1", "evil.com"])
import msticpy as mp
mp.init_notebook(config="/path/to/project/msticpyconfig.yaml")
from msticpy.providers.mde_provider import MDEProvider
mde = MDEProvider()
results = mde.my_query(params={'limit': 100}, timeout=30)
# kql_query.kusto
#database = 'SecurityDatabase'
SecurityEvent | where TimeGenerated > ago(1d)
import msticpy
from msticpy.provider.IntSightsProvider import IntSightsProvider
provider = IntSightsProvider(api_key='your-key')
print(provider.indicators.get(indicator='example.com'))
from msticpy.sectools.sentinel_alert import SentinelAlert
alert = SentinelAlert(alert_data=sentinel_json_payload)
print(alert.related_entities)
import msticpy
from msticpy.providers.cybereason.CybereasonProvider import CybereasonProvider
provider = CybereasonProvider(host='https://cybereason-api')
hosts = provider.hosts.get_all()
print(hosts)
df.mp_plot.incident_graph(timeline=True)
(
Dns.RiskIQ.resolutions("jquery.su")
.query("recordtype=='A'")
.mp_pivot.run(Dns.RiskIQ.reputation, column='resolve', join='left')
.mp_pivot.run(IpAddress.RiskIQ.resolutions, column='resolve', join='left')
)
DataProviders:
MicrosoftDefender:
Args:
ClientId: <client_id>
ClientSecret:
KeyVault: <keyvault_name>
TenantId: <tenant_id>
import json
from msticpy.sectools.entities import Entity
# Assuming 'my_entities' is a list of entity instances
json_output = json.dumps(my_entities, cls=Entity.JSONEncoder)
print(json_output)
# Open MpConfigEdit and navigate to Azure tab
# Select 'Azure China', 'Azure Germany', or 'US Government'
# from the cloud provider dropdown menu
az_net_flows_df.mp_timeline.plot_duration(
group_by=["SrcIP", "DestIP", "L7Protocol"]
)
from msticpy.nbtools.timeline_duration import display_timeline_duration
display_timeline_duration(
host_logons,
group_by="Account",
ref_events=host_logons.sample(3),
ref_col="TargetUserName",
)
from msticpy.data import DataProvider
provider = DataProvider(query_provider='AzureResourceGraph')
df = provider.query('Resources | where type =~ "microsoft.compute/virtualmachines"')
from msticpy.vis import DataViewer
viewer = DataViewer(df)
viewer.show()
from msticpy.data import DataProvider
provider = DataProvider(query_provider='Sumologic')
results = provider.search('error', count=10)
from msticpy.sectools.threat_intelligence import ThreatIntel
with ThreatIntel() as ti:
results = ti.query_provider('Greynoise', '1.2.3.4')
# Assuming 'pivot_df' is the result of a pivot operation
pivot_df = pivot_df.sort('TimeGenerated', ascending=False).filter_cols(['Host', 'Account', 'TimeGenerated'])
from msticpy.sectools.ipaddr import IpAddress
my_ip = IpAddress(Address='8.8.8.8')
whois_info = my_ip.whois()
# In msticpyconfig.yaml
providers:
DataProviders:
- AzureSentinel
TIProviders:
- MISP
pip install msticpy[vt3]
df = data_providers.get_data(query, split_query_by='1D')
from msticpy.sectools.query_browser import query_browser
query_browser()
from msticpy.data.query_browser import obfuscate_data
obfuscated = obfuscate_data(input_data)
import msticpy
msticpy.check_version()
from msticpy.data.local_data_driver import LocalDataDriver
provider = LocalDataDriver()
query_store = provider.query_provider
my_events_df.mp_timeline.plot()
%%ioc
192.168.1.1
evil.com
%%b64
c2VjcmV0IGRhdGE=
from msticpy.sector.mdatp import MDATPQueryProvider
mdatp_prov = MDATPQueryProvider()
alerts = mdatp_prov.get_alerts()
from msticpy.view.process_tree import ProcessTreeViewer
viewer = ProcessTreeViewer(processes)
viewer.show()
from msticpy.sectools import QueryProvider
query_prov = QueryProvider('DefenderATP')
alerts = query_prov.alerts.search(query='AlertSeverity == "High"')
from msticpy.sectools import ProcessTreeViewer
import pandas as pd
tree_df = pd.DataFrame([...]) # Your process tree data
ProcessTreeViewer(tree_df).show()
from msticpy.cloud import AzureMgmtSubscription, AzureMgmtResource
sub = AzureMgmtSubscription()
subs = sub.get_subscriptions()
resources = AzureMgmtResource(subscription_id=subs[0].subscription_id)
vms = resources.get_virtual_machines()
import msticpy.cmd_line as cmd
result = cmd.analyze_cmd('cmd.exe /c dir')
import msticpy as m
config = m.settings.get('TIProvider', {})
from msticpy.sectools import TILookup
ti = TILookup()
ti.init(provider='AzureSentinel')
from msticpy.sectools import TILookup
ti = TILookup()
ti.init(provider='kql_base')
from msticpy.query.kql import execute_simple_query
result = execute_simple_query('SecurityEvent | take 5')
print(result)
import msticpy.observationlist
Summary
MSTICPy is an open-source Python library for InfoSec investigation and hunting inside Jupyter Notebooks, free to use and imported directly into a notebook rather than run as a standalone application. It lets analysts query log data from multiple sources — Microsoft Sentinel, Splunk, Microsoft Defender, Microsoft GraphMicrosoft GraphMicrosoft's unified REST API for accessing data and services across Microsoft 365, Azure AD, and related cloud products, giving cyber tools a single authenticated endpoint to query users, emails, files, and sign-in logs., Cybereason, Prisma Cloud, OpenObserve and others — then enrich it with threat intelligence, geolocation and Azure resource data, extract indicators of activity, and visualize results through interactive timelines, process trees and Morph Charts. It is built for SOCSOCA security operations center, the team or function that monitors threats, investigates alerts and coordinates incident response. Its work can be internal, outsourced or shared. analysts and threat hunters who write notebooks rather than dashboards, and it grew out of Microsoft's own MSTIC team authoring Sentinel notebooks before extending to other SIEMSIEMSecurity information and event management, collecting logs from many systems and correlating events to find suspicious activity. Analysts use it to investigate alerts and incidents. platforms.
MSTICPy is a Python library for InfoSec investigation and hunting in Jupyter Notebooks, supporting data queries, threat intelligence enrichment, and visualization.
Which hosts or accounts in my logs were also seen in a threat intelligence feed?
pulls indicators from the queried log data and checks them against configured threat intelligence providers, returning matches with confidence scores and source attribution
Where in the world did this set of IP addresses connect from?
enriches the IPs with geolocation lookups and plots them so clusters of unexpected countries or ASNs stand out
Which sessions or events in this dataset are behaving differently from the rest?
runs anomalous session detection, time series decomposition, or outlier scoring (including multi-feature and ensemble methods) over the dataframe and flags the records that fall outside the normal pattern
What actually happened on this host, in what order, across these different log sources?
builds an interactive timeline or process tree from the combined query results so the sequence of events is visible without manually joining tables
Can I ask the same investigative questions whether my logs sit in Sentinel, Splunk, Defender, or Cybereason?
runs the same query and enrichment workflow against whichever provider is configured, returning results as a common pandas dataframe so downstream analysis doesn't change with the source
23 capabilities
· 2 backed by code, an API document or a real run
Built from MSTICPy's releases, docs, README and our own runs.
“Seen” marks the month we first spotted a release the vendor didn't date.
Group names and tags are our labels.
+Visualization and mappingshippedVisualizes investigation timelines, graphs, process trees, and maps directly from data structures.27 releases · 9 other sources · first seen Apr 2019▸
Shared capability: Forensic timeline analysis
release
27 total
Cybereason driver's data flattening (_flatten_simple_values, _flatten_element_values) reworked for more reliable output, with extra fields now mapped to the result DataFrame.
v3.0.0 · Apr 2026
· source
· release history
Adds RRCF (Random Cut Forest) outlier detection for ensemble-based anomaly scoring on telemetry data.
v2.17.0 · Sep 2025
· source
· release history
Adds multi-dimensional plot support to analysis.outliers via plot_outlier_results, enabling visual interpretation of Isolation Forest anomaly detection across N-dimensional feature sets.
v2.15.0 · Dec 2024
· source
· release history
Adds a max-retry parameter to prevent HTTP 429 (rate-limit) errors during query execution.
v2.14.0 · Oct 2024
· source
· release history
Adds schema parameter to mp_plot_process and related process tree functions to accept dictionary mappings instead of only ProcSchema objects
v2.1.3 · Oct 2022
· source
· release history
Adds plot_map function in msticpy.vis.foliummap for direct DataFrame-to-map plotting with layer and icon control
v2.0.0 · Jul 2022
· source
· release history
example
9 total
Enable process tree visualization using standard Windows process GUIDs instead of parsing hex or decimal integers.$ process_tree(ProcessID='{123e4567-e89b-12d3-a456-426614174000}')
v2.1.5 · Nov 2022
· source
Map custom log fields to the process tree schema using a dictionary$ cust_schema = { 'process_name': 'ImageFileName', 'process_id': 'PID', 'parent_id': 'PPID', 'time_stamp': 'CreateTime' } df.mp_plot_process(schema=cust_schema)
v2.1.3 · Oct 2022
· source
Visualize an investigation timeline directly from a Pandas DataFrame$ df.mp_plot.incident_graph(timeline=True)
v1.5.0 · Nov 2021
· source
Display a timeline with reference events for host logons.$ from msticpy.nbtools.timeline_duration import display_timeline_duration display_timeline_duration( host_logons, group_by="Account", ref_events=host_logons.sample(3), ref_col="TargetUserName", )
v1.3.0 · Jul 2021
· source
Visualize communication duration grouped by source, destination, and protocol.$ az_net_flows_df.mp_timeline.plot_duration( group_by=["SrcIP", "DestIP", "L7Protocol"] )
v1.3.0 · Jul 2021
· source
Render security event logs as an interactive timeline directly from a pandas DataFrame without explicit function calls.$ my_events_df.mp_timeline.plot()
v0.3.2 · Feb 2020
· source
+Threat intelligence lookupsshippedQueries multiple threat intelligence providers and pivots on indicators of compromise.26 releases · 8 other sources · first seen Aug 2019▸
Shared capability: Threat indicator matching
release
26 total
Adds the ScanMalware threat-intelligence provider supporting verdict lookups for hosts and URLs, passive-DNS context for IP addresses, and quick query modes for bulk lookups — no API credentials required.︀︄︇︀︅︉︀︅︀︀︃︀︀︅︅︀︅︊︀︄︆︀︃︄
v3.1.0 · Sep 2026
· source
· release history
Adds the ScanMalware threat-intelligence provider supporting verdict lookups for DNS names, hostnames, URLs, IPv4, and IPv6 observables, passive-DNS context for addresses, and quick query modes for lower-overhead bulk lookups — no configured API credentials required.
v3.1.0 · Sep 2026
· source
· release history
Adds Cyberint as a new Threat Intelligence provider for IoC lookup via the Cyberint API.
v2.16.0 · Feb 2025
· source
· release history
Supports Maxmind GeoIPLite's new AccountID-based download authentication mechanism via msticpyconfig.yaml.
v2.14.0 · Oct 2024
· source
· release history
Adds a new Threat Intelligence provider for BinaryEdge, expanding TI lookup coverage.
v2.13.0 · Sep 2024
· source
· release history
VirusTotalQueries class provides Virus Total Search Capabilities
v2.10.0 · Feb 2024
· source
· release history
example
8 total
Side-load custom threat intelligence providers from specific directories.$ import msticpy as mp mp.load_plugins(plugin_paths=["./my_custom_providers", "./shared_plugins"])
v2.5.0 · May 2023
· source
Defang or refang IOCs using the new utility functions.$ from msticpy.common.utility import defang_ioc, refang_ioc defanged = defang_ioc('http://evil.com') refanged = refang_ioc('hXXp://evil[.]com')
v2.2.0 · Nov 2022
· source
Fetch threat intel data using the new IntSights provider$ import msticpy from msticpy.provider.IntSightsProvider import IntSightsProvider provider = IntSightsProvider(api_key='your-key') print(provider.indicators.get(indicator='example.com'))
v1.7.0 · Feb 2022
· source
Query risk intelligence for an IP and run pivot functions on DNS resolutions$ ( Dns.RiskIQ.resolutions("jquery.su") .query("recordtype=='A'") .mp_pivot.run(Dns.RiskIQ.reputation, column='resolve', join='left') .mp_pivot.run(IpAddress.RiskIQ.resolutions, column='resolve',…
v1.5.0 · Nov 2021
· source
Query threat intel using the new Greynoise provider within a ThreatIntel lookup context.$ from msticpy.sectools.threat_intelligence import ThreatIntel with ThreatIntel() as ti: results = ti.query_provider('Greynoise', '1.2.3.4')
v1.1.0 · May 2021
· source
Install the specific extras package required to access the new VirusTotal V3 API module.$ pip install msticpy[vt3]
v0.8.5 · Oct 2020
· source
+Configuration managementshippedManages tool configuration, workspace selection, and environment-specific settings.22 releases · 5 other sources · first seen Aug 2019▸
release
22 total
Minimum versions have been raised for IPython, ipywidgets, Panel, Folium, Beautiful Soup, and dnspython — review application constraints if they pin older releases of these packages.
v3.1.0 · Sep 2026
· source
· release history
Adds Python 3.14 to the supported package classifiers and CI test matrix while retaining support for Python 3.10 through 3.13.
v3.1.0 · Sep 2026
· source
· release history
Adds mp.load_user_session() to declaratively initialize and connect multiple data providers and components from a YAML file, publishing them directly into the notebook namespace.
v2.14.0 · Oct 2024
· source
· release history
VelociraptorLogs data environment added to read local exported Velociraptor logs into pandas DataFrames.
v2.6.0 · Jul 2023
· source
· release history
The mp_az_auth_tenant_id parameter is deprecated and unsupported in new providers, replaced by tenant_id
v2.5.0 · May 2023
· source
· release history
The mp_az_auth parameter is deprecated in favor of auth_types (will be removed in a future release)
v2.5.0 · May 2023
· source
· release history
example
Configure OpenObserve credentials in msticpyconfig.yaml, storing the password in Key Vault, before connecting from any notebook.$ DataProviders: OpenObserve: Args: connection_str: "https://your-openobserve-host:5080" user: "your-username" password: KeyVault: verify: true timeout: 300
v3.0.0 · Apr 2026
· source
Bootstrap a notebook's full provider stack from a YAML file instead of writing repetitive connect calls — useful in automation or shared notebook templates.$ import msticpy as mp mp.init_notebook() mp.load_user_session("my_config.yaml", verbose=True) # qry_prov_sent, qry_prov_md, mssentinel now available as variables
v2.14.0 · Oct 2024
· source
Configure MSTICPy for Azure China or Government clouds via the settings editor.$ # Open MpConfigEdit and navigate to Azure tab # Select 'Azure China', 'Azure Germany', or 'US Government' # from the cloud provider dropdown menu
v1.4.0 · Sep 2021
· source
Check if the current msticpy installation is up to date with PyPI.$ import msticpy msticpy.check_version()
v0.6.0 · Jun 2020
· source
Access configuration via the new top-level settings attribute.$ import msticpy as m config = m.settings.get('TIProvider', {})
0.2.7 · Oct 2019
· source
+Endpoint and cloud provider supportshippedProvides data access for Microsoft Defender, Cybereason, Kusto, and various cloud environments.16 releases · 10 other sources · first seen Dec 2019▸
release
16 total
Cybereason driver gains automatic HTTP 429 rate-limit retry with backoff, additional query parameters (page_size, timeout, retry_on_error), improved timeout handling, and better error reporting via MsticpyDataQueryError.
v3.0.0 · Apr 2026
· source
· release history
New OpenObserve data provider enables querying OpenObserve instances directly via mp.QueryProvider('OpenObserve'), with support for time-range parameters, result limits, timezone config, and custom timeouts.
v3.0.0 · Apr 2026
· source
· release history
Adds experimental Azure Monitor search driver with support for custom tables (tracked as issue #831).
v2.16.0 · Feb 2025
· source
· release history
Adds PrismaCloudDriver for querying Prisma Cloud assets, configurations, and events via its CSPM API within MSTICPy workflows.
v2.16.0 · Feb 2025
· source
· release history
Adds support for Microsoft Defender Graph API by using the M365DGraph DataEnvironment name in the data provider
v2.9.0 · Nov 2023
· source
· release history
mp.QueryProvider("OSQueryLogs") enables importing OSQuery JSON logs into dataframes for forensic analysis
v2.5.0 · May 2023
· source
· release history
example
10 total
Query an OpenObserve instance for error logs in the last 24 hours — useful for integrating OpenObserve into existing MSTICPy investigation notebooks.$ import msticpy as mp mp.init_notebook() qry_prov = mp.QueryProvider("OpenObserve") qry_prov.connect( connection_str="https://localhost:5080", user="admin", password="[PLACEHOLDER]", verify=True, ) df…
v3.0.0 · Apr 2026
· source
Load and query local Velociraptor forensic logs using the new VelociraptorLogs provider.$ qry_prov = QueryProvider("VelociraptorLogs", data_paths=["~/my_logs"]) qry_prov.connect() tables = qry_prov.list_queries() process_info = qry_prov.vc_prov.velociraptor.Windows_Forensics_ProcessInfo()
v2.6.0 · Jul 2023
· source
Import OSQuery forensic logs from local directories into a QueryProvider.$ qry_prov = mp.QueryProvider("OSQueryLogs", data_paths=["/var/osquery/logs"]) qry_prov.connect() df = qry_prov.osquery.processes()
v2.5.0 · May 2023
· source
Query an MDE provider with a custom timeout to avoid default hanging.$ from msticpy.providers.mde_provider import MDEProvider mde = MDEProvider() results = mde.my_query(params={'limit': 100}, timeout=30)
v1.8.0 · May 2022
· source
Query Cybereason for host data using the new provider$ import msticpy from msticpy.providers.cybereason.CybereasonProvider import CybereasonProvider provider = CybereasonProvider(host='https://cybereason-api') hosts = provider.hosts.get_all() print(hosts)
v1.7.0 · Feb 2022
· source
Query Azure infrastructure directly using KQL within a Jupyter environment.$ from msticpy.data import DataProvider provider = DataProvider(query_provider='AzureResourceGraph') df = provider.query('Resources | where type =~ "microsoft.compute/virtualmachines"')
v1.2.1 · Jun 2021
· source
+Microsoft Sentinel automationshippedCreates, searches, and manages security items within Microsoft Sentinel workspaces.16 releases · 9 other sources · first seen Dec 2019▸
release
16 total
Adds delete_watchlist_item method to the MS Sentinel API integration
v2.7.0 · Aug 2023
· source
· release history
Introduces an ipywidgets-based QueryEditor to edit and manage KQL query templates with parameter definitions and metadata
v2.7.0 · Aug 2023
· source
· release history
max_threads parameter on QueryProvider controls concurrent thread count (default 4, configurable via init).
v2.6.0 · Jul 2023
· source
· release history
QueryProvider.add_connection() enables running queries across multiple Sentinel/Defender/Splunk instances in parallel.
v2.6.0 · Jul 2023
· source
· release history
download_and_write_sentinel_queries(query_type="Hunting") downloads detection/hunting queries from the Sentinel repo for use with MSTICPy
v2.5.0 · May 2023
· source
· release history
Adds sentinel.list_dynamic_summaries(), create_dynamic_summary(), get_dynamic_summary(), and new_dynamic_summary() to manage Microsoft Sentinel dynamic summaries in preview
v2.3.0 · Jan 2023
· source
· release history
example
9 total
Ensure your analysis completes fully by failing the query immediately if it hits a pagination limit.$ qry_prov.exec_query(query_string, fail_if_partial=True)
v2.11.0 · Mar 2024
· source
Initialize the new query editor to manage KQL templates.$ from msticpy.nbtools import QueryEditor QueryEditor()
v2.7.0 · Aug 2023
· source
Run queries across multiple Sentinel workspaces in parallel using the new add_connection and max_threads capabilities.$ qry_prov = QueryProvider("MSSentinel", max_threads=10) qry_prov.connect(workspace="WS1") qry_prov.add_connection(workspace="WS2", alias="WS2") results = qry_prov.exec_query(query="SecurityAlert |…
v2.6.0 · Jul 2023
· source
Download hunting queries from the MS Sentinel repository to local YAML files.$ from msticpy.data.drivers.sentinel_query_reader import download_and_write_sentinel_queries download_and_write_sentinel_queries(query_type="Hunting", yaml_output_folder="./sentinel_hunt")
v2.5.0 · May 2023
· source
Create and persist a Sentinel summary to archive automated notebook results for later retrieval.$ sentinel.connect() sentinel.create_dynamic_summary( name='My_XYZ_Summary', description='Summarizing the running of the XYZ job.', data=summary_df, tactics=['discovery', 'exploitation'],…
v2.3.0 · Jan 2023
· source
Define and register a reusable parameterized KQL query in a notebook without editing static query files.$ qry_prov = mp.QueryProvider('MSSentinel') query = """ SecurityEvent | where EventID == {event_id} | where TimeGenerated between (datetime({start}) ..
v2.3.0 · Jan 2023
· source
+Authentication and token managementshippedManages authentication tokens and secrets securely across various providers.11 releases · first seen Oct 2020▸
release
11 total
Microsoft Sentinel connections now support certificate-based authentication as an alternative to client secrets, improving security for automated pipelines and service accounts.
v3.0.0 · Apr 2026
· source
· release history
Adds certificate authentication support for OData-based drivers (Microsoft Defender and Microsoft Graph).
v2.16.0 · Feb 2025
· source
· release history
Config key authentication.token in msticpyconfig.yaml enables security token auth for SplunkUploader
v2.10.0 · Feb 2024
· source
· release history
Allows passing an AzureCredential object directly to the credential parameter of AzureData.connect() and MicrosoftSentinel.connect() methods for authentication
v2.7.0 · Aug 2023
· source
· release history
Replaces MSAL auth plaintext file cache with a memory cache, removing the ability to use plaintext token cache due to security concerns.
v1.8.2 · May 2022
· source
· release history
The MSAL auth plaintext file cache is replaced with a memory cache; the previous mechanism for persisting tokens to disk is removed.
v1.8.2 · May 2022
· source
· release history
+Query management and templatingshippedAllows defining, registering, and managing parameterized KQL query templates with metadata and a dedicated UI editor within notebooks.6 releases · 3 other sources · first seen May 2019▸
Also counts toward: Scripting API
release
Introduces an ipywidgets-based QueryEditor to edit and manage KQL query templates with parameter definitions and metadata
v2.7.0 · Aug 2023
· source
· release history
Adds QueryProvider.search() method for finding queries by name, properties, table, or parameter using regex-like terms
v2.3.0 · Jan 2023
· source
· release history
Adds QueryProvider.add_custom_query() API to register ad-hoc parameterized queries at runtime with defined parameters
v2.3.0 · Jan 2023
· source
· release history
Adds QueryProvider.Param constructor for defining query parameter metadata (name, type, description, default)
v2.3.0 · Jan 2023
· source
· release history
In query templates you can now express date parameters (and query defaults) as a pos/neg number relative to current date or a KQL-like range (-30d, 15h, etc.)
0.2.7 · Oct 2019
· source
· release history
Runtime parameter replacement for query definitions
v0.1.8 · May 2019
· source
· release history
example
Initialize the new query editor to manage KQL templates.$ from msticpy.nbtools import QueryEditor QueryEditor()
v2.7.0 · Aug 2023
· source
Define and register a reusable parameterized KQL query in a notebook without editing static query files.$ qry_prov = mp.QueryProvider('MSSentinel') query = """ SecurityEvent | where EventID == {event_id} | where TimeGenerated between (datetime({start}) ..
v2.3.0 · Jan 2023
· source
Find all queries in a provider that match specific table names or parameter keywords.$ matches = qry_prov.search( search='syslog', table='Syslog', param='hostname' )
v2.3.0 · Jan 2023
· source
+Data and utility modulesshippedProvides helper modules for common data operations including IP address validation, domain/DNS/URL parsing, syslog log analysis, and command-line inspection.5 releases · 3 other sources · first seen Oct 2019▸
release
Code that directly indexes the dictionary returned by mp_ua_header() must replace ["UserAgent"] with ["User-Agent"]; code that passes the complete dictionary as HTTP headers does not need to change. The raw identifier is available as MSTICPY_USER_AGENT.
v3.1.0 · Sep 2026
· source
· release history
Adds functions to obfuscate/hash data to protect PII
v0.8.0 · Sep 2020
· source
· release history
base64unpack adds a pandas extension for unpacking Base64 data in DataFrames plus an IPython %%b64 magic for notebook cells
v0.3.2 · Feb 2020
· source
· release history
Added ip_utils module for common IP Address operations
0.2.7 · Oct 2019
· source
· release history
Added cmd_line module for syslog CMD analysis
0.2.7 · Oct 2019
· source
· release history
example
Serialize a list of MSTICPy entities to JSON for external storage or transmission without manual mapping.$ import json from msticpy.sectools.entities import Entity # Assuming 'my_entities' is a list of entity instances json_output = json.dumps(my_entities, cls=Entity.JSONEncoder) print(json_output)
v1.4.5 · Oct 2021
· source
Obfuscate sensitive data fields before logging or export$ from msticpy.data.query_browser import obfuscate_data obfuscated = obfuscate_data(input_data)
v0.8.0 · Sep 2020
· source
Unpack base64 encoded strings in a notebook cell using the new magic command.$ %%b64 c2VjcmV0IGRhdGE=
v0.3.2 · Feb 2020
· source
+Package downloadverifiedDownloads a specific Python package version as a zip file to a chosen directory.3 releases · 4 other sources · first seen Nov 2021▸
release
Adds refresh and delete functions in the keyring module for managing cached secrets
v1.7.5 · Mar 2022
· source
· release history
Preview support for the Kusto query provider targeting Azure Data Explorer clusters
v1.5.0 · Nov 2021
· source
· release history
Sovereign cloud support added to the Microsoft Graph provider
v1.5.0 · Nov 2021
· source
· release history
command line
--directory — Directory for saved zip file
v2.8.0 · Oct 2023
· command-line history
+Sentinel query repository accessshippedEnables downloading, loading, and utilizing detection and hunting queries directly from the Microsoft Sentinel repository.5 releases · 1 other source · first seen Jan 2020▸
Also counts toward: Python scripting support
release
The ThreatIntelIndicators BYOTI provider now supports both old and new table schemas, enabling seamless operation across Sentinel workspaces with either schema version.
v3.0.0 · Apr 2026
· source
· release history
download_and_write_sentinel_queries(query_type="Hunting") downloads detection/hunting queries from the Sentinel repo for use with MSTICPy
v2.5.0 · May 2023
· source
· release history
Adds query_browser module for interactive data exploration
v0.8.0 · Sep 2020
· source
· release history
Adds two new Azure Sentinel query templates: linux_logon_failures and host_linux_logons under azure_sentinel.queries.logon_queries
v0.4.1 · May 2020
· source
· release history
Template queries for MDATP for hunting and standard entities
v0.3.0 · Jan 2020
· source
· release history
example
Download hunting queries from the MS Sentinel repository to local YAML files.$ from msticpy.data.drivers.sentinel_query_reader import download_and_write_sentinel_queries download_and_write_sentinel_queries(query_type="Hunting", yaml_output_folder="./sentinel_hunt")
v2.5.0 · May 2023
· source
+Data visualization controlsshippedProvides configurable data viewer components such as Tabulator and base64 cell export for enhanced notebook interaction.5 releases · 1 other source · first seen Sep 2019▸
release
Add bearer token auth to splunk driver - Supports authentication via security token instead of username/password
v2.8.0 · Oct 2023
· source
· release history
Panel Tabulator is now available as a data viewer control, configurable via initialization parameters
v2.5.0 · May 2023
· source
· release history
Adds DataViewer control for sorting, filtering, and browsing pandas DataFrames in notebooks
v1.2.1 · Jun 2021
· source
· release history
New progress_bar widget added to the nbwidgets module for Jupyter notebook progress visualization
v0.2.8 · Dec 2019
· source
· release history
Adds SelectSubset widget in nbwidgets allowing users to pick from one list and add to selected subset
v0.2.6 · Sep 2019
· source
· release history
example
Visualize and filter a pandas DataFrame interactively using the new Bokeh widget.$ from msticpy.vis import DataViewer viewer = DataViewer(df) viewer.show()
v1.2.1 · Jun 2021
· source
+Dependency updates and removalsshippedManages the evolution of package dependencies, including major version upgrades and the removal of deprecated extras or packages.4 releases · first seen Apr 2021▸
release
The sql2kql extra now requires mo-sql-parsing>=11,<12 (previously >=8,<9); environments using sql_to_kql must be updated.
v3.0.0 · Apr 2026
· source
· release history
MSTICPY now requires pandas 1.1.5 as a minimum
v1.3.1 · Aug 2021
· source
· release history
Adds Pandas accessors filter_cols, filter, sort, list_to_rows, and parse_json to pivot data frames
v1.1.0 · May 2021
· source
· release history
Adds msticpy.data.sql_to_kql module to translate ANSI SQL queries to KQL.
v1.0.0 · Apr 2021
· source
· release history
+Anomaly detectionshippedDetects statistical outliers in telemetry data using Isolation Forest or Random Cut Forest algorithms to identify anomalies across multiple feature sets.4 releases · first seen May 2020▸
Also counts toward: ML-based detection
release
Adds RRCF (Random Cut Forest) outlier detection for ensemble-based anomaly scoring on telemetry data.
v2.17.0 · Sep 2025
· source
· release history
Adds multi-dimensional plot support to analysis.outliers via plot_outlier_results, enabling visual interpretation of Isolation Forest anomaly detection across N-dimensional feature sets.
v2.15.0 · Dec 2024
· source
· release history
msticpy.anomaly.markov provides anomalous sequence detection using Markov Chain analysis for session commands/patterns
v0.5.0 · May 2020
· source
· release history
msticpy.anomalymap.AnomalyDetection enables Markov Chain-based sequence analysis to detect anomalous command patterns in sessions
v0.4.1 · May 2020
· source
· release history
+Context provider integrationsshippedConnects to external platforms such as ServiceNow for context enrichment.2 releases · 2 other sources · first seen Nov 2022▸
release
mp.load_plugins(plugin_paths=...) allows side-loading private data, TI, and context providers alongside built-in ones
v2.5.0 · May 2023
· source
· release history
Adds ContextProviders config section in msticpyconfig.yaml with a ServiceNow provider for querying ServiceNow via the new generic context lookup API.
v2.2.0 · Nov 2022
· source
· release history
example
Configure the ServiceNow context provider with tenant and auth details in the MSTICPy config file.$ ContextProviders: ServiceNow: Primary: True Args: TenantId: <tenant_id> AuthKey: 'auth_key' AuthId: 'auth_id' Provider: "ServiceNow"
v2.2.0 · Nov 2022
· source
Query ServiceNow for threat intelligence context by IP or email using the new generic provider.$ context_lookup = ContextLookup() result = context_lookup.lookup_observable('10.0.0.1', providers=['ServiceNow'])
v2.2.0 · Nov 2022
· source
+Requirements file comparisonverifiedCompares two Python requirements files to identify differences between them.3 other sources · first seen Nov 2021▸
command line
target — Second requirements file to compare.
v2.0.0 · Jul 2022
· command-line history
source — First requirements file to compare.
v2.0.0 · Jul 2022
· command-line history
example
Configure credentials for the new M365D provider in the config file$ DataProviders: MicrosoftDefender: Args: ClientId: <client_id> ClientSecret: KeyVault: <keyvault_name> TenantId: <tenant_id>
v1.5.0 · Nov 2021
· source
+Context enrichment providersshippedsuggestedIntegrates with external threat intelligence and context platforms to enrich investigation data during analysis.2 releases · 1 other source · first seen Sep 2019▸
Suggested capability: Threat indicator matching. This is our guess, not confirmed.
release
Adds support for the Greynoise Community API as a Threat Intel provider
v1.1.0 · May 2021
· source
· release history
Adds validation checks for missing TI Providers or keys with updated documentation in TIProvider
v0.2.6 · Sep 2019
· source
· release history
example
Automatically load specific providers like Azure Sentinel and Threat Intelligence at notebook start.$ # In msticpyconfig.yaml providers: DataProviders: - AzureSentinel TIProviders: - MISP
v1.0.0 · Apr 2021
· source
+Documentation Q&A agentshippedOffers an LLM-powered interface to answer questions about the tool's documentation using RAG technology.1 release · 1 other source · first seen Sep 2024▸
Also counts toward: Built-in AI assistant, Natural-language query
release
Adds an LLM/RAG-based document Q&A agent (msticpy.aiagents.mp_docs_rag_magic) powered by Autogen, enabling natural-language queries against MSTICPy documentation inside notebooks.
v2.13.0 · Sep 2024
· source
· release history
example
Ask natural-language questions about MSTICPy from a notebook — useful when onboarding or exploring unfamiliar query provider configuration.$ %load_ext msticpy.aiagents.mp_docs_rag_magic %%ask What are the three things that I need to connect to Azure Query Provider?
v2.13.0 · Sep 2024
· source
+Authentication method expansionshippedAdds support for bearer token authentication and explicit credential passing across Splunk and Azure services.2 releases · first seen Aug 2023▸
release
Config key authentication.token in msticpyconfig.yaml enables security token auth for SplunkUploader
v2.10.0 · Feb 2024
· source
· release history
Allows passing an AzureCredential object directly to the credential parameter of AzureData.connect() and MicrosoftSentinel.connect() methods for authentication
v2.7.0 · Aug 2023
· source
· release history
+Private provider loadingshippedAllows side-loading custom or private data, threat intelligence, and context providers from local directories at runtime.1 release · 1 other source · first seen May 2023▸
Also counts toward: Plugin system
release
mp.load_plugins(plugin_paths=...) allows side-loading private data, TI, and context providers alongside built-in ones
v2.5.0 · May 2023
· source
· release history
example
Side-load custom threat intelligence providers from specific directories.$ import msticpy as mp mp.load_plugins(plugin_paths=["./my_custom_providers", "./shared_plugins"])
v2.5.0 · May 2023
· source
+Threat intelligence result visualizationshippedProvides interactive widgets to browse and visualize threat intelligence lookup results within the notebook interface.2 releases · first seen Jul 2020▸
release
Adds methods to tilookup and data_providers modules to access respective browser widgets
v0.8.0 · Sep 2020
· source
· release history
+Partial result handlingshippedEnforces query completion by raising exceptions or warnings when data retrieval hits pagination limits.1 other source · first seen Mar 2024▸
example
Ensure your analysis completes fully by failing the query immediately if it hits a pagination limit.$ qry_prov.exec_query(query_string, fail_if_partial=True)
v2.11.0 · Mar 2024
· source
+Logging configurationshippedProvides centralized control over Python logging levels and file output for debugging tool internals.1 release · first seen Apr 2023▸
release
Adds set_logging_level() function and MSTICPYLOGLEVEL / MSTICPYLOGFILE environment variables for centralized Python logging control
v2.4.0 · Apr 2023
· source
· release history
+Code analysis and cleanupshippedsuggestedAnalyzes, formats, and cleans up code artifacts such as PowerShell scripts.1 release · first seen Mar 2022▸
Suggested capability: Static malware analysis. This is our guess, not confirmed.
Also counts toward: Scripting language support
release
Introduces msticpy.analysis.code_cleanup.format_powershell to de-obfuscate and format PowerShell strings into readable code
v1.7.5 · Mar 2022
· source
· release history
Lines in monospace are the tool's own words: help text
parsed from its source, or an endpoint from its API document. Under
release, a line is our summary of a dated release. Under
docs, it is quoted from the tool's own documentation or
website. Each links back to the source it came from.
Command line
View
Source
No command matches.
load a captured run
composed command
No matchesTry a different search, or clear a filter to see more.
option surface across analysed releases
options at that releaseadded, per releaseremoved, per release
option
found in
since
description
No matchesTry a different search, or clear a filter to see more.
option changes per release — drag across the rail to set a range
→
Values are placeholders taken from each option’s declared default.
Nothing is executed here — the output shown is a recording of a run
that already happened.
Score card
Shipping velocityreleases a month, last 12 months
Documentation qualityrelease-notes rubric, 0–100
Breaking-change disciplinehow rarely a release breaks users, and notice given
Maintenance riskquiet time against its own cadence, maintainers
Innovation & surfacenew capabilities, API and MCP surface
Community health
Contributor trenddistinct committers, this year against last
Maintainer concentrationbus factor now against a year ago
Issue backlog trendissues closed per issue opened, 12 months
Responsivenessmedian time to a maintainer’s first reply
Nine scores for MSTICPy, each built from the releases, notes and API history this site tracks — and, on Researcher and Business, where it stands among every measured tool in its category and how that has moved.
Each score is 0–100 on a published rubric, derived from data this site already shows.
A dimension we cannot measure says so — it is never scored 0 and never enters a rank.
How this is scored
Shipping velocity — releases a month over the last 12 months, on a log scale where 16 a month scores 100. Needs 3 releases in the window.
Documentation quality — the release-notes rubric published on the analytics page, unchanged.
Breaking-change discipline — the share of releases carrying a breaking change (none scores 100, half or more scores 0). Only projects that label breaking changes are measured: a clean record cannot be told from an unlabelled one.
Maintenance risk — quiet time measured against the tool's own release cadence (quiet longer than 90 days and three typical gaps scores 0), plus the number of active maintainers and whether contributors are growing, where known. Higher is lower risk.
Innovation & surface — new capabilities in the feature ledger this year, API and MCP operations added, and the share of commits that are features: the mean of whichever we hold.
Community health (open-source tools only) — each is a direction, not a size: contributors this year against last, the bus factor now against a year ago, and issues closed per issue opened, where steady scores 50, doubled 100 and halved 0; plus the median time to a maintainer's first reply (an hour scores about 100, a month or more 0). A commercial card has no repository and carries none of the four.
Documented delivery (commercial tools) — when a vendor's documented new capabilities have slowed against its own baseline, that counts against the overall standing as heavily as two low dimensions. Steady delivery, or too little history to judge, leaves the standing alone; it is never a sixth score.
Open-source tools are scored on repository signals; commercial tools on their published changelog. Ranks compare tools within one category and one profile and need at least five measured peers; the overall standing needs three ranked dimensions. Best-in-breed or consolidator is a shape, not a quality, and is never scored.
Release-note detail over time
See how much detail MSTICPy puts in its release notes, quarter by quarter, and compare it with tracked tools in the same category. This history uses up to ten retained, reviewed notes per tool; sparse or blank older quarters may reflect that limit.
16 readings of Microsoft's pricing page since Mar 2022, with 3 relaunches of its plan lineup — each one dated, compared with the reading before it, and explained for someone buying the tool.
Pricing and packaging history is included with Researcher and Business. See how every vendor we track sells, and how that has changed over time, using data we don't publish anywhere else.
Each offering on the pricing page links to its own page of plans, read at its latest capture.
Plan relaunches
Plans, prices and descriptions are quoted from the vendor's own pricing page as we read it on each date.
A plan missing from a later reading is shown as no longer listed on the page — a statement about the page, not the product.
Readings that failed to show any plans are left out rather than read as a change.
Website history
microsoft.com, every change
Microsoft's home page and 40 more pages as they looked each month from October 2021 to October 2026: 1520 renders, 335 changes of tagline or palette. Step through them, play them, or put any two months side by side.
Website history is included with Researcher and Business.
← → or h l a month · Shift a year · [ ] previous / next change · Space play · 1 2 3 page · T whole page · C compare · F full size
← → or h l the right month · Shift the left · S swap · W wipe · T whole page · Esc back
Rebranding timeline
Dates bound when a change appeared between captures. Possible rebrands are AI suggestions; a redesign alone does not establish a rebrand.
Releases
Show
59 entries
No entries match these filters.
September 20261
May 20261
April 20261
September 20251
February 20251
December 20241
October 20241
September 20241
May 20241
March 20241
February 20241
November 20231
October 20231
August 20231
July 20231
May 20231
April 20231
February 20231
January 20231
November 20222
October 20222
September 20221
July 20221
May 20222
March 20221
February 20221
January 20221
December 20211
November 20211
October 20211
September 20211
August 20211
July 20211
June 20211
May 20211
April 20211
February 20211
January 20211
October 20201
September 20201
August 20201
July 20201
June 20201
May 20203
March 20201
February 20201
January 20201
December 20191
October 20191
September 20191
August 20191
May 20191
April 20192
Project health
Issue, contributor and maintainer activity in microsoft/msticpy, 2023-10 – 2026-09,
as of 2026-09-25. Twelve-month figures first; the trend lines run
the whole window.
Contributors8±0 vs prior 12 months
Maintainers2+1 joined · −1 left, last 12 months
Bus factor1committers behind half the commits
Community-filed67%of issues opened, last 12 months
Median time to close358 daysfirst maintainer reply 2.6 hours
Open backlog5of 206 issues ever filed
Issues opened / month0 · 0communitymaintainers
Open backlog5
Contributors / month2
Commits / month6
Stars2,001
Issue themes, last 12 months
other 100%
Counts from the project's public repository and git history; no individuals
are identified. Maintainers are the committers covering 80% of the last year's
commits. how we measure this
Libraries its release ships
What its latest release locks, checked against known advisories.
None of its release's images build from a lockfile we can read.
Add the badge to your README
Maintain this project? The badge links readers straight to this page, so they can
follow every release here.