PagerDuty MCP server: 101 tools, read-only at 63 by default
PagerDuty starts safer than most connectors. One transport setting removes that protection.
Last verified 1 September 2026 · from PagerDuty's repository, its documentation and the server's own tools/list response
This page is one of 90 in a directory of monitoring and developer tools. Each page checks what an AI coding agent can get out of the tool through its MCP server, the connector that lets the agent query the tool directly.
Summary
PagerDuty publishes an official MCP server that runs locally. It starts read-only, which most connectors in this guide do not.
63 of its 101 tools are available by default. The 38 that change your PagerDuty account need --enable-write-tools, which is a deliberate step rather than a default.
On streamable HTTP or SSE the endpoint has no authentication, and every request uses the single API key the server started with.
What is the PagerDuty MCP server?
It is PagerDuty's server for the Model Context Protocol. The agent gains tools for reading incidents, schedules, escalation policies and services.
It runs on your machine. There is no authenticated hosted endpoint, so the server holds a PagerDuty user API key and acts with that user's permissions.
Read-only is the default state rather than a flag you remember to set. Write tools are absent from the tool list entirely until the server is started with --enable-write-tools, so an agent cannot call one by accident.
PagerDuty covers production observability partially through incident response, and reaches nothing in code review, release, agent observability or cost.
| Part of the work | What PagerDuty has here | Can an agent reach it |
|---|---|---|
| Code, tests & review | None | No code-review product |
| CI & release | Change events | Partial. Change events record that a deploy happened, which is release context rather than a pipeline |
| Production observability | Incidents, alerts, escalation, on-call schedules | Partial. Specific. PagerDuty holds the human response to an outage, not the telemetry that detected it |
| Agent observability & evals | None | No traces, evaluations or prompt versioning for your own agents |
| AI cost management | None | No token or model spend data |
For an agent, PagerDuty answers questions about who was paged and what happened next, and nothing about why the system broke. An agent connected here can tell you which service alerted, who was on call and how long acknowledgement took. It cannot show you the failing query behind it, so this connector sits beside a telemetry one.
What can an AI agent do with PagerDuty?
| Task | Tools | Works | Watch out for |
|---|---|---|---|
| Understand a live incident | get_incident list_incidents get_alert_from_incident | Yes | Incident detail, not the underlying telemetry |
| Find who is on call now | list_oncalls get_escalation_policy list_schedules | Yes | Overrides matter; read the schedule rather than the rotation alone |
| Review how a service is configured | get_service list_services get_business_service_dependencies | Yes | Dependencies are what someone declared, not what the system does |
| Check what changed before the page | get_change_event list_change_events | Yes | Only present if your pipeline sends change events to PagerDuty |
| Analyze response performance | list_log_entries list_alerts_from_incident | Yes | Log entries are the incident timeline, not application logs |
| Acknowledge or resolve an incident | Enable --enable-write-tools manage_incidents add_note_to_incident add_responders | Yes | Absent by default. Enabling writes adds 38 tools, including create_incident |
| Explain why the service degraded | No | No tool covers this. PagerDuty records the response, not the cause, so there are no metrics, logs or traces |
The write row behaves differently from the read rows. Its tools are not disabled but absent: on a default connection they are not in tools/list at all, so an agent cannot see them, describe them or call them.
101 tools registered, of which 63 need no write flag
- Incidents6
get_incidentlist_incidentsget_alert_from_incidentlist_alerts_from_incidentget_past_incidentsget_related_incidents- Incidents, write4
create_incidentmanage_incidentsadd_note_to_incidentadd_responders- On call3
list_oncallslist_schedulesget_escalation_policy- Schedules, write3
create_schedulecreate_schedule_overridecreate_schedule_v3_rotation- Services3
get_servicelist_servicesget_business_service_dependencies- Change and analytics4
get_change_eventlist_change_eventsget_incident_metrics_allget_incident_metrics_by_service- Timeline2
get_log_entrylist_log_entries- Teams and users, write3
create_teamcreate_useradd_team_member
The write groups are absent from tools/list entirely unless the server is started with --enable-write-tools, so an agent on a default connection cannot see or describe them. Of the 101 registered, 28 are named here. Counted from the server's own response on 19 August 2026, captured twice.
What connecting costs before the first question
A context window is the amount of text a model can hold at once, and connecting uses some of it before the agent asks anything. Every tool the server registers sends its name, description and input schema to the model when the session starts. The tool list is charged whether or not a single tool is called.
Enabling writes here is expensive twice over. It adds 38 tools that can change your on-call configuration, and it takes the connector from roughly 6% of a 200,000-token window to roughly 16%.
| Tool set | Tools | Tokens (GPT-5.6, GPT-5.5) | Tokens (GPT-4, GPT-3.5) | Tokens (Claude Haiku 4.5 to Opus 5) | Share of a 200,000-token window |
|---|---|---|---|---|---|
| Read-only, the default | 63 | 12,695 to 19,287 | 12,371 to 19,304 | 17,684 to 23,063 | 6.2% to 11.5% |
| With --enable-write-tools | 101 | 31,904 to 48,129 | 31,058 to 48,209 | 43,430 to 57,729 | 15.5% to 28.9% |
Encodings: GPT-5.6, GPT-5.5 o200k_base; GPT-4, GPT-3.5 cl100k_base; Claude Haiku 4.5 to Opus 5 count_tokens. Counted 19 August 2026 from tools/list on pagerduty-mcp 1.1.0, run locally with a placeholder key. It ran once with defaults and once with --enable-write-tools.
Registration is static, so no PagerDuty account was involved. Figures cover name, description and input schema. The two models in column one share the o200k_base encoding, so they get one count. The spread is formatting, about 52%. Reasoning tokens are output, spent per request. The tool list is input, charged once at connection.
The Claude figures are measured rather than encoded. Anthropic publishes no local tokenizer, so the definitions were sent to the API's count_tokens endpoint and a no-tools baseline subtracted. The range covers two tokenizer generations rather than two serializations. Haiku 4.5 and Opus 4.6 sit at the low end, Opus 5 and Sonnet 5 at the high end. The gap between them is about a third.
PagerDuty MCP server limits: where answers come back incomplete
PagerDuty documents every limit below. The first is the sharpest, and it appears as a warning in the repository's own README.
The agent says: “The server is running locally, so it is private.” On HTTP transports it is open to anything that can reach the port.
PagerDuty states it plainly: when running streamable-http or sse, the MCP endpoint is exposed with no authentication, and every request uses the single PAGERDUTY_USER_API_KEY the server was started with.
Any client that can reach the host and port can invoke tools with that key's full PagerDuty privileges. If the server was also started with --enable-write-tools, that includes creating incidents and changing schedules.
Guard: Use stdio unless you have a specific reason not to. If you need HTTP, bind it to localhost and put an authenticating proxy in front of it.
The agent says: “I have no tool for acknowledging an incident.” Correct, and that is the default.
The server exposes read-only tools unless started with --enable-write-tools. The 38 write tools are not listed at all in the default state, so the agent is telling the truth about what it can see.
This is the safer failure. An agent that cannot see a tool cannot call it by mistake, which is a stronger guarantee than a tool that exists and is discouraged.
Guard: Keep the default for investigation. Start a separate server with writes enabled only for a session where changing PagerDuty is the point.
The agent says: “Nothing changed before the incident.” Nothing was sent to PagerDuty.
Change events exist only if your deployment pipeline sends them. A pipeline that never integrated produces a real, empty answer, and the response does not distinguish that from a quiet period.
Guard: Confirm the change-events integration exists before treating an empty result as evidence that nothing shipped.
How to configure PagerDuty MCP for agents
- 1
Keep the read-only default
Write tools are omitted from the tool list rather than disabled, which is a stronger guarantee than a flag an agent is asked to respect. Start a separate server with
--enable-write-toolsonly for a session where changing PagerDuty is the point. - 2
Use stdio unless you have a reason not to
On
streamable-httporssethe endpoint has no authentication at all, and every request uses the single API key the server started with. - 3
Scope the key to a user
PAGERDUTY_USER_API_KEYis a user token, so the agent inherits that user's permissions across every team and service they can reach. - 4
Budget the context
Read-only costs about 12,695 tokens, roughly 6% of a 200,000-token window. Enabling writes takes it to about 31,904, roughly 16%.
Paste this into your agent’s instructions
PagerDuty's silent failure is absence rather than truncation: change events that were never sent, and write tools that are not there. The block makes the agent distinguish an empty result from an unconfigured integration.
When you answer using PagerDuty MCP tools, state: - Whether write tools are available in this session. They are absent unless the server was started with --enable-write-tools. - The time window you searched, and the service or team scope. - Whether change events exist for the period. They appear only if a pipeline sends them, so an empty result is not evidence that nothing shipped. Never state that data does not exist. State that none was returned under the constraints above. Write your answer in ASD-STE100 Simplified Technical English. Use short sentences with one idea in each.
Do you need the MCP server at all?
Sometimes. PagerDuty's REST API is well documented and a coding agent can call it with the same user API key, which is what the server does underneath.
The server earns its place through the read-only default and the tool descriptions. Raw API calls give you the same safety only if you build the allowlist yourself. An agent choosing endpoints without descriptions chooses less well.
The trade is context. 63 tool definitions cost roughly 6% of a window before the agent asks anything, where a curated set of three or four API calls costs nothing.
Connect the server for open-ended incident investigation. Call the API directly when the question is fixed and you want the context back.
PagerDuty MCP server setup
The server runs locally from PyPI or Docker. It needs a PagerDuty user API key in PAGERDUTY_USER_API_KEY, and PAGERDUTY_API_HOST if your account is not on the default host.
There is no hosted endpoint, so every user runs a process holding that key.
Claude Code, read-only
This is the default state: the 38 write tools are simply not registered.
claude mcp add-json "pagerduty" '{"command":"uvx",
"args":["pagerduty-mcp"],
"env":{"PAGERDUTY_USER_API_KEY":"<your-key>"}}'Cursor
In ~/.cursor/mcp.json for all projects, or .cursor/mcp.json in one.
{"mcpServers":{"pagerduty":{"command":"uvx",
"args":["pagerduty-mcp"],
"env":{"PAGERDUTY_USER_API_KEY":"<your-key>"}}}}Codex CLI
Codex reads TOML, so the JSON blocks above will not transfer.
[mcp_servers.pagerduty]
command = "uvx"
args = ["pagerduty-mcp"]
env = { PAGERDUTY_USER_API_KEY = "<your-key>" }Every other client
Each block below is the configuration for one client, with the file path and the key that client expects.
Claude Desktop
macOS ~/Library/Application Support/Claude/claude_desktop_config.json. Windows %APPDATA%\Claude\claude_desktop_config.json. There is no CLI. Edit through Settings, Developer, Edit Config.
Quit and restart fully for changes to load. Paths in args must be absolute. Logs at ~/Library/Logs/Claude/mcp.log.
{"mcpServers":{"pagerduty":{"command":"uvx",
"args":["pagerduty-mcp"],
"env":{"PAGERDUTY_USER_API_KEY":"<your-key>"}}}}Gemini CLI
~/.gemini/settings.json globally, or .gemini/settings.json per project. Key mcpServers. CLI: gemini mcp add.
{"mcpServers":{"pagerduty":{"command":"uvx",
"args":["pagerduty-mcp"],
"env":{"PAGERDUTY_USER_API_KEY":"<your-key>"}}}}VS Code Copilot
.vscode/mcp.json per workspace, or your user profile. CLI: code --add-mcp.
{"servers":{"pagerduty":{"command":"uvx",
"args":["pagerduty-mcp"],
"env":{"PAGERDUTY_USER_API_KEY":"<your-key>"}}}}The key is `servers`, not `mcpServers`. VS Code is the only client that uses that name, and copying a config from anywhere else fails silently.
Windsurf
~/.codeium/windsurf/mcp_config.json, which is the path Windsurf documents. Key mcpServers, the same JSON shape as Cursor, carrying the same user API key.
Zed
~/.config/zed/settings.json, carrying the same user API key as the blocks above.
The key is `context_servers`. Zed does not call them MCP servers in config, so searching its settings for mcp finds nothing.
Google Antigravity
~/.gemini/config/mcp_config.json globally, or .agents/mcp_config.json per project. Key mcpServers. There is no CLI. Use the /mcp overlay in the editor. Supports stdio, streamable HTTP, SSE and websocket.
{"mcpServers":{"pagerduty":{"command":"uvx",
"args":["pagerduty-mcp"],
"env":{"PAGERDUTY_USER_API_KEY":"<your-key>"}}}}Amp (Sourcegraph)
~/.config/amp/settings.json or .amp/settings.json, carrying the same user API key. The amp mcp CLI covers approve, doctor and oauth.
The key is `amp.mcpServers`, namespaced. A bare mcpServers block is ignored.
Cline
~/.cline/mcp.json per the docs. The source also reads ~/.cline/data/settings/cline_mcp_settings.json. Key mcpServers, standard JSON shape, carrying the same user API key. Supports stdio, streamable HTTP and SSE.
Goose (Block)
~/.config/goose/config.yaml, carrying the same user API key.
YAML, and servers are called `extensions`. Goose does not use the MCP vocabulary in config at all. Add one interactively with goose configure, or per session with goose session --with-extension.
Kiro (AWS)
.kiro/settings/mcp.json per workspace, or ~/.kiro/settings/mcp.json globally. Key mcpServers, standard JSON shape, carrying the same user API key.
Warp
~/.warp/.mcp.json or .warp/.mcp.json. Key mcpServers, standard shape, carrying the same user API key. Also addable through the /agent-add-mcp skill.
JetBrains Junie
.junie/mcp/mcp.json per project, or ~/.junie/mcp/mcp.json. Key mcpServers, carrying the same user API key. Use /mcp in the CLI to manage.
Roo Code
.roo/mcp.json per project. The global file is mcp_settings.json, opened from the Roo Code MCP settings view with Edit Global MCP. Key mcpServers, carrying the same user API key.
Continue
.continue/mcpServers/*.yaml, one file per server, carrying the same user API key.
YAML, and `mcpServers` is a list, not an object. Every JSON client keys servers by name. Continue takes an array, so a converted config will not parse.
Trae
.trae/mcp.json per project, or paste into the UI under Raw Config (JSON). Key mcpServers, standard shape, carrying the same user API key.
Devin
Devin has no config file to edit. Servers are added through a web form in the settings UI, and Devin's documentation states you do not need to write or paste JSON. The block below is the shape those fields describe, shown for reference. Either route uses the same user API key.
With write tools enabled
Run this as a separate entry rather than replacing the read-only one, so an investigation session cannot reach it.
uvx pagerduty-mcp --enable-write-tools
# env: PAGERDUTY_USER_API_KEY=<your-key>Docker
Same key, same flags, without putting the package on your machine.
docker run -i --rm -e PAGERDUTY_USER_API_KEY \ pagerduty-mcp:latest
Read-only access, permissions and security
Read-only by construction
Write tools are absent from
tools/listwithout--enable-write-tools, so an agent cannot see, describe or call them. That is stronger than a flag it is asked to honor.HTTP transports have no authentication
PagerDuty documents that
streamable-httpandsse, which is server-sent events, expose the endpoint with no authentication, and that every request uses the single API key the server holds. Any client that can reach the port acts with that key's full privileges.The key is a user key
The agent inherits one person's permissions across every team and service they can reach, so scope it to a user with the access you would give an agent.
The server declares its own read-only tools
63 of the 101 carry a
readOnlyHintof true. That is the MCP field a server sets to mark a tool as one that does not change anything, and it matches the default set exactly.
Troubleshooting
- The agent has no tool for acknowledging an incident
- That is the default. Write tools appear only when the server is started with
--enable-write-tools, and until then they are not in the tool list at all. - 401 on connect
PAGERDUTY_USER_API_KEYis missing or not a user key. If your account is on a non-default host, setPAGERDUTY_API_HOSTas well.- No change events for the period
- Change events exist only if your deployment pipeline sends them. An unintegrated pipeline produces the same empty result as a quiet period.
- Another machine is using your server
- The HTTP transports have no authentication. Bind to localhost, or put an authenticating proxy in front of the endpoint.
PagerDuty MCP server: Reference
| Item | Value |
|---|---|
| Status | PyPI 1.1.0 on 7 July 2026 · repository pushed 27 August 2026 |
| Adoption | 76 stars · Apache 2.0 license |
| Package | pagerduty-mcp on PyPI, plus a Docker image. No hosted endpoint |
| Transport | stdio, streamable HTTP and SSE. The HTTP transports carry no authentication |
| Auth | PAGERDUTY_USER_API_KEY, a user token carrying that user's permissions |
| Tools | 101 registered · 63 without the write flag · 63 marked read-only by the server |
| Read-only | The default. Writes need --enable-write-tools |
What engineers report
The server is at PyPI 1.1.0 of 7 July 2026, Apache 2.0, with 76 stars. Public discussion is small, so the two issues below are the whole record rather than a sample.
| What was checked | What it shows |
|---|---|
| Stars | 76 |
| Latest release | PyPI 1.1.0, 7 July 2026 |
| License | Apache 2.0 |
| Tools | 101 registered, of which 63 need no flag |
| Hosted endpoint | None; local only |
“The PagerDuty MCP server is great! But it exposes a bit too many tools, especially given LLMs today will have degraded performance with the increase number of MCP tools available to them.”
“The MCP implementation does not support OAuth2 Tokens. The underlying api expects the Authorization header to be slightly different between API keys and OAuth2 Tokens.”
Repository facts from the GitHub API and package facts from PyPI, both retrieved 19 August 2026. Tool counts come from the server's own tools/list response, captured twice: once with defaults and once with --enable-write-tools.
Should you connect an agent to PagerDuty?
Yes. Best for PagerDuty teams connecting over stdio, keeping the read-only default for investigation work.
- Strongest fit
- Teams who want an agent reading incident history, on-call schedules and escalation policies during or after an outage.
- Main advantage
- Read-only by default, implemented by leaving write tools out of the tool list rather than by asking the agent not to use them.
- Main weakness
- No hosted endpoint, so every user runs a local process holding a PagerDuty user API key.
- Operational risk
- The HTTP transports ship with no authentication and share one API key across every caller.
From Oodle
One platform for agent traces and infrastructure
Agent traces usually sit in a different product from the rest of your telemetry, so when a slow database makes an agent slow the symptom is in one tool and the cause is in another. Oodle keeps both in one query surface, from $10 per million spans.
See agent observabilityFrequently asked questions
How many tools does the PagerDuty MCP server have?
101 in total, of which 63 are available by default. The other 38 need --enable-write-tools. Counted from the server's own tools/list response on version 1.1.0, 19 August 2026.
Is it read-only by default?
Yes. Write tools are absent from the tool list unless the server is started with --enable-write-tools, so an agent cannot see or call them by accident.
Is the HTTP transport safe to expose?
No. PagerDuty documents that streamable HTTP and SSE have no built-in authentication, and every request uses the single API key the server started with. Prefer stdio, or put an authenticating proxy in front.
Is there a hosted version?
No. The server runs locally from PyPI or Docker, so it holds a PagerDuty user API key on your machine.
Can it tell me why an incident happened?
No. PagerDuty records the alert and the human response, not the telemetry. Pair it with an observability connector.