Skip to main content
Glama
Panther MCP Server

Panther MCP Server

Official

Panther MCP Server

Ruff

Panther's Model Context Protocol (MCP) server provides functionality to:

  1. Write and tune detections from your IDE

  2. Interactively query security logs using natural language

  3. Triage, comment, and resolve one or many alerts

Available Tools

Tool Name

Description

Sample Prompt

add_alert_comment

Add a comment to a Panther alert

"Add comment 'Looks pretty bad' to alert abc123"

start_ai_alert_triage

Start an AI-powered triage analysis for a Panther alert with intelligent insights and recommendations

"Start AI triage for alert abc123" / "Generate a detailed AI analysis of alert def456"

get_ai_alert_triage_summary

Retrieve the latest AI triage summary previously generated for a specific alert

"Get the AI triage summary for alert abc123" / "Show me the AI analysis for alert def456"

get_alert

Get detailed information about a specific alert

"What's the status of alert 8def456?"

get_alert_events

Get a small sampling of events for a given alert

"Show me events associated with alert 8def456"

list_alerts

List alerts with comprehensive filtering options (date range, severity, status, etc.)

"Show me all high severity alerts from the last 24 hours"

bulk_update_alerts

Bulk update multiple alerts with status, assignee, and/or comment changes

"Update alerts abc123, def456, and ghi789 to resolved status and add comment 'Fixed'"

update_alert_assignee

Update the assignee of one or more alerts

"Assign alerts abc123 and def456 to John"

update_alert_status

Update the status of one or more alerts

"Mark alerts abc123 and def456 as resolved"

list_alert_comments

List all comments for a specific alert

"Show me all comments for alert abc123"

Tool Name

Description

Sample Prompt

query_data_lake

Execute SQL queries against Panther's data lake with synchronous results

"Query AWS CloudTrail logs for failed login attempts in the last day"

get_table_schema

Get schema information for a specific table

"Show me the schema for the AWS_CLOUDTRAIL table"

list_databases

List all available data lake databases in Panther

"List all available databases"

list_database_tables

List all available tables for a specific database in Panther's data lake

"What tables are in the panther_logs database"

get_alert_event_stats

Analyze patterns and relationships across multiple alerts by aggregating their event data into time-based statistics

"Show me patterns in events from alerts abc123 and def456"

Tool Name

Description

Sample Prompt

list_scheduled_queries

List all scheduled queries with pagination support

"Show me all scheduled queries" / "List the first 25 scheduled queries"

get_scheduled_query

Get detailed information about a specific scheduled query by ID

"Get details for scheduled query 'weekly-security-report'"

Tool Name

Description

Sample Prompt

list_log_sources

List log sources with optional filters (health status, log types, integration type)

"Show me all healthy S3 log sources"

get_http_log_source

Get detailed information about a specific HTTP log source by ID

"Show me the configuration for HTTP source 'webhook-collector-123'"

Tool Name

Description

Sample Prompt

list_detections

List detections from Panther with comprehensive filtering support. Supports multiple detection types and filtering by name, state, severity, tags, log types, resource types, output IDs (destinations), and more. Returns outputIDs for each detection showing configured alert destinations

"Show me all enabled HIGH severity rules with tag 'AWS'" / "List disabled policies for S3 resources" / "Find all rules with outputID 'prod-slack'" / "Show me detections that alert to production destinations"

get_detection

Get detailed information about a specific detection including the detection body and tests. Accepts a list with one detection type: ["rules"], ["scheduled_rules"], ["simple_rules"], or ["policies"]

"Get details for rule ID abc123" / "Get details for policy ID AWS.S3.Bucket.PublicReadACP"

disable_detection

Disable a detection by setting enabled to false. Supports rules, scheduled_rules, simple_rules, and policies

"Disable rule abc123" / "Disable policy AWS.S3.Bucket.PublicReadACP"

Tool Name

Description

Sample Prompt

list_global_helpers

List global helper functions with comprehensive filtering options (name search, creator, modifier)

"Show me global helpers containing 'aws' in the name"

get_global_helper

Get detailed information and complete Python code for a specific global helper

"Get the complete code for global helper 'AWSUtilities'"

Tool Name

Description

Sample Prompt

list_data_models

List data models that control UDM mappings in rules

"Show me all data models for log parsing"

get_data_model

Get detailed information about a specific data model

"Get the complete details for the 'AWS_CloudTrail' data model"

Tool Name

Description

Sample Prompt

list_log_type_schemas

List available log type schemas with optional filters

"Show me all AWS-related schemas"

get_log_type_schema_details

Get detailed information for specific log type schemas

"Get full details for AWS.CloudTrail schema"

Tool Name

Description

Sample Prompt

get_rule_alert_metrics

Get metrics about alerts grouped by rule

"Show top 10 rules by alert count"

get_severity_alert_metrics

Get metrics about alerts grouped by severity

"Show alert counts by severity for the last week"

get_bytes_processed_metrics

Get data ingestion metrics by log type and source

"Show me data ingestion volume by log type"

Tool Name

Description

Sample Prompt

list_users

List all Panther user accounts with pagination support

"Show me all active Panther users" / "List the first 25 users"

get_user

Get detailed information about a specific user

"Get details for user ID 'john.doe@company.com'"

get_permissions

Get the current user's permissions

"What permissions do I have?"

list_roles

List all roles with filtering options (name search, role IDs, sort direction)

"Show me all roles containing 'Admin' in the name"

get_role

Get detailed information about a specific role including permissions

"Get complete details for the 'Admin' role"

Data lake SQL backends

query_data_lake uses the instance's SQL dialect (Snowflake or Databricks). Discover names and types with list_databases, list_database_tables, and get_table_schema. Fetch schemas before using vendor-specific fields; reuse schemas already fetched in the conversation. Use SQL LIMIT to bound results; max_rows controls page size.

Backend

database_name

Example table

Snowflake

panther_logs.public (default)

panther_logs.public.aws_cloudtrail

Databricks

panther_logs (pass explicitly)

panther_logs.aws_cloudtrail

get_alert_event_stats currently requires Snowflake. On Databricks, query panther_signals.correlation_signals through query_data_lake with database_name="panther_signals".

Related MCP server: stepsecurity-mcp

Panther Configuration

Follow these steps to configure your API credentials and environment.

  1. Create an API token in Panther:

    • Navigate to Settings (gear icon) → API Tokens

    • Create a new token with the following permissions (recommended read-only approach to start):

    • Screenshot of Panther Token permissions Screenshot of Panther Token permissions

  2. Store the generated token securely (e.g., 1Password)

  3. Copy the Panther instance URL from your browser (e.g., https://YOUR-PANTHER-INSTANCE.domain)

    • Note: This must include https://

MCP Server Installation

Choose one of the following installation methods:

The easiest way to get started is using our pre-built Docker image:

{
  "mcpServers": {
    "mcp-panther": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "-e", "PANTHER_INSTANCE_URL",
        "-e", "PANTHER_API_TOKEN",
        "--rm",
        "ghcr.io/panther-labs/mcp-panther"
      ],
      "env": {
        "PANTHER_INSTANCE_URL": "https://YOUR-PANTHER-INSTANCE.domain",
        "PANTHER_API_TOKEN": "YOUR-API-KEY"
      }
    }
  }
}

Version Pinning: For production stability, pin to a specific version tag:

"ghcr.io/panther-labs/mcp-panther:v2.2.0"

Available tags can be found on the GitHub Container Registry.

UVX

For Python users, you can run directly from PyPI using uvx:

  1. Install UV

  2. Configure your MCP client:

{
  "mcpServers": {
    "mcp-panther": {
      "command": "uvx",
      "args": ["mcp-panther"],
      "env": {
        "PANTHER_INSTANCE_URL": "https://YOUR-PANTHER-INSTANCE.domain",
        "PANTHER_API_TOKEN": "YOUR-PANTHER-API-TOKEN"
      }
    }
  }
}

Version Pinning: For production stability, pin to a specific version:

"args": ["mcp-panther==2.2.0"]

Available versions can be found on PyPI.

MCP Client Setup

Cursor

Follow the instructions here to configure your project or global MCP configuration. It's VERY IMPORTANT that you do not check this file into version control.

Once configured, navigate to Cursor Settings > MCP to view the running server:

Tips:

  • Be specific about where you want to generate new rules by using the @ symbol and then typing a specific directory.

  • For more reliability during tool use, try selecting a specific model, like Claude 3.7 Sonnet.

  • If your MCP Client is failing to find any tools from the Panther MCP Server, try restarting the Client and ensuring the MCP server is running. In Cursor, refresh the MCP Server and start a new chat.

Claude Code

Claude Code is Anthropic's official CLI tool. Add the Panther MCP server using Docker:

claude mcp add-json panther '{
  "command": "docker",
  "args": [
    "run",
    "-i",
    "-e", "PANTHER_INSTANCE_URL",
    "-e", "PANTHER_API_TOKEN",
    "--rm",
    "ghcr.io/panther-labs/mcp-panther"
  ],
  "env": {
    "PANTHER_INSTANCE_URL": "https://YOUR-PANTHER-INSTANCE.domain",
    "PANTHER_API_TOKEN": "YOUR-API-TOKEN"
  }
}'

Alternatively, using UVX:

claude mcp add-json panther '{
  "command": "uvx",
  "args": ["mcp-panther"],
  "env": {
    "PANTHER_INSTANCE_URL": "https://YOUR-PANTHER-INSTANCE.domain",
    "PANTHER_API_TOKEN": "YOUR-API-TOKEN"
  }
}'

After adding, verify the server is configured:

claude mcp list

Claude Desktop

To use with Claude Desktop, manually configure your claude_desktop_config.json:

  1. Open the Claude Desktop settings and navigate to the Developer tab

  2. Click "Edit Config" to open the configuration file

  3. Add the following configuration:

{
  "mcpServers": {
    "mcp-panther": {
      "command": "uvx",
      "args": ["mcp-panther"],
      "env": {
        "PANTHER_INSTANCE_URL": "https://YOUR-PANTHER-INSTANCE.domain",
        "PANTHER_API_TOKEN": "YOUR-PANTHER-API-TOKEN"
      }
    }
  }
}
  1. Save the file and restart Claude Desktop

If you run into any issues, try the troubleshooting steps here.

Goose CLI

Use with Goose CLI, Block's open-source AI agent:

# Start Goose with the MCP server
goose session --with-extension "uvx mcp-panther"

Goose Desktop

Use with Goose Desktop, Block's open-source AI agent:

From 'Extensions' -> 'Add custom extension' provide your configuration information.

Running the Server

The MCP Panther server supports multiple transport protocols:

STDIO (Default)

For local development and MCP client integration:

uv run python -m mcp_panther.server

Streamable HTTP

For running as a persistent web service, use the HTTP transport. This is ideal for:

  • Long-running server deployments

  • Multiple clients connecting to the same server

  • Testing and debugging with continuous log monitoring

Using Docker Run (Detached)

docker run -d \
  --name panther-mcp-server \
  -p 8000:8000 \
  -e PANTHER_INSTANCE_URL=https://YOUR-PANTHER-INSTANCE.domain \
  -e PANTHER_API_TOKEN=YOUR-API-TOKEN \
  -e MCP_TRANSPORT=streamable-http \
  -e MCP_HOST=0.0.0.0 \
  -e MCP_PORT=8000 \
  -e LOG_LEVEL=INFO \
  --restart unless-stopped \
  ghcr.io/panther-labs/mcp-panther:latest

Create a docker-compose.yml file:

services:
  panther-mcp:
    image: ghcr.io/panther-labs/mcp-panther:latest
    container_name: panther-mcp-server
    ports:
      - "8000:8000"
    environment:
      - PANTHER_INSTANCE_URL=https://YOUR-PANTHER-INSTANCE.domain
      - PANTHER_API_TOKEN=YOUR-API-TOKEN
      - MCP_TRANSPORT=streamable-http
      - MCP_HOST=0.0.0.0
      - MCP_PORT=8000
      - LOG_LEVEL=INFO
    restart: unless-stopped

Start the server:

# Start in detached mode
docker-compose up -d

# View logs
docker-compose logs -f

# Stop the server
docker-compose down

Connecting Claude Code to HTTP Server

Important: The server runs on HTTP (not HTTPS). Configure Claude Code with the http:// URL:

# Add the HTTP endpoint (note: http:// not https://)
claude mcp add-json panther-http '{
  "url": "http://localhost:8000/mcp"
}'

# Verify configuration
claude mcp list

Testing the Connection

# Test the HTTP endpoint
curl http://localhost:8000/mcp

# View server logs
docker logs -f panther-mcp-server
# Or with docker-compose:
docker-compose logs -f

You can also test using the FastMCP client:

import asyncio
from fastmcp import Client

async def test_connection():
    async with Client("http://localhost:8000/mcp") as client:
        tools = await client.list_tools()
        print(f"Available tools: {len(tools)}")

asyncio.run(test_connection())

Troubleshooting Streamable HTTP

Port Already in Use

If you see Bind for 0.0.0.0:8000 failed: port is already allocated:

# Check what's using the port
lsof -i :8000

# Stop conflicting containers
docker ps | grep panther
docker stop <container-id>

# Or use a different port via MCP_PORT environment variable:
-e MCP_PORT=8080
# Then connect to: http://localhost:8080/mcp

Invalid HTTP Request Warnings

If you see WARNING: Invalid HTTP request received in the logs, this usually means:

  • Claude Code is trying to connect via HTTPS instead of HTTP

  • Check your configuration uses http:// not https://

  • Verify with: claude mcp list

Environment Variables

  • MCP_TRANSPORT: Set transport type (stdio or streamable-http)

  • MCP_PORT: Port for HTTP transport (default: 3000)

  • MCP_HOST: Host for HTTP transport (default: 127.0.0.1)

  • MCP_LOG_FILE: Log file path (optional)

  • MCP_MAX_RESULT_SIZE_CHARS: Advertise _meta["anthropic/maxResultSizeChars"] on every tool, so Claude Code returns text results up to this many characters inline instead of saving them to a file (optional; Claude Code accepts up to 500,000)

Security Best Practices

We highly recommends the following MCP security best practices:

  • Apply strict least-privilege to Panther API tokens. Scope tokens to the minimal permissions required and bind them to an IP allow-list or CIDR range so they're useless if exfiltrated. Rotate credentials on a preferred interval (e.g., every 30d).

  • Host the MCP server in a locked-down sandbox (e.g., Docker) with read-only mounts. This confines any compromise to a minimal blast radius.

  • Monitor credential access to Panther and monitor for anomalies. Write a Panther rule!

  • Run only trusted, officially signed MCP servers. Verify digital signatures or checksums before running, audit the tool code, and avoid community tools from unofficial publishers.

Troubleshooting

Check the server logs for detailed error messages: tail -n 20 -F ~/Library/Logs/Claude/mcp*.log. Common issues and solutions are listed below.

Running tools

  • If you get a {"success": false, "message": "Failed to [action]: Request failed (HTTP 403): {\"error\": \"forbidden\"}"} error, it likely means your API token lacks the particular permission needed by the tool.

  • Ensure your Panther Instance URL is correctly set. You can view this in the config://panther resource from your MCP Client.

Contributing

We welcome contributions to improve MCP-Panther! Here's how you can help:

  1. Report Issues: Open an issue for any bugs or feature requests

  2. Submit Pull Requests: Fork the repository and submit PRs for bug fixes or new features

  3. Improve Documentation: Help us make the documentation clearer and more comprehensive

  4. Share Use Cases: Let us know how you're using MCP-Panther and what could make it better

Please ensure your contributions follow our coding standards and include appropriate tests and documentation.

Contributors

This project exists thanks to all the people who contribute. Special thanks to Tomasz Tchorz and Glenn Edwards from Block, who played a core role in launching MCP-Panther as a joint open-source effort with Panther.

See our CONTRIBUTORS.md for a complete list of contributors.

License

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

Available Tools

36 tools
add_alert_commentA
Destructive

Add a comment to a Panther alert. Comments support Markdown formatting.

Returns: Dict containing: - success: Boolean indicating if the comment was added successfully - comment: Created comment information if successful - message: Error message if unsuccessful

Permissions:{'all_of': ['Manage Alerts']}

Inputs: alert_id (required), comment (required). Returns: object

bulk_update_alertsA
DestructiveIdempotent

Bulk update multiple alerts with status, assignee, and/or comment changes.

This tool allows you to efficiently update multiple alerts at once by setting their status, assignee, and adding a comment. At least one of status, assignee_id, or comment must be provided.

Returns: Dict containing: - success: Boolean indicating overall success - results: Dict with operation results: - status_updates: List of alert IDs successfully updated with new status - assignee_updates: List of alert IDs successfully updated with new assignee - comments_added: List of alert IDs that successfully received comments - failed_operations: List of failed operations with error details - summary: Dict with counts of successful and failed operations - message: Error message if unsuccessful

Permissions:{'all_of': ['Manage Alerts']}

Inputs: alert_ids (required), status, assignee_id, comment. Returns: object

disable_detectionA
DestructiveIdempotent

Disable a Panther detection by setting enabled to false.

Permissions:{'any_of': ['Manage Rules', 'Manage Policies']}

Inputs: detection_id (required), detection_type. Returns: object

get_ai_alert_triage_summaryA
Read-only

Retrieve the latest AI triage summary for a specific Panther alert.

This tool retrieves the most recently generated AI triage analysis for an alert. It fetches the list of AI inference stream IDs associated with the alert, then retrieves the response text for the latest stream.

Returns: Dict containing: - success: Boolean indicating if retrieval was successful - summary: The latest AI triage summary containing: - stream_id: The unique stream identifier - response_text: The AI-generated triage summary - finished: Whether the triage generation completed - error: Any error message if present - message: Error message if unsuccessful

Permissions:{'all_of': ['Run Panther AI']}

Inputs: alert_id (required). Returns: object

get_alertA
Read-only

Get detailed information about a specific Panther alert by ID

Permissions:{'all_of': ['Read Alerts']}

Inputs: alert_id (required). Returns: object

get_alert_eventsA
Read-only

Get events for a specific Panther alert. Order of events is not guaranteed. This tool does not support pagination to prevent long-running, expensive queries.

Returns: Dict containing: - success: Boolean indicating if the request was successful - events: List of most recent events if successful - message: Error message if unsuccessful

Permissions:{'all_of': ['Read Alerts']}

Inputs: alert_id (required), limit. Returns: object

get_alert_event_statsA
Read-only

Analyze patterns and relationships across multiple alerts by aggregating their event data into time-based groups.

For each time window (configurable from 1-60 minutes), the tool collects unique entities (IPs, emails, usernames, trace IDs) and alert metadata (IDs, rules, severities) to help identify related activities.

Results are ordered chronologically with the most recent first, helping analysts identify temporal patterns, common entities, and potential incident scope.

Returns: Dict containing: - success: Boolean indicating if the query was successful - status: Status of the query (e.g., "succeeded", "failed", "cancelled") - message: Error message if unsuccessful - results: List of query result rows - column_info: Dict containing column names and types - stats: Dict containing stats about the query - has_next_page: Boolean indicating if there are more results available - next_cursor: Cursor for fetching the next page of results, or null if no more pages

Permissions:{'all_of': ['Query Data Lake']}

Inputs: alert_ids (required), time_window, start_date, end_date. Returns: object

get_bytes_processed_metricsB
Read-only

Retrieves data ingestion metrics showing total bytes processed per log type and source, helping analyze data volume patterns.

Returns: Dict: - success: Boolean indicating if the query was successful - bytes_processed: List of series with breakdown by log type and source - total_bytes: Total bytes processed in the period - start_date: Start date of the period - end_date: End date of the period - interval_in_minutes: Grouping interval for the metrics

Permissions:{'all_of': ['Read Panther Metrics']}

Inputs: start_date, end_date, interval_in_minutes. Returns: object

get_data_modelB
Read-only

Get detailed information about a Panther data model, including the mappings and body

Returns complete data model information including Python body code and UDM mappings.

Permissions:{'all_of': ['View Rules']}

Inputs: data_model_id (required). Returns: object

get_detectionB
Read-only

Get detailed information about a Panther detection, including the detection body and tests.

Permissions:{'all_of': ['View Rules', 'View Policies']}

Inputs: detection_id (required), detection_type. Returns: object

get_global_helperA
Read-only

Get detailed information about a Panther global helper by ID

Returns complete global helper information including Python body code and usage details.

Permissions:{'all_of': ['View Rules']}

Inputs: helper_id (required). Returns: object

get_http_log_sourceA
Read-only

Get detailed information about a specific HTTP log source by ID.

HTTP log sources are used to collect logs via HTTP endpoints/webhooks. This tool provides detailed configuration information for troubleshooting and monitoring HTTP log source integrations.

Args: source_id: The ID of the HTTP log source to retrieve

Returns: Dict containing: - success: Boolean indicating if the query was successful - source: HTTP log source information if successful, containing: - integrationId: The source ID - integrationLabel: The source name/label - logTypes: List of log types this source handles - logStreamType: Stream type (Auto, JSON, JsonArray, etc.) - logStreamTypeOptions: Additional stream type configuration - authMethod: Authentication method (None, Bearer, Basic, etc.) - authBearerToken: Bearer token if using Bearer auth - authUsername: Username if using Basic auth - authPassword: Password if using Basic auth - authHeaderKey: Header key for HMAC/SharedSecret auth - authSecretValue: Secret value for HMAC/SharedSecret auth - authHmacAlg: HMAC algorithm if using HMAC auth - message: Error message if unsuccessful

Permissions:{'all_of': ['View Log Sources']}

Inputs: source_id (required). Returns: object

get_log_type_schema_detailsA
Read-only

Get detailed information for specific log type schemas, including their full specifications. Limited to 5 schemas at a time to prevent response size issues.

Returns: Dict containing: - success: Boolean indicating if the query was successful - schemas: List of schemas, each containing: - name: Schema name (Log Type) - description: Schema description - spec: Schema specification in YAML/JSON format - version: Schema version number - revision: Schema revision number - isArchived: Whether the schema is archived - isManaged: Whether the schema is managed by a pack - isFieldDiscoveryEnabled: Whether automatic field discovery is enabled - referenceURL: Optional documentation URL - discoveredSpec: The schema discovered spec - createdAt: Creation timestamp - updatedAt: Last update timestamp - message: Error message if unsuccessful

Permissions:{'all_of': ['View Rules']}

Inputs: schema_names (required). Returns: object

get_permissionsA
Read-only

Get the current user's permissions. Use this to diagnose permission errors and determine if a new API token is needed.

Inputs: no named parameters. Returns: object

get_roleA
Read-only

Get detailed information about a Panther role by ID

Returns complete role information including all permissions and settings.

Permissions:{'all_of': ['Read User Info']}

Inputs: role_id (required). Returns: object

get_rule_alert_metricsA
Read-only

Gets alert metrics grouped by detection rule for ALL alert types, including alerts, detection errors, and system errors within a given time period. Use this tool to identify hot spots in alerts and use list_alerts for specific alert details.

Returns: Dict: - alerts_per_rule: List of series with entityId, label, and value - total_alerts: Total number of alerts in the period - start_date: Start date of the period - end_date: End date of the period - interval_in_minutes: Grouping interval for the metrics - rule_ids: List of rule IDs if provided

Permissions:{'all_of': ['Read Panther Metrics']}

Inputs: start_date, end_date, interval_in_minutes, rule_ids. Returns: object

get_scheduled_queryA
Read-only

Get detailed information about a specific scheduled query by ID.

Returns complete scheduled query information including SQL, schedule configuration, and metadata.

Returns: Dict containing: - success: Boolean indicating if the query was successful - query: Scheduled query information if successful, containing: - id: Query ID - name: Query name - description: Query description - sql: The SQL query text - schedule: Schedule configuration (cron, rate, timeout) - managed: Whether the query is managed by Panther - createdAt: Creation timestamp - updatedAt: Last update timestamp - message: Error message if unsuccessful

Permissions:{'all_of': ['Query Data Lake']}

Inputs: query_id (required). Returns: object

get_severity_alert_metricsA
Read-only

Gets alert metrics grouped by severity for rule and policy alert types within a given time period. Use this tool to identify hot spots in your alerts, and use the list_alerts tool for specific details. Keep in mind that these metrics combine errors and alerts, so there may be inconsistencies from what list_alerts returns.

Returns: Dict: - alerts_per_severity: List of series with breakdown by severity - total_alerts: Total number of alerts in the period - start_date: Start date of the period - end_date: End date of the period - interval_in_minutes: Grouping interval for the metrics

Permissions:{'all_of': ['Read Panther Metrics']}

Inputs: start_date, end_date, alert_types, severities, +1 more. Returns: object

get_table_schemaA
Read-only

Get column details for a specific data lake table.

IMPORTANT: This returns the table structure in Snowflake. For writing optimal queries, ALSO call get_panther_log_type_schema() to understand:

  • Nested object structures (only shown as 'object' type here)

  • Which fields map to p_any_* indicator columns

  • Array element structures

Example workflow:

  1. get_panther_log_type_schema(["AWS.CloudTrail"]) - understand structure

  2. get_table_schema("panther_logs.public", "aws_cloudtrail") - get column names/types

  3. Write query using both: nested paths from log schema, column names from table schema

Returns: Dict containing: - success: Boolean indicating if the query was successful - name: Table name - display_name: Table display name - description: Table description - log_type: Log type - columns: List of columns, each containing: - name: Column name - type: Column data type - description: Column description - message: Error message if unsuccessful

Permissions:{'all_of': ['Query Data Lake']}

Inputs: database_name (required), table_name (required). Returns: object

get_userA
Read-only

Get detailed information about a Panther user by ID

Returns complete user information including email, names, role, authentication status, and timestamps.

Permissions:{'all_of': ['Read User Info']}

Inputs: user_id (required). Returns: object

list_alert_commentsA
Read-only

Get all comments for a specific Panther alert.

Returns: Dict containing: - success: Boolean indicating if the request was successful - comments: List of comments if successful, each containing: - id: The comment ID - body: The comment text - createdAt: Timestamp when the comment was created - createdBy: Information about the user who created the comment - format: The format of the comment (HTML or PLAIN_TEXT or JSON_SCHEMA) - message: Error message if unsuccessful

Permissions:{'all_of': ['Read Alerts']}

Inputs: alert_id (required), limit. Returns: object

list_alertsA
Read-only

List alerts from Panther with comprehensive filtering options

Args: start_date: Optional start date in ISO 8601 format (e.g. "2024-03-20T00:00:00Z") end_date: Optional end date in ISO 8601 format (e.g. "2024-03-21T00:00:00Z") severities: Optional list of severities to filter by (e.g. ["CRITICAL", "HIGH", "MEDIUM", "LOW", "INFO"]) statuses: Optional list of statuses to filter by (e.g. ["OPEN", "TRIAGED", "RESOLVED", "CLOSED"]) cursor: Optional cursor for pagination from a previous query detection_id: Optional detection ID to filter alerts by. If not provided, default date range (7days) is applied. event_count_max: Optional maximum number of events that returned alerts must have event_count_min: Optional minimum number of events that returned alerts must have log_sources: Optional list of log source IDs to filter alerts by log_types: Optional list of log type names to filter alerts by name_contains: Optional string to search for in alert titles page_size: Number of results per page (default: 25, maximum: 50) resource_types: Optional list of AWS resource type names to filter alerts by subtypes: Optional list of alert subtypes. Valid values depend on alert_type: - When alert_type="ALERT": ["POLICY", "RULE", "SCHEDULED_RULE"] - When alert_type="DETECTION_ERROR": ["RULE_ERROR", "SCHEDULED_RULE_ERROR"] - When alert_type="SYSTEM_ERROR": subtypes are not allowed alert_type: Type of alerts to return (default: "ALERT"). One of: - "ALERT": Regular detection alerts - "DETECTION_ERROR": Alerts from detection errors - "SYSTEM_ERROR": System error alerts

Permissions:{'all_of': ['Read Alerts']}

Inputs: start_date, end_date, severities, statuses, +11 more. Returns: object

list_databasesA
Read-only

List all available datalake databases in Panther.

Returns: Dict containing: - success: Boolean indicating if the query was successful - databases: List of databases, each containing: - name: Database name - description: Database description - message: Error message if unsuccessful

Permissions:{'all_of': ['Query Data Lake']}

Inputs: no named parameters. Returns: object

list_database_tablesA
Read-only

List all available tables in a Panther Database.

Required: Only use valid database names obtained from list_databases

Returns: Dict containing: - success: Boolean indicating if the query was successful - tables: List of tables, each containing: - name: Table name - description: Table description - log_type: Log type - database: Database name - message: Error message if unsuccessful

Permissions:{'all_of': ['Query Data Lake']}

Inputs: database (required). Returns: object

list_data_modelsA
Read-only

List all data models from your Panther instance. Data models are used only in Panther's Python rules to map log type schema fields to a unified data model. They may also contain custom mappings for fields that are not part of the log type schema.

Returns paginated list of data models with metadata including mappings and log types.

Permissions:{'all_of': ['View Rules']}

Inputs: cursor, limit. Returns: object

list_detectionsA
Read-only

List detections from your Panther instance with support for multiple detection types and filtering.

Note: The output_ids filter is applied client-side after fetching all results from the API, as the Panther REST API does not support server-side filtering by outputID. For more efficient API-level filtering, consider using the 'tag' parameter if your detections are tagged by environment.

Permissions:{'all_of': ['View Rules', 'View Policies']}

Inputs: detection_types, cursor, limit, name_contains, +9 more. Returns: object

list_global_helpersA
Read-only

List all global helpers from your Panther instance. Global helpers are shared Python functions that can be used across multiple rules, policies, and other detections.

Returns paginated list of global helpers with metadata including descriptions and code.

Permissions:{'all_of': ['View Rules']}

Inputs: cursor, limit, name_contains, created_by, +1 more. Returns: object

list_log_sourcesA
Read-only

List log sources from Panther with optional filters.

Permissions:{'all_of': ['View Rules']}

Inputs: cursor, log_types, is_healthy, integration_type. Returns: object

list_log_type_schemasA
Read-only

List all available log type schemas in Panther. Schemas are transformation instructions that convert raw audit logs into structured data for the data lake and real-time Python rules.

Returns: Dict containing: - success: Boolean indicating if the query was successful - schemas: List of schemas, each containing: - name: Schema name (Log Type) - description: Schema description - revision: Schema revision number - isArchived: Whether the schema is archived - isManaged: Whether the schema is managed by a pack - referenceURL: Optional documentation URL - createdAt: Creation timestamp - updatedAt: Last update timestamp - message: Error message if unsuccessful

Permissions:{'all_of': ['View Log Sources']}

Inputs: contains, is_archived, is_in_use, is_managed. Returns: object

list_rolesA
Read-only

List all roles from your Panther instance.

Returns list of roles with metadata including permissions and settings.

Permissions:{'all_of': ['Read User Info']}

Inputs: name_contains, name, role_ids, sort_dir. Returns: object

list_scheduled_queriesA
Read-only

List all scheduled queries from your Panther instance.

Scheduled queries are SQL queries that run automatically on a defined schedule for recurring analysis, reporting, and monitoring tasks.

Note: SQL content is excluded from list responses to prevent token limits. Use get_scheduled_query() to retrieve the full SQL for a specific query.

Returns: Dict containing: - success: Boolean indicating if the query was successful - queries: List of scheduled queries if successful, each containing: - id: Query ID - name: Query name - description: Query description - schedule: Schedule configuration (cron, rate, timeout) - managed: Whether the query is managed by Panther - createdAt: Creation timestamp - updatedAt: Last update timestamp - total_queries: Number of queries returned - has_next_page: Boolean indicating if more results are available - next_cursor: Cursor for fetching the next page of results - message: Error message if unsuccessful

Permissions:{'all_of': ['Query Data Lake']}

Inputs: cursor, limit, name_contains. Returns: object

list_usersA
Read-only

List all Panther user accounts.

Returns: Dict containing: - success: Boolean indicating if the query was successful - users: List of user accounts if successful - total_users: Number of users returned - has_next_page: Boolean indicating if more results are available - next_cursor: Cursor for fetching the next page of results - message: Error message if unsuccessful

Permissions:{'all_of': ['Read User Info']}

Inputs: cursor, limit. Returns: object

query_data_lakeA
Read-only

Query Panther's security data lake using SQL for log analysis and threat hunting.

REQUIRED: Include time filter with p_event_time (required for performance and partitioning)

Panther Time Filter Macros (Recommended - optimized for performance):

  • p_occurs_since(timeOffset [, tableAlias[, column]]) Examples: p_occurs_since('1 d'), p_occurs_since('6 h'), p_occurs_since('2 weeks'), p_occurs_since(3600) Time formats: '30 s', '15 m', '6 h', '2 d', '1 w' OR '2 weeks', '1 day' OR numeric seconds

  • p_occurs_between(startTime, endTime [, tableAlias[, column]]) Examples: p_occurs_between('2024-01-01', '2024-01-02'), p_occurs_between('2024-03-20T00:00:00Z', '2024-03-20T23:59:59Z')

  • p_occurs_around(timestamp, timeOffset [, tableAlias[, column]]) Example: p_occurs_around('2024-01-15T10:30:00Z', '1 h') # ±1 hour around timestamp

  • p_occurs_after(timestamp [, tableAlias[, column]])

  • p_occurs_before(timestamp [, tableAlias[, column]])

Alternative (manual): WHERE p_event_time >= '2024-01-01' AND p_event_time < '2024-01-02'

Best Practices:

  • Always use time filters (macros preferred over manual p_event_time conditions)

  • Start with summary queries, then drill down to specific timeframes

  • Use p_any_* fields for faster correlation (p_any_ip_addresses, p_any_usernames, p_any_emails)

  • Query specific fields instead of SELECT * for better performance

Pagination:

  • First call: No cursor parameter - returns first page with max_rows results

  • Subsequent calls: Use next_cursor from previous response to get next page

  • Continue until has_next_page is False

Common Examples:

  • Recent failed logins: "SELECT * FROM panther_logs.public.aws_cloudtrail WHERE p_occurs_since('1 d') AND errorcode IS NOT NULL"

  • IP activity summary: "SELECT sourceippaddress, COUNT(*) FROM panther_logs.public.aws_cloudtrail WHERE p_occurs_since('6 h') GROUP BY sourceippaddress"

  • User correlation: "SELECT * FROM panther_logs.public.aws_cloudtrail WHERE p_occurs_since('2 h') AND ARRAY_CONTAINS('user@domain.com'::VARIANT, p_any_emails)"

  • Nested field access: "SELECT p_enrichment:ipinfo_privacy:"context.ip_address" FROM table WHERE p_occurs_since('1 h')"

Query Syntax (Snowflake SQL):

  • Access nested JSON: column:field.subfield

  • Quote special characters: column:"field name" or p_enrichment:"context.ip_address"

  • Array searches: ARRAY_CONTAINS('value'::VARIANT, array_column)

Returns: Dict with query results: - results: List of matching rows (paginated based on cursor parameter) - results_truncated: True if results were truncated (only for non-paginated requests) - total_rows_available: Total rows found (for non-paginated requests) - has_next_page: True if more results are available - next_cursor: Cursor for next page (use in subsequent call) - column_info: Column names and data types - stats: Query performance metrics (execution time, bytes scanned) - success/status/message: Query execution status

Permissions:{'all_of': ['Query Data Lake']}

Inputs: sql (required), database_name, timeout, max_rows, +1 more. Returns: object

start_ai_alert_triageA
Read-only

Start an AI-powered triage analysis for a Panther alert with intelligent insights and recommendations.

This tool initiates Panther's embedded AI agent to triage an alert and provide an intelligent report about the events, risk level, potential impact, and recommended next steps for investigation.

The AI triage includes analysis of:

  • Alert metadata (severity, detection rule, timestamps)

  • Related events and logs (if available)

  • Comments from previous investigations

  • Contextual security analysis and recommendations

Returns: Dict containing: - success: Boolean indicating if triage was generated successfully - summary: The AI-generated triage summary text - stream_id: The stream ID used for this analysis - metadata: Information about the analysis request - message: Error message if unsuccessful

Permissions:{'all_of': ['Run Panther AI']}

Inputs: alert_id (required), prompt, timeout_seconds. Returns: object

update_alert_assigneeA
DestructiveIdempotent

Update the assignee of one or more alerts through the assignee's ID.

Returns: Dict containing: - success: Boolean indicating if the update was successful - alerts: List of updated alert IDs if successful - message: Error message if unsuccessful

Permissions:{'all_of': ['Manage Alerts']}

Inputs: alert_ids (required), assignee_id (required). Returns: object

update_alert_statusA
DestructiveIdempotent

Update the status of one or more Panther alerts.

Returns: Dict containing: - success: Boolean indicating if the update was successful - alerts: List of updated alert IDs if successful - message: Error message if unsuccessful

Permissions:{'all_of': ['Manage Alerts']}

Inputs: alert_ids (required), status (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 36 tools

    Disambiguation4/5

    Most tools have distinct purposes targeting specific resources (alerts, detections, schemas, queries, etc.), but there is some overlap between get_alert_events and get_alert_event_stats (both analyze alert events), and between various metric tools like get_rule_alert_metrics and get_severity_alert_metrics. Descriptions help clarify differences, but an agent might initially confuse these pairs.

    Naming Consistency5/5

    Tool names follow a highly consistent verb_noun pattern throughout, with clear prefixes like get_, list_, add_, update_, bulk_update_, disable_, start_, and query_. All names use snake_case consistently, making them predictable and readable across the entire set.

    Tool Count3/5

    With 36 tools, the count feels heavy for a single server, though Panther is a comprehensive security platform. The tools cover alerts, detections, data lake, schemas, users, roles, and AI triage, which justifies breadth, but it may overwhelm agents with too many options for common workflows.

    Completeness5/5

    The tool set provides complete CRUD/lifecycle coverage for Panther's domain: alert management (list, get, update, comment, bulk update, AI triage), detection handling (list, get, disable), data lake querying and schema inspection, user/role management, and metric retrieval. No obvious gaps exist; agents can perform end-to-end security operations.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      B
      maintenance
      An MCP server for the Wazuh SIEM/XDR platform that enables users to query agents, security alerts, detection rules, and decoders through Claude or other MCP clients. It provides specialized tools and prompts for investigating security alerts, performing agent health checks, and generating environmental security overviews.
      28
      78 npm
      9
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      MCP server for the StepSecurity platform that enables investigating supply-chain and CI/CD security issues through natural language.
      30
      120 npm
      5
      Apache 2.0
    • A
      license
      A
      quality
      C
      maintenance
      Official MCP server for interacting with Saudi market data (Sahmk) via natural language queries, enabling stock quotes, company info, and market summaries inside AI agents like Cursor and Claude Desktop.
      15
      15
      MIT