Open-source Python template. Triggers the PagerDuty page, opens the Jira incident, notifies the on-call Slack channel, and drafts the Confluence postmortem.
Every step runs on the on-call engineer's own credential, so the PagerDuty page carries a real from_email and the Jira ticket names a person. Re-running with the same incident key never pages twice: the key is passed to PagerDuty as its own dedup key and recorded in a local ledger.
for provider in ("pagerduty", "jira", "confluence", "slackmcp"):
account = client.connect.get_or_create_connected_account(
connection_name=settings.connector[provider],
identifier=settings.oncall_email,
)
if account.status != "ACTIVE":
link = client.connect.get_magic_link(identifier=settings.oncall_email)
raise ConnectorUnavailableError(f"{provider} not authorized: {link}")Four things you'd otherwise build: PagerDuty OAuth, Jira tokens, Confluence credentials, Slack scopes. Handled.
Clone github.com/scalekit-developers/workflow-agents-demos/tree/main/incident-response-agent and adapt it for my on-call stack.
I am building for: my engineering org (or: an incident-response product) <- edit this line
Connectors my users need: PagerDuty, Jira, Confluence, Slack <- edit this line
Trigger: invoked per alert from my alert source. Deliver: a PagerDuty page, a Jira incident ticket, an on-call Slack notification, and a Confluence postmortem draft.
Steps:
1. Create Scalekit AgentKit connections for pagerduty, jira (the plain JIRA REST connector, not JiraServiceManagement or AtlassianMCP), confluence (plain REST, not AtlassianMCP), and an MCP-variant slack -- copy the exact connection names into PAGERDUTY_CONNECTOR / JIRA_CONNECTOR / CONFLUENCE_CONNECTOR / SLACK_CONNECTOR.
2. Set ONCALL_EMAIL to the engineer each run acts for; PagerDuty requires it on every write, so attribution stays real instead of a shared bot.
3. Resolve PAGERDUTY_SERVICE_NAME and SLACK_CHANNEL at startup and fail before paging if either is ambiguous -- mirror the Step 0.5 checks in run_flow.py.
4. Confirm JIRA_ISSUE_TYPE is valid for JIRA_PROJECT_KEY (run jira_issue_create_meta_issue_types_list) and set CONFLUENCE_SPACE_ID to the numeric space ID, not the space key.
5. Pass a stable --incident-key from my alert source so retries never double-page; keep the state ledger in state.py for partial-failure resume.
6. Run python run_flow.py --title "test incident" --severity low, then describe how to wire it behind my alertmanager or Datadog webhook.
Each one runs on delegated identity, scoped per user.