Agentic on-call resolution: a Slack bot that triages on-call questions via a LangGraph ReAct-style loop — RAG over Slack history, runbooks via Jira/Confluence (MCP), Grafana metrics, code search — and escalates to maintainers via DM when confidence is low.
src/oncall_agent/agent— LangGraph state machine and toolssrc/oncall_agent/rag— embeddings + Qdrant vector storesrc/oncall_agent/mcp— MCP client + Atlassian / Grafana wrapperssrc/oncall_agent/slack— Bolt event handlers and message formattingsrc/oncall_agent/integrations/github_code.py— code search toolsrc/oncall_agent/escalation— confidence gate → maintainer DMscripts/ingest_seed.py— seed JSON → Qdrantdata/seed_slack.json— synthetic on-call threads
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
cp .env.example .env # fill in keys
docker compose up -d qdrant
python scripts/ingest_seed.py
# run service (FastAPI + Slack Socket Mode if tokens are set)
python -m oncall_agent.app
# ask without Slack
curl -s -X POST http://localhost:8000/debug/ask \
-H 'content-type: application/json' \
-d '{"question":"db connection pool exhausted on checkout"}' | jqTo enable Jira/Confluence + Grafana tools:
docker compose --profile mcp up -dA. Slack hello (this commit) → echo bot, FastAPI, /debug/ask
B. RAG ingest + retrieve CLI
C. Single-tool LangGraph agent
D. MCP Atlassian tool
E. Grafana MCP + code search + multi-hop retrieve
F. Confidence gate + escalation DM
G. Real Slack backfill