MCP server for LLM agents to interact with PagerDuty SaaS
The server provides 11 well-structured tools with comprehensive input schemas and descriptions. Tool naming follows verb_noun conventions (get_*, create_*, acknowledge_*, resolve_*, reassign_*), which is correct. All tools have detailed parameter descriptions with type information. However, there are significant gaps in output schema documentation, the source code does not show explicit output schema definitions for any tool. Tool descriptions are adequate (60-150 chars) but lack specificity about when to use each tool vs. alternatives. Parameter validation is good, with enum-like constraints mentioned in descriptions for status/urgency fields in get_incidents, but not formally encoded as JSON Schema enums. Error handling is present via ToolError wrapper and validation decorators, but recovery guidance is minimal. The validation decorator approach (@validation.validate_include_parameter) suggests schema enforcement, but the actual schema documents are not visible in the provided source. Security is handled via environment-based credential injection (keyring), which is correct. Overall, the tools are usable and reasonably well-designed, but lack the polish needed for a 70+ score due to missing output schemas and shallow error guidance.
Acknowledge a PagerDuty incident.
Create a note on a PagerDuty incident.
Get PagerDuty escalation policies by filters or get details for a specific policy ID.
Get PagerDuty incidents by filters or get details for a specific incident ID or number.
Get PagerDuty on-call schedules and users.
Get PagerDuty schedules by filters or get details for a specific schedule ID.
No explicit output schema documentation visible in source. Tools return dict[str, Any] but the structure of that response is not documented. LLMs cannot plan downstream calls or extract chaining IDs without knowing what fields are present.
Error handling uses ToolError wrapper but does not provide recovery guidance. When an API error occurs, the response is the raw API error text. No suggestions for how to fix invalid inputs or what to try next.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 62 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 46 | - | v1 |
Get PagerDuty services by filters or get details for a specific service ID.
Get PagerDuty teams by filters or get details for a specific team ID.
Get PagerDuty users by filters or get details for a specific user ID.
Reassign a PagerDuty incident to users or escalation policies.
Resolve a PagerDuty incident.
Enum-like constraints (e.g. statuses=[triggered, acknowledged, resolved], urgencies=[high, low]) are mentioned in descriptions but not formalized as JSON Schema enum constraints. This forces LLMs to rely on natural language parsing rather than machine-readable options.
Tool descriptions lack specificity about when to use each tool vs. alternatives. For example, get_incidents, get_oncalls, get_schedules, get_services, get_teams, and get_users all follow similar patterns (filter by ID or search), but the descriptions do not clearly distinguish when to use each. LLMs may waste reasoning cycles deciding between similar tools.
get_incidents has include_past_incidents and include_related_incidents parameters that only work when incident_id is provided. This interdependency is documented in descriptions but is a footgun for LLM composition. The tool could offer separate tools or clearer error messages when these are misused.
No confirmation mechanism for destructive operations. acknowledge_incident, resolve_incident, reassign_incident, and create_incident_note all modify state, but there is no dry-run or confirmation step. Agents can accidentally resolve a critical incident without warning.