Skip to main content
Glama
Sentinel-One

Purple AI MCP Server

Official
by Sentinel-One

Purple AI MCP Server

License: MIT

Purple AI MCP Server allows you to access SentinelOne Services with any MCP client.

Features

This server exposes SentinelOne's platform through the Model Context Protocol:

  • Purple AI: Ask security questions, investigate threats

  • Events: Run PowerQueries on events in your SentinelOne data lake

  • Alerts: Query, search, and investigate alerts

  • Vulnerabilities: Track CVEs and security findings

  • Misconfigurations: Analyze security posture issues

  • Inventory: Ask questions about endpoints, cloud resources, identities, and network devices

  • CVE Search: Query public CVE databases for vulnerability details

  • Threat Intelligence: Get file, URL, domain, and IP analysis from VirusTotal

Purple AI MCP is a read-only service - you cannot make changes to your account or any objects within your account from this MCP.

Related MCP server: AccuKnox MCP Server

Quick Start

# Install uv if you don't have it
curl -LsSf https://astral.sh/uv/install.sh | sh

# Set credentials
export PURPLEMCP_CONSOLE_TOKEN="your_token"
export PURPLEMCP_CONSOLE_BASE_URL="https://your-console.sentinelone.net"

# Run
uvx --from git+https://github.com/Sentinel-One/purple-mcp.git purple-mcp --mode=stdio

⚠️ Security note ⚠️

For production or security-sensitive environments, pin to a specific commit hash instead of using the default branch to reduce supply chain risk from the our releases or our verified commits in main branch.

# Run with pinned hash
uvx --from git+https://github.com/Sentinel-One/purple-mcp.git@<commit-hash> purple-mcp --mode=stdio

Using Docker

Follow instructions for Docker Deployment here

Using Amazon Bedrock AgentCore

Follow instructions for Amazon Bedrock AgentCore Deployment here

Using Amazon Elastic Container Service (ECS)

Follow instructions for Amazon Elastic Container Service Deployment here

Using a Cloud Provider

For cloud deployments, see Deployment Guide.

Note: Purple AI MCP does not include built-in authentication. For network-exposed deployments, place it behind a reverse proxy or load balancer. See cloud Setup for cloud load balancer configurations (AWS ALB, GCP Cloud Load Balancing, Azure Application Gateway) or nginx examples for self-hosted deployments.


Your token needs Account or Site level permissions (not Global). Get one from Policy & Settings → User Management → Service Users in your console. Currently, this server only supports tokens that have access to a single Account or Site. If you need to access multiple sites, you will need to run multiple MCP servers with Account-specific or Site-specific tokens.

Authentication

Purple MCP uses a SentinelOne Console token configured at startup via environment variables. The server authenticates with your SentinelOne Console using the provided token and base URL.

# Configure authentication credentials
PURPLEMCP_CONSOLE_TOKEN=YOUR_CONSOLE_TOKEN
PURPLEMCP_CONSOLE_BASE_URL=https://console.sentinelone.net

In addition you may define a console scope for Purple AI query operations:

PURPLEMCP_PURPLE_AI_CONSOLE_ACCOUNT_ID=1234567890123456789

This will scope Purple AI queries to account-scope with id 1234567890123456789.

Health Check Endpoints:

The following endpoints bypass authentication to support container orchestration systems (Kubernetes, Docker, etc.):

  • /health, /ready, /ping

These endpoints return only basic status ({"status": "ok"}) and do not expose sensitive information. See SECURITY.md for details.

Clients

Purple AI MCP supports stdio, sse, and streamable-http protocols and should work in any client that supports MCP. Some sample configurations are listed below.

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%/Claude/claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "purple-mcp": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/Sentinel-One/purple-mcp.git",
        "purple-mcp",
        "--mode",
        "stdio"
      ],
      "env": {
        "PURPLEMCP_CONSOLE_TOKEN": "your_token",
        "PURPLEMCP_CONSOLE_BASE_URL": "https://your-console.sentinelone.net"
      }
    }
  }
}

Claude Code

Run this command in a terminal:

claude mcp add --transport stdio purple-mcp --env PURPLEMCP_CONSOLE_TOKEN=your_token --env PURPLEMCP_CONSOLE_BASE_URL=https://your-console.sentinelone.net -- uvx --from git+https://github.com/Sentinel-One/purple-mcp.git purple-mcp --mode stdio

OpenAI Codex

Run this command in a terminal:

codex mcp add purple-mcp --env PURPLEMCP_CONSOLE_TOKEN=your_token --env PURPLEMCP_CONSOLE_BASE_URL=https://your-console.sentinelone.net -- uvx --from git+https://github.com/Sentinel-One/purple-mcp.git purple-mcp --mode stdio

Pydantic AI

Here is some example Python code to use Purple MCP with a Pydantic AI Agent.

from pydantic_ai import Agent
from pydantic_ai.mcp import MCPServerStdio

server = MCPServerStdio(
    'uvx', args=["--from", "git+https://github.com/Sentinel-One/purple-mcp.git", "purple-mcp", "--mode", "stdio"], timeout=10
)
agent = Agent('anthropic:claude-haiku-4-5', toolsets=[server])

Zed

Edit ~/.zed/mcp.json:

{
  "mcpServers": {
    "purple-mcp": {
      "enabled": true,
      "source": "custom",
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/Sentinel-One/purple-mcp.git",
        "purple-mcp",
        "--mode",
        "stdio"
      ],
      "env": {
        "PURPLEMCP_CONSOLE_TOKEN": "your_token",
        "PURPLEMCP_CONSOLE_BASE_URL": "https://your-console.sentinelone.net"
      }
    }
  }
}

Other Clients

For debugging or to host server for multiple clients, run in streamable-http mode and connect via mcp-remote:

# Terminal 1: Start server
export PURPLEMCP_CONSOLE_TOKEN="your_token"
export PURPLEMCP_CONSOLE_BASE_URL="https://your-console.sentinelone.net"
uvx --from git+https://github.com/Sentinel-One/purple-mcp.git purple-mcp --mode streamable-http --host localhost --port 8000

# Terminal 2: Connect with any client
npx -y mcp-remote http://127.0.0.1:8000/mcp

We suggest you do not expose Purple AI MCP on a network at this time, as there is no authentication enforced and anyone could access a configured SentinelOne account.

Available Tools

Purple AI

  • purple_ai(query) - Ask security questions

Data Lake

  • powerquery(query, start_time, end_time) - Run PowerQuery analytics

Alerts

  • get_alert(alert_id) - Get alert details

  • list_alerts(first, after, view_type) - List recent alerts

  • search_alerts(filters, first) - Search with filters

  • get_alert_notes(alert_id) - Get alert comments

  • get_alert_history(alert_id) - View alert timeline

Vulnerabilities

  • get_vulnerability(id) - Get vulnerability details

  • list_vulnerabilities(first, after) - List recent vulnerabilities

  • search_vulnerabilities(filters, first) - Search CVEs and findings

  • get_vulnerability_notes(id) - Get comments

  • get_vulnerability_history(id) - View timeline

Misconfigurations

  • get_misconfiguration(id) - Get misconfiguration details

  • list_misconfigurations(first, after) - List recent issues

  • search_misconfigurations(filters, first) - Search by criteria

  • get_misconfiguration_notes(id) - Get comments

  • get_misconfiguration_history(id) - View timeline

Asset Inventory

  • get_inventory_item(item_id, fetch_fields) - Get asset details with field filtering

  • list_inventory_items(limit, skip, surface, fetch_fields) - List assets by surface type

  • search_inventory_items(filters, limit, skip, fetch_fields) - Search with advanced filters

Field Filtering: All inventory tools support fetch_fields parameter to control returned data:

  • Presets: MINIMAL (7 fields), STANDARD (13 fields), ALL (~200+ fields)

  • Custom lists: Specify exact fields in camelCase, e.g., ["id", "name", "resourceType"]

  • Use get_inventory_item(item_id, fetch_fields="ALL") on a single item to discover available field names

CVE Search (External)

Query public CVE databases (cve-search.org) for vulnerability information:

  • cve_search_by_id(cve_id) - Get detailed CVE information by ID

  • cve_search_by_vendor(vendor, product) - Search CVEs by vendor/product

  • cve_database_status() - Get database update information

Note: No API key required. Data sourced from CIRCL.LU's cve-search.org.

Threat Intelligence (External)

Query VirusTotal/Google Threat Intelligence for file, URL, domain, and IP analysis:

  • threat_intel_by_hash(hash_value) - Get threat intel for file hash (MD5/SHA1/SHA256)

  • threat_intel_by_url(url) - Get URL reputation and analysis

  • threat_intel_by_domain(domain) - Get domain threat intelligence

  • threat_intel_by_ip(ip_address) - Get IP address threat intelligence

  • threat_intel_get_file_relationships(hash_value, relationship_type) - Get file relationships (contacted domains/IPs, similar files)

  • threat_intel_search(query) - Search VirusTotal Intelligence (Premium API required)

  • threat_intel_get_file_behavior(hash_value, sandbox) - Get sandbox behavioral analysis

Note: Requires PURPLEMCP_VT_API_KEY environment variable with a valid VirusTotal API key.

Environment Variables

Required

  • PURPLEMCP_CONSOLE_TOKEN - Authentication token (Service User token or Console API token)

  • PURPLEMCP_CONSOLE_BASE_URL - Console URL (e.g., https://console.sentinelone.net)

Optional

  • PURPLEMCP_SDL_BASE_URL - Dedicated base URL for the SDL API

    • When set, this URL is used directly instead of PURPLEMCP_CONSOLE_BASE_URL + /sdl

    • Example: https://your-dedicated-sdl-endpoint.sentinelone.net

    • When not set, the SDL API is accessed at {PURPLEMCP_CONSOLE_BASE_URL}/sdl (default behavior)

  • PURPLEMCP_VT_API_KEY - VirusTotal API key for threat intelligence tools (get one from https://www.virustotal.com/gui/my-apikey)

  • PURPLEMCP_SDL_CONSOLE_ACCOUNT_IDS - Account IDs for SDL query scoping (comma-separated or JSON array)

    • When specified: queries are scoped to the provided account(s)

    • When not specified: queries all accounts accessible to the token

    • Example: "426418030212073761" or "123,456,789" or ["123", "456"]

  • PURPLEMCP_SDL_CONSOLE_SITE_IDS - Site IDs for SDL query scoping

    • When specified: queries are scoped to the provided site

    • Requires PURPLEMCP_SDL_CONSOLE_ACCOUNT_IDS to also be set with exactly one account ID

    • Example: "1234567890123456789" or "123,456,789" or "[123, 456]"

    • Note: Currently, only the first site ID is used.

  • PURPLEMCP_TRANSPORT_MODE - MCP transport mode: stdio, http, streamable-http, or sse (default: stdio)

  • PURPLEMCP_STATELESS_HTTP - Enable stateless HTTP mode for serverless deployments (e.g., Amazon Bedrock AgentCore) - see deployment guide

Development

We welcome your pull requests or issue submissions.

Setup

# Install all dependencies
uv sync --all-groups

# Format and lint
uv run ruff format
uv run ruff check .
uv run mypy src tests

Testing

# Run unit tests
uv run pytest tests/unit/ -v

# Run integration tests (requires .env.test with real credentials)
uv run pytest tests/integration/ -v

# All tests with coverage
uv run pytest --cov=src/purple_mcp --cov-report=html

Env-vars for integration-testing of Account Scopes

There are some integration tests that require additional configuration to run (if left unconfigured they will be skipped). If you want to run test_sdl_scope_integration.py you will need to define the following env-vars in your .env.test file (with the dummy values replaced for your test scenario):

# An accessible account for your console token:
PURPLEMCP_SDL_CONSOLE_ACCOUNT_IDS=123456789012345678
# Another account from your console
PURPLEMCP_SDL_INT_TEST_SECOND_ACCOUNT_ID=222333444555666
# An Agent UUID accessible in your primary account:
PURPLEMCP_SDL_INT_TEST_AGENT_UUID=aaabbb-1234-5678-ccdd-678e89100bb1
# A timestamp at the middle of a 10-minute window where you expect to see events from the Agent UUID:
PURPLEMCP_SDL_INT_TEST_AGENT_EVENT_TIMESTAMP=2025-11-18T05:25:00+00:00

Troubleshooting

  • Authentication errors: Check your token has Account/Site level permissions (not Global), and your token has not expired

  • PowerQuery does not return expected results: Check your token has Account/Site level permissions (not Global)

  • Connection failures: Verify your console URL and network access; use --verbose for debug logs

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

This project is open source and community-driven. Although it is not an official SentinelOne product, it is maintained by SentinelOne in partnership with the broader open source developer community. See our LICENSE file for further information.

For SentinelOne platform support, use the appropriate support channel.

Available Tools

33 tools
cve_database_statusA

Get information about the CVE database status and last update time.

This tool provides metadata about the CVE database including when it was last updated and how many CVEs it contains. Useful for determining data freshness and database health.

What this tool provides:

  • Last database update timestamp

  • Total CVE count in database

  • Database version information

  • Data source information

Common Use Cases:

  • Verify data freshness

  • Check database health

  • Compliance documentation

  • Data quality assurance

  • Integration monitoring

Returns: JSON string containing database metadata: - Last update timestamp (ISO 8601 format) - Total number of CVEs - Database version - Data sources

Notes: - Database typically updates multiple times daily - Sources include NVD, vendor advisories, and community feeds - No API key required

Raises: CVEClientError: If there's an error communicating with the API.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the return fields, update frequency (multiple times daily), data sources, and that no API key is required. It also mentions potential errors (CVEClientError). Rate limits are not mentioned, but the information provided is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections: main purpose, what it provides, use cases, return details, notes, and raises. Every sentence adds value, and it is appropriately sized without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists (as indicated by context signals), the description fully covers the return fields and provides additional useful context (update frequency, sources, no API key needed). It is complete for an agent to understand and use the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4. The description does not need to add parameter information since there are none. It correctly provides context about what the tool returns instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool gets information about the CVE database status and last update time. It lists exactly what it provides (last update timestamp, total CVE count, etc.) and distinguishes it from sibling tools like cve_search_by_id which search for specific CVEs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a 'Common Use Cases' section that implicitly guides when to use the tool (verify data freshness, check database health, etc.), but it does not explicitly say when not to use it or mention alternatives. The context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cve_search_by_idA

Get detailed information about a specific CVE by its identifier.

This tool queries the CVE database to retrieve comprehensive vulnerability information including description, CVSS scores, affected products, references, and remediation guidance.

What this tool provides:

  • CVE description and summary

  • CVSS v2 and v3 scores with vector strings

  • Affected products and versions (CPE format)

  • References to advisories, patches, and exploits

  • CWE (Common Weakness Enumeration) mappings

  • Publication and modification timestamps

  • Impact ratings and severity

Common Use Cases:

  • Security research and vulnerability assessment

  • Incident response investigations

  • Patch management prioritization

  • Security advisory creation

  • Compliance reporting

Args: cve_id: The CVE identifier in the format CVE-YYYY-NNNNN (e.g., CVE-2024-47176, CVE-2023-12345)

Returns: JSON string containing comprehensive CVE details including: - id: CVE identifier - summary: Vulnerability description - cvss: CVSS v2 score - cvss3: CVSS v3 score with full metrics - vulnerable_configuration: List of affected CPEs - references: Links to advisories and patches - cwe: Common Weakness Enumeration identifier - Published: Publication timestamp - Modified: Last modification timestamp

Examples: "CVE-2024-47176" - Recent vulnerability "CVE-2023-12345" - Search any CVE from any year "CVE-2021-44228" - Log4Shell vulnerability

Notes: - Data sourced from cve-search.org (CIRCL.LU) - No API key required - Database updated regularly from NVD and other sources - Returns detailed CAPEC, CWE, and CPE expansions

Not Found Response: When a CVE is not found, returns a JSON response with this structure: { "found": false, "resource": "CVE-YYYY-NNNNN", "resource_type": "cve", "message": "CVE-YYYY-NNNNN not found in the CVE database." }

Raises: CVEClientError: If there's an error communicating with the API (not for not-found cases).

ParametersJSON Schema
NameRequiredDescriptionDefault
cve_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It details data source (cve-search.org), auth requirements (no API key), update frequency, return structure, not-found response, and error handling. All behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections, but it is somewhat verbose (e.g., bullet lists of return fields). It front-loads the main purpose and uses headings, which aids readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single parameter and rich output, the description covers input format, output structure, error cases, source attribution, use cases, and examples. Despite an output schema existing, the description adds valuable context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds complete parameter semantics: format (CVE-YYYY-NNNNN), examples, and explicit documentation in the 'Args' section. This fully compensates for the schema's lack of description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Get detailed information about a specific CVE by its identifier', which is a specific verb+resource combination. It clearly distinguishes from sibling tools like cve_search_by_vendor and cve_database_status through the focus on identifier-based lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Common use cases are listed (security research, incident response, etc.), but the description does not explicitly state when to avoid this tool in favor of alternatives like cve_search_by_vendor. The context is clear enough for typical usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cve_search_by_vendorA

Search for CVEs by vendor name and optionally filter by product.

This tool searches the CVE database for vulnerabilities affecting specific vendors and their products. Can be used to browse available products or get a comprehensive list of CVEs for a vendor/product combination.

What this tool provides:

  • List of CVEs for a specific vendor/product

  • Available products for a vendor (when product not specified)

  • Complete CVE details for each result

  • Sorted by severity and recency

Common Use Cases:

  • Asset vulnerability scanning

  • Vendor risk assessment

  • Product-specific security monitoring

  • Patch management planning

  • Security posture evaluation

Args: vendor: The vendor name (case-insensitive, use lowercase). Examples: 'microsoft', 'apache', 'cisco', 'linux', 'oracle' product: Optional product name (case-insensitive, use lowercase). Examples: 'office', 'httpd', 'ios', 'kernel', 'database' If omitted, returns list of available products for the vendor.

Returns: When product is specified: - JSON string containing array of CVE objects with full details

When product is omitted:
- JSON string containing array of available product names for that vendor

Examples: Search CVEs: vendor="microsoft", product="windows" Search CVEs: vendor="apache", product="httpd" List products: vendor="cisco" (product omitted) List products: vendor="linux" (product omitted)

Notes: - Vendor/product names should be lowercase - Use underscores or hyphens as they appear in CPE names - Product browsing helps discover correct product names - Results may include multiple product versions - No API key required - When vendor/product is not found, returns a structured JSON response with found=false

Raises: CVEClientError: If there's an error communicating with the API.

ParametersJSON Schema
NameRequiredDescriptionDefault
vendorYes
productNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description fully discloses behavioral traits: sorting by severity/recency, error handling (found=false response), API requirements (no key), case-insensitivity, and raised exceptions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections (summary, what it provides, use cases, args, returns, examples, notes, raises). Every sentence adds value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has only 2 params and no annotations, but description covers all needed context: inputs, behaviors, return formats, error handling, and practical examples. Output schema implied but description compensates with thorough explanation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description adds detailed semantics: vendor and product are case-insensitive, lowercase, with examples. It explains the dual behavior when product is omitted (returns product list vs CVEs).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches for CVEs by vendor and optionally product. It distinguishes from sibling tools like cve_search_by_id and the many other tools focused on different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides common use cases and examples, and explains when to omit product to browse products. Does not explicitly contrast with alternatives like cve_database_status or cve_search_by_id, but context is sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alertA

Get detailed information about a specific alert by ID.

Retrieves comprehensive alert data including metadata, timing information, severity, status, associated assets, and analyst findings.

Args: alert_id: The unique identifier of the alert (string).

Returns: Detailed alert information in JSON format containing: - id: Unique alert identifier - externalId: External system identifier (if any) - severity: CRITICAL, HIGH, MEDIUM, LOW, INFO, UNKNOWN - status: NEW, IN_PROGRESS, RESOLVED, FALSE_POSITIVE - name: Alert title/name - description: Detailed description of the alert - detectedAt: ISO timestamp when alert was first detected - firstSeenAt: ISO timestamp of first occurrence (if different) - lastSeenAt: ISO timestamp of most recent occurrence - analystVerdict: Expert analysis result (if available) - classification: Alert category/type - confidenceLevel: Detection confidence score - dataSources: List of data sources that contributed to detection - detectionSource: {product, vendor} information - asset: Associated asset information {id, name, type} - assignee: Assigned user information {userId, email, fullName} - noteExists: Boolean indicating if notes are attached - result: Investigation outcome - storylineId: Associated storyline identifier - ticketId: Associated ticket identifier

Common Use Cases: - Incident investigation and triage - Alert enrichment with contextual data - Status and assignment tracking - Evidence collection for security workflows

Raises: RuntimeError: If there's an error retrieving the alert. ValueError: If alert_id is invalid or empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden for behavioral transparency. It mentions possible exceptions (RuntimeError, ValueError) but does not disclose whether the operation is read-only, idempotent, or any side effects. This is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (Args, Returns, Common Use Cases, Raises) and front-loads the key purpose. Some verbosity exists, especially in the returns section which lists many fields, but it is organized and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having only one parameter, the description provides extensive return field documentation and common use cases. The output schema likely covers the return structure, so the description complements it fully. Context is complete for this tool's intended use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description defines alert_id as 'The unique identifier of the alert (string)', which adds minimal semantic value beyond the schema type. With 0% schema description coverage, the description should compensate, but it only restates the parameter name and type without examples or format details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves detailed information about a specific alert by ID. It distinguishes from siblings like list_alerts, search_alerts, get_alert_history, and get_alert_notes by focusing on a single alert's comprehensive data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Common use cases are provided (incident investigation, enrichment, tracking, evidence collection), giving clear context for when to use this tool. It does not explicitly mention when not to use it or alternatives, but the sibling tools (list_alerts, search_alerts) are sufficiently differentiated by the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alert_historyA

Get the complete audit history and timeline for an alert.

Retrieves a chronological record of all actions, status changes, and events related to a specific alert. Provides full audit trail for compliance and investigation.

Args: alert_id: The unique identifier of the alert. first: Number of history events to retrieve (1-100, default: 10). after: Pagination cursor from previous response (optional).

Returns: Paginated chronological list in JSON format containing: - edges: Array of history events with: - createdAt: ISO timestamp when the event was created - eventText: Human-readable description of the event - eventType: Type of event (STATUS_CHANGED, ASSIGNMENT_CHANGED, NOTE_ADDED, etc.) - reportUrl: Optional URL to mitigation action report (if applicable) - historyItemCreator: Creator/author of the event (may be null for system events): - userId: User identifier - userType: Type of user (MDR, CONSOLE_USER, etc.) - pageInfo: Pagination metadata (same structure as list_alerts)

Common Event Types: - status_change: Alert status modified (NEW → IN_PROGRESS, etc.) - assignment: Alert assigned/unassigned to user or team - severity_change: Severity level modified - note_added: Analyst note or comment added - verdict_change: Analyst verdict updated - escalation: Alert escalated to higher priority - integration_action: External system actions (ticket creation, etc.)

Common Use Cases: - Compliance auditing and reporting - Investigation timeline reconstruction - Performance metrics and SLA tracking - Change management and accountability - Forensic analysis of alert handling

Raises: RuntimeError: If there's an error retrieving alert history. ValueError: If parameters are invalid.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
firstNo
alert_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully bears the burden of behavioral disclosure. It explains pagination, chronological order, event types, and raises RuntimeError/ValueError. It is transparent about output structure but lacks details on rate limits or authentication needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (args, returns, common event types, use cases, raises). It is front-loaded with purpose, and every sentence adds value without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and sibling tools, the description is complete. It details the output schema (edges, pageInfo, event objects), event types, use cases, and error conditions, leaving no obvious gaps for an agent to misinterpret.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must add meaning. It does so excellently by defining each parameter: alert_id as unique identifier, first with range (1-100) and default 10, after as optional pagination cursor. This goes beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it retrieves the complete audit history and timeline for an alert, providing a full audit trail. It distinguishes from sibling tools like get_alert and get_alert_notes by focusing on chronological events, not just the alert itself or notes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description lists common use cases such as compliance auditing and investigation timeline reconstruction, offering clear context for when to use the tool. However, it does not explicitly state when not to use it or provide alternative tools for specific scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alert_investigation_reportA

Get the agentic auto-investigation report associated with an alert.

Retrieves the comprehensive investigation report generated by Purple AI's Auto Investigations for a specific alert. This report includes analysis findings, evidence, conclusions, recommended actions, and a final verdict.

Args: alert_id: The unique identifier of the alert.

Returns: The agentic auto-investigation report in markdown format and the verdict.

Common use cases: - Reviewing the auto-investigation summary - Understanding the final verdict and recommendations on an alert - Retrieving previous report to review detailed analysis and evidence

Note: Returns None if no report exists.

Raises: RuntimeError: If there's an error retrieving the alert report. ValueError: If alert_id is invalid or empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the tool retrieves a report, returns markdown format and verdict, may return None if no report exists, and raises RuntimeError or ValueError for errors. This provides sufficient behavioral insight without contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a one-line summary, followed by detailed explanation, Args, Returns, Common use cases, Note, and Raises. It is front-loaded with the key purpose, concise, and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's single parameter and the presence of an output schema, the description adequately explains the return format (markdown report and verdict) and error conditions. It covers common use cases and potential None result. However, it could be slightly more precise about alert_id format, but overall complete for agent decision-making.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one required parameter (alert_id) with 0% coverage. The description minimally describes it as 'The unique identifier of the alert' in Args. While adequate given only one parameter, it lacks additional context like format, examples, or validation rules that would aid agent usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'Get', the resource 'agentic auto-investigation report', and its association with an alert. It distinguishes itself from sibling tools like 'get_alert' and 'purple_ai' by specifying the report's content (analysis findings, evidence, conclusions, verdict).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a 'Common use cases' section listing explicit scenarios, such as reviewing the investigation summary or retrieving past reports. It also notes when the tool returns None (no report exists). However, it lacks explicit guidance on when not to use this tool or comparisons to alternatives like 'get_alert' or 'purple_ai'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alert_notesA

Get all notes and comments associated with an alert.

Retrieves all analyst notes, comments, and annotations attached to a specific alert. Notes provide context, analysis findings, investigation steps, and collaboration history.

Args: alert_id: The unique identifier of the alert.

Returns: List of notes in JSON format, each containing: - id: Unique note identifier - text: Note content/message - createdAt: ISO timestamp when note was created - author: User information {userId, email, fullName} - alertId: Associated alert identifier

Notes are typically ordered by creation time (newest first).

Common Use Cases: - Investigation documentation and collaboration - Tracking analyst findings and decisions - Audit trail for alert handling - Knowledge sharing between team members - Compliance and reporting requirements

Note: Returns empty array if no notes exist. Check alert.noteExists field from get_alert to avoid unnecessary calls.

Raises: RuntimeError: If there's an error retrieving alert notes. ValueError: If alert_id is invalid or empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: returns a list of notes with field details, ordering by newest first, empty array if no notes, and raises RuntimeError and ValueError. This exceeds the burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections (Args, Returns, Use Cases, etc.), but slightly verbose for a one-parameter tool. Front-loads main purpose effectively.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Highly complete given low complexity: explains return format, ordering, error handling, and use cases. Output schema exists, so return value details are not required but are provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate, but it merely restates 'The unique identifier of the alert' without additional context (e.g., format, length, constraints). Adds minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves all notes and comments for an alert, using specific verbs like 'Get all notes and comments'. It distinguishes itself from sibling tools like get_alert and get_alert_history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use (e.g., investigation, collaboration) and suggests checking alert.noteExists to avoid unnecessary calls. Implies when not to use (if no notes exist).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_inventory_itemA

Get detailed information about a specific managed asset in SentinelOne by ID.

Use this tool to retrieve information about SentinelOne managed assets such as computers, servers, workstations, cloud resources, and network devices.

Args: item_id: The unique identifier of the inventory item. fetch_fields: Field filtering. Either: - Preset name: "MINIMAL", "STANDARD", or "ALL" (default: "ALL") * MINIMAL: 7 core fields (id, name, category, etc.) * STANDARD: 13 fields (MINIMAL + operational context) * ALL: All available fields (~200+ fields) - List of specific field names in camelCase: Examples: ["id", "name", "resourceType"] ["id", "osVersion", "ipAddress", "lastActiveDt"] Defaults to "ALL" to return complete asset information.

Returns: JSON string containing the requested fields (keys use camelCase format). Fields without values are excluded from the output.

Raises: ValueError: If item_id is invalid or empty, or fetch_fields is invalid. InventoryAuthenticationError: If authentication fails. InventoryNetworkError: If network operation fails. InventoryAPIError: If the API returns an error. InventoryClientError: For other client-level errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYes
fetch_fieldsNoALL

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It describes return format (JSON string), error types, and field exclusion behavior. It does not mention authentication or rate limits, but for a read-only tool, it's sufficiently transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with Args, Returns, Raises sections. It is front-loaded with the main purpose. Every sentence is informative and adds value, with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low schema coverage and presence of output schema, the description is comprehensive. It explains both parameters, return format, error types, and default behavior. It covers all relevant aspects for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description compensates fully. It explains item_id as unique identifier and fetch_fields in detail: presets with field counts, custom field list, default value, camelCase keys. Adds significant meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get detailed information about a specific managed asset in SentinelOne by ID.' It uses specific verbs and resources, and distinguishes from sibling tools like list_inventory_items and search_inventory_items.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does and the purpose of parameters, including presets. It implies usage for single-item retrieval but lacks explicit when-not-to-use or comparison with alternatives. Clear enough for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_misconfigurationA

Get detailed information about a specific misconfiguration by ID.

Retrieves comprehensive misconfiguration data including metadata, severity, affected assets, compliance information, remediation steps, and MITRE ATT&CK mappings.

Args: misconfiguration_id: The unique identifier of the misconfiguration (string).

Returns: Detailed misconfiguration information in JSON format containing: - id: Unique misconfiguration identifier - externalId: External system identifier - name: Misconfiguration title/name - description: Detailed description of the issue - severity: CRITICAL, HIGH, MEDIUM, LOW, INFO, UNKNOWN - status: NEW, IN_PROGRESS, ON_HOLD, RESOLVED, RISK_ACKED, SUPPRESSED, TO_BE_PATCHED - detectedAt: ISO timestamp when misconfiguration was detected - eventTime: ISO timestamp of the event - environment: Environment where detected (e.g., cloud, kubernetes) - product: Detection source product name - vendor: Detection source vendor name - asset: Associated asset information {id, name, type, category, cloudInfo, etc.} - scope: Organizational scope {account, site, group} - scopeLevel: account/site/group - analystVerdict: TRUE_POSITIVE or FALSE_POSITIVE - assignee: Assigned user information {id, email, fullName} - compliance: Compliance standards and requirements - remediation: Remediation steps and references - failedRules: List of failed security rules - findingData: Additional context and properties - mitreAttacks: MITRE ATT&CK technique mappings - cnapp: Cloud-native application protection details - evidence: Evidence data (files, IPs, ports, secrets, etc.)

Common Use Cases: - Security posture assessment - Compliance auditing and reporting - Vulnerability management workflows - Cloud security remediation - Risk assessment and prioritization

Raises: RuntimeError: If there's an error retrieving the misconfiguration. ValueError: If misconfiguration_id is invalid or empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
misconfiguration_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It details the comprehensive data returned, raises RuntimeError and ValueError, and does not mention any destructive side effects. This provides adequate transparency for a read-only retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose, listing many return fields in detail. While structured with sections (Args, Returns, Use Cases, Raises), it is longer than necessary. Front-loading is good but could be more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is extremely detailed, covering all aspects of the tool's response and use cases. Since an output schema exists, the description need not explain returns, but it does so thoroughly, making it comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It names the parameter 'misconfiguration_id' and states it is a unique identifier (string). This adds sufficient meaning beyond the schema, which only defines type and requirement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves detailed information about a specific misconfiguration by ID, using the verb 'get' and resource 'misconfiguration'. It distinguishes from siblings like list_misconfigurations (list) and search_misconfigurations (search) by specifying a single entity retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes common use cases such as security posture assessment and compliance auditing, implying when to use. However, it does not explicitly state when not to use or provide direct alternatives, though the sibling list makes context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_misconfiguration_historyA

Get the complete audit history and timeline for a misconfiguration.

Retrieves a chronological record of all actions, status changes, and events related to a specific misconfiguration. Provides full audit trail for compliance and investigation.

Args: misconfiguration_id: The unique identifier of the misconfiguration. first: Number of history events to retrieve (1-100, default: 10). after: Pagination cursor from previous response (optional).

Returns: Paginated chronological list in JSON format containing: - edges: Array of history events with: - eventType: Type of event (CREATION, STATUS, ANALYST_VERDICT, USER_ASSIGNMENT, NOTES, WORKFLOW_ACTION) - eventText: Human-readable description of the event - createdAt: ISO timestamp when event occurred - pageInfo: Pagination metadata (same structure as list_misconfigurations)

Common Event Types: - CREATION: Misconfiguration first detected - STATUS: Status changed (NEW → IN_PROGRESS, etc.) - ANALYST_VERDICT: Verdict updated (TRUE_POSITIVE/FALSE_POSITIVE) - USER_ASSIGNMENT: Assigned/unassigned to user - NOTES: Note or comment added - WORKFLOW_ACTION: Automated action or workflow step

Common Use Cases: - Compliance auditing and reporting - Investigation timeline reconstruction - Performance metrics and SLA tracking - Change management and accountability - Security posture trend analysis

Raises: RuntimeError: If there's an error retrieving misconfiguration history. ValueError: If parameters are invalid.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
firstNo
misconfiguration_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It details return format and errors, but does not explicitly state the read-only nature, authorization needs, or other behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with headings and sections, though slightly long; every section adds value. Could be marginally more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, the description is highly complete: covers return format, event types, common use cases, errors, and pagination. Output schema is described in detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates with detailed Args section explaining each parameter's purpose, constraints (e.g., first: 1-100, default 10), and optionality.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves the complete audit history and timeline for a misconfiguration, distinguishing it from sibling tools like get_misconfiguration or get_misconfiguration_notes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Common Use Cases section provides explicit contexts for using the tool (compliance auditing, investigation, etc.), but does not explicitly mention when not to use it or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_misconfiguration_notesA

Get all notes and comments associated with a misconfiguration.

Retrieves all analyst notes, comments, and annotations attached to a specific misconfiguration. Notes provide context, analysis findings, remediation steps, and collaboration history.

Args: misconfiguration_id: The unique identifier of the misconfiguration.

Returns: List of notes in JSON format, each containing: - id: Unique note identifier - misconfigurationId: Associated misconfiguration identifier - text: Note content/message - author: User information {id, email, fullName, deleted} - createdAt: ISO timestamp when note was created - updatedAt: ISO timestamp when note was last updated (if applicable)

Notes are typically ordered by creation time (newest first).

Common Use Cases: - Remediation documentation and collaboration - Tracking analyst findings and decisions - Audit trail for security issue handling - Knowledge sharing between security teams - Compliance and reporting requirements

Raises: RuntimeError: If there's an error retrieving misconfiguration notes. ValueError: If misconfiguration_id is invalid or empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
misconfiguration_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states notes are ordered newest first and lists raised errors, but does not disclose read-only nature or authentication requirements. Still appropriate for a simple getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (Args, Returns, Common Use Cases, Raises), front-loaded with the core purpose, and contains no superfluous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, output schema exists), the description covers purpose, argument, return format, common scenarios, and errors comprehensively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description thoroughly explains 'misconfiguration_id' as 'The unique identifier of the misconfiguration.' This single parameter is clearly defined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'Get' and resource 'notes and comments' are clearly stated. The description distinguishes from sibling tools like get_misconfiguration and get_misconfiguration_history by focusing specifically on notes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Common use cases are provided (remediation, collaboration, audit trail, etc.), but there is no explicit guidance on when not to use this tool or how it compares to alternatives like get_misconfiguration.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_timestamp_rangeC

Generate time range timestamps for PowerQuery analytics in SentinelOne's Singularity Data Lake.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
hoursNo
weeksNo
yearsNo
monthsNo
minutesNo
secondsNo
directionNopast
reference_timeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description should disclose behavioral traits (e.g., read-only nature, side effects) but only states the purpose, leaving the agent uninformed about safety or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very brief (one sentence) but lacks structure and detail, making it concise at the expense of completeness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema being present, the description omits any explanation of the returned timestamps or how the 9 optional parameters should be used, leaving significant gaps for effective agent usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description adds no parameter-level detail beyond the schema's self-explanatory names, failing to clarify how parameters combine to form a time range.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool generates 'time range timestamps' for a specific use in PowerQuery analytics, differentiating it from sibling tools like iso_to_unix_timestamp which handles single conversions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as iso_to_unix_timestamp, nor are there any context hints for its appropriate application.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vulnerabilityA

Get detailed information about a specific vulnerability by ID.

Retrieves comprehensive vulnerability data including CVE details, affected assets, risk scores, EPSS metrics, exploit maturity, and remediation information.

Args: vulnerability_id: The unique identifier of the vulnerability (string).

Returns: Detailed vulnerability information in JSON format containing: - id: Unique vulnerability identifier - externalId: External system identifier - name: Vulnerability title/name - severity: CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN - status: NEW, IN_PROGRESS, ON_HOLD, RESOLVED, RISK_ACKED, SUPPRESSED, TO_BE_PATCHED - detectedAt: ISO timestamp when vulnerability was detected - lastSeenAt: ISO timestamp of most recent occurrence - updatedAt: ISO timestamp of last update - product: Detection source product name - vendor: Detection source vendor name - asset: Associated asset information {id, name, type, category, cloudInfo, etc.} - scope: Organizational scope {account, site, group} - scopeLevel: account/site/group - cve: CVE details including: - id: CVE identifier (CVE-YYYY-NNNN) - description: CVE description - nvdBaseScore: NVD base score - riskScore: SentinelOne risk score - publishedDate: Publication date - epssScore: EPSS probability score - epssPercentile: EPSS percentile - exploitMaturity: Exploit code maturity level - exploitedInTheWild: Boolean indicating active exploitation - kevAvailable: CISA KEV catalog availability - s1BaseValues: CVSS vector components - riskIndicators: Additional risk indicators - timeline: CVE timeline events - software: Affected software {name, version, fixVersion, type, vendor} - findingData: Additional context and properties - paidScope: Whether under paid scope - remediationInsightsAvailable: Remediation insights availability - selfLink: Link to the vulnerability details - analystVerdict: TRUE_POSITIVE or FALSE_POSITIVE - assignee: Assigned user information {id, email, fullName} - exclusionPolicyId: Exclusion policy identifier if applicable

Common Use Cases: - Vulnerability assessment and prioritization - CVE research and analysis - Risk scoring and exposure analysis - Patch management workflows - Compliance reporting

Raises: RuntimeError: If there's an error retrieving the vulnerability. ValueError: If vulnerability_id is invalid or empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
vulnerability_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description fully covers behavioral traits. It details return fields, error types (RuntimeError, ValueError), and mentions retrieving comprehensive data. However, it could mention idempotency or caching, but overall it is thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy and repeats return field details that are already provided by the output schema (context signals indicate output schema exists). It could be more concise by omitting the verbose return schema listing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single parameter, straightforward get operation), the description is complete. It covers purpose, parameters, return structure, use cases, and errors. No gaps are apparent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'vulnerability_id' is described as 'The unique identifier of the vulnerability (string).' This adds meaning beyond the schema, which has no description. For a single parameter, this is sufficient and clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get detailed information about a specific vulnerability by ID.' It uses a specific verb 'get' and identifies the resource 'vulnerability', distinguishing it from sibling tools like 'list_vulnerabilities' and 'get_alert'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes 'Common Use Cases' that imply when to use it, but it does not explicitly state when not to use it or provide alternative tools. The context is clear but lacks exclusionary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vulnerability_historyA

Get the complete audit history and timeline for a vulnerability.

Retrieves a chronological record of all actions, status changes, and events related to a specific vulnerability. Provides full audit trail for compliance and investigation.

Args: vulnerability_id: The unique identifier of the vulnerability. first: Number of history events to retrieve (1-100, default: 10). after: Pagination cursor from previous response (optional).

Returns: Paginated chronological list in JSON format containing: - edges: Array of history events with: - eventType: Type of event (CREATION, STATUS, ANALYST_VERDICT, USER_ASSIGNMENT, NOTES, WORKFLOW_ACTION) - eventText: Human-readable description of the event - createdAt: ISO timestamp when event occurred - pageInfo: Pagination metadata (same structure as list_vulnerabilities)

Common Event Types: - CREATION: Vulnerability first detected - STATUS: Status changed (NEW → IN_PROGRESS, etc.) - ANALYST_VERDICT: Verdict updated (TRUE_POSITIVE/FALSE_POSITIVE) - USER_ASSIGNMENT: Assigned/unassigned to user - NOTES: Note or comment added - WORKFLOW_ACTION: Automated action or workflow step

Common Use Cases: - Compliance auditing and reporting - Investigation timeline reconstruction - Performance metrics and SLA tracking - Change management and accountability - Vulnerability lifecycle analysis

Raises: RuntimeError: If there's an error retrieving vulnerability history. ValueError: If parameters are invalid.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
firstNo
vulnerability_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must fully disclose behavior. It explains that the tool returns a paginated chronological list, details event types, mentions errors (RuntimeError, ValueError), and describes the return structure. It does not mention authentication, rate limits, or side effects, but as a read-only history tool, these are less critical. The disclosure is adequate for safe invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Args, Returns, Common Event Types, Common Use Cases, Raises). It is somewhat verbose but each section adds value. The main purpose is front-loaded in the first line. Minor redundancy could be trimmed, but overall it is effective and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although no output schema was provided in the input (context says it exists), the description includes a detailed 'Returns' section outlining the structure, event types, and pagination metadata. It also covers common use cases and error conditions. This completeness compensates for missing schema and ensures the agent can understand the tool's output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema defines three parameters with minimal constraints. The description adds critical context: 'vulnerability_id' is the unique identifier, 'first' has a range of 1-100 (default 10), and 'after' is a pagination cursor from previous response. Schema description coverage is 0%, so the description carries full burden and provides complete semantic information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get the complete audit history and timeline for a vulnerability.' The verb 'Get' and resource 'vulnerability history' are specific. The name and description distinguish it from sibling tools like get_vulnerability (current state) and get_alert_history (different resource).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a 'Common Use Cases' section listing compliance auditing, investigation, etc., which implies when to use the tool. It does not explicitly exclude alternatives, but the context of resource-specific history is clear. No direct comparison with siblings is provided, but the use cases guide appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vulnerability_notesA

Get all notes and comments associated with a vulnerability.

Retrieves all analyst notes, comments, and annotations attached to a specific vulnerability. Notes provide context, analysis findings, remediation steps, and collaboration history.

Args: vulnerability_id: The unique identifier of the vulnerability.

Returns: List of notes in JSON format, each containing: - id: Unique note identifier - vulnerabilityId: Associated vulnerability identifier - text: Note content/message - author: User information {id, email, fullName, deleted} - createdAt: ISO timestamp when note was created - updatedAt: ISO timestamp when note was last updated (if applicable)

Notes are typically ordered by creation time (newest first).

Common Use Cases: - Vulnerability analysis documentation - Tracking security team findings and decisions - Audit trail for vulnerability handling - Knowledge sharing between security analysts - Compliance and reporting requirements

Raises: RuntimeError: If there's an error retrieving vulnerability notes. ValueError: If vulnerability_id is invalid or empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
vulnerability_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description relies solely on text. Describes ordering (newest first) and error raises, but does not explicitly state read-only nature or authorization requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections (summary, args, returns, use cases, raises). Slightly verbose but each section adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers input, output fields with examples, common uses, and errors. Output schema exists but description enriches it. Complete for a single-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage; description only says 'unique identifier', lacking format or examples. Minimal addition beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'Get' and resource 'notes/comments associated with vulnerability'. Distinguishes from sibling tools like get_vulnerability and get_alert_notes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Lists common use cases and input parameter, but does not explicitly state when not to use or compare to alternatives like get_misconfiguration_notes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iso_to_unix_timestampA

Convert an ISO 8601 datetime string to a UNIX timestamp in milliseconds (UTC).

This tool accepts datetime strings in ISO 8601 format and converts them to UNIX timestamps (milliseconds since epoch: January 1, 1970 00:00:00 UTC). This is essential for datetime filter queries in Purple Alert, Vulnerability, Misconfiguration, and Inventory searches.

IMPORTANT: You should provide datetime inputs in the user's preferred timezone. This tool will automatically convert them to UTC timestamps for use in API queries. For example, if the user asks for "October 30, 2024 at 8 AM Eastern Time", you should submit "2024-10-30T08:00:00-04:00" (not convert it yourself to UTC).

Args: iso_datetime (str): An ISO 8601 formatted datetime string. Examples: - "2025-10-30T12:00:00Z" (UTC with 'Z' suffix) - "2025-10-30T12:00:00+00:00" (UTC with explicit offset) - "2025-10-30T08:00:00-04:00" (Eastern Time with offset) - "2025-10-30T17:00:00+05:00" (IST/Pakistan Time with offset) - "2025-10-30T12:00:00" (no timezone - treated as UTC)

Returns: str: The UNIX timestamp in milliseconds (UTC) as a JSON number string. Example: "1761825600000"

Common Use Cases: - Converting user-friendly datetime inputs to UNIX timestamps for API queries - Handling datetimes across different time zones automatically - Preparing datetime filters for Alert, Vulnerability, Misconfiguration, and Inventory searches

Examples: Input: "2025-10-30T12:00:00Z" (noon UTC) Output: "1761825600000"

Input: "2025-10-30T08:00:00-04:00" (8 AM EDT = noon UTC)
Output: "1761825600000"

Input: "2025-10-30T17:00:00+05:00" (5 PM PKT = noon UTC)
Output: "1761825600000"

Raises: ValueError: If the input string is not a valid ISO 8601 datetime format.

Notes: - All timestamps are returned in milliseconds (not seconds or nanoseconds) - All timestamps represent UTC time regardless of input timezone - If no timezone is specified in input, UTC is assumed - The tool handles timezone conversion automatically - provide times in the user's local timezone

ParametersJSON Schema
NameRequiredDescriptionDefault
iso_datetimeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it returns milliseconds, converts timezones automatically, assumes UTC if omitted, and raises ValueError for invalid input. This is comprehensive and transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections like Args, Returns, Examples, and Notes, making it easy to scan. However, it is somewhat lengthy; a more streamlined version could retain all value while being more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no annotations) and the presence of an output schema (though not shown), the description covers all necessary aspects: purpose, usage, behavior, and examples. It is complete for an AI agent to use effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the description compensates thoroughly by detailing the parameter 'iso_datetime' with format, examples, and timezone handling. This adds significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Convert an ISO 8601 datetime string to a UNIX timestamp in milliseconds (UTC).' This is specific and distinguishes it from siblings like get_timestamp_range, which likely handles range queries rather than single conversions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes explicit usage guidance, such as providing datetime in the user's timezone and not converting manually. It lists common use cases but does not mention when not to use the tool or alternatives, which would elevate it to a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_alertsA

List alerts with pagination and filtering capabilities.

Retrieves a paginated list of alerts with basic filtering by assignment status. For advanced filtering by severity, status, time ranges, etc., use search_alerts instead.

Args: first: Number of alerts to retrieve (1-100, default: 10). after: Pagination cursor from previous response (optional). Use pageInfo.endCursor from previous response to get next page. view_type: Assignment filter with options: - "ALL": Show all alerts (default) - "ASSIGNED_TO_ME": Only alerts assigned to current user - "UNASSIGNED": Only unassigned alerts - "MY_TEAM": Only alerts assigned to user's team fields: Optional JSON string containing an array of field names to return. If not specified, returns all default fields (including dataSources). Use minimal fields like '["id"]' when paging through intermediate results.

        Available fields:
        - Basic: "id", "externalId", "severity", "status", "name", "description"
        - Timing: "detectedAt", "firstSeenAt", "lastSeenAt"
        - Analysis: "analystVerdict", "classification", "confidenceLevel"
        - Context: "noteExists", "result", "storylineId", "ticketId", "dataSources"
        - Nested objects (returns all subfields):
          - "detectionSource" (product, vendor)
          - "asset" (id, name, type)
          - "assignee" (userId, email, fullName)

        IMPORTANT - dataSources field behavior:
        - When fields=None (default): dataSources is INCLUDED automatically
        - When fields is provided: dataSources is ONLY included if explicitly requested
          Example with dataSources: '["id", "severity", "dataSources"]'
          Example without: '["id", "severity"]' (dataSources will be omitted)

        Examples:
        - Minimal for paging: '["id"]'
        - Summary view: '["id", "severity", "status", "name", "detectedAt"]'
        - With dataSources: '["id", "severity", "dataSources"]'
        - Full details: omit fields parameter or pass None

Returns: Paginated alert list in JSON format containing: - edges: Array of alert objects (with requested fields only) - pageInfo: Pagination metadata - hasNextPage: Boolean indicating more results available - hasPreviousPage: Boolean indicating previous page exists - startCursor: Cursor for first item in current page - endCursor: Cursor for last item (use for next page) - totalCount: Total number of matching alerts (if available)

Common Use Cases: - Dashboard alert feeds and overviews - Assignment-based alert distribution - Bulk alert processing workflows - Alert queue management

Pagination Example: 1. Call with first=20 to get first 20 alerts 2. Use pageInfo.endCursor as 'after' parameter for next 20 3. Continue until pageInfo.hasNextPage is false

IMPORTANT Performance Notes: - Cursor pagination is SEQUENTIAL ONLY - you cannot skip to arbitrary positions (e.g., cannot jump directly to "the 1532nd alert") - When paging through many results to reach a specific position, use fields=["id"] for intermediate pages to conserve context window - Use the totalCount field to understand the full result set size

Raises: RuntimeError: If there's an error listing alerts. ValueError: If parameters are invalid.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
firstNo
fieldsNo
view_typeNoALL

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits: pagination mechanism (cursor-based, sequential only), performance notes (use minimal fields for intermediate pages), the conditional inclusion of 'dataSources' based on the 'fields' parameter, and error handling (raises RuntimeError/ValueError). No contradictions exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but well-organized with sections, bullet points, and examples. Every part adds value, though some redundancy (e.g., repeating 'dataSources' behavior) could be trimmed slightly without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 4 parameters, no annotations, and an output schema (present but not detailed), the description is exceptionally complete. It covers pagination flow, performance optimization, parameter behavior, return structure, and error cases, leaving no ambiguity for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description thoroughly explains each parameter: 'first' (range, default), 'after' (pagination cursor usage), 'view_type' (all options detailed), and 'fields' (JSON string, behavior, available fields with examples). This far exceeds the bare schema information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List alerts with pagination and filtering capabilities', using a specific verb ('list') and resource ('alerts'). It distinguishes from sibling tools like 'search_alerts' by noting that this tool provides basic filtering, while the sibling handles advanced filtering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises when to use this tool versus 'search_alerts' (e.g., 'For advanced filtering by severity, status, time ranges, etc., use search_alerts instead'). It also lists common use cases (dashboard feeds, assignment-based distribution, bulk processing, queue management), providing clear context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_inventory_itemsA

List managed assets in SentinelOne with pagination and optional filtering.

Use this tool to browse SentinelOne managed assets including computers, servers, workstations, cloud resources, and network-discovered devices.

Args: limit: Number of items to retrieve (1-1000, default: 50). skip: Number of items to skip for pagination (default: 0). surface: Optional surface filter: - "ENDPOINT": Endpoint assets (agents, workstations, servers, computers) - "CLOUD": Cloud resources (AWS, Azure, GCP) - "IDENTITY": Identity entities (AD, Entra ID) - "NETWORK_DISCOVERY": Network-discovered devices (Ranger) fetch_fields: Field filtering. Either: - Preset name: "MINIMAL", "STANDARD", or "ALL" (default: "MINIMAL") * MINIMAL: 7 core fields (id, name, category, etc.) - fastest * STANDARD: 13 fields (MINIMAL + operational context) * ALL: All available fields (~200+ fields) - slowest - List of specific field names in camelCase: Examples: ["id", "name", "category"] ["id", "resourceType", "assetStatus", "lastActiveDt"] Use fetch_fields="ALL" on a single item to discover all field names. Defaults to "MINIMAL" for optimal performance with list operations.

Returns: JSON string with paginated inventory items containing only requested fields. Field keys use camelCase format. Fields without values are excluded from the output. Includes pagination metadata.

Raises: ValueError: If parameters are invalid, or fetch_fields is invalid. InventoryAuthenticationError: If authentication fails. InventoryNetworkError: If network operation fails. InventoryAPIError: If the API returns an error. InventoryClientError: For other client-level errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNo
limitNo
surfaceNo
fetch_fieldsNoMINIMAL

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses return format (JSON string, camelCase keys, excluded null values), pagination behavior (limit/skip), and detailed error types (ValueError, InventoryAuthenticationError, etc.). Also mentions performance trade-offs for fetch_fields options.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with summary, usage guidance, parameter details, returns, and raises sections. It is front-loaded with the core purpose. While verbose, each sentence adds value and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 4 parameters and no annotations, the description covers all relevant aspects: pagination, filtering, field selection, output format, and exceptions. The output schema exists (context signal), so return details are adequate. Minor gap: no mention of rate limits or authentication prerequisites beyond error types.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description fully explains all 4 parameters. limit, skip, and surface are clearly defined with ranges and enum options. fetch_fields is exceptionally detailed with preset names, field counts, and syntax examples. This adds significant meaning beyond the schema's type/defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List managed assets in SentinelOne with pagination and optional filtering,' specifying the exact verb and resource. It distinguishes from sibling tools like get_inventory_item (single item) and search_inventory_items (different query mode).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'Use this tool to browse SentinelOne managed assets' and provides parameter context like surface filter and fetch_fields options. However, it does not explicitly exclude cases where alternative tools (e.g., get_inventory_item for a single item, search_inventory_items for complex filters) would be more appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_misconfigurationsA

List misconfigurations with pagination and view filtering.

Retrieves a paginated list of misconfigurations with filtering by environment type. For advanced filtering by severity, status, compliance, etc., use search_misconfigurations instead.

Args: first: Number of misconfigurations to retrieve (1-100, default: 10). after: Pagination cursor from previous response (optional). Use pageInfo.endCursor from previous response to get next page. view_type: Environment filter with options: - "ALL": Show all misconfigurations (default) - "CLOUD": Cloud environment only - "KUBERNETES": Kubernetes environment only - "IDENTITY": Identity-related misconfigurations - "INFRASTRUCTURE_AS_CODE": IaC misconfigurations - "ADMISSION_CONTROLLER": Admission controller findings - "OFFENSIVE_SECURITY": Offensive security findings - "SECRET_SCANNING": Secret scanning findings fields: Optional JSON string containing an array of field names to return. If not specified, returns all default fields. Use minimal fields like '["id"]' when paging through intermediate results.

        Available fields:
        - Basic: "id", "externalId", "name", "severity", "status"
        - Timing: "detectedAt", "lastSeenAt", "eventTime"
        - Context: "environment", "product", "vendor", "organization"
        - Analysis: "analystVerdict", "mitigable", "exposureReason"
        - Type: "misconfigurationType"
        - IDs: "resourceUid", "exploitId", "exclusionPolicyId"
        - Nested objects (returns subfields):
          - "asset" (id, externalId, name, type, category, subcategory, privileged,
                    cloudInfo {accountId, accountName, providerName, region},
                    kubernetesInfo {cluster, namespace})
          - "scope" (account {id, name}, site {id, name}, group {id, name})
          - "assignee" (id, email, fullName)
          - "evidence" (fileName, fileType, iacFramework, ipAddress, port, subdomain)
          - "cnapp" (policy {id, version, group}, verifiedExploitable)
          - "admissionRequest" (category, resourceName, resourceNamespace, resourceType,
                               userName, userUid, userGroup)
          - "remediation" (mitigable, mitigationSteps)
          - "mitreAttacks" (techniqueId, techniqueName, techniqueUrl, tacticName, tacticUid)
        - Lists: "complianceStandards", "dataClassificationDataTypes", "dataClassificationCategories"
        - Enforcement: "enforcementAction"

        Examples:
        - Minimal for paging: '["id"]'
        - Summary view: '["id", "severity", "status", "name", "detectedAt"]'
        - With asset context: '["id", "name", "asset", "severity"]'
        - Full details: omit fields parameter or pass None

Returns: Paginated misconfiguration list in JSON format containing: - edges: Array of misconfiguration objects - pageInfo: Pagination metadata - hasNextPage: Boolean indicating more results available - hasPreviousPage: Boolean indicating previous page exists - startCursor: Cursor for first item in current page - endCursor: Cursor for last item (use for next page) - totalCount: Total number of matching misconfigurations

Common Use Cases: - Security dashboard feeds - Environment-specific security reviews - Bulk remediation workflows - Compliance reporting by scope - Cloud security posture management

Pagination Example: 1. Call with first=20 to get first 20 misconfigurations 2. Use pageInfo.endCursor as 'after' parameter for next 20 3. Continue until pageInfo.hasNextPage is false

Raises: RuntimeError: If there's an error listing misconfigurations. ValueError: If parameters are invalid.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
firstNo
fieldsNo
view_typeNoALL

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description fully discloses pagination behavior, parameter effects, return values, error types, and usage patterns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with Args, Returns, Raises, Use Cases, and Example sections. Every sentence adds value; appropriate length for the detail required.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all aspects: pagination, filtering, field selection, common use cases, errors, and return format. Completeness is high despite output schema existence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds extensive detail beyond schema: first range, after cursor usage, view_type enum values, fields JSON string with available fields and examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists misconfigurations with pagination and view filtering, and distinguishes from search_misconfigurations for advanced filtering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool vs search_misconfigurations, provides common use cases, and includes a pagination example.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_vulnerabilitiesA

List vulnerabilities with pagination.

Retrieves a paginated list of vulnerabilities in the environment. For advanced filtering by severity, CVE, asset type, etc., use search_vulnerabilities instead.

Args: first: Number of vulnerabilities to retrieve (1-100, default: 10). after: Pagination cursor from previous response (optional). Use pageInfo.endCursor from previous response to get next page. fields: Optional JSON string containing an array of field names to return. If not specified, returns all default fields. Use minimal fields like '["id"]' when paging through intermediate results.

        Available fields:
        - Basic: "id", "name", "severity", "status"
        - Timing: "detectedAt", "lastSeenAt"
        - Context: "product", "vendor"
        - Analysis: "analystVerdict"
        - IDs: "exclusionPolicyId"
        - Nested objects (returns subfields):
          - "cve" (id, nvdBaseScore, riskScore, publishedDate, epssScore,
                  exploitMaturity, exploitedInTheWild)
          - "software" (name, version, fixVersion, type, vendor)
          - "asset" (id, externalId, name, type, category, subcategory, privileged,
                    cloudInfo {accountId, accountName, providerName, region},
                    kubernetesInfo {cluster, namespace})
          - "scope" (account {id, name}, site {id, name}, group {id, name})
          - "assignee" (id, email, fullName)

        Examples:
        - Minimal for paging: '["id"]'
        - Summary view: '["id", "severity", "status", "name", "detectedAt"]'
        - With CVE details: '["id", "name", "cve", "software"]'
        - Full details: omit fields parameter or pass None

Returns: Paginated vulnerability list in JSON format containing: - edges: Array of vulnerability objects - pageInfo: Pagination metadata - hasNextPage: Boolean indicating more results available - hasPreviousPage: Boolean indicating previous page exists - startCursor: Cursor for first item in current page - endCursor: Cursor for last item (use for next page) - totalCount: Total number of matching vulnerabilities

Common Use Cases: - Vulnerability dashboard feeds - Security posture overview - Bulk vulnerability processing - Patch priority queues - Compliance reporting

Pagination Example: 1. Call with first=20 to get first 20 vulnerabilities 2. Use pageInfo.endCursor as 'after' parameter for next 20 3. Continue until pageInfo.hasNextPage is false

Raises: RuntimeError: If there's an error listing vulnerabilities. ValueError: If parameters are invalid.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
firstNo
fieldsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, but description covers pagination, parameter constraints, and error types. Does not mention side effects, but it's a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections, though lengthy. Every section adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all aspects: parameters, pagination logic, return format, use cases, and errors. Output schema exists, but description provides necessary context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description explains each parameter in depth, including fields with available subfields and examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists vulnerabilities with pagination, and distinguishes from search_vulnerabilities for advanced filtering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs when to use list_vulnerabilities vs search_vulnerabilities, and provides common use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

powerqueryA

Execute advanced PowerQuery analytics on data in SentinelOne's Singularity Data Lake for complex threat hunting and data analysis.

PowerQuery is SentinelOne's high-performance query language for searching, transforming, and aggregating telemetry and log data in the Scalyr and Singularity XDR platforms. It uses a pipeline-based syntax for filtering, grouping, computing, and summarizing large-scale unstructured data. SentinelOne PowerQuery is not the same as Microsoft PowerQuery. It also looks somewhat like Splunk SPL but is not the same language.

IMPORTANT: You should ALWAYS use the purple_ai() tool to generate PowerQueries for this tool based on natural language. It is very unlikely you know how to write PowerQueries yourself.

If a user gives you a specific PowerQuery that wasn't generated by Purple AI, run it EXACTLY as sent. DO NOT modify the user's input, pass it directly to this tool.

Args: query: The PowerQuery string to execute start_datetime: Start time in ISO 8601 format. ISO 8601 is the international standard for datetime representation: YYYY-MM-DDTHH:MM:SS with timezone offset. MUST include timezone offset (Z for UTC or ±HH:MM for local time). Examples: "2024-01-15T10:30:00Z" (UTC/Zulu time), "2024-01-15T10:30:00+05:00" (UTC+5 hours, e.g., Asia/Karachi), "2024-01-15T10:30:00-08:00" (UTC-8 hours, e.g., US Pacific), "2024-01-15T10:30:00.123456+02:00" (with microseconds, UTC+2) end_datetime: End time in ISO 8601 format. Same format requirements as start_datetime. Must be later than start_datetime. Examples: "2024-01-15T11:30:00Z" (UTC), "2024-01-15T11:30:00+05:00" (UTC+5, same timezone as start), "2024-01-15T11:30:00-08:00" (UTC-8, same timezone as start)

Time Range Guidelines:

  • DEFAULT to a 24-hour search period unless the user specifies a different time range

  • Use get_timestamp_range(hours=24) to get the last 24 hours

  • Queries with longer time ranges may take longer to execute or timeout

  • The query timeout is 5 minutes; if exceeded, reduce the time range or simplify the query

Understanding Results:

  • Empty results (no data returned) are NORMAL and ACCEPTABLE. This means no records match your query criteria.

  • Empty results could indicate:

    • No matching data exists in the specified time range

    • The query conditions are too restrictive; remove filters to attempt to retrieve more results

    • The searched activity or behavior simply hasn't occurred

  • DO NOT repeatedly rephrase or retry queries that legitimately return no results

  • If you expect results but get none, consider adjusting the time range or query criteria rather than retrying the exact same query

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
end_datetimeYes
start_datetimeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully covers behavioral traits: it explains the query language, the need for exact execution, timeout of 5 minutes, default time range, and proper handling of empty results. This gives the agent comprehensive understanding of the tool's behavior beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose but well-structured: it starts with a clear purpose, explains the language, gives important usage notes, then parameter details and guidelines. While every sentence is informative, it could be slightly more concise without losing clarity. However, the structure is logical and easy to follow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (a custom query language) and the lack of parameter descriptions in the schema, the description is exceptionally complete. It covers purpose, language distinction, parameter formatting, time range handling, error behaviors, and even references a sibling tool (purple_ai) for query generation. An output schema exists, so return values need not be described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no descriptions for parameters (0% coverage), but the tool description provides extensive details: for query, it explains it is a PowerQuery string; for start_datetime and end_datetime, it gives ISO 8601 format with multiple examples and timezone requirements. It also provides time range guidance, which adds significant meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifically states 'Execute advanced PowerQuery analytics on data in SentinelOne's Singularity Data Lake for complex threat hunting and data analysis,' clearly identifying the verb, resource, and scope. It also distinguishes PowerQuery from Microsoft PowerQuery and Splunk SPL, differentiating it from sibling tools like list_alerts or cve_search_by_id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to use purple_ai() to generate queries, advises to run user-provided queries exactly, and provides time range guidelines and empty result handling. This clearly indicates when to use this tool vs. alternatives and how to use it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

purple_aiA

Interact with SentinelOne's Purple AI, a cybersecurity assistant that helps you investigate threats, generate PowerQueries, and answer questions about SentinelOne. Purple AI understands natural language and converts your questions into structured security queries, or answers in plain language.

What Purple AI can do:

  • Generate and explain PowerQueries for threat hunting and detection

  • Help answer questions using threat intelligence and behavioral signals

  • Explore user, process, network, and file-based activities

  • Investigate MITRE TTPs, ransomware behavior, lateral movement, and more

  • Answer questions about SentinelOne capabilities

What Purple AI can't do:

  • Access active alerts (use the Alerts tool for that)

  • Modify configurations or directly interact with your endpoints

  • Run the PowerQueries itself (use the PowerQuery tool to run the PQ returned by Purple AI)


How to ask good questions

Purple AI works best when your questions are:

  • Descriptive: Include process names, file paths, domains, ports, or usernames

  • Focused: Describe what you're trying to understand or find

  • Scoped: If helpful, include filters like time ranges, endpoint type, or OS

Example questions:

  • Show me PowerShell processes that connected to external IPs

  • Find unsigned processes that accessed lsass.exe

  • List endpoints where the user “jsmith” logged in more than 5 times

  • Are there any reverse SSH tunnels from public IPs?

  • Find living-off-the-land binaries spawned from Microsoft Word

DO NOT instruct Purple AI to "Generate a Powerquery to ...". Instead, just say what you are looking for. Example: - GOOD: "Is APT-1337 in my environment?" - BAD: "Generate a PowerQuery to determine if APT-1337 is in my environment, including their typical tools, processes, and TTPs."


Tips for writing questions

  • Start with verbs like: show, find, list, search

  • Add specific entities like: powershell, svchost, lolbins, ssh, .tmp files

  • Use filters like: external IPs, non-Windows folders, file size over 1GB

  • Ask about behaviors: ransomware, persistence, privilege escalation, data staging, beaconing, phishing

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it generates and explains PowerQueries but does not run them, understands natural language, and returns answers. It also warns against instructing it to 'generate a PowerQuery' directly, revealing an important behavioral constraint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (capabilities, limitations, query guidance, examples) and front-loads the purpose. While somewhat lengthy, every section earns its place, though minor trimming could improve conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool (interactive cybersecurity assistant), the description is comprehensive. It covers capabilities, limitations, query format, examples, and guidance. The presence of an output schema also reduces the need to describe return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'query' has no description in the input schema (0% coverage), but the description extensively explains what kinds of queries to ask, provides examples, and offers tips for effective questions, adding substantial meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that purple_ai is a cybersecurity assistant that helps investigate threats, generate PowerQueries, and answer questions. It lists specific capabilities and distinguishes itself from sibling tools like powerquery (which runs queries) and alerts tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool (asking natural language questions about threats, generating PowerQueries) and when not to (accessing alerts, modifying configs). It provides guidance on how to ask good questions with examples and tips, and contrasts with the powerquery tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_alertsA

Search alerts using advanced filters and criteria.

If a user is asking a "how many" type query, set the "first" field to 1 - "totalCount" is returned for any query.

Args: filters: JSON string containing an array of filter objects (optional). Each filter object must have: - fieldId: String field name (use flattened camelCase names below) - filterType: One of the supported filter types below - isNegated: Optional boolean to negate the filter (default: false)

        Common Field Names (flattened camelCase):
        - Core: "id", "severity", "status", "alertName", "detectedAt", "createdAt"
        - Analysis: "analystVerdict", "assigneeUserId", "assigneeFullName", "alertNoteExists"
        - Context: "storylineId", "description"

        Filter Types and Required Keys:

        String Filters (for severity, status, analystVerdict, etc.):
        - "string_equals": Exact match. Requires "value" key.
          Example: {"fieldId": "severity", "filterType": "string_equals", "value": "CRITICAL"}
        - "string_in": Match any of multiple values. Requires "values" key (list).
          Example: {"fieldId": "status", "filterType": "string_in", "values": ["NEW", "IN_PROGRESS"]}

        Boolean Filters (for alertNoteExists, etc.):
        - "boolean_equals": Exact match. Requires "value" key.
          Example: {"fieldId": "alertNoteExists", "filterType": "boolean_equals", "value": true}
        - "boolean_in": Match any of multiple values. Requires "values" key (list).
          Example: {"fieldId": "alertNoteExists", "filterType": "boolean_in", "values": [true, false]}

        Long Filters (for numeric IDs like assigneeUserId):
        - "long_equals": Exact match. Requires "value" key.
          Example: {"fieldId": "assigneeUserId", "filterType": "long_equals", "value": 123}
        - "long_in": Match any of multiple values. Requires "values" key (list).
          Example: {"fieldId": "assigneeUserId", "filterType": "long_in", "values": [1, 2, 3]}

        DateTime Filters (for detectedAt, createdAt):
        - "datetime_range": Range match using UNIX timestamps in milliseconds (UTC). Requires "start" and/or "end" keys.
          Optional: "startInclusive", "endInclusive" (default: true)

          IMPORTANT: All datetimes in the Alert API are in UTC timezone.
          You MUST use the iso_to_unix_timestamp tool to convert ISO 8601 datetime strings
          to UNIX timestamps (milliseconds) before using them in datetime filters.

          IMPORTANT: Unless the user specifies a field to query a DateTime on, use createdAt.

          The iso_to_unix_timestamp tool handles timezone conversion automatically.
          Provide datetimes in the user's preferred timezone (e.g., "2024-10-30T08:00:00-04:00" for Eastern Time)
          and the tool will convert to UTC milliseconds for the API.

          Example workflow:
          1. Call iso_to_unix_timestamp("2024-10-30T08:00:00-04:00") -> returns "1730289600000" (UTC)
          2. Use result in filter: {"fieldId": "createdAt", "filterType": "datetime_range", "start": 1730289600000}

          Example: {"fieldId": "createdAt", "filterType": "datetime_range", "start": 1730289600000}

        Fulltext Search (for alertName, id, storylineId):
        - "fulltext": Text search with case-insensitive substring matching. Requires "values" key (list).
          Example: {"fieldId": "alertName", "filterType": "fulltext", "values": ["malware", "threat"]}

        Limits:
        - Maximum 50 filters per request
        - Maximum 100 values in "values" arrays

first: Number of alerts to retrieve (1-100, default: 10).
after: Cursor for pagination (optional).
view_type: Filter by assignment - ALL, ASSIGNED_TO_ME, UNASSIGNED, MY_TEAM (default: ALL).
fields: Optional JSON string containing an array of field names to return.
        If not specified, returns all default fields (including dataSources).
        See list_alerts for available fields and dataSources behavior.

        IMPORTANT - dataSources field behavior:
        - When fields=None (default): dataSources is INCLUDED automatically
        - When fields is provided: dataSources is ONLY included if explicitly requested
          Example: '["id", "severity", "dataSources"]'

Performance Note: When paging through many results, use fields='["id"]' for intermediate pages to conserve context window space. Use totalCount to gauge result set size.

Returns: Filtered list of alerts in JSON format.

Raises: RuntimeError: If there's an error searching alerts. ValueError: If parameters are invalid.

Examples: CORRECT: filters=[ {"fieldId": "severity", "filterType": "string_in", "values": ["CRITICAL", "HIGH"]}, {"fieldId": "status", "filterType": "string_equals", "value": "NEW"}, {"fieldId": "alertNoteExists", "filterType": "boolean_equals", "value": false} ]

WRONG:
filters=[
  {"fieldId": "severity", "filterType": "EQUALS", "value": "CRITICAL"},  # Use "string_equals"
  {"fieldId": "status.value", "filterType": "string_equals", "value": "NEW"}  # Use "status" not "status.value"
]
ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
firstNo
fieldsNo
filtersNo
view_typeNoALL

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: returns filtered list, raises RuntimeError/ValueError, default values, pagination via after cursor, totalCount behavior when first=1, and performance implications of fields. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections (summary, Args, Performance Note, Returns, Raises, Examples). Every sentence adds value, and the details are necessary given the complexity of filtering. Front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (5 parameters, nested filters), the description covers all necessary aspects: usage, parameter details, examples, error handling, and references to sibling tools. The presence of an output schema means return value details are not required, but the description still mentions the return format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description compensates comprehensively. It explains each parameter in detail: filters (field names, filter types, required keys, examples), first (range and default), after (cursor), view_type (enum values), and fields (JSON string, dataSources behavior). Includes both correct and wrong examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search alerts using advanced filters and criteria.' The verb 'search' with 'advanced filters' distinguishes it from sibling tools like list_alerts, which likely provides a simpler listing. The tool's specific function is immediately apparent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Extensive guidelines are provided: when to use the 'first' field for count queries, when to use fields for performance, and explicit instructions for datetime conversion using the sibling iso_to_unix_timestamp tool. It also includes correct and incorrect examples, helping the agent avoid common mistakes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_inventory_itemsA

Search for managed assets in SentinelOne using REST API filters.

Use this tool to find specific SentinelOne managed assets such as computers, servers, workstations, cloud resources, and network devices by various criteria (name, type, status, tags, etc.). Multiple filters are combined with AND logic.

Note: For surface-specific filtering (ENDPOINT, CLOUD, IDENTITY, NETWORK_DISCOVERY), use the list_inventory_items tool instead, which supports surface filtering via GET.

Args: filters: JSON string containing filter dictionary (optional, default: {}). Use REST API filter format with field names in camelCase.

         Standard Filters (exact match - matches ANY value in list):
         - {"resourceType": ["Windows Server", "Linux Server"]}
         - {"assetStatus": ["Active", "Inactive"]}
         - {"category": ["Server", "Workstation"]}
         - {"infectionStatus": ["Infected", "Healthy"]}

         Contains Filters (partial match - case-insensitive):
         - {"name__contains": ["dev", "test"]}
         - {"cloudProviderAccountName__contains": ["testing"]}
         - {"osName__contains": ["Windows", "Ubuntu"]}

         Range Filters (date ranges - use ISO date strings or millisecond timestamps):
         - {"lastActiveDt__between": {"from": "2024-01-01", "to": "2024-12-31"}}
         - {"lastActiveDt__between": {"from": 1704067200000, "to": 1735689599000}}

         IMPORTANT: All datetimes in the Inventory API are in UTC timezone.
         For timestamp-based date filters, you can use the iso_to_unix_timestamp tool
         to convert ISO 8601 datetime strings to UNIX timestamps in milliseconds (UTC).

         The iso_to_unix_timestamp tool handles timezone conversion automatically.
         Provide datetimes in the user's preferred timezone (e.g., "2024-01-01T00:00:00-05:00" for Eastern Time)
         and the tool will convert to UTC milliseconds for the API.

         Example workflow for timestamp filters:
         1. Call iso_to_unix_timestamp("2024-01-01T00:00:00-05:00") -> returns "1704085200000" (UTC)
         2. Use in filter: {"lastActiveDt__between": {"from": 1704085200000, "to": 1735693199000}}

         ID Filters (exact ID matches):
         - {"id__in": ["uuid1", "uuid2", "uuid3"]}

         Negation Filters (exclude values):
         - {"assetStatus__nin": ["Decommissioned"]}
         - {"resourceType__nin": ["Unknown"]}

         Combining Filters (AND logic - all must match):
         - {"resourceType": ["Windows Server"], "assetStatus": ["Active"], "name__contains": ["test"]}

         Common Examples:
         - Find testing servers: {"name__contains": ["test"], "resourceType": ["Windows Server", "Linux Server"]}
         - Find active AWS instances: {"cloudProvider": ["AWS"], "assetStatus": ["Active"]}
         - Find recently active endpoints: {"lastActiveDt__between": {"from": "2024-12-01", "to": "2024-12-31"}}

limit: Number of items to retrieve (1-1000, default: 50).
skip: Number of items to skip for pagination (default: 0).
fetch_fields: Field filtering. Either:
              - Preset name: "MINIMAL", "STANDARD", or "ALL" (default: "MINIMAL")
                * MINIMAL: 7 core fields (id, name, category, etc.) - fastest
                * STANDARD: 13 fields (MINIMAL + operational context)
                * ALL: All available fields (~200+ fields) - slowest
              - List of specific field names in camelCase:
                Examples: ["id", "name", "resourceType", "assetStatus"]
                          ["id", "category", "osVersion", "ipAddress"]
              Use fetch_fields="ALL" on a single item to discover all field names.
              Defaults to "MINIMAL" for optimal performance with search operations.

Returns: JSON string with filtered inventory items containing only requested fields. Field keys use camelCase format. Fields without values are excluded from the output. Includes pagination metadata. Returns empty list if no matches found.

Raises: ValueError: If filters JSON is invalid, parameters are out of range, or fetch_fields is invalid. InventoryAuthenticationError: If authentication fails. InventoryNetworkError: If network operation fails. InventoryAPIError: If the API returns an error. InventoryClientError: For other client-level errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNo
limitNo
filtersNo
fetch_fieldsNoMINIMAL

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses AND logic for filters, field case and omission, pagination via skip/limit, and raises specific exceptions. It does not mention rate limits or auth requirements beyond error types, but the behavioral traits are well-covered for a search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections (Args, Returns, Raises) and bullet points. It is front-loaded with the purpose and direct URL, making key info accessible. While some details could be trimmed, the organization compensates for length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters with 0% schema coverage, a complex filters parameter, and an output schema that likely describes return fields, the description provides sufficient context: filter syntax, pagination, field presets, error types, and a workflow for date conversion. It is complete for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must add all meaning. It does so comprehensively: filters parameter is explained with multiple filter types (standard, contains, range, ID, negation, combination) and examples. limit, skip, and fetch_fields are detailed with presets and custom lists, plus a timestamp conversion workflow. This far exceeds the schema's null/default information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches for managed assets in SentinelOne using REST API filters. It specifies the resource type (managed assets) and distinguishes from sibling tool list_inventory_items by noting the latter supports surface-specific filtering. The verb 'Search' and the target domain 'inventory items' are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly guides when to use this tool vs. the sibling list_inventory_items for surface-specific filtering. It provides extensive filter examples and workflow for timestamp conversion, but does not explicitly state when not to use it or list all alternatives. However, the guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_misconfigurationsA

Search misconfigurations using advanced filters and criteria.

Args: filters: JSON string containing an array of filter objects (optional). Each filter object must have: - fieldId: String field name - MUST use flattened camelCase names (see Valid Field Names below) - filterType: One of the supported filter types below - isNegated: Optional boolean to negate the filter (default: false)

        Valid Field Names (fieldId values):
        IMPORTANT: Use these exact field names, NOT nested paths like "asset.name" or "evidence.secret"

        Core Fields:
        - "id": Misconfiguration ID
        - "name": Misconfiguration name
        - "severity": CRITICAL, HIGH, MEDIUM, LOW, INFO, UNKNOWN
        - "status": NEW, IN_PROGRESS, ON_HOLD, RESOLVED, RISK_ACKED, SUPPRESSED, TO_BE_PATCHED
        - "detectedAt": Detection timestamp
        - "lastSeenAt": Last seen timestamp
        - "environment": Environment type
        - "product": Product name
        - "vendor": Vendor name
        - "analystVerdict": TRUE_POSITIVE, FALSE_POSITIVE
        - "assigneeFullName": Assigned user full name
        - "exposureReason": Reason for exposure
        - "mitigable": Boolean - can be mitigated

        Asset Fields (use "asset" prefix, NOT "asset."):
        - "assetId": Asset identifier
        - "assetName": Asset name
        - "assetType": Asset type
        - "assetTypeCategory": Asset type category
        - "assetCategory": Asset category
        - "assetSubcategory": Asset subcategory
        - "assetCriticality": CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN
        - "assetPrivileged": Boolean - privileged asset
        - "assetCloudResourceId": Cloud resource ID
        - "assetCloudAccountId": Cloud account ID
        - "assetCloudAccount": Cloud account name
        - "assetCloudRegion": Cloud region
        - "assetKubernetesCluster": Kubernetes cluster name
        - "assetKubernetesClusterId": Kubernetes cluster ID

        Policy Fields (use appropriate prefixes):
        - "policyId": Policy identifier
        - "policyVersion": Policy version
        - "policyGroup": Policy group name
        - "organization": Organization name
        - "enforcementAction": Enforcement action type
        - "iacFramework": Infrastructure as Code framework

        Compliance & Classification:
        - "complianceStandards": Compliance standards
        - "hasClassifiedData": Boolean - contains classified data
        - "dataClassificationCategories": Data classification categories
        - "dataClassificationDataTypes": Data classification types

        Secret Fields (use "secret" prefix, NOT "evidence.secret."):
        - "secretId": Secret identifier
        - "secretHash": Secret hash
        - "secretType": Type of secret
        - "secretValidity": Secret validity status

        Request Fields (for admission controller, use "request" prefix):
        - "requestResourceName": Resource name
        - "requestResourceType": Resource type
        - "requestResourceNamespace": Resource namespace
        - "requestUserName": User name
        - "requestUserUid": User UID
        - "requestUserGroup": User group
        - "requestCategory": Request category

        Other Fields:
        - "commitedBy": Committed by (IaC findings)
        - "verifiedExploitable": Boolean - verified as exploitable
        - "accountId": Account ID (hidden)
        - "siteId": Site ID (hidden)
        - "groupId": Group ID (hidden)

        Filter Types and Required Keys:
        IMPORTANT: The misconfigurations API does NOT support INT filters. Use STRING or BOOLEAN filters.

        String Filters (for severity, status, product, vendor, etc.):
        - "string_equals": Exact match. Requires "value" key.
          Example: {"fieldId": "severity", "filterType": "string_equals", "value": "CRITICAL"}
        - "string_in": Match any of multiple values. Requires "values" key (list).
          Example: {"fieldId": "status", "filterType": "string_in", "values": ["NEW", "IN_PROGRESS"]}
          Note: product and vendor ONLY support STRING filters, NOT fulltext

        Boolean Filters (for mitigable, verifiedExploitable, hasClassifiedData, etc.):
        - "boolean_equals": Exact match for single boolean. Requires "value" key.
          Example: {"fieldId": "mitigable", "filterType": "boolean_equals", "value": true}
        - "boolean_in": Match any of multiple boolean values. Requires "values" key (list).
          Example: {"fieldId": "hasClassifiedData", "filterType": "boolean_in", "values": [true, null]}
          Note: Can include null to match missing/unset values
          SPECIAL CASE - secretValidity: ONLY supports boolean_in (NOT boolean_equals)

        DateTime Filters (for detectedAt, lastSeenAt):
        - "datetime_range": Range match using UNIX timestamps in milliseconds (UTC). Requires "start" and/or "end" keys.
          Optional: "startInclusive", "endInclusive" (default: true)

          IMPORTANT: All datetimes in the Misconfiguration API are in UTC timezone.
          You MUST use the iso_to_unix_timestamp tool to convert ISO 8601 datetime strings
          to UNIX timestamps (milliseconds) before using them in datetime filters.

          IMPORTANT: Unless the user specifies a field to query a DateTime on, use lastSeenAt.

          The iso_to_unix_timestamp tool handles timezone conversion automatically.
          Provide datetimes in the user's preferred timezone (e.g., "2024-10-30T08:00:00-04:00" for Eastern Time)
          and the tool will convert to UTC milliseconds for the API.

          Example workflow:
          1. Call iso_to_unix_timestamp("2024-10-30T08:00:00-04:00") -> returns "1730289600000" (UTC)
          2. Use result in filter: {"fieldId": "detectedAt", "filterType": "datetime_range", "start": 1730289600000}

          Example: {"fieldId": "detectedAt", "filterType": "datetime_range", "start": 1730289600000}

        Fulltext Search (for name, exposureReason, asset/resource names, compliance, etc.):
        - "fulltext": Single-value text search. Requires "values" key (list of search terms).
          Example: {"fieldId": "name", "filterType": "fulltext", "values": ["s3"]}
        - "fulltext_in": Multi-value text search with partial matching. Requires "values" key (list).
          Example: {"fieldId": "assetName", "filterType": "fulltext_in", "values": ["server", "test", "web"]}
          SPECIAL CASES - secretHash/secretId: ONLY support fulltext/fulltext_in (NOT string_equals)

        Limits:
        - Maximum 50 filters per request
        - Maximum 100 values in "values" arrays

first: Number of misconfigurations to retrieve (1-100, default: 10).
after: Cursor for pagination (optional).
view_type: Filter by environment - ALL, CLOUD, KUBERNETES, etc.
fields: Optional JSON string containing an array of field names to return.
        If not specified, returns all default fields.
        See list_misconfigurations for available fields and examples.

        Available fields:
        - Basic: "id", "externalId", "name", "severity", "status"
        - Timing: "detectedAt", "lastSeenAt", "eventTime"
        - Context: "environment", "product", "vendor", "organization"
        - Analysis: "analystVerdict", "mitigable", "exposureReason"
        - Type: "misconfigurationType"
        - IDs: "resourceUid", "exploitId", "exclusionPolicyId"
        - Nested objects: "asset", "scope", "assignee", "evidence", "cnapp",
                        "admissionRequest", "remediation", "mitreAttacks"
          (See list_misconfigurations for exact subfields returned)
        - Lists: "complianceStandards", "dataClassificationDataTypes",
                "dataClassificationCategories"

        Examples:
        - Minimal for paging: '["id"]'
        - Summary: '["id", "severity", "status", "name", "detectedAt"]'
        - With asset: '["id", "name", "asset", "severity"]'

Performance Note: When paging through many results, use fields='["id"]' for intermediate pages to conserve context window space. Use totalCount to gauge result set size.

Returns: Filtered list of misconfigurations in JSON format.

Raises: RuntimeError: If there's an error searching misconfigurations. ValueError: If parameters are invalid.

Examples: CORRECT: filters=[ {"fieldId": "severity", "filterType": "string_equals", "value": "CRITICAL"}, {"fieldId": "status", "filterType": "string_in", "values": ["NEW", "IN_PROGRESS"]}, {"fieldId": "assetCloudRegion", "filterType": "string_in", "values": ["us-east-1", "us-west-2"]} ] WRONG: filters=[ {"fieldId": "asset.name", "filterType": "fulltext", "values": ["test"]}, # Use "assetName" not "asset.name" {"fieldId": "evidence.secret.hash", "filterType": "string_equals", "value": "abc123"}, # Use "secretHash" not "evidence.secret.hash" {"fieldId": "severity", "filterType": "EQUALS", "value": "CRITICAL"} # Use "string_equals" not "EQUALS" ]

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
firstNo
fieldsNo
filtersNo
view_typeNoALL

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the filter syntax, limits (50 filters, 100 values), unsupported INT filters, and error types (RuntimeError, ValueError). It does not explicitly state the tool is read-only, but the search context implies it. Missing explicit read-only mention prevents a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly detailed but overly long, with extensive lists of field names and examples. While well-structured with sections (Args, Valid Field Names, Filter Types, etc.), it could be more concise. Some redundancy exists (e.g., repeated emphasis on flat camelCase names).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (not shown but known), the description covers all necessary aspects: parameters, error conditions, usage patterns, and references to sibling tools. It is complete for a complex filtering tool, addressing edge cases like date format conversion and secretValidity constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description thoroughly explains all five parameters: 'filters' (detailed JSON structure with examples), 'first' (default 10, range 1-100), 'after' (cursor for pagination), 'view_type' (ALL, CLOUD, etc.), and 'fields' (examples and performance note). This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Search misconfigurations using advanced filters and criteria.' It distinguishes itself from siblings like 'list_misconfigurations' (referenced in the fields section) and 'get_misconfiguration' by emphasizing advanced filtering capabilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides detailed usage guidance, including when to use specific filter types, field naming conventions, and performance tips (e.g., using minimal fields for paging). It references 'list_misconfigurations' for available fields, helping users decide between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_vulnerabilitiesA

Search vulnerabilities using advanced filters and criteria.

Args: filters: JSON string containing an array of filter objects (optional). Each filter object must have: - fieldId: String field name - MUST use flattened camelCase names (see Valid Field Names below) - filterType: One of the supported filter types below - isNegated: Optional boolean to negate the filter (default: false)

        Valid Field Names (fieldId values):
        IMPORTANT: Use these exact field names, NOT nested paths like "cve.id" or "asset.name"

        Core Fields:
        - "id": Vulnerability ID
        - "name": Vulnerability name
        - "severity": CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN
        - "status": NEW, IN_PROGRESS, ON_HOLD, RESOLVED, RISK_ACKED, SUPPRESSED, TO_BE_PATCHED
        - "detectedAt": Detection timestamp
        - "lastSeenAt": Last seen timestamp
        - "product": Product name
        - "vendor": Vendor name
        - "analystVerdict": TRUE_POSITIVE, FALSE_POSITIVE
        - "assigneeFullName": Assigned user full name

        CVE Fields (use "cve" prefix, NOT "cve."):
        - "cveId": CVE identifier (e.g. CVE-2024-1234)
        - "cveNvdBaseScore": NVD base score (SORT ONLY - not filterable)
        - "cveRiskScore": SentinelOne risk score (SORT ONLY - not filterable)
        - "cveEpssScore": EPSS probability score (STRING_IN only - use ranges: "0.0-0.35", "0.35-0.5", "0.5-0.75", "0.75-1.0")
        - "cveExploitMaturity": NOT_AVAILABLE, UNPROVEN, PROOF_OF_CONCEPT, FUNCTIONAL, HIGH
        - "cveExploitedInTheWild": Boolean - actively exploited
        - "cveKevAvailable": Boolean - in CISA KEV catalog
        - "cveReportConfidence": Report confidence level

        Software Fields (use "software" prefix, NOT "software."):
        - "softwareName": Software package name
        - "softwareVersion": Installed version
        - "softwareFixVersion": Available fix version
        - "softwareFixVersionAvailable": Boolean - fix available
        - "softwareType": OPERATING_SYSTEM, APPLICATION, LIBRARY, etc.
        - "softwareVendor": Software vendor name

        Asset Fields (use "asset" prefix, NOT "asset."):
        - "assetId": Asset identifier
        - "assetName": Asset name
        - "assetType": Asset type
        - "assetTypeCategory": Asset type category
        - "assetCategory": Asset category
        - "assetSubcategory": Asset subcategory
        - "assetCriticality": CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN
        - "assetPrivileged": Boolean - privileged asset
        - "assetCloudResourceId": Cloud resource ID
        - "assetCloudAccountId": Cloud account ID
        - "assetCloudAccount": Cloud account name
        - "assetCloudRegion": Cloud region
        - "assetKubernetesCluster": Kubernetes cluster name
        - "assetKubernetesClusterId": Kubernetes cluster ID

        Other Fields:
        - "remediationInsightsAvailable": Boolean - remediation insights available
        - "accountId": Account ID (hidden)
        - "siteId": Site ID (hidden)
        - "groupId": Group ID (hidden)

        Filter Types and Required Keys:
        IMPORTANT: The vulnerabilities API does NOT support INT filters. Use STRING or BOOLEAN filters.

        String Filters (for severity, status, product, vendor, etc.):
        - "string_equals": Exact match. Requires "value" key.
          Example: {"fieldId": "severity", "filterType": "string_equals", "value": "CRITICAL"}
        - "string_in": Match any of multiple values. Requires "values" key (list).
          Example: {"fieldId": "status", "filterType": "string_in", "values": ["NEW", "IN_PROGRESS"]}
          SPECIAL CASE - cveEpssScore: Use range format like {"fieldId": "cveEpssScore", "filterType": "string_in", "values": ["0.5-0.75", "0.75-1.0"]}
          Note: product and vendor ONLY support STRING filters, NOT fulltext

        Boolean Filters (for exploited, KEV, fix available, etc.):
        - "boolean_equals": Exact match for single boolean. Requires "value" key.
          Example: {"fieldId": "cveExploitedInTheWild", "filterType": "boolean_equals", "value": true}
        - "boolean_in": Match any of multiple boolean values. Requires "values" key (list).
          Example: {"fieldId": "softwareFixVersionAvailable", "filterType": "boolean_in", "values": [true, null]}
          Note: Can include null to match missing/unset values

        DateTime Filters (for detectedAt, lastSeenAt):
        - "datetime_range": Range match using UNIX timestamps in milliseconds (UTC). Requires "start" and/or "end" keys.
          Optional: "startInclusive", "endInclusive" (default: true)

          IMPORTANT: All datetimes in the Vulnerability API are in UTC timezone.
          You MUST use the iso_to_unix_timestamp tool to convert ISO 8601 datetime strings
          to UNIX timestamps (milliseconds) before using them in datetime filters.

          IMPORTANT: Unless the user specifies a field to query a DateTime on, use detectedAt.

          The iso_to_unix_timestamp tool handles timezone conversion automatically.
          Provide datetimes in the user's preferred timezone (e.g., "2024-10-30T08:00:00-04:00" for Eastern Time)
          and the tool will convert to UTC milliseconds for the API.

          Example workflow:
          1. Call iso_to_unix_timestamp("2024-10-30T08:00:00-04:00") -> returns "1730289600000" (UTC)
          2. Use result in filter: {"fieldId": "detectedAt", "filterType": "datetime_range", "start": 1730289600000}

          Example: {"fieldId": "detectedAt", "filterType": "datetime_range", "start": 1730289600000}

        Fulltext Search (for name, CVE ID, software/asset names):
        - "fulltext": Single-value text search. Requires "values" key (list of search terms).
          Example: {"fieldId": "name", "filterType": "fulltext", "values": ["log4j"]}
        - "fulltext_in": Multi-value text search with partial matching. Requires "values" key (list).
          Example: {"fieldId": "assetName", "filterType": "fulltext_in", "values": ["server", "test", "web"]}

        Limits:
        - Maximum 50 filters per request
        - Maximum 100 values in "values" arrays

first: Number of vulnerabilities to retrieve (1-100, default: 10).
after: Cursor for pagination (optional).
fields: Optional JSON string containing an array of field names to return.
        If not specified, returns all default fields.
        See list_vulnerabilities for available fields and examples.

        Available fields:
        - Basic: "id", "name", "severity", "status"
        - Timing: "detectedAt", "lastSeenAt"
        - Context: "product", "vendor"
        - Analysis: "analystVerdict"
        - IDs: "exclusionPolicyId"
        - Nested objects: "cve", "software", "asset", "scope", "assignee"
          (See list_vulnerabilities for exact subfields returned)

        Examples:
        - Minimal for paging: '["id"]'
        - Summary: '["id", "severity", "status", "name", "detectedAt"]'
        - With CVE: '["id", "name", "cve", "software"]'

Performance Note: When paging through many results, use fields='["id"]' for intermediate pages to conserve context window space. Use totalCount to gauge result set size.

Returns: Filtered list of vulnerabilities in JSON format.

Raises: RuntimeError: If there's an error searching vulnerabilities. ValueError: If parameters are invalid.

Examples: CORRECT: filters=[ {"fieldId": "severity", "filterType": "string_equals", "value": "CRITICAL"}, {"fieldId": "cveExploitedInTheWild", "filterType": "boolean_equals", "value": true}, {"fieldId": "assetType", "filterType": "string_in", "values": ["SERVER", "WORKSTATION"]} ] WRONG: filters=[ {"fieldId": "cve.id", "filterType": "string_equals", "value": "CVE-2024-1234"}, # Use "cveId" not "cve.id" {"fieldId": "asset.name", "filterType": "fulltext", "values": ["test"]}, # Use "assetName" not "asset.name" {"fieldId": "severity", "filterType": "EQUALS", "value": "CRITICAL"} # Use "string_equals" not "EQUALS" ]

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
firstNo
fieldsNo
filtersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that the tool raises RuntimeError or ValueError on failure, returns JSON, and has limitations (no INT filters). It does not explicitly state that the operation is read-only or idempotent, but that is implied by its search nature. Overall, it clearly explains the filtering behavior and error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections (Args, Returns, Raises, Examples), bullet points, and code formatting. It is front-loaded with the main purpose. Some redundancy exists (e.g., repeated prefix explanations), but the complexity of the filter system justifies the length. Minor trimming could improve conciseness without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 parameters, 0% schema coverage, no annotations) and the existence of an output schema, the description is remarkably complete. It covers all parameters with extensive detail, includes examples, notes about timezone conversion, performance advice, and error conditions. The output schema covers return values, so no additional explanation needed there.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must fully explain parameters. It does so exhaustively: 'filters' gets a multi-page guide with valid field names, filter types, examples, and special cases. 'first' and 'after' are described with defaults and pagination. 'fields' lists available fields and sample JSON arrays. The description adds immense value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search vulnerabilities using advanced filters and criteria.' It names the verb 'search' and resource 'vulnerabilities.' It distinguishes itself from sibling tools like list_vulnerabilities by emphasizing advanced filtering capabilities, and from other search tools like search_alerts by specifying the domain. The extensive detail on filter structure reinforces purpose clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use filters, how to structure them, and includes examples of correct and incorrect usage. It advises using iso_to_unix_timestamp for datetime conversions, notes that product/vendor only support STRING filters, and gives a performance tip for paging. It also mentions the maximum filter limits and valid field names, leaving little ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

threat_intel_by_domainA

Get threat intelligence for a domain from VirusTotal/Google Threat Intelligence.

This tool queries VirusTotal's database to retrieve comprehensive threat intelligence about a domain name, including reputation, detection results, WHOIS data, and relationships.

What this tool provides:

  • Domain reputation and detection status from 90+ security vendors

  • WHOIS registration information

  • DNS resolution history

  • Associated files, URLs, and IP addresses

  • SSL certificates

  • Subdomains discovered

  • Threat categories (malware, phishing, etc.)

  • Historical analysis data

  • Community reputation scores

Common Use Cases:

  • Investigate suspicious domains from email headers or logs

  • Research command & control infrastructure

  • Validate domain reputation before allowing access

  • Identify malicious infrastructure in incident response

  • Threat hunting for known bad actor domains

Args: domain: The domain name to query (e.g., "example.com").

Returns: JSON string containing comprehensive threat intelligence data including: - Detection statistics from security vendors - WHOIS registration details - DNS records and resolution history - Related malware, IPs, and URLs - Reputation score and categories - SSL certificate information

Examples: "google.com" "malicious-c2.example.com" "phishing-site.test"

Notes: - Requires a valid VirusTotal API key (PURPLEMCP_VT_API_KEY environment variable) - Results include historical data aggregated over time - Private API keys have higher rate limits - When a domain is not found, returns a structured JSON response with found=false

Raises: ThreatIntelligenceClientError: If there's an error communicating with the API. RuntimeError: If the API key is not configured.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Details API key requirement, rate limit differences, error raises, and response format for not-found. Discloses read-only nature implicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections (What, Use Cases, Args, Returns, Examples, Notes, Raises), but slightly verbose with redundancy (e.g., repetition of domain intelligence details). Still earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given single parameter and existence of output schema, description covers purpose, usage, behavioral nuances, parameter details, examples, prerequisites, and error handling. Complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter 'domain'. Schema description coverage is 0%, but description provides clear definition with example format and additional examples section, fully compensating.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Get threat intelligence for a domain' with specific verb and resource. Differentiates from sibling threat intel tools (by hash, IP, URL) by specifying domain focus.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Lists common use cases (investigate domains, research C2, etc.) and notes outcomes like 'not found returns structured JSON'. Lacks explicit when-not-to-use or direct comparison to alternatives, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

threat_intel_by_hashA

Get threat intelligence for a file hash from VirusTotal/Google Threat Intelligence.

This tool queries VirusTotal's database to retrieve comprehensive threat intelligence about a file based on its cryptographic hash. The hash can be in MD5, SHA1, or SHA256 format.

What this tool provides:

  • Malware detection results from 70+ antivirus engines

  • File metadata (size, type, names, creation dates)

  • Behavioral analysis results

  • YARA rule matches

  • Crowdsourced threat intelligence

  • Relationships with other files, URLs, domains, and IPs

  • Community comments and votes

  • Signature information (digital signatures, if present)

Common Use Cases:

  • Incident response: Validate if a suspicious file is malicious

  • Threat hunting: Research known malware samples

  • Malware analysis: Get context about a file before deeper investigation

  • IOC enrichment: Add threat intelligence to indicators of compromise

Args: hash_value: File hash in MD5, SHA1, or SHA256 format (case-insensitive).

Returns: JSON string containing comprehensive threat intelligence data including: - Detection statistics (e.g., 45/70 engines detected as malicious) - File attributes and metadata - Last analysis date and statistics - Community reputation score - Related threat intelligence - MITRE ATT&CK techniques (if applicable)

Examples: MD5: "44d88612fea8a8f36de82e1278abb02f" SHA1: "3395856ce81f2b7382dee72602f798b642f14140" SHA256: "275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f"

Notes: - Requires a valid VirusTotal API key (PURPLEMCP_VT_API_KEY environment variable) - Results are cached by VirusTotal and may not reflect real-time scans - File must have been previously submitted to VirusTotal to have results - Private API keys have higher rate limits and additional features

Not Found Response: When a hash is not found, returns a JSON response with this structure: { "found": false, "resource": "hash_value", "resource_type": "file", "message": "File hash 'hash_value' was not found in VirusTotal's database..." }

Raises: ThreatIntelligenceClientError: If there's an error communicating with the API (not for not-found cases). RuntimeError: If the API key is not configured.

ParametersJSON Schema
NameRequiredDescriptionDefault
hash_valueYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It discloses caching behavior, API key requirement, rate limit differences, not-found response structure, and possible exceptions (ThreatIntelligenceClientError, RuntimeError). All behavioral traits are transparently documented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (intro, what it provides, use cases, args, returns, examples, notes, not found, raises). It is front-loaded with purpose. A bit lengthy but every section adds value; could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description still explains the return structure in detail (detection stats, file metadata, etc.), covers prerequisites (API key), error conditions, and not-found case. It is fully complete for an agent to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description thoroughly defines the hash_value parameter: accepted formats (MD5, SHA1, SHA256), case-insensitivity, and provides examples. This adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves threat intelligence for a file hash from VirusTotal/Google Threat Intelligence. It distinguishes from siblings by specifying hash-based lookup, while sibling tools handle domains, IPs, URLs, etc. The specific verb 'Get' and resource 'threat intelligence for a file hash' are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides common use cases (incident response, threat hunting, etc.) and explicit notes: requires valid API key, file must have been previously submitted, results are cached, and private API keys have higher rate limits. It implicitly advises when to use this tool versus siblings like threat_intel_get_file_behavior for behavioral analysis.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

threat_intel_by_ipA

Get threat intelligence for an IP address from VirusTotal/Google Threat Intelligence.

This tool queries VirusTotal's database to retrieve comprehensive threat intelligence about an IP address, including reputation, geolocation, ASN data, and relationships.

What this tool provides:

  • IP reputation and detection status from 90+ security vendors

  • Geolocation data (country, city, coordinates)

  • ASN (Autonomous System Number) and network owner

  • Associated files, URLs, and domains

  • Passive DNS data

  • Historical analysis results

  • Open ports and services (if available)

  • Threat categories and tags

  • Community reputation scores

Common Use Cases:

  • Investigate suspicious IPs from firewall logs

  • Research malware C2 servers

  • Validate IP reputation before allowing connections

  • Identify attacker infrastructure in incident response

  • Threat hunting for known malicious IPs

  • Network forensics and attribution

Args: ip_address: The IP address to query (IPv4 or IPv6).

Returns: JSON string containing comprehensive threat intelligence data including: - Detection statistics from security vendors - Geolocation and network information - ASN and owner details - Related malware, domains, and URLs - Reputation score and categories - Historical connection data

Examples: "8.8.8.8" "192.168.1.1" "2001:4860:4860::8888"

Notes: - Requires a valid VirusTotal API key (PURPLEMCP_VT_API_KEY environment variable) - Results include historical data aggregated over time - Private/internal IPs may have limited or no data - Private API keys have higher rate limits - When an IP is not found, returns a structured JSON response with found=false

Raises: ThreatIntelligenceClientError: If there's an error communicating with the API. RuntimeError: If the API key is not configured.

ParametersJSON Schema
NameRequiredDescriptionDefault
ip_addressYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description covers key behaviors: requires API key, returns historical data, private IPs may lack data, structured JSON for missing IPs, and error types. Does not mention mutation/read nature explicitly but implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections, but verbose with many bullet points. Some redundancy (e.g., reputation mentioned twice). Front-loads purpose effectively but could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple input (1 parameter) and existence of output schema, the description is very thorough: covers input, output fields, notes, errors, and examples. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The one parameter (ip_address) is described clearly with type and examples (IPv4/IPv6), compensating for 0% schema description coverage. The description adds context beyond the schema's property definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool retrieves threat intelligence for an IP address from VirusTotal/GTI. It lists features and use cases, but does not explicitly differentiate from sibling tools like threat_intel_by_domain or threat_intel_by_hash.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use cases (e.g., investigate suspicious IPs, research C2 servers) and notes on limitations (private IPs, API key requirements). However, no guidance on when not to use or alternatives among sibling threat intel tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

threat_intel_by_urlA

Get threat intelligence and reputation information for a URL from VirusTotal/Google Threat Intelligence.

This tool queries VirusTotal's database to retrieve comprehensive threat intelligence about a URL, including reputation scores, detection results, and historical data.

What this tool provides:

  • URL reputation and detection status from 90+ security vendors

  • Historical analysis results

  • Associated files and malware

  • Redirection chains

  • SSL certificate information

  • WHOIS data for the domain

  • Related IPs and domains

  • Community comments and votes

  • Threat categories (phishing, malware, etc.)

Common Use Cases:

  • Email security: Check if URLs in emails are malicious

  • Web filtering: Validate URL safety before allowing access

  • Incident response: Investigate suspicious URLs from logs

  • Phishing detection: Identify phishing sites

  • Threat hunting: Research known malicious infrastructure

Args: url: The URL to query (must be a valid HTTP/HTTPS URL).

Returns: JSON string containing comprehensive threat intelligence data including: - Detection statistics from security vendors - URL categories and tags - Last analysis timestamp - Reputation score - Related files and domains - SSL certificate details - Redirection information

Examples: "https://example.com/suspicious-page" "http://malicious-domain.test/payload.exe" "https://phishing-site.example/login"

Notes: - Requires a valid VirusTotal API key (PURPLEMCP_VT_API_KEY environment variable) - VirusTotal may scan the URL if it hasn't been analyzed recently - Results include historical data and may not reflect current state - Scanning a URL will visit the site, which may have privacy implications - Private API keys have higher rate limits and additional features - When a URL is not found, returns a structured JSON response with found=false

Raises: ThreatIntelligenceClientError: If there's an error communicating with the API. RuntimeError: If the API key is not configured.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description thoroughly discloses API key requirement, potential URL scanning, privacy implications, rate limits, return structure for not found, and errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but well-organized into clear sections (what it provides, use cases, args, returns, examples, notes). Front-loaded with core purpose, though could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a single-parameter tool with output schema existence. Describes output structure, common use cases, error conditions, and privacy implications.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (url) with 0% schema coverage. Description adds valid URL format requirement and provides examples, significantly compensating for schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get threat intelligence and reputation information for a URL' and distinguishes from sibling tools like threat_intel_by_domain and threat_intel_by_hash by specifying it's for URLs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides common use cases (email security, web filtering, etc.) and examples, but doesn't explicitly say when not to use or compare to siblings for URLs vs domains.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

threat_intel_get_file_behaviorA

Get detailed behavioral analysis report for a file from VirusTotal sandboxes.

This tool retrieves sandbox execution reports that show what a file does when run, including process activity, network connections, file operations, registry changes, and MITRE ATT&CK techniques. Essential for understanding malware capabilities and identifying detection opportunities.

What this tool provides:

  • Process tree and execution flow

  • Network connections (IPs, domains, URLs contacted)

  • File system operations (files created, modified, deleted)

  • Registry modifications

  • MITRE ATT&CK TTPs (Tactics, Techniques, Procedures)

  • API calls and system interactions

  • Behavioral signatures matched

  • Mutex/synchronization objects

  • Memory operations

Common Use Cases:

  • Malware analysis: Understand what a file does when executed

  • Detection engineering: Identify behavioral indicators for rules

  • Incident response: Determine malware capabilities and impact

  • Threat intelligence: Extract TTPs for threat profiling

  • IOC extraction: Get network and file system indicators

  • Attribution: Identify techniques used by specific threat actors

Args: hash_value: The file hash (SHA256 preferred) to query. sandbox: Optional specific sandbox name (e.g., 'VirusTotal Jujubox', 'C2AE'). If not specified, returns the default/first available report.

Returns: JSON string containing detailed behavioral analysis (up to 50 reports) including: - Processes created and their relationships - Network activity (DNS, HTTP, TCP/IP) - File system operations - Registry operations - MITRE ATT&CK techniques - Behavioral signatures - Sandbox metadata (environment, time)

Examples: hash_value="275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f" hash_value="44d88612fea8a8f36de82e1278abb02f", sandbox="VirusTotal Jujubox"

Notes: - Requires a valid VirusTotal API key (PURPLEMCP_VT_API_KEY environment variable) - Only SHA256 hashes are supported for behavior reports - Returns up to 50 behavior reports - Not all files have behavioral analysis (requires sandbox execution) - Multiple sandbox environments may have analyzed the same file - Reports reflect behavior in a controlled sandbox environment - Private API keys have access to more detailed reports - When no behavior report is found, returns a structured JSON response with found=false - IMPORTANT: Do NOT call this tool repeatedly with the same parameters. It returns the same data each time, not additional results.

Raises: ThreatIntelligenceClientError: If there's an error communicating with the API. RuntimeError: If the API key is not configured.

ParametersJSON Schema
NameRequiredDescriptionDefault
sandboxNo
hash_valueYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits: requires API key, supports only SHA256, returns up to 50 reports, behavior in controlled sandbox, private key access, and structured response on missing data. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections and bullet points, front-loaded with a summary. While somewhat verbose, every section adds value and no information is redundant. Slightly long but appropriate for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema (though not shown), the description still covers return format with field lists. It includes all necessary sections: purpose, parameters, returns, examples, notes, and use cases. Complete for a complex threat intelligence tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It thoroughly explains both parameters: hash_value (SHA256 preferred) and sandbox (optional sandbox name), with examples and formatting details, adding substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves behavioral analysis reports from VirusTotal sandboxes, specifying the action (get), resource (file behavior), and context. It distinguishes from sibling tools like threat_intel_by_hash and threat_intel_get_file_relationships by focusing on sandbox execution details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly lists common use cases (malware analysis, detection engineering, etc.) and provides critical usage notes, including when not to use (e.g., not all files have analysis) and an important warning against repeated calls with the same parameters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

threat_intel_get_file_relationshipsA

Get relationships for a file hash from VirusTotal (network IOCs and related files).

This tool extracts relationship data from a file's VirusTotal analysis, revealing network infrastructure (domains, IPs, URLs) contacted by the file, as well as related files. This is essential for pivoting from files to network indicators and building comprehensive threat intelligence profiles.

Available relationship types:

  • contacted_domains: Domains contacted during execution

  • contacted_ips: IP addresses contacted during execution

  • contacted_urls: URLs contacted during execution

  • similar_files: Files with similar characteristics

  • execution_parents: Files that executed this file

  • bundled_files: Files bundled/dropped by this file

  • compressed_parents: Archives containing this file

  • overlay_parents: Parent files with overlays

What this tool provides:

  • Network infrastructure IOCs (domains, IPs, URLs)

  • File lineage and relationships

  • Dropped/bundled files

  • Similar malware samples

  • Execution chain information

Common Use Cases:

  • Extract network IOCs from malware samples

  • Build threat intelligence from file analysis

  • Pivot from files to domains/IPs for blocking

  • Identify related malware families

  • Map malware infrastructure and campaigns

  • Enrich incident response with related indicators

Args: hash_value: The file hash (MD5, SHA1, or SHA256) to query. relationship_type: The type of relationship to retrieve (e.g., 'contacted_domains').

Returns: JSON string containing: - relationships: Array of related objects with full details (up to 100) - count: Number of relationships found

Examples: hash_value="275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f", relationship_type="contacted_domains"

hash_value="44d88612fea8a8f36de82e1278abb02f",
relationship_type="contacted_ips"

Notes: - Requires a valid VirusTotal API key (PURPLEMCP_VT_API_KEY environment variable) - Returns up to 100 relationships (the API maximum) - Not all files have all relationship types - Relationship data comes from sandbox execution - Private API keys have access to more relationship types - When a hash or relationship is not found, returns a structured JSON response with found=false - IMPORTANT: Do NOT call this tool repeatedly with the same parameters. It returns the same data each time, not additional results.

Raises: ThreatIntelligenceClientError: If there's an error communicating with the API. RuntimeError: If the API key is not configured.

ParametersJSON Schema
NameRequiredDescriptionDefault
hash_valueYes
relationship_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description fully discloses behaviors: returns up to 100 relationships, not all types available, sandbox execution source, private API keys have more, returns found=false on not found, idempotency warning, and error types. Very comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections and bullet points, but slightly verbose. Could be trimmed without losing key information. Still efficient given the detail needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all aspects: purpose, parameters with examples, return format, error handling, authentication, and usage constraints. Explains output structure (JSON with relationships and count). No gaps given complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (no property descriptions), but the description compensates fully by specifying hash format (MD5/SHA1/SHA256), relationship_type values with examples, and listing all available types. Adds significant meaning beyond bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves relationships for a file hash from VirusTotal, listing specific relationship types and use cases. It distinguishes from siblings like threat_intel_by_hash by focusing on relationships rather than general file intelligence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use cases such as extracting network IOCs and pivoting from files. Includes important note about not calling repeatedly with same params. Could be improved by mentioning when NOT to use this tool (e.g., use threat_intel_by_hash for general file analysis).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 14 tool updatesv0.7.0
    • Addedcve_database_status
    • Addedcve_search_by_id
    • Addedcve_search_by_vendor
    • Addedget_alert_investigation_report
    • Changedget_inventory_item1 field changed
      • addedInput schema / properties / fetch_fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "MINIMAL",
        +        "STANDARD",
        +        "ALL"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  ],
        +  "default": "ALL"
        +}
    • Changedlist_inventory_items1 field changed
      • addedInput schema / properties / fetch_fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "MINIMAL",
        +        "STANDARD",
        +        "ALL"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  ],
        +  "default": "MINIMAL"
        +}
    • Changedsearch_inventory_items1 field changed
      • addedInput schema / properties / fetch_fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "MINIMAL",
        +        "STANDARD",
        +        "ALL"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  ],
        +  "default": "MINIMAL"
        +}
    • Addedthreat_intel_by_domain
    • Addedthreat_intel_by_hash
    • Addedthreat_intel_by_ip
    • Addedthreat_intel_by_url
    • Addedthreat_intel_get_file_behavior
    • Addedthreat_intel_get_file_relationships
    • Addedthreat_intel_search
  2. 22 tool updatesv0.6.0
    • First observedget_alert
    • First observedget_alert_history
    • First observedget_alert_notes
    • First observedget_inventory_item
    • First observedget_misconfiguration
    • First observedget_misconfiguration_history
    • First observedget_misconfiguration_notes
    • First observedget_timestamp_range
    • First observedget_vulnerability
    • First observedget_vulnerability_history
    • First observedget_vulnerability_notes
    • First observediso_to_unix_timestamp
    • First observedlist_alerts
    • First observedlist_inventory_items
    • First observedlist_misconfigurations
    • First observedlist_vulnerabilities
    • First observedpowerquery
    • First observedpurple_ai
    • First observedsearch_alerts
    • First observedsearch_inventory_items
    • First observedsearch_misconfigurations
    • First observedsearch_vulnerabilities

TDQS

A3.9/5.0
Disambiguation5/5

Each tool targets a distinct resource and action (e.g., get_alert, get_alert_history, list_alerts, search_alerts). Detailed descriptions further clarify differences. The only potential overlap is between get_timestamp_range and iso_to_unix_timestamp but their purposes are clearly separated.

Naming Consistency4/5

Tools follow a consistent verb_resource pattern like get_alert, list_vulnerabilities, search_misconfigurations. However, a few tools like powerquery and purple_ai break this pattern by being plain nouns, which is a minor inconsistency.

Tool Count4/5

22 tools cover alerts, vulnerabilities, misconfigurations, inventory, and analytics. This is on the higher side but well-justified by the breadth of the domain. Each tool serves a clear purpose without excessive redundancy.

Completeness4/5

The tool set provides thorough read/search operations for four data types, plus history and notes. Missing write operations (update, delete, add note) but this aligns with a read-heavy investigation context. PowerQuery and Purple AI fill analytical gaps.

Maintenance

ActivityStale
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables read-only access to SentinelOne's platform through MCP, allowing security investigations, threat hunting, and asset inventory queries via natural language.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables interaction with the AccuKnox cloud security platform through MCP, allowing users to query cloud assets, vulnerabilities, and perform security analysis via natural language or API.
    1
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables interaction with SentinelOne's security platform, including Purple AI, events, alerts, vulnerabilities, and asset inventory, through MCP.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for ConnectSecure vulnerability management, exposing 285 read-only tools to query assets, vulnerabilities, Active Directory, and more via natural language.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Sentinel-One/purple-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server