Configure integrations via Settings > Integrations in the web UI.
Backend Tools via Agent SDK (Recommended)
NEW: Backend tool integration via Claude Agent SDK eliminates desktop dependency.
Available Tools (19)
| Category | Count | Tools |
|---|---|---|
| Security Detections | 5 | Coverage analysis, detection search, gap identification |
| Findings & Cases | 7 | List/get findings, case management, similarity search |
| MITRE ATT&CK | 2 | Attack layer generation, technique rollup |
| Approval Workflow | 5 | Pending approvals, approve/reject actions, statistics |
Benefits
- ✅ Zero Desktop Dependency - Works entirely through Agent SDK
- ✅ Web UI Compatible - All tools accessible via browser
- ✅ Production Ready - Multi-user deployments
- ✅ Lower Latency - Direct function calls via Agent SDK
- ✅ Simpler Deployment - No MCP server configuration needed
Usage
Backend tools are automatically enabled for web UI users via the Claude Agent SDK. See Backend Tools Guide for detailed documentation.
MCP Servers (Optional - Advanced Integration)
Note: MCP servers are optional and primarily used for advanced integrations requiring external services (Splunk, VirusTotal, etc.). Web UI users get full functionality through the Agent SDK backend tools.
| Category | Servers | Status |
|---|---|---|
| Core | deeptempo-findings, approval, attack-layer, tempo-flow | Implemented |
| Community | GitHub, PostgreSQL | Active |
| Detection Engineering | Security-Detections-MCP | Implemented |
| SIEM | Splunk, Elastic Security | Implemented |
| Timeline | Timesketch | Implemented |
| Threat Intel | VirusTotal, Shodan, AlienVault OTX, MISP, URL Analysis, IP Geolocation | Implemented |
| EDR | CrowdStrike | Implemented |
| Sandbox | Hybrid Analysis, Joe Sandbox, ANY.RUN, CAPE Sandbox | Implemented |
| Ticketing | Jira | Implemented |
| Communication | Slack | Implemented |
| Data Pipeline | Cribl Stream | Implemented |
Security-Detections-MCP
Detection engineering with 7,200+ rules across Sigma, Splunk ESCU, Elastic, and KQL formats.
Overview
Security-Detections-MCP provides:
- 7,200+ Detection Rules - Comprehensive detection rule database
- 71+ Tools - Coverage analysis, gap identification, template generation
- 11 Expert Prompts - Guided detection engineering workflows
- Tribal Knowledge - Document and retrieve detection decisions
- Pattern Intelligence - Learn from existing detection rules
Configuration
Automatically configured during ./setup_dev.sh. Detection repositories are cloned to ~/security-detections/.
To skip automatic installation:
SKIP_DETECTION_REPOS=true ./setup_dev.sh
To update repositories:
./scripts/setup_detection_repos.sh --update
Key Tool Categories
| Category | Tools | Description |
|---|---|---|
| Coverage Analysis | 6 tools | Quantify detection coverage by MITRE technique |
| Detection Search | 12 tools | Find relevant detection rules |
| Pattern Intelligence | 15 tools | Learn from existing detection patterns |
| Template Generation | 8 tools | AI-assisted detection rule creation |
| Tribal Knowledge | 20 tools | Document and retrieve detection decisions |
| Analytics & Reporting | 10 tools | Metrics and gap analysis reports |
Expert Workflow Prompts
11 guided workflows for detection engineering:
apt-threat-emulation- Purple team exercises for APT groupscoverage-analysis- Comprehensive coverage assessmentdetection-tuning- Optimize existing detectionsgap-prioritization- Prioritize detection gapsmitre-mapping- Map findings to ATT&CK frameworkpurple-team-report- Generate purple team reportsthreat-landscape-sync- Align to current threat landscapedetection-validation- Validate detection effectivenesssigma-to-platform- Convert Sigma to platform-specificcoverage-heatmap- Visualize detection coveragedetection-lifecycle- Manage detection lifecycle
Primary Use Cases
For MITRE Analyst Agent:
"What's our detection coverage for APT29?"
"What detection gaps exist for ransomware?"
"Generate a Splunk detection for T1059.001 PowerShell execution"
For Threat Hunter Agent:
"What patterns exist for detecting C2 beaconing?"
"Extract common fields used in PowerShell detections"
"Show me similar detections to the one we just created"
For Investigator Agent:
"Would our current detections catch this attack?"
"What detections exist for technique T1071.001?"
"Document why we prioritized this detection"
Documentation
See DETECTION_ENGINEERING.md for complete usage guide, examples, and best practices.
Verification
Test integration:
python scripts/test_detection_integration.py
Splunk
Natural language to SPL query generation.
Configuration
SPLUNK_PASSWORD="your_password"
Settings > Integrations > Splunk:
- Server URL:
https://splunk.example.com:8089 - Username
- Verify SSL
MCP Tools
| Tool | Description |
|---|---|
generate_spl_query |
Natural language to SPL |
execute_spl_search |
Run SPL query |
search_by_ip |
Quick IP search |
search_by_hostname |
Quick hostname search |
search_by_username |
Quick user search |
natural_language_search |
Generate and execute |
get_splunk_indexes |
List available indexes |
Elastic Security
Elasticsearch SIEM with detection alert ingestion, bi-directional case sync, and IOC enrichment.
Configuration
ELASTIC_HOST="https://elasticsearch.example.com:9200"
ELASTIC_KIBANA_URL="https://kibana.example.com:5601"
ELASTIC_API_KEY="your_api_key"
# Or use basic auth:
# ELASTIC_USERNAME="elastic"
# ELASTIC_PASSWORD="your_password"
Settings > Integrations > Elastic Security (SIEM):
- Elasticsearch URL
- Kibana URL (required for detection alerts and case sync)
- API Key or Username/Password
- Alert Index Pattern (default:
.alerts-security.alerts-default)
MCP Tools
| Tool | Description |
|---|---|
elastic_search_logs |
Search Elasticsearch with query DSL |
elastic_search_by_ioc |
Search by IOC (IP, hash, username, hostname) |
elastic_get_indices |
List available indices |
elastic_get_detection_alerts |
Fetch recent detection alerts |
Features
- Alert Ingestion: Daemon poller fetches detection alerts from Kibana Detections API
- Bi-directional Sync: Case status changes in Vigil sync back to Elastic Security alerts
- IOC Enrichment: Agents query Elasticsearch indices for logs matching case IOCs
Timesketch
Forensic timeline analysis.
Configuration
Settings > Integrations > Timesketch:
- Server URL:
http://localhost:5000(local) or production URL - Auth: Username/Password or API Token
- Auto-sync interval (optional)
MCP Tools
| Tool | Description |
|---|---|
list_sketches |
List investigation workspaces |
get_sketch |
Get sketch details |
create_sketch |
Create new workspace |
search_timesketch |
Lucene query search |
export_to_timesketch |
Export findings/cases |
Threat Intelligence
VirusTotal
# Settings > Integrations > VirusTotal
VT_API_KEY="your_api_key"
Tools: vt_check_hash, vt_check_ip, vt_check_domain, vt_check_url
Shodan
SHODAN_API_KEY="your_api_key"
Tools: shodan_search_ip, shodan_get_host_info, shodan_search_exploits
AlienVault OTX
OTX_API_KEY="your_api_key"
Tools: otx_get_indicator, otx_search_pulses, otx_get_pulse
MISP
MISP_URL="https://misp.example.com"
MISP_API_KEY="your_api_key"
Tools: misp_search, misp_get_event, misp_add_attribute
Cloudflare Cloudforce One (STIX/TAXII)
Pulls Cloudflare’s Cloudforce One threat feed via TAXII 2.1 into the
threat_indicators table. The daemon polls on the configured interval; the
finding processor enriches IOCs against this table and surfaces matches
under finding.enrichment.threat_indicators.
# Settings → Integrations → Cloudflare Cloudforce One
# (env vars are fallbacks; the integration is the on/off switch)
CLOUDFORCE_ONE_API_TOKEN="..."
CLOUDFORCE_ONE_TAXII_SERVER_URL="https://api.cloudflare.com/client/v4/accounts/{account_id}/cloudforce-one/threat-events/taxii2/"
CLOUDFORCE_ONE_COLLECTION_IDS="collection-uuid-1,collection-uuid-2"
THREAT_FEED_POLL_INTERVAL="900"
Operates independently of the Cloudflare WAF/Zero Trust integration — customers can subscribe to either or both.
Sandbox Analysis
Hybrid Analysis
HYBRID_ANALYSIS_API_KEY="your_api_key"
Tools: ha_submit_file, ha_get_report, ha_search
Joe Sandbox
JOE_SANDBOX_API_KEY="your_api_key"
Tools: joe_submit, joe_get_report, joe_search
ANY.RUN
ANYRUN_API_KEY="your_api_key"
Tools: anyrun_get_report, anyrun_search, anyrun_get_iocs
CAPE Sandbox
Open-source Cuckoo fork for on-prem detonation. Vigil ships an MCP client
(core/integrations/cape_sandbox/tool.py) that talks to an existing CAPE deployment over
its REST API — Vigil does not host CAPE itself. CAPE requires KVM and
Windows guest VMs, so it’s typically deployed on bare metal, not inside
Docker Desktop.
CAPE_SANDBOX_ENABLED="true"
CAPE_SANDBOX_URL="http://cape.internal:8000"
CAPE_SANDBOX_API_KEY="your_cape_api_token"
Tools: cape_submit_file, cape_submit_url, cape_get_report,
cape_get_iocs, cape_get_pcap, cape_list_tasks, cape_search_hash,
cape_task_status.
Auto-submission pipeline
When SANDBOX_AUTO_SUBMIT=true and at least one sandbox is enabled, the
daemon will, during finding enrichment, consult each sandbox’s hash cache
for any file hash on the finding. Safety gates:
- File extension must be in
SANDBOX_ALLOWED_FILE_TYPES(default list matches common malware extensions). file_size(when known) must be ≤SANDBOX_MAX_FILE_SIZE_MB.- No binary bytes are ever sent from Vigil. Only hash-cache lookups and sandbox-API submission-by-hash are performed.
A companion scheduler task (sandbox_poll, default every 60s) picks up
completed reports and writes them into the case as CaseEvidence plus
extracted IOCs into CaseIOC. See SANDBOX.md.
Network Security & Edge Enforcement
Cloudflare (WAF, Zero Trust Gateway, Access)
Closes the loop by letting Vigil propose and (with approval) execute enforcement actions on Cloudflare’s edge:
| Action type | MCP tool | Cloudflare API |
|---|---|---|
WAF_BLOCK |
cf_waf_block_ip / cf_waf_unblock_ip |
IP Access Rules (/firewall/access_rules/rules) |
GATEWAY_BLOCK |
cf_gateway_block_domain |
Zero Trust Gateway DNS+HTTP rule (/gateway/rules) |
ACCESS_REVOKE |
cf_access_revoke_session |
Access organization revoke (/access/organizations/revoke_user) |
Read-only context tools — cf_lookup_ip_threat and cf_lookup_domain_threat
— are wired into the Threat Intel and Network Analyst agents so investigations
can pull edge context on demand.
# Settings → Integrations → Cloudflare
# Required scopes: Zone:Firewall Services:Edit, Account:Zero Trust:Edit,
# Account:Access:Edit, Account:Account Analytics:Read
CLOUDFLARE_API_TOKEN="..."
CLOUDFLARE_ACCOUNT_ID="..." # required for Zero Trust + Access actions
CLOUDFLARE_ZONE_ID="..." # optional default zone for WAF rules
All write actions route through services/approval_service.py; the auto-
responder agent only auto-approves at confidence ≥ 0.90, otherwise an analyst
must approve in the Approvals UI before the daemon executes the call.
Cloudflare Cloudy ingestion (gated)
Inbound webhook receiver at POST /api/webhooks/cloudflare/cloudy for
Cloudflare-pushed events with attached Cloudy natural-language summaries.
Off by default because the upstream contract is not publicly stable
yet; the router only mounts when CLOUDY_INGESTION_ENABLED=true and a
CLOUDY_WEBHOOK_SECRET is set for HMAC-SHA256 verification.
When enabled, Cloudy summaries land on findings as
finding.evidence.cloudy_summary (cited verbatim, with provenance) and
are surfaced into the Threat Intel agent’s context window.
CrowdStrike
CS_CLIENT_ID="your_client_id"
CS_CLIENT_SECRET="your_client_secret"
Tools: get_crowdstrike_alert_by_ip, crowdstrike_foundry_isolate, crowdstrike_foundry_unisolate, get_host_status
Communication
Slack
SLACK_BOT_TOKEN="xoxb-..."
SLACK_DEFAULT_CHANNEL="#soc-alerts"
Tools: slack_send_message, slack_send_alert, slack_create_channel, slack_upload_file
Jira
JIRA_URL="https://company.atlassian.net"
JIRA_EMAIL="user@company.com"
JIRA_API_TOKEN="your_token"
Tools: jira_create_issue, jira_update_issue, jira_add_comment, jira_search, jira_get_issue
Data Pipeline
Cribl Stream
CRIBL_PASSWORD="your_password"
CRIBL_WORKER_GROUP="default"
Benefits:
- Normalize log formats before DeepTempo analysis
- Filter noise, reduce Splunk ingestion 30-50%
- Enrich events with GeoIP, asset info
- Route data to multiple destinations
Data Sources -> Cribl Stream -> DeepTempo LogLM
-> Splunk
-> S3/Data Lake
Adding Custom Integrations
Settings > Integrations > Custom Integration Builder:
- Upload API documentation
- AI generates MCP server code
- Review and test
- Saved to
~/.vigil/custom_integrations/<id>_server.py
CloudCurrent VStrike (Network Topology Fusion)
VStrike enriches DeepTempo findings with network topology, asset, segment, and mission-system context, then pushes the enriched findings back into Vigil. Vigil can also query VStrike on demand for asset topology and blast radius.
Integration surface
| Direction | Endpoint / Tool | Purpose |
|---|---|---|
| VStrike → Vigil | POST /api/integrations/vstrike/findings |
Push enriched findings (batched) |
| Vigil → VStrike | GET /api/integrations/vstrike/health |
Outbound reachability check |
| Vigil → VStrike | GET /api/integrations/vstrike/topology/asset/{id} |
Asset topology lookup |
| Vigil → VStrike | GET /api/integrations/vstrike/topology/asset/{id}/adjacent |
One-hop neighbors |
| Vigil → VStrike | GET /api/integrations/vstrike/topology/asset/{id}/blast-radius |
Blast radius |
| Vigil → VStrike | POST /api/integrations/vstrike/network-graph |
Full network graph: {label, nodes, edges, bbox} |
| Vigil → VStrike | POST /api/integrations/vstrike/ui/legend-apply |
Apply selected legend in the iframe |
| Vigil → VStrike | POST /api/integrations/vstrike/ui/rightpanel-focus |
Open / focus the iframe’s right-hand details panel |
| MCP | core/integrations/vstrike/tool.py (vstrike_* tools) |
Agent-invokable topology queries + UI control |
Recently added MCP tools
| Tool | Input | Behavior |
|---|---|---|
vstrike_network_graph_get |
networkId (optional) |
Returns {label, nodes, edges, bbox} for the active (or specified) network. Useful for blast-radius, path-finding, and layout reasoning beyond single-asset lookups. |
vstrike_ui_legend_apply |
legendId (required, value from legend-run-list), networkId (optional) |
Applies the selected legend run inside the active VStrike iframe session. |
vstrike_ui_rightpanel_focus |
none | Opens the VStrike iframe’s right-hand details panel for whatever node is currently selected. |
UX wiring:
- The toolbar’s Legend dropdown now has an Apply button parallel to the existing Storyline Apply.
- Picking a node from the toolbar search results chains
ui-camera-node→ui-rightpanel-focusso the camera selects the node and its details panel opens automatically. - Clicking an adjacent-asset chip in
NetworkContextPanelchains the same way: Vigil highlights the node in its own EntityGraph, then drives VStrike withcameraNode+focusRightPanel.
Service methods accept **kwargs and REST routes use extra="allow" Pydantic models, so future schema bumps on VStrike’s side don’t require a Vigil refactor.
Configuration
Either set env vars (recommended for push/CI) or configure via the UI:
# .env
VSTRIKE_BASE_URL="https://vstrike.example.com"
VSTRIKE_API_KEY="<outbound bearer token>"
VSTRIKE_VERIFY_SSL="true"
VSTRIKE_INBOUND_API_KEY="<bearer token Vigil expects on inbound push>"
UI: Settings → Integrations → CloudCurrent VStrike.
Storage model
VStrike enrichment lives at finding.entity_context["vstrike"] (JSONB —
no DB migration required). Shape is defined by
core/integrations/vstrike/schemas.py::VStrikeEnrichment and mirrored by
clients/web/src/types/vstrike.ts.
The ingest handler does read-modify-write on entity_context so existing
keys (src_ip, hostname, etc.) are never clobbered.
Auto-case clustering
When auto_cluster_cases: true (default), the ingest handler groups
upserted findings by (segment, attack_path[0] or asset_id) and creates
one case per group via
core.cases.case_automation_service.cluster_findings_by_attack_path.
Authentication
Inbound push uses a bearer token:
Authorization: Bearer $VSTRIKE_INBOUND_API_KEY
When DEV_MODE=true, the auth check is bypassed (matches the rest of the
codebase). Outside dev mode, the endpoint returns:
401if the header is missing or wrong503ifVSTRIKE_INBOUND_API_KEYis unset (refuses to run open)
Example push
export DEV_MODE=true
curl -X POST http://localhost:6987/api/integrations/vstrike/findings \
-H 'Content-Type: application/json' \
-d '{
"batch_id": "demo-1",
"findings": [{
"finding_id": "f-test-1",
"timestamp": "2026-05-20T14:00:00Z",
"anomaly_score": 0.87,
"vstrike_enrichment": {
"asset_id": "srv-01",
"asset_name": "SAP-PROD-01",
"segment": "mgmt-vlan-10",
"site": "JBSA",
"criticality": "high",
"mission_system": "C2-AWACS",
"attack_path": ["ext-gw-01", "dmz-web-02", "srv-01"],
"blast_radius": 14,
"adjacent_assets": [
{"asset_id": "dc-01", "hop_distance": 1, "edge_technique": "T1021.002"}
],
"enriched_at": "2026-05-20T14:00:00Z"
}
}]
}'
Visualization
- Finding detail:
NetworkContextPanelrenders the VStrike sub-dict (criticality, segment, mission system, blast radius, attack-path breadcrumb, clickable adjacent-asset chips). - Entity graph: nodes are tinted by segment when VStrike metadata is present; the first MITRE technique on a link is rendered as an edge label (always on highlighted links, and at zoom > 2.0 otherwise).
- Pivot: clicking an adjacent-asset chip dispatches
vstrike-graph-highlight—pages/Investigation.tsxlistens for this event and feeds the node id intoEntityGraph.highlightedNodes.
Testing
pytest tests/integration/test_vstrike_ingest.py -v
pytest tests/unit/test_vstrike_service.py -v
Stub Servers (Not Implemented)
Available for future implementation:
| Server | Category |
|---|---|
| AWS Security Hub | Cloud |
| Azure Sentinel | Cloud |
| GCP Security | Cloud |
| Azure AD | Identity |
| Okta | Identity |
| Microsoft Defender | EDR |
| SentinelOne | EDR |
| Carbon Black | EDR |
| PagerDuty | Communication |