Source profileQuality 93/100

WYRE-AI/msp-claude-plugins/msp-claude-plugins/sentinelone/sentinelone/skills/threat-hunting/SKILL.md

SentinelOne Threat Hunting

PowerQuery against the Singularity Data Lake: the Scalyr-based pipeline syntax (distinct from SPL, SQL, KQL, and Elasticsearch DSL), the powerquery, get_timestamp_range, and iso_to_unix_timestamp tools, time-range and row-limit handling, common hunting scenarios, and the Purple AI generation path.

Source repository stars
42
Declared platforms
0
Static risk flags
0
Last source update
2026-08-28
Source checked
2026-08-28

Decision brief

What it does: where it fits

PowerQuery against the Singularity Data Lake: the Scalyr-based pipeline syntax (distinct from SPL, SQL, KQL, and Elasticsearch DSL), the powerquery, get_timestamp_range, and iso_to_unix_timestamp tools, time-range and row-limit handling, common hunting scenarios, and the Purple AI generation path.

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/WYRE-AI/msp-claude-plugins --skill "msp-claude-plugins/sentinelone/sentinelone/skills/threat-hunting"
    Safe inspection promptEditorial

    Inspect the Agent Skill "SentinelOne Threat Hunting" from https://github.com/WYRE-AI/msp-claude-plugins/blob/5005f73ba2f52cd299f58aa6bb79f4e70ae87103/msp-claude-plugins/sentinelone/sentinelone/skills/threat-hunting/SKILL.md at commit 5005f73ba2f52cd299f58aa6bb79f4e70ae87103. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Typical Workflow

      The recommended threat hunting workflow is:

      Describe the threat to Purple AI - Call purpleai with a natural language description of what you want to findReview the generated PowerQuery - Purple AI returns one or more PowerQuery stringsCheck time range - Call gettimestamprange to verify data availability
    2. 02

      Anti-triggers

      A natural-language question with no query yet. Do not hand-write

      A natural-language question with no query yet. Do not hand-write"Threat hunting" on a Huntress tenant. The phrase belongs to bothA specific alert's timeline. Alert notes and history come from the
    3. 03

      MCP Tools

      Call powerquery with a query string and optional time range:

      query: PowerQuery string (required)fromDate: Start of time range (ISO 8601 or Unix epoch ms)toDate: End of time range (ISO 8601 or Unix epoch ms)
    4. 04

      Available Tools

      Review the “Available Tools” section in the pinned source before continuing.

      Review and apply the “Available Tools” source section.
    5. 05

      Execute a PowerQuery

      Call powerquery with a query string and optional time range:

      query: PowerQuery string (required)fromDate: Start of time range (ISO 8601 or Unix epoch ms)toDate: End of time range (ISO 8601 or Unix epoch ms)

    Permission review

    Static risk signals and limitations

    No configured static risk pattern was detected

    This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score93/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars42SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    WYRE-AI/msp-claude-plugins
    Skill path
    msp-claude-plugins/sentinelone/sentinelone/skills/threat-hunting/SKILL.md
    Commit
    5005f73ba2f52cd299f58aa6bb79f4e70ae87103
    License
    Apache-2.0
    Collected
    2026-08-28
    Default branch
    main
    View the original SKILL.md

    SentinelOne PowerQuery / Singularity Data Lake

    Overview

    PowerQuery is SentinelOne's query language for searching the Singularity Data Lake -- the centralized telemetry repository containing process events, network connections, file operations, registry changes, and other security-relevant data from all managed endpoints and cloud workloads. For MSPs, PowerQuery is the primary tool for deep forensic analysis, threat hunting, and incident investigation across client environments.

    IMPORTANT: PowerQuery is a Scalyr-based pipeline query language. It is NOT Splunk SPL, SQL, KQL (Kusto), or Elasticsearch Query DSL. The syntax is fundamentally different. The recommended approach is to use the purple_ai tool to generate PowerQuery strings from natural language descriptions, then execute them with the powerquery tool.

    Anti-triggers

    • A natural-language question with no query yet. Do not hand-write PowerQuery from a plain-English prompt — sentinelone-purple-ai generates it correctly, and this skill executes what it returns.
    • "Threat hunting" on a Huntress tenant. The phrase belongs to both products; the telemetry does not. Huntress raw detections are huntress-signals and its confirmed threats are huntress-incidents.
    • A specific alert's timeline. Alert notes and history come from the alert object, not the Data Lake — use sentinelone-alerts.

    MCP Tools

    Available Tools

    ToolDescriptionKey Parameters
    powerqueryExecute a PowerQuery against the Singularity Data Lakequery (required), fromDate, toDate
    get_timestamp_rangeGet the available time range for PowerQuery dataNone
    iso_to_unix_timestampConvert ISO 8601 timestamp to Unix epoch millisecondstimestamp (required)

    Execute a PowerQuery

    Call powerquery with a query string and optional time range:

    • query: PowerQuery string (required)
    • fromDate: Start of time range (ISO 8601 or Unix epoch ms)
    • toDate: End of time range (ISO 8601 or Unix epoch ms)

    Default time range: Last 24 hours if not specified.

    Example: Find PowerShell network connections:

    • powerquery with query="EventType = \"IP Connect\" AND SrcProcName = \"powershell.exe\" | columns EndpointName, SrcProcCmdLine, DstIP, DstPort | limit 100"

    Example: With custom time range:

    • powerquery with query="EventType = \"Process Creation\" AND TgtProcName = \"mimikatz.exe\" | limit 50", fromDate="2026-02-23T00:00:00Z", toDate="2026-02-24T00:00:00Z"

    Get Available Time Range

    Call get_timestamp_range to determine how far back the Data Lake has data. Returns the earliest and latest available timestamps.

    Convert Timestamps

    Call iso_to_unix_timestamp to convert ISO 8601 timestamps to Unix epoch milliseconds, which is required by some query parameters.

    Key Concepts

    PowerQuery Syntax

    PowerQuery uses a pipeline model with filters, columns, sorting, and aggregation:

    <filter expression>
    | columns <field1>, <field2>, ...
    | sort -<field>
    | limit <n>
    | group <field> calculate count() as cnt
    

    Filter Expressions

    Filters use field operator value syntax:

    OperatorDescriptionExample
    =EqualsEventType = "Process Creation"
    !=Not equalsSrcProcName != "explorer.exe"
    containsSubstring matchTgtProcCmdLine contains "powershell"
    InMatch listDstPort In (80, 443, 8080)
    NOT InExclude listNOT DstIP In ("10.0.0.0/8")
    ANDLogical ANDEventType = "IP Connect" AND DstPort = 4444
    ORLogical ORSrcProcName = "cmd.exe" OR SrcProcName = "powershell.exe"

    Pipeline Operators

    OperatorDescriptionExample
    columnsSelect specific fields| columns EndpointName, SrcProcName, DstIP
    sortSort results (prefix - for descending)| sort -EventTime
    limitLimit result count (max 100)| limit 100
    groupAggregate data| group EndpointName calculate count() as cnt
    filterPost-pipeline filter| filter cnt > 10

    Common Event Types

    Event TypeDescription
    Process CreationNew process started
    Process ExitProcess terminated
    IP ConnectNetwork connection established
    IP ListenPort opened for listening
    File CreationFile created
    File ModificationFile modified
    File DeletionFile deleted
    Registry Key CreationRegistry key created
    Registry Value ModifiedRegistry value changed
    DNSDNS query
    LoginUser login event
    LogoutUser logout event
    Module LoadDLL or shared library loaded
    URLURL accessed

    Common Fields

    FieldDescription
    EndpointNameHostname of the endpoint
    SiteNameSentinelOne site (MSP client)
    EventTimeEvent timestamp
    EventTypeType of event
    SrcProcNameSource (parent) process name
    SrcProcCmdLineSource process command line
    SrcProcPidSource process ID
    TgtProcNameTarget (child) process name
    TgtProcCmdLineTarget process command line
    TgtProcPidTarget process ID
    DstIPDestination IP address
    DstPortDestination port
    SrcIPSource IP address
    SrcPortSource port
    NetConnStatusNetwork connection status
    TgtFileNameTarget file name/path
    TgtFileHashSha256Target file SHA256 hash
    RegistryKeyPathRegistry key path
    RegistryValueNameRegistry value name
    DNSRequestDNS query domain
    URLAccessed URL
    UserUser account

    Query Constraints

    ConstraintValue
    Maximum rows returned100
    Default time rangeLast 24 hours
    Query timeout5 minutes
    Empty resultsValid (no matching data, not an error)

    Common Hunting Scenarios

    Lateral Movement

    EventType = "Process Creation" AND
    (TgtProcName = "psexec.exe" OR TgtProcName = "psexesvc.exe" OR
     TgtProcCmdLine contains "wmic" AND TgtProcCmdLine contains "/node:")
    | columns EndpointName, SiteName, SrcProcName, TgtProcName, TgtProcCmdLine, EventTime
    | sort -EventTime
    | limit 100
    

    Credential Access (LSASS)

    EventType = "Process Creation" AND
    TgtProcCmdLine contains "lsass" AND
    SrcProcName != "svchost.exe" AND SrcProcName != "csrss.exe"
    | columns EndpointName, SiteName, SrcProcName, TgtProcName, TgtProcCmdLine, User, EventTime
    | sort -EventTime
    | limit 100
    

    Persistence (Scheduled Tasks)

    EventType = "Process Creation" AND
    TgtProcName = "schtasks.exe" AND TgtProcCmdLine contains "/create"
    | columns EndpointName, SiteName, SrcProcName, TgtProcCmdLine, User, EventTime
    | sort -EventTime
    | limit 100
    

    Command & Control (Beaconing)

    EventType = "IP Connect" AND NetConnStatus = "SUCCESS" AND
    NOT DstIP In ("10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16") AND
    DstPort NOT In (80, 443)
    | group DstIP, SrcProcName, EndpointName calculate count() as connections
    | filter connections > 50
    | sort -connections
    | limit 100
    

    Data Staging

    EventType = "Process Creation" AND
    (TgtProcName In ("7z.exe", "rar.exe", "zip.exe", "tar.exe") OR
     TgtProcCmdLine contains "Compress-Archive")
    | columns EndpointName, SiteName, SrcProcName, TgtProcCmdLine, User, EventTime
    | sort -EventTime
    | limit 100
    

    LOLBIN Activity

    EventType = "Process Creation" AND
    TgtProcName In ("certutil.exe", "mshta.exe", "regsvr32.exe", "rundll32.exe",
                     "wscript.exe", "cscript.exe", "bitsadmin.exe") AND
    (TgtProcCmdLine contains "http" OR TgtProcCmdLine contains "ftp" OR
     TgtProcCmdLine contains "/decode" OR TgtProcCmdLine contains "script:")
    | columns EndpointName, SiteName, SrcProcName, TgtProcName, TgtProcCmdLine, EventTime
    | sort -EventTime
    | limit 100
    

    DNS Tunneling

    EventType = "DNS" AND
    DNSRequest contains "." AND
    NOT DNSRequest In ("*.microsoft.com", "*.windows.com", "*.windowsupdate.com",
                        "*.office.com", "*.sentinelone.net")
    | group DNSRequest calculate count() as queries
    | filter queries > 100
    | sort -queries
    | limit 100
    

    Phishing (Office Macro Execution)

    EventType = "Process Creation" AND
    SrcProcName In ("winword.exe", "excel.exe", "powerpnt.exe") AND
    TgtProcName In ("powershell.exe", "cmd.exe", "wscript.exe", "cscript.exe", "mshta.exe")
    | columns EndpointName, SiteName, SrcProcName, TgtProcName, TgtProcCmdLine, User, EventTime
    | sort -EventTime
    | limit 100
    

    Typical Workflow

    The recommended threat hunting workflow is:

    1. Describe the threat to Purple AI - Call purple_ai with a natural language description of what you want to find
    2. Review the generated PowerQuery - Purple AI returns one or more PowerQuery strings
    3. Check time range - Call get_timestamp_range to verify data availability
    4. Execute the query - Call powerquery with the generated query string
    5. Analyze results - Review returned rows for indicators of compromise
    6. Iterate - Refine the query based on initial results, or ask Purple AI for follow-up queries

    Response Examples

    PowerQuery Result:

    {
      "rows": [
        {
          "EndpointName": "ACME-WS-042",
          "SrcProcName": "winword.exe",
          "TgtProcName": "powershell.exe",
          "TgtProcCmdLine": "powershell.exe -enc aQBlAHgA...",
          "EventTime": "2026-02-24T08:12:34.000Z"
        },
        {
          "EndpointName": "ACME-WS-015",
          "SrcProcName": "excel.exe",
          "TgtProcName": "cmd.exe",
          "TgtProcCmdLine": "cmd.exe /c whoami && net user",
          "EventTime": "2026-02-24T07:45:12.000Z"
        }
      ],
      "totalRows": 2
    }
    

    Empty Result (Valid):

    {
      "rows": [],
      "totalRows": 0
    }
    

    Empty results are valid and common in threat hunting. No results means no matching telemetry was found -- which is often a positive finding.

    Error Handling

    Common Errors

    ErrorCauseResolution
    Syntax errorInvalid PowerQuery syntaxUse purple_ai to generate correct syntax
    TimeoutQuery too broad or time range too largeNarrow the time range or add more filters
    No data availableTime range outside Data Lake retentionCall get_timestamp_range to check availability
    Authentication errorInvalid tokenVerify Service User token is Account or Site level
    Rate limitedToo many queriesWait before retrying

    PowerQuery Syntax Tips

    • String values must be in double quotes: SrcProcName = "powershell.exe"
    • Use In (capital I) for list matches: DstPort In (80, 443)
    • Use NOT before conditions for negation: NOT DstIP In ("10.0.0.0/8")
    • Pipeline operators start with | on a new line or after a space
    • Comments are not supported in PowerQuery

    Best Practices

    1. Use Purple AI to generate queries - Do not write PowerQuery manually unless you are familiar with the syntax
    2. Always set a time range - Avoid scanning the entire Data Lake; default to 24 hours
    3. Start narrow, then broaden - Begin with specific filters and widen if no results
    4. Use the columns operator - Select only the fields you need for faster results
    5. Limit results - Always include | limit 100 to stay within the row limit
    6. Check for empty results - Empty results are valid; they mean no matching data
    7. Iterate on findings - Use initial results to refine follow-up queries
    8. Filter by site - Add SiteName = "Client Name" to scope hunts to specific clients
    9. Combine with alerts - Cross-reference PowerQuery findings with alert data
    10. Document queries - Save successful hunting queries for reuse across client environments

    Related Skills

    • Purple AI - Generate PowerQuery strings from natural language
    • Alerts - Alert context for threat hunting findings
    • API Patterns - MCP tools reference and connection info
    • Inventory - Asset context for endpoints in query results
    • Vulnerabilities - Vulnerability context for compromised endpoints

    Frequently asked questions

    What to verify before installation and use

    What does the SentinelOne Threat Hunting source document cover?

    PowerQuery against the Singularity Data Lake: the Scalyr-based pipeline syntax (distinct from SPL, SQL, KQL, and Elasticsearch DSL), the powerquery, get_timestamp_range, and iso_to_unix_timestamp tools, time-range and row-limit handling, common hunting scenarios, and the Purple AI generation path.

    How do I install SentinelOne Threat Hunting?

    The source record exposes this install command: npx skills add https://github.com/WYRE-AI/msp-claude-plugins --skill "msp-claude-plugins/sentinelone/sentinelone/skills/threat-hunting". Inspect the command and pinned source before running it.

    Alternatives

    Compare before choosing

    Computed 9836,049

    K-Dense-AI/scientific-agent-skills

    dask

    Distributed computing for larger-than-RAM pandas/NumPy workflows. Use when you need to scale existing pandas/NumPy code beyond memory or across clusters. Best for parallel file processing, distributed ML, integration with existing pandas code. For out-of-core analytics on single machine use vaex; for in-memory speed use polars.

    Computed 983,352

    synthetic-sciences/openscience

    pharmacology-wetlab

    Computational analysis of pharmacology wet-lab experiments. Western blot densitometry, xenograft tumor growth inhibition, pharmaceutical stability modeling (Arrhenius), radiolabeled antibody biodistribution, MIRD dosimetry, and adverse event grading. For drug databases use chembl-database or fda-database; for molecular docking use diffdock.

    Computed 9815

    getcargohq/cargo-skills

    cargo-orchestration

    Make Cargo actually run something, or show what it would run — execute one connector action, run a multi-step workflow, trigger a batch across a whole segment or model, message an AI agent, build or edit a node graph, draw a workflow, tool or play as a diagram, and query the runtime tables (runs, batches, spans, records) with SQL. Triggers: "run this on all my contacts", "execute the action", "kick off a batch", "build a workflow", "schedule a play", "make it run every morning", "ask the agent",

    Computed 973,379

    davepoon/buildwithclaude

    youtube-automation

    Automate YouTube tasks via Rube MCP (Composio): upload videos, manage playlists, search content, get analytics, and handle comments. Always search tools first for current schemas.