Examples / PR review bot

PR review bot

When a pull request opens, Murmurator reads the diff, asks your model for a structured risk review, comments on the PR, and pings Slack when something looks risky.

GitHubSlackYour AI models

What you tell the assistant

When a pull request is opened in northwind/api, review the diff for risky changes and post a summary comment. If the risk is high, alert #eng-reviews in Slack.

Why it works

  • Structured output drives the branching — high-risk reviews also go to Slack.
  • The model only sees the diff you fetched; nothing else leaves your connections.
  • Every run keeps the exact input, output and tokens for each step.
Build this workflow

What it builds

Trigger
GitHub
github · pull_request · northwind/api
tool
Fetch pull request
github.get_pull_request
llm
Review the diff
smart · structured
tool
Comment on the PR
github.create_comment
tool
Alert #eng-reviews
slack.post_message
if review.output.data.risk equals high
View the definition
trigger:
  kind: github
  connection: github
  events: [pull_request]
  actions: [opened, ready_for_review]
  repos: [northwind/api]
steps:
  - key: pr
    name: Fetch pull request
    kind: tool
    tool: github.get_pull_request
    args:
      repo: "{{ trigger.repository.full_name }}"
      number: "{{ trigger.pull_request.number }}"
      include_diff: true
  - key: review
    name: Review the diff
    kind: llm
    model: smart
    system: You are a meticulous senior engineer reviewing a pull request. Be specific and brief.
    prompt: |
      Review this pull request. Focus on correctness, security and data migrations.
      {{ steps.pr.output }}
    schema:
      type: object
      properties:
        risk: { type: string, enum: [low, medium, high] }
        summary: { type: string }
        concerns: { type: array, items: { type: string } }
      required: [risk, summary, concerns]
  - key: comment
    name: Comment on the PR
    kind: tool
    tool: github.create_comment
    args:
      repo: "{{ trigger.repository.full_name }}"
      number: "{{ trigger.pull_request.number }}"
      body: "**Automated review — risk: {{ steps.review.output.data.risk }}**\n\n{{ steps.review.output.data.summary }}"
  - key: alert
    name: "Alert #eng-reviews"
    kind: tool
    if: { path: steps.review.output.data.risk, equals: high }
    tool: slack.post_message
    args:
      channel: C04ENGREVIEW
      text: ":rotating_light: High-risk PR: {{ steps.pr.output.title }} {{ steps.pr.output.html_url }}"

A sample run

What each step produces

Fetch pull request tool

succeeded
Calling github.get_pull_request
{
  "number": 1482,
  "title": "Backfill invoice currency and drop legacy column",
  "author": "sokafor",
  "state": "open",
  "additions": 212,
  "deletions": 48,
  "changed_files": 9,
  "html_url": "https://github.com/northwind/api/pull/1482"
}

Review the diff llm

succeeded
Using model smart (Claude Sonnet 5, Murmurator AI)
{
  "text": "",
  "data": {
    "risk": "high",
    "summary": "The migration drops `invoices.legacy_currency` in the same deploy that backfills its replacement. If the backfill job lags, reads during the deploy window will return null currencies.",
    "concerns": [
      "Split the column drop into a follow-up migration after the backfill completes.",
      "The backfill runs in a single transaction over ~4M rows; batch it.",
      "Add a NOT NULL constraint only after verifying the backfill."
    ]
  }
}

Comment on the PR tool

succeeded
Calling github.create_comment
{
  "id": 2231984410,
  "html_url": "https://github.com/northwind/api/pull/1482#issuecomment-2231984410"
}

Alert #eng-reviews tool

succeeded
Calling slack.post_message
{
  "channel": "C04ENGREVIEW",
  "ts": "1758639620.004100"
}

Trigger payload

{
  "event": "pull_request",
  "action": "opened",
  "repository": {
    "full_name": "northwind/api"
  },
  "pull_request": {
    "number": 1482,
    "title": "Backfill invoice currency and drop legacy column"
  }
}

Your next automation is one sentence away.

14-day free trial with $5 of built-in AI included. Cancel anytime.