AI Code Review: Automate PR Reviews with Claude in 20 Minutes

Difficulty: Intermediate Category: Coding

AI Code Review: Automate PR Reviews with Claude in 20 Minutes

Manual code reviews consume 20-30% of engineering time according to a 2025 Google DevOps report, yet they’re critical for catching bugs before production. With Claude 3.5 Sonnet’s 200K context window, you can now automate first-pass PR reviews to catch obvious issues, security vulnerabilities, and style inconsistencies—letting human reviewers focus on architecture and business logic.

In this tutorial, you’ll build a GitHub Action that automatically comments on every pull request with Claude’s analysis, complete with specific line-by-line feedback.

Prerequisites

  • GitHub repository with admin access (or ability to create Actions)
  • Anthropic API key (get one at console.anthropic.com—$15 free credit)
  • Basic familiarity with GitHub Actions and YAML
  • Node.js 18+ installed locally for testing

Step 1: Get Your Anthropic API Key and Set Up Secrets

First, navigate to console.anthropic.com and create an account. Click “Get API Keys” and generate a new key. Copy it immediately—you won’t see it again.

In your GitHub repository, go to Settings → Secrets and variables → Actions → New repository secret. Name it ANTHROPIC_API_KEY and paste your key.

Gotcha: Don’t commit API keys to your repository, even in “private” repos. GitHub’s secret scanning will flag it, and Anthropic will automatically revoke the key.

Pro tip: Set up billing alerts in your Anthropic console. Claude 3.5 Sonnet costs $3 per million input tokens and $15 per million output tokens. A typical PR review uses 5K-20K tokens (about $0.03-$0.30 per review).

Step 2: Create the GitHub Action Workflow File

Create .github/workflows/ai-code-review.yml in your repository:

name: AI Code Review with Claude

on:
  pull_request:
    types: [opened, synchronize]

permissions:
  contents: read
  pull-requests: write

jobs:
  ai-review:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get PR diff
        id: diff
        run: |
          git fetch origin $
          DIFF=$(git diff origin/$...HEAD)
          echo "diff> $GITHUB_OUTPUT
          echo "$DIFF" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Run AI Review
        env:
          ANTHROPIC_API_KEY: $
          PR_NUMBER: $
          REPO: $
          GITHUB_TOKEN: $
        run: |
          node .github/scripts/ai-review.js

This workflow triggers on every PR open and update, fetches the diff, and runs your review script.

Step 3: Write the Claude Review Script

Create .github/scripts/ai-review.js:

const Anthropic = require('@anthropic-ai/sdk');
const { Octokit } = require('@octokit/rest');
const fs = require('fs');

const anthropic = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
});

const octokit = new Octokit({
  auth: process.env.GITHUB_TOKEN,
});

async function reviewCode() {
  const diff = fs.readFileSync('/tmp/pr.diff', 'utf-8');
  
  const message = await anthropic.messages.create({
    model: 'claude-3-5-sonnet-20241022',
    max_tokens: 4096,
    temperature: 0.3,
    system: `You are an expert code reviewer. Analyze the git diff and provide:
1. Security vulnerabilities (SQL injection, XSS, authentication issues)
2. Logic bugs or edge cases
3. Performance concerns
4. Code style issues (if severe)

Format your response as:
## Summary
[1-2 sentences]

## Issues Found
### 🔴 Critical
- [issue]: [explanation]

### 🟡 Suggestions  
- [suggestion]: [explanation]

Be concise. Only flag real issues—don't nitpick formatting if it's consistent.`,
    messages: [{
      role: 'user',
      content: `Review this pull request diff:\n\n${diff.substring(0, 150000)}`
    }]
  });

  const review = message.content[0].text;
  
  const [owner, repo] = process.env.REPO.split('/');
  await octokit.rest.issues.createComment({
    owner,
    repo,
    issue_number: parseInt(process.env.PR_NUMBER),
    body: `## 🤖 AI Code Review (Claude 3.5 Sonnet)\n\n${review}\n\n---\n*Automated review • [Improve this action](https://github.com/${process.env.REPO}/blob/main/.github/scripts/ai-review.js)*`
  });
}

// Save diff from GitHub Actions
const diff = process.env.DIFF || '';
fs.writeFileSync('/tmp/pr.diff', diff);

reviewCode().catch(console.error);

Gotcha: The 150,000 character substring limit prevents token overflow. Claude 3.5 Sonnet handles 200K tokens (~750K characters), but we cap it safely. For massive PRs, consider splitting files.

Step 4: Add Dependencies and Test Locally

Create package.json in .github/scripts/:

{
  "name": "ai-code-review",
  "version": "1.0.0",
  "dependencies": {
    "@anthropic-ai/sdk": "^0.20.0",
    "@octokit/rest": "^20.0.2"
  }
}

Test locally before committing:

cd .github/scripts
npm install
export ANTHROPIC_API_KEY="your-key-here"
export GITHUB_TOKEN="your-github-pat"
export PR_NUMBER="123"
export REPO="yourname/yourrepo"
export DIFF="$(git diff main...feature-branch)"
node ai-review.js

You should see a comment posted to your PR (use a test PR first!).

Pro tip: Add a .node-version file with 20 to ensure consistency across environments.

Step 5: Customize the Review Prompt for Your Codebase

The system prompt in Step 3 is generic. Tailor it to your team’s needs:

system: `You are a senior ${language} developer reviewing code for a ${projectType} project.

Code standards:
- We use ${framework} version ${version}
- Authentication via ${authMethod}
- Database queries must use parameterized statements
- All user input requires validation

Focus on:
1. Security (OWASP Top 10)
2. ${specificConcern} (e.g., "race conditions in async code")
3. Breaking changes to public APIs

Ignore:
- Formatting (handled by prettier)
- Missing comments (not required)

Flag only medium+ severity issues.`

For a Python/Django project, you might specify: “Check for N+1 queries, missing CSRF tokens, and unsafe pickle usage.”

Gotcha: Temperature 0.3 makes Claude more consistent but less creative. For exploratory reviews, try 0.7. For security-critical code, use 0.1.

Step 6: Add File-Specific Review Rules

Enhance the script to skip certain files or apply custom rules:

// Before calling Claude
const filteredDiff = diff
  .split('\ndiff --git')
  .filter(fileDiff => {
    // Skip generated files
    if (fileDiff.includes('package-lock.json')) return false;
    if (fileDiff.includes('dist/')) return false;
    return true;
  })
  .join('\ndiff --git');

// For sensitive files, add stricter prompts
if (diff.includes('auth.js') || diff.includes('security.py')) {
  systemPrompt += '\n\nEXTRA SCRUTINY: This PR modifies authentication. Check for timing attacks, token leakage, and session fixation.';
}

Step 7: Set Up Cost Controls and Rate Limiting

Add a token counter to prevent runaway costs:

function estimateTokens(text) {
  // Rough estimate: 1 token ≈ 4 characters for English
  return text.length / 4;
}

const estimatedTokens = estimateTokens(diff);
if (estimatedTokens > 100000) {
  console.log(`⚠️  Diff too large (${estimatedTokens} tokens). Skipping AI review.`);
  process.exit(0);
}

Pro tip: In your Anthropic dashboard, set a monthly budget alert at $50. Most teams spend $10-30/month reviewing 50-100 PRs.

Practical Example: Complete Working Setup

Here’s a real-world review result from a React PR that added user authentication:

## 🤖 AI Code Review (Claude 3.5 Sonnet)

## Summary
This PR implements login functionality. Found 1 critical security issue and 2 suggestions.

## Issues Found

### 🔴 Critical
- **Cleartext password logging (auth.js:45)**: `console.log(password)` exposes credentials in logs. Remove immediately.

### 🟡 Suggestions
- **Missing error handling (LoginForm.jsx:78)**: `fetch()` has no catch block. Network failures will crash the component.
- **Hardcoded API URL (config.js:12)**: Use environment variables for `API_BASE_URL` to support staging/prod environments.

## What Looks Good
- Proper JWT storage in httpOnly cookies ✓
- Input validation using Joi ✓

This caught a real security bug before human review.

Key Takeaways

  • Claude 3.5 Sonnet can review PRs with 200K context, sufficient for most diffs under 500 changed lines
  • Cost-effective automation: At $0.03-$0.30 per review, you save 15-30 minutes of engineering time (worth $15-30)
  • Custom prompts are essential—generic reviews miss project-specific issues like framework misuse or architectural violations
  • Combine AI + human reviews: Claude catches obvious bugs; humans handle business logic and design trade-offs

What’s Next

Once you’ve mastered automated PR reviews, explore training Claude on your codebase’s vector embeddings to provide context-aware suggestions about internal APIs and architectural patterns.


Key Takeaway: You can build a custom GitHub Action that uses Claude 3.5 Sonnet to automatically review pull requests, catching bugs and suggesting improvements before human review—saving 2-3 hours per week for engineering teams.


New AI tutorials published daily on AtlasSignal. Follow @AtlasSignalDesk for more.


📧 Get Daily AI & Macro Intelligence

Stay ahead of market-moving news, emerging tech, and global shifts.

Categories:

Updated: