MCP server for GoAlert — read + write control over on-call scheduling and alerting via its GraphQL API
GoAlert MCP demonstrates solid tool design with 20 well-named, action-verb-prefixed tools covering alerts, escalation, rotations, and on-call management. All tools have descriptions (avg 120 chars) and input schemas with typed parameters. However, output schemas are not documented in the source, parameter descriptions vary in completeness, and error handling lacks recovery guidance. Tool composition is clean (single responsibility), but some tools accept multiple mutually-exclusive parameters without explicit documentation of constraints.
Create an alert on a service. Use dedup to coalesce repeated alerts; meta is an arbitrary key/value map.
Create an escalation policy. repeat = number of times the policy loops after the last step (defaults to 3 if omitted; 0 = run once).
Create a rotation. type ∈ hourly|daily|weekly|monthly; shiftLength is in units of type; userIDs is the ordered participant list.
Get full detail for one alert by its numeric alertID, including state and recent log events.
Get one escalation policy with its steps (actions) and assigned services.
Report who is on call. Provide exactly one of: serviceID (current on-call users), scheduleID (+ start/end window for shifts), or userID (their on-call overview).
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Get full detail for one alert') but do not specify the response structure, field names, or types. LLMs cannot plan downstream tool calls or extract required fields without knowing the output schema.
manage_alerts accepts both alertIDs and serviceID with complex precedence rules ('alertIDs takes precedence'). This mutual exclusivity is documented in the description but not enforced in the schema. LLMs may pass both, causing ambiguous behavior.
get_on_call requires exactly one of three mutually-exclusive parameters (serviceID, scheduleID, userID), with conditional requirements (start/end required with scheduleID). Schema does not enforce this constraint; LLMs may pass invalid combinations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2025-06-18+ | v2 |
Get one rotation with its users, active user index, next handoff times, and shift configuration.
Delete one or more GoAlert resources of a single type by ID (uses deleteAll). Covers services, schedules, rotations, escalation policies, integration keys, heartbeat monitors, user overrides, and calendar subscriptions. (Escalation-policy STEPS are not deletable here — remove them via update_escalation_policy stepIDs.) Requires confirm:true.
Run an arbitrary read-only GraphQL query against GoAlert's /api/graphql. Use this for reads not covered by a dedicated tool. Mutations/subscriptions are rejected. Pass `query` and optional `variables`.
Mark a service, schedule, rotation, or user as favorite (or unfavorite).
Set or remove a key/value label on a target (usually a service). The key MUST be namespaced as `prefix/suffix` (e.g. `team/owner` or `example.com/region`) — a key without a `/` is rejected by GoAlert. An empty value deletes the label.
List alerts, optionally filtered by service IDs, status (unacked/acked/closed), and free-text search. Cursor-paginated.
List escalation policies (search, cursor pagination).
List rotations (search, favorites-first, cursor pagination).
Acknowledge, close, unacknowledge, or escalate alerts. Target either specific alertIDs (numeric) OR all alerts on a serviceID. Escalate requires alertIDs (not valid with serviceID). If both alertIDs and serviceID are provided, alertIDs takes precedence.
Add or update an escalation policy step. A step notifies its targets (users/schedules/rotations) then waits delayMinutes before the next step. To remove or reorder steps, use update_escalation_policy with stepIDs (the full ordered list of remaining step IDs).
Create or update a heartbeat monitor for a service. Returns the check-in href (the URL the monitored service must ping). Delete a monitor via goalert_delete type 'heartbeatMonitor'.
Create or list integration keys for a service. type ∈ generic|grafana|site24x7|prometheusAlertmanager|email|universal. Returns the key href (the inbound webhook URL). Delete a key via goalert_delete type 'integrationKey'.
Update an escalation policy's name, description, repeat count, or step order (stepIDs). stepIDs is the full ordered list of step IDs to keep — omit a step ID to remove it.
Update a rotation. Set activeUserIndex to override who is currently on call (the rotation-level override — there is no separate rotation-override API). userIDs replaces the ordered participant list.
Error handling lacks recovery guidance. Source code shows GoAlertError and GoAlertAuthError classes but no evidence of actionable error messages (e.g., 'User not found. Try search_users() with a partial name.'). Agents receive errors but no next-step guidance.
goalert_graphql_query is a generic escape hatch that bypasses tool-level validation and description. While useful for flexibility, it reduces discoverability and allows LLMs to construct invalid queries. Consider adding query validation or limiting to read-only patterns.