Tracecat secrets integrations
Skill adrojis/tracecat-skills/skills/tracecat-secrets-integrations
Expert Claude Code skills for building Tracecat SOAR workflows — action configuration, case management, workflow patterns, integrations & MCP tools guidance
npx -y skills add adrojis/tracecat-skills --skill tracecat-secrets-integrationsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Activate when users configure secrets, connect integrations, set up Splunk, CrowdStrike, Okta, Wazuh, Slack, Jira, VirusTotal, GLIMPS, Microsoft Defender, or any third-party tool with Tracecat
SKILL.md
8.1 KB, as published. Nobody here has run it
Tracecat Secrets & Integrations Expert
You are an expert at configuring secrets and connecting external tools with Tracecat.
Secret Management
Creating Secrets (MCP)
tracecat_create_secret:
name: "virustotal"
type: "custom"
keys:
- { key: "API_KEY", value: "your-api-key-here" }
Secret Types
| Type | Use Case |
|---|---|
custom | Any key-value pairs (default) |
token | Single bearer/API token |
oauth2 | OAuth2 credentials |
ssh | SSH key pairs |
Accessing Secrets in Workflows
# In action inputs
headers:
Authorization: "Bearer ${{ SECRETS.my_service.API_KEY }}"
# In Python scripts (pass via inputs, never access directly)
inputs:
api_key: ${{ SECRETS.virustotal.API_KEY }}
Secret Naming Convention
Use the integration name as the secret name for auto-resolution:
virustotalfor VirusTotalcrowdstrikefor CrowdStrikesplunkfor Splunkslackfor Slack
Integration Reference
Threat Intelligence
VirusTotal
Secret: virustotal
Keys: API_KEY
# Via native integration
action: tools.virustotal.analyze_hash
args:
hash: ${{ TRIGGER.data.file_hash }}
# Via HTTP (API v3)
action: core.http_request
args:
url: https://www.virustotal.com/api/v3/files/${{ TRIGGER.data.hash }}
method: GET
headers:
x-apikey: ${{ SECRETS.virustotal.API_KEY }}
AbuseIPDB
Secret: abuseipdb
Keys: API_KEY
action: core.http_request
args:
url: https://api.abuseipdb.com/api/v2/check
method: GET
headers:
Key: ${{ SECRETS.abuseipdb.API_KEY }}
params:
ipAddress: ${{ TRIGGER.data.ip }}
maxAgeInDays: "90"
GreyNoise
Secret: greynoise
Keys: API_KEY
Shodan
Secret: shodan
Keys: API_KEY
EDR / Endpoint
CrowdStrike Falcon
Secret: crowdstrike
Keys: CLIENT_ID, CLIENT_SECRET
# Step 1: Get OAuth2 token
action: core.http_request
args:
url: https://api.crowdstrike.com/oauth2/token
method: POST
headers:
Content-Type: application/x-www-form-urlencoded
payload:
client_id: ${{ SECRETS.crowdstrike.CLIENT_ID }}
client_secret: ${{ SECRETS.crowdstrike.CLIENT_SECRET }}
# Step 2: Use token in subsequent calls
action: core.http_request
args:
url: https://api.crowdstrike.com/detects/queries/detects/v1
method: GET
headers:
Authorization: "Bearer ${{ ACTIONS.get_cs_token.result.access_token }}"
Microsoft Defender for Endpoint
Secret: msdefender
Keys: TENANT_ID, CLIENT_ID, CLIENT_SECRET
# Step 1: Get Azure AD token
action: core.http_request
args:
url: https://login.microsoftonline.com/${{ SECRETS.msdefender.TENANT_ID }}/oauth2/v2.0/token
method: POST
headers:
Content-Type: application/x-www-form-urlencoded
payload:
client_id: ${{ SECRETS.msdefender.CLIENT_ID }}
client_secret: ${{ SECRETS.msdefender.CLIENT_SECRET }}
scope: https://api.securitycenter.microsoft.com/.default
grant_type: client_credentials
SentinelOne
Secret: sentinelone
Keys: API_KEY, BASE_URL
SIEM
Splunk
Secret: splunk
Keys: TOKEN, BASE_URL
action: core.http_request
args:
url: ${{ SECRETS.splunk.BASE_URL }}/services/search/jobs
method: POST
headers:
Authorization: "Bearer ${{ SECRETS.splunk.TOKEN }}"
Content-Type: application/x-www-form-urlencoded
payload:
search: "search index=main sourcetype=syslog | head 100"
output_mode: json
Elastic / OpenSearch
Secret: elastic
Keys: API_KEY, BASE_URL
Wazuh
Secret: wazuh
Keys: USER, PASSWORD, BASE_URL
# Step 1: Authenticate
action: core.http_request
args:
url: ${{ SECRETS.wazuh.BASE_URL }}/security/user/authenticate
method: POST
headers:
Content-Type: application/json
Authorization: "Basic ${{ FN.base64_encode(SECRETS.wazuh.USER + ':' + SECRETS.wazuh.PASSWORD) }}"
Communication
Slack
Secret: slack
Keys: BOT_TOKEN
action: core.http_request
args:
url: https://slack.com/api/chat.postMessage
method: POST
headers:
Authorization: "Bearer ${{ SECRETS.slack.BOT_TOKEN }}"
Content-Type: application/json
payload:
channel: "#security-alerts"
text: "Alert: ${{ TRIGGER.data.alert_name }}"
Microsoft Teams (via Webhook)
Secret: teams
Keys: WEBHOOK_URL
action: core.http_request
args:
url: ${{ SECRETS.teams.WEBHOOK_URL }}
method: POST
headers:
Content-Type: application/json
payload:
text: "Security alert: ${{ TRIGGER.data.message }}"
PagerDuty
Secret: pagerduty
Keys: API_KEY, ROUTING_KEY
Email (SMTP)
Secret: smtp
Keys: HOST, PORT, USER, PASSWORD
Ticketing
Jira
Secret: jira
Keys: API_TOKEN, EMAIL, BASE_URL
action: core.http_request
args:
url: ${{ SECRETS.jira.BASE_URL }}/rest/api/3/issue
method: POST
headers:
Authorization: "Basic ${{ FN.base64_encode(SECRETS.jira.EMAIL + ':' + SECRETS.jira.API_TOKEN) }}"
Content-Type: application/json
payload:
fields:
project:
key: SEC
summary: ${{ TRIGGER.data.alert_title }}
issuetype:
name: Task
description:
type: doc
version: 1
content:
- type: paragraph
content:
- type: text
text: ${{ TRIGGER.data.description }}
ServiceNow
Secret: servicenow
Keys: INSTANCE_URL, USER, PASSWORD
Identity & Access
Okta
Secret: okta
Keys: API_KEY, DOMAIN
# Suspend a user
action: core.http_request
args:
url: https://${{ SECRETS.okta.DOMAIN }}/api/v1/users/${{ TRIGGER.data.user_id }}/lifecycle/suspend
method: POST
headers:
Authorization: "SSWS ${{ SECRETS.okta.API_KEY }}"
Azure AD / Entra ID
Secret: azuread
Keys: TENANT_ID, CLIENT_ID, CLIENT_SECRET
File Analysis
GLIMPS Malware
Secret: glimps
Keys: API_KEY, BASE_URL
action: core.http_request
args:
url: ${{ SECRETS.glimps.BASE_URL }}/submit
method: POST
headers:
Authorization: "Bearer ${{ SECRETS.glimps.API_KEY }}"
MCP Tools for Secrets
| Tool | Usage |
|---|---|
tracecat_create_secret | Create new secret with key-value pairs |
tracecat_get_secret | Get secret metadata (NOT decrypted values) |
tracecat_update_secret | Update secret keys or description |
tracecat_delete_secret | Permanently delete a secret |
tracecat_search_secrets | Search secrets by name |
Best Practices
- Naming — Use the integration name as the secret name
- Key naming — Use UPPERCASE for key names (API_KEY, CLIENT_ID)
- Least privilege — Use API keys with minimum required permissions
- Rotation — Rotate secrets regularly via
tracecat_update_secret - No hardcoding — Never put credentials in action inputs directly
- Test first — Test integrations with non-destructive read-only actions before containment/blocking
- Rate limiting — Add
start_delayor batch processing for high-volume API calls - Error handling — Use error edges to handle API failures (401, 403, 429)
Common Mistakes
| Mistake | Correct |
|---|---|
${{ SECRETS.vt.api_key }} (lowercase) | ${{ SECRETS.virustotal.API_KEY }} |
| Hardcoded API key in URL | Use ${{ SECRETS.name.KEY }} |
| Accessing secrets in Python directly | Pass via inputs field |
| Creating duplicate secret names | Check with tracecat_search_secrets first |
| Forgetting OAuth2 token step | CrowdStrike/Defender need token exchange first |
Related Skills
- tracecat-action-configuration — Action types and input configuration
- tracecat-mcp-tools-expert — MCP tools for secret operations
- tracecat-workflow-patterns — Integration patterns in workflows
- tracecat-code-python — Custom integrations via Python scripts
- tracecat-validation-debug — Debug secret access errors