<!-- Generated by `just docs` from catalog/toolkits/pagerduty.yaml, catalog/expansions/pagerduty.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# PagerDuty

On-call and incidents. Open, triage, and resolve incidents, add notes, manage escalation policies, and see who is on call.

| Property | Value |
| --- | --- |
| Slug | `pagerduty` |
| Definition version | `0.1.0` |
| Base URL | `https://api.pagerduty.com` |
| Auth schemes | `api_key` |
| Action tools | 35 |
| By class | 14 read, 15 write, 6 destructive |
| Triggers | 0 |
| Provider rate limit | not declared, so outbound calls are unpaced |

## Measured routing accuracy

48 golden cases replayed through the router over the whole index: measured over corpus `ea4f12ad2948` (65 toolkits, 2283 tools indexed and 13 declared uncallable), 35 cases written by hand and 13 cases from the paraphrase pass. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.

| Measure | Cases | Share |
| --- | --- | --- |
| top-1 | 35/48 | 72.9% |
| top-8 | 46/48 | 95.8% |

The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. `just eval-live` measures the same cases through the live reranker.

## Authentication

Connect an entity with `ConnectionsService.InitiateConnection`, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.

### `api_key`

| Property | Value |
| --- | --- |
| Placement | `header` |
| Name | `Authorization` |
| Rendered as | `Token token={key}` |

Submit the key with `ConnectionsService` rather than putting it in a request; it is sealed at rest and never returned.

## Tools

35 action tools. The catalog-wide slug is `pagerduty.<tool>`, which is what `search_tools` returns and `call_tool` takes.

### `pagerduty.list_incidents`

List PagerDuty incidents, optionally filtered by status or service. Use when the user asks what's currently firing, what's on fire, or wants the whole incident queue rather than one known incident. For a single incident by id or number use get_incident.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /incidents`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `service_id` | string | no | Restrict to one service's incidents, from list_services. Omit for every service. |
| `since` | string | no | Only incidents created at or after this ISO 8601 timestamp. |
| `status` | string, one of triggered, acknowledged, resolved | no | Restrict to incidents in one status. Omit for the open set (triggered and acknowledged). |
| `until` | string | no | Only incidents created at or before this ISO 8601 timestamp. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `incidents` | array of object |  |
| `incidents[].created_at` | string |  |
| `incidents[].html_url` | string |  |
| `incidents[].id` | string |  |
| `incidents[].incident_number` | integer |  |
| `incidents[].service` | object |  |
| `incidents[].service.id` | string |  |
| `incidents[].service.summary` | string |  |
| `incidents[].status` | string |  |
| `incidents[].title` | string |  |
| `incidents[].urgency` | string |  |

Also retrieved by: "what's on fire right now", "show me everything currently paging", "what's in the incident queue", "browse every open incident", "what's actively firing across our services".

### `pagerduty.get_incident`

Get one PagerDuty incident's full detail by id or incident number: title, status, urgency, priority, service, escalation policy, and current assignments. Use when the user names a specific incident. For the whole queue use list_incidents.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /incidents/{{params.incident_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `incident_id` | string | **yes** | PagerDuty incident id or incident number, e.g. "PT4KHLK" or "1234", from list_incidents. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `incident` | object |  |
| `incident.assignments` | array of object |  |
| `incident.assignments[].assignee` | object |  |
| `incident.created_at` | string |  |
| `incident.escalation_policy` | object |  |
| `incident.escalation_policy.id` | string |  |
| `incident.escalation_policy.summary` | string |  |
| `incident.html_url` | string |  |
| `incident.id` | string |  |
| `incident.incident_number` | integer |  |
| `incident.priority` | object |  |
| `incident.priority.id` | string |  |
| `incident.priority.summary` | string |  |
| `incident.service` | object |  |
| `incident.service.id` | string |  |
| `incident.service.summary` | string |  |
| `incident.status` | string |  |
| `incident.title` | string |  |
| `incident.urgency` | string |  |

Also retrieved by: "pull up the details on this page", "what's going on with this incident", "check the status of this page", "show me what triggered this alert".

### `pagerduty.create_incident`

Open a new PagerDuty incident on a service. Use when the user wants to trigger, page, or manually declare an incident rather than wait for a monitoring alert to fire one. Requires the triggering user's email and the service to open it on; urgency, priority, and escalation policy are optional.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /incidents`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `escalation_policy` | object | no | Escalation policy reference object, e.g. {"id": "PXXXXXX"}, from list_escalation_policies. Omit to use the service's default policy. |
| `escalation_policy.id` | string | no |  |
| `from_email` | string | **yes** | Email of the PagerDuty user this incident is opened as. Sent as the required From header. |
| `priority` | object | no | Priority reference object, e.g. {"id": "PXXXXXX"}. Omit for no priority. |
| `priority.id` | string | no |  |
| `service_id` | string | **yes** | Service id to open the incident on, from list_services. |
| `title` | string | **yes** | Incident title. |
| `urgency` | string, one of high, low | no | Incident urgency. Omit for the service's default. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `incident` | object |  |
| `incident.created_at` | string |  |
| `incident.html_url` | string |  |
| `incident.id` | string |  |
| `incident.incident_number` | integer |  |
| `incident.service` | object |  |
| `incident.service.id` | string |  |
| `incident.service.summary` | string |  |
| `incident.status` | string |  |
| `incident.title` | string |  |
| `incident.urgency` | string |  |

Also retrieved by: "page the on-call team about this", "declare an incident for this outage", "manually trigger a page for this problem", "open an incident because something's down", "kick off an incident for this issue".

### `pagerduty.update_incident`

Edit a PagerDuty incident's own fields: title, urgency, priority, or escalation policy. Use when the user wants to retitle, reprioritize, or re-escalate an incident. For its status use acknowledge_incident or resolve_incident; for who owns it use assign_incident.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /incidents/{{params.incident_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `escalation_policy` | object | no | New escalation policy reference object, e.g. {"id": "PXXXXXX"}. Omit to leave unchanged. |
| `escalation_policy.id` | string | no |  |
| `from_email` | string | **yes** | Email of the PagerDuty user making this change. Sent as the required From header. |
| `incident_id` | string | **yes** | PagerDuty incident id or incident number, from list_incidents. |
| `priority` | object | no | New priority reference object, e.g. {"id": "PXXXXXX"}. Omit to leave unchanged. |
| `priority.id` | string | no |  |
| `title` | string | no | New title. |
| `urgency` | string, one of high, low | no | New urgency. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `incident` | object |  |
| `incident.escalation_policy` | object |  |
| `incident.escalation_policy.id` | string |  |
| `incident.escalation_policy.summary` | string |  |
| `incident.id` | string |  |
| `incident.priority` | object |  |
| `incident.priority.id` | string |  |
| `incident.priority.summary` | string |  |
| `incident.title` | string |  |
| `incident.urgency` | string |  |

Also retrieved by: "bump the severity on this incident", "retitle this page", "change which team this incident escalates through", "reprioritize this outage".

### `pagerduty.resolve_incident`

Resolve a PagerDuty incident, marking it fixed and stopping its escalation. Use when the user wants to resolve, close, or mark an incident done. Irreversible: a resolved incident does not reopen; a new incident is created instead if the problem recurs.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `PUT /incidents/{{params.incident_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `from_email` | string | **yes** | Email of the PagerDuty user resolving this incident. Sent as the required From header. |
| `incident_id` | string | **yes** | PagerDuty incident id or incident number, from list_incidents. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `incident` | object |  |
| `incident.id` | string |  |
| `incident.status` | string |  |

Also retrieved by: "mark this incident as fixed", "close out this page, it's handled", "stop the paging, this is resolved", "this outage is over, wrap it up".

### `pagerduty.acknowledge_incident`

Acknowledge a PagerDuty incident, marking that someone is actively working it and pausing further escalation. Use when the user wants to ack, claim, or confirm they're looking at an incident. To mark it fully fixed use resolve_incident instead.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /incidents/{{params.incident_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `from_email` | string | **yes** | Email of the PagerDuty user acknowledging this incident. Sent as the required From header. |
| `incident_id` | string | **yes** | PagerDuty incident id or incident number, from list_incidents. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `incident` | object |  |
| `incident.id` | string |  |
| `incident.status` | string |  |

Also retrieved by: "claim this page, I'm on it", "let the team know I'm looking into this", "ack this alert so it stops escalating", "confirm I've seen this incident".

### `pagerduty.assign_incident`

Reassign a PagerDuty incident to a different responder. Use when the user wants to hand off, reassign, or transfer ownership of an incident to someone else. For the incident's own fields use update_incident.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /incidents/{{params.incident_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `assignee_id` | string | **yes** | User id to assign the incident to, from list_users. |
| `from_email` | string | **yes** | Email of the PagerDuty user making this reassignment. Sent as the required From header. |
| `incident_id` | string | **yes** | PagerDuty incident id or incident number, from list_incidents. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `incident` | object |  |
| `incident.assignments` | array of object |  |
| `incident.assignments[].assignee` | object |  |
| `incident.id` | string |  |

Also retrieved by: "hand this page off to someone else", "reassign this incident to another responder", "put this outage on someone else's plate", "transfer ownership of this page".

### `pagerduty.snooze_incident`

Snooze a PagerDuty incident's escalation for a set duration without resolving it. Use when the user wants to postpone, silence, or delay further paging on an incident they're already aware of. The incident stays open and re-escalates once the snooze ends.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /incidents/{{params.incident_id}}/snooze`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `duration_seconds` | integer | **yes** | How long to snooze escalation for, in seconds, e.g. 3600 for one hour. |
| `from_email` | string | **yes** | Email of the PagerDuty user snoozing this incident. Sent as the required From header. |
| `incident_id` | string | **yes** | PagerDuty incident id or incident number, from list_incidents. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `incident` | object |  |
| `incident.id` | string |  |
| `incident.status` | string |  |

Also retrieved by: "silence this page for an hour", "hold off on escalating this for now", "delay the next page on this incident", "mute this alert for a bit, I'm aware".

### `pagerduty.merge_incidents`

Merge one or more PagerDuty incidents into a target incident. Use when the user wants to merge, combine, or fold duplicate incidents (often from the same underlying alert) into one. Irreversible: the merged-away incidents' own identity is gone.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `POST /incidents/{{params.incident_id}}/merge`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `from_email` | string | **yes** | Email of the PagerDuty user performing this merge. Sent as the required From header. |
| `incident_id` | string | **yes** | Target incident id that survives the merge, from list_incidents. |
| `source_incidents` | array of object | **yes** | Incident reference objects to merge into the target, e.g. [{"id": "PT4KHLK", "type": "incident_reference"}]. Ids from list_incidents. |
| `source_incidents[].id` | string | no |  |
| `source_incidents[].type` | string | no |  |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `incident` | object |  |
| `incident.id` | string |  |
| `incident.incident_number` | integer |  |
| `incident.status` | string |  |

Also retrieved by: "combine these duplicate pages into one", "fold these two alerts into a single incident", "these are the same outage, merge them".

### `pagerduty.list_incident_notes`

List the notes left on a PagerDuty incident, in order. Use when the user wants to read an incident's timeline of updates or investigation notes. To add a new one use add_incident_note.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /incidents/{{params.incident_id}}/notes`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `incident_id` | string | **yes** | PagerDuty incident id or incident number, from list_incidents. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `notes` | array of object |  |
| `notes[].content` | string |  |
| `notes[].created_at` | string |  |
| `notes[].id` | string |  |
| `notes[].user` | object |  |
| `notes[].user.id` | string |  |
| `notes[].user.summary` | string |  |

Also retrieved by: "what updates have people left on this incident", "read the investigation notes on this page", "show me the timeline of comments on this outage".

### `pagerduty.add_incident_note`

Post a new note on a PagerDuty incident, e.g. an update on root cause or remediation. Use when the user wants to note, log, or comment on an incident's investigation. For the incident's own fields use update_incident.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /incidents/{{params.incident_id}}/notes`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `content` | string | **yes** | Note text. |
| `from_email` | string | **yes** | Email of the PagerDuty user leaving this note. Sent as the required From header. |
| `incident_id` | string | **yes** | PagerDuty incident id or incident number, from list_incidents. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `note` | object |  |
| `note.content` | string |  |
| `note.created_at` | string |  |
| `note.id` | string |  |

Also retrieved by: "log what we found on this incident", "leave an update on the root cause", "note the remediation steps taken so far", "write down what's happening on this page".

### `pagerduty.list_incident_alerts`

List the individual alerts that triggered or attached to a PagerDuty incident. Use when the user wants to see what raw monitoring signals or events rolled up into an incident, not the incident's own summary.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /incidents/{{params.incident_id}}/alerts`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `incident_id` | string | **yes** | PagerDuty incident id or incident number, from list_incidents. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `alerts` | array of object |  |
| `alerts[].created_at` | string |  |
| `alerts[].id` | string |  |
| `alerts[].severity` | string |  |
| `alerts[].status` | string |  |
| `alerts[].summary` | string |  |

Also retrieved by: "what raw alerts rolled into this incident", "show me the monitoring events behind this page", "which signals fired that caused this outage".

### `pagerduty.list_escalation_policies`

List the escalation policies configured in PagerDuty. Use when the user asks what escalation paths or on-call chains exist, or wants a policy's id for a service or another tool.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /escalation_policies`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | no | Filter by name substring. Omit to list every policy. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `escalation_policies` | array of object |  |
| `escalation_policies[].description` | string |  |
| `escalation_policies[].id` | string |  |
| `escalation_policies[].name` | string |  |
| `escalation_policies[].num_loops` | integer |  |

Also retrieved by: "what escalation chains do we have set up", "show me the on-call paths configured", "browse every escalation policy".

### `pagerduty.get_escalation_policy`

Get one PagerDuty escalation policy's detail by id: its name and its rungs of targets and delays. Use when the user names a specific escalation policy. For the whole list use list_escalation_policies.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /escalation_policies/{{params.escalation_policy_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `escalation_policy_id` | string | **yes** | Escalation policy id, from list_escalation_policies. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `escalation_policy` | object |  |
| `escalation_policy.description` | string |  |
| `escalation_policy.escalation_rules` | array of object |  |
| `escalation_policy.escalation_rules[].escalation_delay_in_minutes` | integer |  |
| `escalation_policy.escalation_rules[].id` | string |  |
| `escalation_policy.escalation_rules[].targets` | array of object |  |
| `escalation_policy.id` | string |  |
| `escalation_policy.name` | string |  |
| `escalation_policy.num_loops` | integer |  |

Also retrieved by: "who gets paged first on this escalation path", "show me the rungs on this on-call chain", "what's the delay between steps on this policy".

### `pagerduty.create_escalation_policy`

Create a new PagerDuty escalation policy: an ordered chain of users or schedules to page, with a delay between each rung. Use when the user wants to set up a new escalation path or on-call chain.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /escalation_policies`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | Optional free-text description. |
| `escalation_rules` | array of object | **yes** | Ordered rungs, e.g. [{"escalation_delay_in_minutes": 10, "targets": [{"id": "PXXXXXX", "type": "user_reference"}]}]. Target type is "user_reference" or "schedule_reference". |
| `escalation_rules[].escalation_delay_in_minutes` | integer | no |  |
| `escalation_rules[].targets` | array of object | no |  |
| `escalation_rules[].targets[].id` | string | no |  |
| `escalation_rules[].targets[].type` | string | no |  |
| `name` | string | **yes** | Escalation policy name. |
| `num_loops` | integer | no | How many times to repeat the whole chain before giving up. Omit for PagerDuty's default. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `escalation_policy` | object |  |
| `escalation_policy.id` | string |  |
| `escalation_policy.name` | string |  |
| `escalation_policy.num_loops` | integer |  |

Also retrieved by: "set up a new paging chain", "build an on-call escalation path", "configure who gets paged and in what order".

### `pagerduty.update_escalation_policy`

Edit a PagerDuty escalation policy's name, description, or rungs of targets and delays. Use when the user wants to change who gets paged, in what order, or how quickly an escalation moves on.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /escalation_policies/{{params.escalation_policy_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | New free-text description. |
| `escalation_policy_id` | string | **yes** | Escalation policy id to edit, from list_escalation_policies. |
| `escalation_rules` | array of object | no | Replacement ordered rungs, same shape as create_escalation_policy. Omit to leave the rungs unchanged. |
| `escalation_rules[].escalation_delay_in_minutes` | integer | no |  |
| `escalation_rules[].targets` | array of object | no |  |
| `escalation_rules[].targets[].id` | string | no |  |
| `escalation_rules[].targets[].type` | string | no |  |
| `name` | string | no | New name. |
| `num_loops` | integer | no | New loop count. Omit to leave unchanged. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `escalation_policy` | object |  |
| `escalation_policy.id` | string |  |
| `escalation_policy.name` | string |  |
| `escalation_policy.num_loops` | integer |  |

Also retrieved by: "change who gets paged first on this chain", "reorder the rungs on this escalation path", "adjust the delay before the next person gets paged".

### `pagerduty.delete_escalation_policy`

Permanently delete a PagerDuty escalation policy. Use when the user wants to delete or remove an escalation path for good. Irreversible; fails if a service still depends on the policy.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /escalation_policies/{{params.escalation_policy_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `escalation_policy_id` | string | **yes** | Escalation policy id to delete, from list_escalation_policies. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove this paging chain for good", "get rid of this escalation path entirely", "wipe out this on-call chain permanently".

### `pagerduty.list_schedules`

List the on-call schedules configured in PagerDuty. Use when the user asks what rotations or schedules exist, or wants a schedule's id for another tool. For who is on call right now use list_oncalls.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /schedules`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | no | Filter by name substring. Omit to list every schedule. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `schedules` | array of object |  |
| `schedules[].id` | string |  |
| `schedules[].name` | string |  |
| `schedules[].time_zone` | string |  |

Also retrieved by: "what on-call rotations exist", "show me every schedule we have set up", "browse the on-call calendars".

### `pagerduty.get_schedule`

Get one PagerDuty on-call schedule's detail by id: its name, time zone, and rotation layers. Use when the user names a specific schedule or rotation. For the whole list use list_schedules.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /schedules/{{params.schedule_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `schedule_id` | string | **yes** | Schedule id, from list_schedules. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `schedule` | object |  |
| `schedule.description` | string |  |
| `schedule.html_url` | string |  |
| `schedule.id` | string |  |
| `schedule.name` | string |  |
| `schedule.schedule_layers` | array of object |  |
| `schedule.schedule_layers[].id` | string |  |
| `schedule.schedule_layers[].name` | string |  |
| `schedule.schedule_layers[].rotation_turn_length_seconds` | integer |  |
| `schedule.schedule_layers[].start` | string |  |
| `schedule.time_zone` | string |  |

Also retrieved by: "show me this rotation's layers", "what time zone does this on-call calendar run in", "pull up the details on this rotation".

### `pagerduty.create_schedule`

Create a new PagerDuty on-call schedule: a rotation of users across one or more layers in a time zone. Use when the user wants to set up a new on-call rotation. For a one-off shift swap on an existing schedule use create_schedule_override instead.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /schedules`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | Optional free-text description. |
| `name` | string | **yes** | Schedule name. |
| `schedule_layers` | array of object | **yes** | Rotation layers, e.g. [{"name": "Primary", "start": "2026-08-01T00:00:00-04:00", "rotation_virtual_start": "2026-08-01T00:00:00-04:00", "rotation_turn_length_seconds": 604800, "users": [{"user": {"id": "PXXXXXX", "type": "user_reference"}}]}]. User ids from list_users. |
| `schedule_layers[].name` | string | no |  |
| `schedule_layers[].rotation_turn_length_seconds` | integer | no |  |
| `schedule_layers[].rotation_virtual_start` | string | no |  |
| `schedule_layers[].start` | string | no |  |
| `schedule_layers[].users` | array of object | no |  |
| `schedule_layers[].users[].user` | object | no |  |
| `time_zone` | string | **yes** | IANA time zone the schedule runs in, e.g. "America/New_York". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `schedule` | object |  |
| `schedule.id` | string |  |
| `schedule.name` | string |  |
| `schedule.time_zone` | string |  |

Also retrieved by: "set up a new on-call rotation", "build a weekly paging schedule", "configure a rotation across the team".

### `pagerduty.update_schedule`

Edit a PagerDuty on-call schedule's name, time zone, or rotation layers. Use when the user wants to change how an existing rotation is built, not swap one shift; for a one-off swap use create_schedule_override.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /schedules/{{params.schedule_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | New free-text description. |
| `name` | string | no | New name. |
| `schedule_id` | string | **yes** | Schedule id to edit, from list_schedules. |
| `schedule_layers` | array of object | no | Replacement rotation layers, same shape as create_schedule. Omit to leave the layers unchanged. |
| `schedule_layers[].name` | string | no |  |
| `schedule_layers[].rotation_turn_length_seconds` | integer | no |  |
| `schedule_layers[].rotation_virtual_start` | string | no |  |
| `schedule_layers[].start` | string | no |  |
| `schedule_layers[].users` | array of object | no |  |
| `schedule_layers[].users[].user` | object | no |  |
| `time_zone` | string | no | New IANA time zone, e.g. "America/New_York". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `schedule` | object |  |
| `schedule.id` | string |  |
| `schedule.name` | string |  |
| `schedule.time_zone` | string |  |

Also retrieved by: "change the time zone on this rotation", "edit the layers on this on-call calendar", "adjust who's in this rotation".

### `pagerduty.delete_schedule`

Permanently delete a PagerDuty on-call schedule. Use when the user wants to delete or remove a rotation for good. Irreversible; fails if an escalation policy still depends on the schedule.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /schedules/{{params.schedule_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `schedule_id` | string | **yes** | Schedule id to delete, from list_schedules. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove this on-call rotation for good", "get rid of this schedule entirely", "wipe out this rotation permanently".

### `pagerduty.list_schedule_overrides`

List the temporary overrides on a PagerDuty schedule within a date range: one-off swaps to the normal rotation. Use when the user asks who is covering a schedule on a specific day outside the regular rotation.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /schedules/{{params.schedule_id}}/overrides`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `schedule_id` | string | **yes** | Schedule id, from list_schedules. |
| `since` | string | **yes** | Start of the date range, ISO 8601 timestamp. |
| `until` | string | **yes** | End of the date range, ISO 8601 timestamp. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `overrides` | array of object |  |
| `overrides[].end` | string |  |
| `overrides[].id` | string |  |
| `overrides[].start` | string |  |
| `overrides[].user` | object |  |
| `overrides[].user.id` | string |  |
| `overrides[].user.summary` | string |  |

Also retrieved by: "who's covering this weekend outside the normal rotation", "show me the shift swaps on this schedule", "what one-off changes are on this calendar this week".

### `pagerduty.create_schedule_override`

Add a temporary override to a PagerDuty schedule, swapping in a different user for a set time window. Use when the user wants to cover, swap, or fill in for someone's on-call shift without changing the underlying rotation.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /schedules/{{params.schedule_id}}/overrides`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `end` | string | **yes** | Override end, ISO 8601 timestamp. |
| `schedule_id` | string | **yes** | Schedule id to override, from list_schedules. |
| `start` | string | **yes** | Override start, ISO 8601 timestamp. |
| `user_id` | string | **yes** | User id to cover the override, from list_users. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `override` | object |  |
| `override.end` | string |  |
| `override.id` | string |  |
| `override.start` | string |  |
| `override.user` | object |  |
| `override.user.id` | string |  |
| `override.user.summary` | string |  |

Also retrieved by: "swap someone in for tomorrow's on-call shift", "cover this rotation while someone's out", "put a substitute on call for the weekend".

### `pagerduty.list_oncalls`

List who is on call right now across PagerDuty schedules and escalation policies. Use when the user asks who's on call, who's covering, or who will get paged next. For a rotation's own setup use list_schedules or list_escalation_policies.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /oncalls`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `escalation_policy_id` | string | no | Restrict to one escalation policy's on-call chain. Omit for every policy. |
| `schedule_id` | string | no | Restrict to one schedule. Omit for every schedule. |
| `since` | string | no | Start of the time window to check, ISO 8601 timestamp. Omit for right now. |
| `until` | string | no | End of the time window to check, ISO 8601 timestamp. Omit for right now. |
| `user_id` | string | no | Restrict to one user's on-call shifts. Omit for every user. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `oncalls` | array of object |  |
| `oncalls[].end` | string |  |
| `oncalls[].escalation_level` | integer |  |
| `oncalls[].escalation_policy` | object |  |
| `oncalls[].escalation_policy.id` | string |  |
| `oncalls[].escalation_policy.summary` | string |  |
| `oncalls[].schedule` | object |  |
| `oncalls[].schedule.id` | string |  |
| `oncalls[].schedule.summary` | string |  |
| `oncalls[].start` | string |  |
| `oncalls[].user` | object |  |
| `oncalls[].user.id` | string |  |
| `oncalls[].user.summary` | string |  |

Also retrieved by: "who's on call right now", "who's going to get paged next", "who's covering tonight", "check who's currently responsible for pages".

### `pagerduty.list_services`

List the services configured in PagerDuty, each representing a monitored system that can open incidents. Use when the user asks what services exist, or wants a service's id for create_incident or another tool.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | no | Filter by name substring. Omit to list every service. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `services` | array of object |  |
| `services[].escalation_policy` | object |  |
| `services[].escalation_policy.id` | string |  |
| `services[].escalation_policy.summary` | string |  |
| `services[].id` | string |  |
| `services[].name` | string |  |
| `services[].status` | string |  |

Also retrieved by: "what monitored systems do we have set up", "show me every service that can open a page", "browse the list of integrations".

### `pagerduty.get_service`

Get one PagerDuty service's detail by id: its name, status, and escalation policy. Use when the user names a specific service or system. For the whole list use list_services.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/{{params.service_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `service_id` | string | **yes** | Service id, from list_services. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `service` | object |  |
| `service.description` | string |  |
| `service.escalation_policy` | object |  |
| `service.escalation_policy.id` | string |  |
| `service.escalation_policy.summary` | string |  |
| `service.html_url` | string |  |
| `service.id` | string |  |
| `service.name` | string |  |
| `service.status` | string |  |

Also retrieved by: "which escalation path does this service follow", "show me the details on this monitored system", "check the status of this service's setup".

### `pagerduty.create_service`

Create a new PagerDuty service: a monitored system that opens incidents against an escalation policy. Use when the user wants to add, register, or set up a new service or integration target.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `alert_creation` | string, one of create_alerts_and_incidents, create_incidents | no | Whether alerts open incidents (default) or are grouped as alerts on existing ones. |
| `description` | string | no | Optional free-text description. |
| `escalation_policy_id` | string | **yes** | Escalation policy id this service's incidents follow, from list_escalation_policies. |
| `name` | string | **yes** | Service name. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `service` | object |  |
| `service.id` | string |  |
| `service.name` | string |  |
| `service.status` | string |  |

Also retrieved by: "set up a new system to page on", "register a new integration target", "add a service that opens incidents".

### `pagerduty.update_service`

Edit a PagerDuty service's name, description, or escalation policy. Use when the user wants to rename a service or change which escalation path its incidents follow.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /services/{{params.service_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | New free-text description. |
| `escalation_policy` | object | no | New escalation policy reference object, e.g. {"id": "PXXXXXX"}. Omit to leave unchanged. |
| `escalation_policy.id` | string | no |  |
| `name` | string | no | New name. |
| `service_id` | string | **yes** | Service id to edit, from list_services. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `service` | object |  |
| `service.escalation_policy` | object |  |
| `service.escalation_policy.id` | string |  |
| `service.escalation_policy.summary` | string |  |
| `service.id` | string |  |
| `service.name` | string |  |

Also retrieved by: "rename this monitored system", "change which escalation chain this service uses", "edit this integration's description".

### `pagerduty.delete_service`

Permanently delete a PagerDuty service. Use when the user wants to delete or remove a service for good. Irreversible; its incident history goes with it.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /services/{{params.service_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `service_id` | string | **yes** | Service id to delete, from list_services. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove this monitored system for good", "get rid of this integration entirely", "wipe out this service permanently".

### `pagerduty.list_users`

List the users in a PagerDuty account. Use when the user asks who has an account, or wants a user's id for an escalation policy, schedule, or another tool. For one known person use get_user.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /users`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | no | Filter by name or email substring. Omit to list every user. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `users` | array of object |  |
| `users[].email` | string |  |
| `users[].id` | string |  |
| `users[].name` | string |  |
| `users[].role` | string |  |

Also retrieved by: "who has an account in our pagerduty", "show me everyone on the team", "browse every person set up".

### `pagerduty.get_user`

Get one PagerDuty user's profile by id: name, email, role, and time zone. Use when the user names a specific person. For the whole list use list_users.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /users/{{params.user_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `user_id` | string | **yes** | User id, from list_users. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `user` | object |  |
| `user.email` | string |  |
| `user.id` | string |  |
| `user.job_title` | string |  |
| `user.name` | string |  |
| `user.role` | string |  |
| `user.time_zone` | string |  |

Also retrieved by: "pull up someone's profile", "what's this person's role and time zone", "check someone's contact details".

### `pagerduty.create_user`

Create a new PagerDuty user account. Use when the user wants to add, invite, or register a new person to the PagerDuty account. Requires a name and email.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /users`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `email` | string | **yes** | Email address. |
| `job_title` | string | no | Optional job title. |
| `name` | string | **yes** | Full name. |
| `role` | string, one of admin, limited_user, observer, owner, read_only_user, read_only_limited_user, restricted_access, user | no | PagerDuty role to grant. Omit for the account's default role. |
| `time_zone` | string | no | IANA time zone, e.g. "America/New_York". Omit for the account default. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `user` | object |  |
| `user.email` | string |  |
| `user.id` | string |  |
| `user.name` | string |  |
| `user.role` | string |  |

Also retrieved by: "invite a new teammate", "add someone new to the account", "register a new person".

### `pagerduty.update_user`

Edit a PagerDuty user's name, email, role, or time zone. Use when the user wants to edit or correct someone's own profile details.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /users/{{params.user_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `email` | string | no | New email address. |
| `job_title` | string | no | New job title. |
| `name` | string | no | New full name. |
| `role` | string, one of admin, limited_user, observer, owner, read_only_user, read_only_limited_user, restricted_access, user | no | New PagerDuty role. |
| `time_zone` | string | no | New IANA time zone, e.g. "America/New_York". |
| `user_id` | string | **yes** | User id to edit, from list_users. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `user` | object |  |
| `user.email` | string |  |
| `user.id` | string |  |
| `user.name` | string |  |
| `user.role` | string |  |

Also retrieved by: "fix someone's time zone", "change a teammate's role", "correct someone's email on file".

### `pagerduty.delete_user`

Permanently delete a PagerDuty user account. Use when the user wants to remove or delete someone's account for good. Irreversible; fails if the user is still referenced by an escalation policy or schedule.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /users/{{params.user_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `user_id` | string | **yes** | User id to delete, from list_users. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove someone's account for good", "take this person off the account entirely", "wipe out this teammate's profile permanently".
