Inspiration
Every on-call tool is built to protect the service. None of them are built to protect the person holding the pager at 2 a.m.
We kept coming back to a specific, quiet kind of harm: one person, alone, deep into the night, fighting an incident that everyone else is asleep for. No handoff, no backup, just them and a scrolling wall of alerts — long past the point where anyone makes good decisions. It happens to the solo SRE at a Series-A startup, to the volunteer keeping a nonprofit's systems alive, to whoever drew the short straw on the rota. The work is invisible, and so is the toll.
Quiet Hours is an on-call agent that notices that person — and does something about it, gently.
What it does
Quiet Hours watches high-intensity Slack channels. When it detects that one human has been carrying an incident alone, late at night, it acts:
- It sends a warm, honest DM — built only from what it actually observed: hours solo, messages sent, how long since anyone else replied. No diagnosis, no "we think you're burned out." Just the observed shape of the night, and an offer.
- On their consent ("Hand off & sleep"), an LLM drafts a handoff note in their voice from the real thread, and Quiet Hours pages a rested backup through a real Model Context Protocol server wrapping PagerDuty.
- The next morning, it posts a Canvas that makes the night visible — every number observed in Slack, nothing invented — so the work nobody saw doesn't stay invisible.
The trigger is a fully transparent, unit-tested 4-signal heuristic: one dominant human sender, no other human reply for a long stretch, late local hour or a multi-hour solo run, and the user has opted in. Those four numbers are shown to the user — the product never hides how it decided.
How we built it
- Slack Bolt (Socket Mode) as the runtime. A watcher subscribes to channel messages and feeds a rolling window to the pure heuristic.
- Real-Time Search API — the agent's sensory system. Detection is RTS-first: it pulls cross-message, permission-aware context (who's speaking, how often, when anyone else last replied), because "one person is carrying this alone right now" is a judgment you cannot make from a single event payload. It degrades to
conversations.historyif no fresh RTS action token is in hand — detection must never go dark just because a permission boundary was hit. - A real stdio MCP server for PagerDuty.
pagerdutyServer.jsexposes exactly two tools —get_oncallandpage_backup— and the intervention engine calls them through a standard MCP client. This is the actuator: detection is worthless if the "fix" is "post a message and hope someone volunteers." MCP turns the human's consent into an actual page to a rested person. - Slack AI carries the human-facing half: the Assistant/DM surface, the LLM-drafted handoff note (a provider chain of Anthropic → Gemini → Cerebras, with a deterministic templated fallback so it never fails), and the morning Canvas.
- An observed-data ledger (JSON) is the single source of truth for the Canvas. If a fact isn't in the ledger, it does not appear on screen.
Challenges we ran into
The hardest problem wasn't technical — it was tone. An agent that DMs you at 1 a.m. about how you're doing can feel invasive in one wrong word. We rewrote the copy until every line stated an observed fact and offered, never insisted.
Enforcing the honesty rule end-to-end took real discipline. It's tempting to compute a friendly "burnout risk: high" — and we deleted every such shortcut, because the moment the agent invents a number, the trust is gone. The ledger stays pure; the Canvas footer promises it.
Wiring a genuine stdio MCP server (rather than faking the PagerDuty call) meant getting the client/server handshake right so the page is a real tool call. And mapping the current RTS permission model — bot tokens, action tokens, and what a developer sandbox actually supports — took careful reading of Slack's newest docs.
What we learned
That the honesty constraint isn't a limitation — it's the product. Refusing to invent a single number forced a cleaner architecture and a warmer voice than "one more dashboard" would have. We learned that MCP is the difference between an agent that talks and an agent that acts, and that the most valuable thing an AI can do at 2 a.m. is not analyze you — it's take the pager off your hands.
What's next
Let teams tune the four thresholds to their own rhythm. Add more MCP actuators beyond PagerDuty (Opsgenie, VictorOps). And a weekly team Canvas that surfaces who's been carrying the most nights — turning invisible labor into something a team can rebalance, before anyone burns out.

Log in or sign up for Devpost to join the conversation.