MCP Server Integration

Bop provides an MCP (Model Context Protocol) server that integrates with AI coding assistant that support MCP like Claude Code, Codex, Gemini, and Cursor. This enables AI assistants to perform code reviews, triage findings, and manage PR comments interactively.

Setup

Prerequisites

  1. Install Bop if you haven’t already.
  2. LLM API Key: An Anthropic API key is all you need. Additional providers (OpenAI, Gemini) are optional.
  3. GitHub Token (optional): Required for PR operations.

Claude Code

Using the claude CLI:

1
2
3
4
5
6
7
claude mcp add -s user \
  -e OPENAI_API_KEY=<value> \
  -e ANTHROPIC_API_KEY=<value> \
  -e GEMINI_API_KEY=<value> \
  -e GITHUB_ENTERPRISE_TOKEN=<value> \
  -e GITHUB_TOKEN=<value> \
  bop -- /opt/homebrew/bin/bop-mcp

Or add to your MCP configuration file manually (~/.config/claude-code/mcp.json or project-level .claude/mcp.json):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "mcpServers": {
    "bop": {
      "command": "bop-mcp",
      "env": {
        "GITHUB_TOKEN": "ghp_..."
      }
    }
  }
}

Codex

Use the codex CLI:

1
2
3
4
5
6
codex mcp add bop \
   --env GITHUB_TOKEN="$GITHUB_TOKEN" \
   --env OPENAI_API_KEY="$OPENAI_API_KEY" \
   --env ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
   --env GEMINI_API_KEY="$GEMINI_API_KEY" \
   -- /opt/homebrew/bin/bop-mcp

Or add to your MCP configuration file manually (~/.codex/config.toml):

1
2
3
4
5
6
[mcp_servers.bop]
command = "/opt/homebrew/bin/bop-mcp"
GITHUB_TOKEN = "..."
OPENAI_API_KEY = "..."
ANTHROPIC_API_KEY = "..."
GEMINI_API_KEY = "..."

Gemini

Use the gemini CLI:

1
2
3
4
5
6
gemini mcp add bop /opt/homebrew/bin/bop-mcp \
-e GITHUB_TOKEN="$GITHUB_TOKEN" \
-e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
-e GEMINI_API_KEY="$GEMINI_API_KEY" \
-e OPENAI_API_KEY="$OPENAI_API_KEY" \
--transport stdio

Or add to your MCP configuration file manually (~/.gemini/settings.json):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "mcpServers": {
    "bop/": {
      "command": "/opt/homebrew/bin/bop-mcp",
      "args": [],
      "env": {
        "ANTHROPIC_API_KEY": "your_key_here",
        "GEMINI_API_KEY": "your_key_here",
        "OPENAI_API_KEY": "your_key_here",
        "GITHUB_TOKEN": "ghp_..."
      }
    }
  }
}

Cursor

Add to your Cursor MCP configuration:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "mcpServers": {
    "bop": {
      "command": "bop-mcp",
      "env": {
        "GITHUB_TOKEN": "ghp_...",
        "ANTHROPIC_API_KEY": "sk-ant-..."
      }
    }
  }
}

Environment Requirements

The MCP server requires:

VariableRequired ForDescription
GITHUB_TOKENAll PR operationsGitHub personal access token
ANTHROPIC_API_KEYreview_* toolsAnthropic API key
OPENAI_API_KEYreview_* toolsOpenAI API key (alternative)
GEMINI_API_KEYreview_* toolsGemini API key (alternative)

At least one LLM API key is required for review operations.

Available Tools

Bop’s MCP server provides 17 tools organized by function.

Read Operations

These tools retrieve information without modifying anything.

list_annotations

List SARIF annotations from check runs on a PR.

Parameters:

  • owner (string, required) - Repository owner
  • repo (string, required) - Repository name
  • pr_number (int, required) - Pull request number
  • check_name (string) - Filter by check run name
  • level (string) - Filter by level: notice, warning, failure

Example:

1
List all warning annotations on PR #123 in myorg/myrepo

get_annotation

Get a single annotation by check run ID and index.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • check_run_id (int, required) - GitHub check run ID
  • index (int, required) - Annotation index (0-based)

list_findings

List code review findings (comments with fingerprints) on a PR.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • category (string) - Filter by category
  • severity (string) - Filter: critical, high, medium, low
  • reply_status (string) - Filter: all, replied, unreplied

Example:

1
List unreplied high-severity findings on PR #456

get_finding

Get a single finding by ID.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • finding_id (string, required) - Fingerprint or comment ID

get_suggestion

Extract a structured code suggestion from a finding for use with str_replace.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • finding_id (string, required)

Returns: Structured suggestion with before/after code blocks.


get_code_context

Get file content at specific lines from the PR’s head commit.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • file (string, required) - File path
  • start_line (int, required) - Start line (1-based)
  • end_line (int, required) - End line (1-based)
  • context_lines (int) - Lines of context (default: 3)

get_diff_context

Get the diff hunk for a file at specific lines.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • file (string, required)
  • start_line (int, required) - Start line in new file (1-based)
  • end_line (int, required) - End line in new file (1-based)

get_thread

Get the full comment thread for a review comment, including replies.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • comment_id (int, required) - Comment ID
  • pr_number (int) - PR number (recommended)

Write Operations

These tools modify PR state (comments, reviews, threads).

reply_to_finding

Reply to a code review finding with optional status tag.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • finding_id (string, required)
  • body (string, required) - Reply body (markdown)
  • status (string) - Status tag: acknowledged, disputed, fixed, wont_fix

Example:

1
Reply to finding abc123 acknowledging it will be fixed in a follow-up PR

post_comment

Post a new review comment at a specific file and line.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • file (string, required) - File path
  • line (int, required) - Line number (1-based)
  • body (string, required) - Comment body (markdown)

mark_resolved

Mark a review thread as resolved or unresolved.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • thread_id (string, required) - Thread node ID (e.g., PRRT_kwDO...)
  • resolved (bool, required) - True to resolve, false to unresolve

request_rereview

Dismiss stale reviews and request fresh review from specified reviewers.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • dismiss_stale (bool, required) - Dismiss stale bot reviews
  • message (string) - Message for dismissing
  • reviewers (array[string]) - User logins to request
  • team_reviewers (array[string]) - Team slugs to request

Review Operations

These tools run code reviews and post results.

review_pr

Review a GitHub pull request and return findings (without posting).

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • reviewers (array[string]) - Specific reviewers to use

Returns: Array of findings with severity, category, description, and suggestion.

Example:

1
Review PR #789 in myorg/myrepo using the security reviewer

review_branch

Review a local git branch against a base reference.

Parameters:

  • base_ref (string, required) - Base reference to diff against
  • repo_dir (string) - Repository directory (defaults to server cwd)
  • target_ref (string) - Branch to review (auto-detects current branch)
  • include_uncommitted (bool) - Include uncommitted changes
  • reviewers (array[string]) - Specific reviewers

review_files

Review files in a directory without requiring git.

Parameters:

  • path (string, required) - Directory to review
  • patterns (array[string]) - Glob patterns to include (e.g., *.go)
  • exclude (array[string]) - Glob patterns to exclude
  • reviewers (array[string]) - Specific reviewers

Example:

1
Review all TypeScript files in ./src excluding test files

edit_finding

Edit a finding’s properties and return the modified finding.

Parameters:

  • finding (object, required) - The finding to edit
  • severity (string) - New severity
  • category (string) - New category
  • description (string) - New description
  • suggestion (string) - New suggestion

Use Cases:

  • Adjust severity if the LLM was too aggressive/lenient
  • Recategorize findings
  • Refine descriptions before posting

post_findings

Post findings to a GitHub PR as inline review comments.

Parameters:

  • owner (string, required)
  • repo (string, required)
  • pr_number (int, required)
  • findings (array, required) - Findings to post
  • skip_duplicates (bool) - Skip findings already on PR (default: true)
  • blocking_findings (array[string]) - Fingerprints of blocking findings
  • dry_run (bool) - Preview without posting
  • include_summary (bool) - Add summary comment
  • review_action (string) - COMMENT, REQUEST_CHANGES, APPROVE

Example:

1
Post findings to PR #123, skipping duplicates and including a summary

Feedback Tool

submit_feedback

Submit feedback about Bop (requires authentication).

Parameters:

  • category (string, required) - bug, feature, usability, other
  • title (string, required) - Brief summary
  • description (string, required) - Detailed description

Example Workflows

Interactive PR Review Triage

  1. Run review:

    1
    
    review_pr owner=myorg repo=myrepo pr_number=123
    
  2. Examine findings:

    1
    
    list_findings owner=myorg repo=myrepo pr_number=123 severity=high
    
  3. Get context for a finding:

    1
    
    get_code_context owner=myorg repo=myrepo pr_number=123 file=src/api.go start_line=45 end_line=55
    
  4. Adjust severity if needed:

    1
    
    edit_finding finding={...} severity=medium
    
  5. Post curated findings:

    1
    
    post_findings owner=myorg repo=myrepo pr_number=123 findings=[...]
    

Addressing Findings

  1. List unreplied findings:

    1
    
    list_findings owner=myorg repo=myrepo pr_number=123 reply_status=unreplied
    
  2. Acknowledge a finding:

    1
    
    reply_to_finding owner=myorg repo=myrepo pr_number=123 finding_id=abc123 body="Will fix in follow-up PR" status=acknowledged
    
  3. Mark thread resolved:

    1
    
    mark_resolved owner=myorg repo=myrepo thread_id=PRRT_kwDO... resolved=true
    

Local Branch Review

  1. Review current branch:

    1
    
    review_branch base_ref=main
    
  2. Review with uncommitted changes:

    1
    
    review_branch base_ref=main include_uncommitted=true
    

Troubleshooting

“Missing GITHUB_TOKEN”

Ensure the GITHUB_TOKEN environment variable is set in your MCP configuration.

“No LLM provider configured”

For review operations, you need at least one of: ANTHROPIC_API_KEY, OPENAI_API_KEY, or GEMINI_API_KEY.

Tools not appearing

  1. Restart your editor/AI tool
  2. Check the MCP server logs for errors
  3. Verify bop-mcp is in your PATH

See Troubleshooting for more solutions.