On-Call Health

io.github.Rootly-AI-LabsPublished by GitHub account Rootly-AI-Labsv0.4.1Updated Nov 5, 2026

On-call burnout analysis: team risk summaries, at-risk responders, daily health trends.

The publisher's own server: Rootly

Overview

AI-generated overview

Connects an assistant to On-Call Health so it can run burnout-risk analyses and surface at-risk or healthy on-call responders.

What you can do
  • Check and list connected integrations (Rootly, GitHub, Slack, Jira, Linear) and see who is currently on call
  • Start, poll and inspect health analyses, including the latest one and its status
  • Read team summaries with averages, risk distribution and the most and least at-risk members
  • Find at-risk responders, safe replacements and per-member daily health trends
  • Pull the full raw analysis payload when every field is needed
When to use it
Useful for engineering managers and on-call leads who want an assistant to review team workload, identify responders at risk of overwork, and suggest healthier shift assignments from data already synced into On-Call Health.
Requirements
Runs locally over stdio via uvx (Python package oncallhealth-mcp) or as a self-hosted HTTP service. Needs an On-Call Health account and an API key supplied in the ONCALLHEALTH_API_KEY environment variable; network access to the On-Call Health API. Optional settings cover the API URL, polling interval and Code Mode.
Before you install
The API key is a secret: keep it out of version control and config files that get committed. Analyses are started on the backend and may keep running after a timeout. Results contain identifiable per-person health and workload data, so treat them as sensitive. Scores are workload indicators, not medical diagnoses.

Installation

In SourceWeft

  1. Open On-Call Health in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

oncallhealth-mcp

[PyPI version] [Python 3.10+]

MCP server for On-Call Health burnout analysis. Connects AI assistants to your on-call data for workload insights.

Prerequisites

Installation

The server runs locally over stdio with uvx (no install step) and reads the API key from the ONCALLHEALTH_API_KEY environment variable. Pick your client:

Claude Code

bash
claude mcp add oncallhealth --env ONCALLHEALTH_API_KEY=och_live_... -- uvx oncallhealth-mcp

Claude Desktop

Add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json):

json
{  "mcpServers": {    "oncallhealth": {      "command": "uvx",      "args": ["oncallhealth-mcp"],      "env": { "ONCALLHEALTH_API_KEY": "och_live_your_api_key_here" }    }  }}

Cursor

Add to .cursor/mcp.json in your project (or ~/.cursor/mcp.json for global):

json
{  "mcpServers": {    "oncallhealth": {      "command": "uvx",      "args": ["oncallhealth-mcp"],      "env": { "ONCALLHEALTH_API_KEY": "och_live_your_api_key_here" }    }  }}

VS Code / GitHub Copilot

Add to .vscode/mcp.json in your project:

json
{  "servers": {    "oncallhealth": {      "command": "uvx",      "args": ["oncallhealth-mcp"],      "env": { "ONCALLHEALTH_API_KEY": "och_live_your_api_key_here" }    }  }}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

json
{  "mcpServers": {    "oncallhealth": {      "command": "uvx",      "args": ["oncallhealth-mcp"],      "env": { "ONCALLHEALTH_API_KEY": "och_live_your_api_key_here" }    }  }}

Codex CLI

bash
codex mcp add oncallhealth --env ONCALLHEALTH_API_KEY=och_live_... -- uvx oncallhealth-mcp

Gemini CLI

bash
gemini mcp add oncallhealth -e ONCALLHEALTH_API_KEY=och_live_... uvx oncallhealth-mcp

Manual / other clients

bash
pip install oncallhealth-mcpexport ONCALLHEALTH_API_KEY=och_live_...oncallhealth-mcp

Or run without installing: ONCALLHEALTH_API_KEY=och_live_... uvx oncallhealth-mcp.

Configuration

VariableRequiredDefaultDescription
ONCALLHEALTH_API_KEYYes (stdio)-API key from oncallhealth.ai
ONCALLHEALTH_API_URLNohttps://api.oncallhealth.aiAPI endpoint URL
ONCALLHEALTH_CODE_MODENooff1 exposes the catalog through Code Mode meta-tools (see below)
ONCALLHEALTH_POLL_INTERVALNo5.0Seconds between status checks inside analysis_run (backs off to ONCALLHEALTH_POLL_MAX_INTERVAL, default 30.0)
ONCALLHEALTH_MCP_ALLOWED_HOSTSNo-HTTP only: comma-separated host names that enable the Host/Origin DNS-rebinding guard

Request timeouts, retries and circuit-breaker settings are also configurable; see oncallhealth_mcp/client/config.py.

Security note

Avoid committing API keys to version control. Use environment variables or a secrets manager instead of hardcoding keys in config files.

Protocol compatibility

The server implements MCP revision 2026-07-28 (stateless Streamable HTTP, Mcp-Method/Mcp-Name routing headers, cacheable list results, the Tasks extension) and negotiates older revisions per connection, so clients on the 2025 handshake-era protocol keep working. Every tool publishes annotations (read-only, idempotent, open-world) and a structured output schema. The deprecated HTTP+SSE transport is not served.

Tools

Start with validate_integrations, then analysis_current (or analysis_run for a fresh analysis), then analysis_summary and the member-level tools.

ToolWhat it does
validate_integrationsCheck that every connected integration has valid credentials. force_refresh bypasses the backend cache.
integrations_listList connected Rootly, GitHub, Slack, Jira and Linear integrations.
oncall_usersWho is currently on call for a Rootly integration (integration_id).
analysis_currentMetadata of the most recent analysis (status, timestamps, config).
analysis_runStart an analysis and wait for it: days_back (default 30), include_weekends, integration_id, wait_timeout_seconds (default 600). Returns the team summary. Runs as a background task for clients that support the MCP Tasks extension, inline otherwise, with progress messages while waiting.
analysis_startStart an analysis without waiting. Poll with analysis_status.
analysis_statusStatus and metadata of an analysis (analysis_id).
analysis_summaryTeam averages, risk distribution, top five at-risk and healthiest members.
analysis_resultsFull raw payload of a completed analysis (large; prefer the focused tools).
get_at_risk_usersMembers at or above min_och_score (default 50) in include_risk_levels (default ["medium", "high"]), with Rootly/PagerDuty/Slack/GitHub IDs.
get_safe_respondersMembers at or below max_och_score (default 30) who could take extra shifts, up to limit.
check_users_riskRisk check for specific rootly_user_ids (list of integers), split into at-risk, healthy and not-found.
member_daily_healthDay-by-day health, incident and after-hours breakdown for member_email.

OCH scores run 0-100; higher means more at risk. Scores inform staffing decisions and are not a medical diagnosis.

Resources

URIContent
oncallhealth://methodologyShort description of the scoring methodology
oncallhealth://analyses/latestMetadata of the most recent analysis (JSON)
oncallhealth://analyses/{analysis_id}/summaryTeam summary of a completed analysis (JSON)

Prompts

PromptArgumentsPurpose
weekly_briefteam_nameWeekly on-call health brief with follow-up actions
investigate_respondermember_email, analysis_idDig into one responder's trend and recommend shift changes

Code Mode (optional)

With --code-mode or ONCALLHEALTH_CODE_MODE=1 the catalog is exposed through FastMCP Code Mode: three meta-tools (search, get_schema, execute) let an agent discover tools on demand and chain calls in a sandboxed Python snippet. It saves context when an agent needs many calls per task, at the cost of hiding the tool list, annotations and output schemas from clients that read them directly. Off by default.

CLI reference

usage: oncallhealth-mcp [-h] [--transport {stdio,http}] [--host HOST]                        [--port PORT] [--code-mode] [-v] [--version]
options:  --transport {stdio,http}  Transport to use (default: stdio)  --host HOST               Host to bind to (http transport only, default: 127.0.0.1)  --port PORT               Port to bind to (http transport only, default: 8000)  --code-mode               Expose the catalog through Code Mode meta-tools  -v, --verbose             Enable verbose logging  --version                 show program's version number and exit

Hosted deployment (Streamable HTTP)

oncallhealth-mcp --transport http (or the Docker image, which runs uvicorn oncallhealth_mcp.transport:mcp_http_app) serves:

  • POST /mcp: stateless Streamable HTTP MCP endpoint
  • GET /health: unauthenticated health check

Every MCP request must carry the user's API key as Authorization: Bearer och_...; X-API-Key: och_... is accepted as well. Keys are verified against the On-Call Health API (successful checks are cached for five minutes) and unauthenticated requests get 401 before any tool runs. Tool calls are rate limited per key and per tool (for example analysis_run and analysis_start at 5/minute) identified from the JSON-RPC body, with 429 and Retry-After on excess.

Example remote client configuration (Claude Code):

bash
claude mcp add --transport http oncallhealth https://your-host/mcp --header "Authorization: Bearer och_live_..."

Because the server is stateless you can run several uvicorn workers or replicas. For analysis_run background tasks to be shared across workers, point FastMCP's task backend at Redis or Valkey with FASTMCP_DOCKET_URL; the default in-memory backend is per process.

Set ONCALLHEALTH_MCP_ALLOWED_HOSTS=mcp.example.com to enable FastMCP's Host/Origin DNS-rebinding guard for the public host name.

bash
docker build -t oncallhealth-mcp .docker run -p 8080:8080 oncallhealth-mcp

Links

License

Apache-2.0

Source: README.md at commit 918da0c

Tools

13

validate_integrations

Validate Integrations

Check that every connected integration has valid credentials. Call this before starting an analysis. Returns per-integration validation status (GitHub, Slack, Jira, Linear) and an all_valid flag.

Parametersforce_refresh

integrations_list

Integrations List

List connected integrations (Rootly, GitHub, Slack, Jira, Linear).

Takes no parameters.

oncall_users

Oncall Users

Get the users currently on call for a Rootly integration. Cross-reference the returned emails with analysis data (for example get_at_risk_users) to see whether anyone currently on call is at risk.

Parametersintegration_idrequired

analysis_current

Analysis Current

Get the most recent analysis for the current account. Returns metadata only (status, timestamps, configuration). Use analysis_summary with the returned id for the team overview.

Takes no parameters.

analysis_run

Analysis Run

Start a new health analysis, wait for it to finish, and return the summary. Runs as a background task for clients that support the MCP Tasks extension and inline otherwise. Progress messages report the analysis status while waiting. On timeout the analysis keeps running on the backend; use analysis_status with the reported analysis_id to pick it up later.

Parametersdays_backintegration_idinclude_weekendswait_timeout_seconds

analysis_start

Analysis Start

Start a new health analysis without waiting for it. Poll analysis_status until status is "completed", then use analysis_summary. Prefer analysis_run when you want a single call that waits for the result.

Parametersdays_backintegration_idinclude_weekends

analysis_status

Analysis Status

Get the status and metadata of an analysis.

Parametersanalysis_idrequired

analysis_summary

Analysis Summary

Get a condensed team summary of a completed analysis. Returns team averages, the risk-level distribution and the five most and least at-risk members. Use analysis_results only when you need every field.

Parametersanalysis_idrequired

analysis_results

Analysis Results

Get the full raw results for a completed analysis. WARNING: Returns complete data for 80+ members with ~40 fields each and may overwhelm a context window. Prefer analysis_summary, get_at_risk_users or member_daily_health unless you need every field.

Parametersanalysis_idrequired

get_at_risk_users

Get At Risk Users

Get users at or above a health-risk threshold with their external IDs. Use this to identify at-risk responders and correlate them with Rootly, PagerDuty, Slack or GitHub using the returned platform IDs. Results are sorted by OCH score, highest risk first.

Parametersanalysis_idrequiredmin_och_scoreinclude_risk_levels

get_safe_responders

Get Safe Responders

Get users with low health risk who could take additional on-call shifts. Use this to find replacement responders when removing at-risk users from schedules. Results are sorted by OCH score, healthiest first.

Parameterslimitanalysis_idrequiredmax_och_score

check_users_risk

Check Users Risk

Check health risk for specific users by their Rootly user IDs. Use this after fetching a schedule from Rootly to see whether any scheduled responders are at risk. A user is at risk when their OCH score is at or above min_och_score or their risk level is medium or high.

Parametersanalysis_idrequiredmin_och_scorerootly_user_idsrequired

member_daily_health

Member Daily Health

Get the day-by-day health breakdown for one team member. Shows per-day health scores, incident counts and after-hours activity over the analysis period (only days with data are included).

Parametersanalysis_idrequiredmember_emailrequired

Version history

1
  1. v0.4.1LatestNov 5, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Rootly integrations