Connectors pull events from your platforms, normalize them into a common schema, and apply the airlock (sanitize, length-cap, wrap markers). The AI never sees raw API responses.
All connectors are plugins. Built-in connectors ship with mallcop.
You can override any built-in connector by dropping a same-named plugin into
plugins/connectors/ in your deployment repo.
The Azure connector polls Activity Log, Container Apps access logs, Cosmos DB diagnostics, and Microsoft Defender free tier findings.
Service principal with read-only roles. Minimum: Reader + Monitoring Reader.
# Environment variables AZURE_TENANT_ID=your-tenant-id AZURE_CLIENT_ID=your-sp-client-id AZURE_CLIENT_SECRET=your-sp-secret AZURE_SUBSCRIPTION_ID=your-sub-id # optional if in mallcop.yaml
| Type | Description | Detector Coverage |
|---|---|---|
role_assignment | New role assignment on subscription or resource group | priv-escalation, new-external-access |
permission_change | Permission modification on any resource | priv-escalation |
service_principal_created | New app registration or service principal | new-actor |
resource_access | Key Vault access, Storage access, Cosmos DB queries | unusual-resource-access |
admin_action | Subscription-level administrative operations | unusual-timing, priv-escalation |
login | Entra ID sign-in events | auth-failure-burst, unusual-timing |
defender_alert | Microsoft Defender free-tier alerts | All detectors receive these |
connectors:
- id: azure
type: azure
subscriptions:
- "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
resource_groups: [] # empty = all
include_container_logs: true # requires Log Analytics workspace
lookback_hours: 8 # hours of history per scan
Polls CloudTrail LookupEvents API. Authenticated with SigV4. Covers IAM changes, security group modifications, S3 policy changes, and console logins.
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_DEFAULT_REGION=us-east-1
Minimum IAM permissions: cloudtrail:LookupEvents, cloudtrail:DescribeTrails.
CreateUser, AttachRolePolicy, etc.)AuthorizeSecurityGroupIngress, etc.)connectors:
- id: aws
type: aws-cloudtrail
region: us-east-1
lookback_hours: 8
Polls the GitHub org audit log API. Captures membership changes, permission changes, secret scanning alerts, Dependabot findings, and Actions workflow events.
GITHUB_TOKEN=github_pat_... # personal access token or GitHub App token
Required scopes: read:audit_log, repo (for Dependabot/secret scanning).
| Type | Description |
|---|---|
org_membership | Member added/removed from org |
repo_permission | Collaborator added, permission changed |
collaborator_added | External collaborator added to repo |
secret_scanning_alert | GitHub detected a secret in a commit |
dependabot_alert | Dependency vulnerability found |
workflow_run | Actions workflow triggered and completed |
oauth_authorization | OAuth app authorized by org member |
connectors:
- id: github
type: github
org: "your-org-name"
include_dependabot: true
include_secret_scanning: true
Uses the Office 365 Management Activity API. Covers Azure AD sign-ins, admin actions, Exchange mail rules, SharePoint access, and DLP policy matches. The API has a 7-day window - regular polling (every 6 hours) avoids gaps.
M365_TENANT_ID=your-tenant-id
M365_CLIENT_ID=your-app-client-id
M365_CLIENT_SECRET=your-app-secret
Register an Azure AD app with ActivityFeed.Read permission
(Office 365 Management APIs). Admin consent required.
connectors:
- id: m365
type: m365
tenant_id: "${M365_TENANT_ID}"
Queries Azure Log Analytics for container app stdout/stderr. Works with Azure Container Apps
including scaled-to-zero applications. Parses structured log lines against app-specific templates;
unmatched lines trigger the log-format-drift detector.
LOG_ANALYTICS_WORKSPACE_ID=your-workspace-id
# Auth reuses Azure SP credentials (AZURE_CLIENT_ID / AZURE_CLIENT_SECRET)
connectors:
- id: container-logs
type: container-logs
workspace_id: "${LOG_ANALYTICS_WORKSPACE_ID}"
apps: [] # empty = all apps in workspace
lookback_hours: 8
Use mallcop discover-app <app-name> to sample an app's logs and
generate a parser template. The template lives in apps/<app-name>/parser.yaml
and is updated by the self-improvement loop.
Polls Vercel's deployment and audit log APIs. Captures deployment events, team membership changes, and audit log entries.
VERCEL_TOKEN=your-api-token # Vercel account token
VERCEL_TEAM_ID=team_xxxxx # optional, for team accounts
connectors:
- id: vercel
type: vercel
team_id: "${VERCEL_TEAM_ID}"
Auth audit logs, project configuration changes, and edge function monitoring.
Monitors your Supabase project for auth events (sign-ins, sign-ups, token refreshes), project configuration changes, and edge function deployments.
connectors:
- id: supabase
type: supabase
project_ref: "${SUPABASE_PROJECT_REF}"
SUPABASE_SERVICE_KEY - Supabase service role keyAI agent skill integrity, behavior monitoring, and gateway security.
Monitors OpenClaw AI agent installations for skill integrity violations, behavior anomalies, and insecure gateway configurations.
connectors:
- id: openclaw
type: openclaw
gateway_url: "${OPENCLAW_GATEWAY_URL}"
Scaffold a new connector with:
mallcop scaffold connector cloudflare
This generates plugins/connectors/cloudflare/ with:
manifest.yaml, connector.py, tools.py,
fixtures/, and tests.py.
The manifest declares capabilities, auth, and event types. mallcop verify
checks that the implementation matches the manifest. Once verified, the connector
integrates with all existing detectors and actors automatically.
All connectors emit events in a normalized format:
{
"id": "evt-2026-03-11-azure-abc123",
"timestamp": "2026-03-11T14:00:00Z",
"source": "azure",
"event_type": "role_assignment",
"actor": "[USER_DATA_BEGIN]baron@3dl.dev[USER_DATA_END]",
"target": "[USER_DATA_BEGIN]my-key-vault[USER_DATA_END]",
"action": "role_assignment",
"severity": "info",
"metadata": {
"role": "Key Vault Reader",
"scope": "/subscriptions/xxx/resourceGroups/prod"
},
"raw": "..." <-- never exposed to the LLM
}
User-controllable string fields are wrapped in [USER_DATA_BEGIN]...[USER_DATA_END]
markers at ingest. The raw field stores the original API response but is never
included in actor context. See Security for the full airlock architecture.