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
- Install Bop if you haven’t already.
- LLM API Key: An Anthropic API key is all you need. Additional providers (OpenAI, Gemini) are optional.
- GitHub Token (optional): Required for PR operations.
Claude Code
Using the claude CLI:
| |
Or add to your MCP configuration file manually (~/.config/claude-code/mcp.json or project-level .claude/mcp.json):
| |
Codex
Use the codex CLI:
| |
Or add to your MCP configuration file manually (~/.codex/config.toml):
| |
Gemini
Use the gemini CLI:
| |
Or add to your MCP configuration file manually (~/.gemini/settings.json):
| |
Cursor
Add to your Cursor MCP configuration:
| |
Environment Requirements
The MCP server requires:
| Variable | Required For | Description |
|---|---|---|
GITHUB_TOKEN | All PR operations | GitHub personal access token |
ANTHROPIC_API_KEY | review_* tools | Anthropic API key |
OPENAI_API_KEY | review_* tools | OpenAI API key (alternative) |
GEMINI_API_KEY | review_* tools | Gemini 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 ownerrepo(string, required) - Repository namepr_number(int, required) - Pull request numbercheck_name(string) - Filter by check run namelevel(string) - Filter by level:notice,warning,failure
Example:
| |
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 IDindex(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 categoryseverity(string) - Filter:critical,high,medium,lowreply_status(string) - Filter:all,replied,unreplied
Example:
| |
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 pathstart_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 IDpr_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:
| |
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 pathline(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 reviewsmessage(string) - Message for dismissingreviewers(array[string]) - User logins to requestteam_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:
| |
review_branch
Review a local git branch against a base reference.
Parameters:
base_ref(string, required) - Base reference to diff againstrepo_dir(string) - Repository directory (defaults to server cwd)target_ref(string) - Branch to review (auto-detects current branch)include_uncommitted(bool) - Include uncommitted changesreviewers(array[string]) - Specific reviewers
review_files
Review files in a directory without requiring git.
Parameters:
path(string, required) - Directory to reviewpatterns(array[string]) - Glob patterns to include (e.g.,*.go)exclude(array[string]) - Glob patterns to excludereviewers(array[string]) - Specific reviewers
Example:
| |
edit_finding
Edit a finding’s properties and return the modified finding.
Parameters:
finding(object, required) - The finding to editseverity(string) - New severitycategory(string) - New categorydescription(string) - New descriptionsuggestion(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 postskip_duplicates(bool) - Skip findings already on PR (default: true)blocking_findings(array[string]) - Fingerprints of blocking findingsdry_run(bool) - Preview without postinginclude_summary(bool) - Add summary commentreview_action(string) -COMMENT,REQUEST_CHANGES,APPROVE
Example:
| |
Feedback Tool
submit_feedback
Submit feedback about Bop (requires authentication).
Parameters:
category(string, required) -bug,feature,usability,othertitle(string, required) - Brief summarydescription(string, required) - Detailed description
Example Workflows
Interactive PR Review Triage
Run review:
1review_pr owner=myorg repo=myrepo pr_number=123Examine findings:
1list_findings owner=myorg repo=myrepo pr_number=123 severity=highGet context for a finding:
1get_code_context owner=myorg repo=myrepo pr_number=123 file=src/api.go start_line=45 end_line=55Adjust severity if needed:
1edit_finding finding={...} severity=mediumPost curated findings:
1post_findings owner=myorg repo=myrepo pr_number=123 findings=[...]
Addressing Findings
List unreplied findings:
1list_findings owner=myorg repo=myrepo pr_number=123 reply_status=unrepliedAcknowledge a finding:
1reply_to_finding owner=myorg repo=myrepo pr_number=123 finding_id=abc123 body="Will fix in follow-up PR" status=acknowledgedMark thread resolved:
1mark_resolved owner=myorg repo=myrepo thread_id=PRRT_kwDO... resolved=true
Local Branch Review
Review current branch:
1review_branch base_ref=mainReview with uncommitted changes:
1review_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
- Restart your editor/AI tool
- Check the MCP server logs for errors
- Verify
bop-mcpis in your PATH
See Troubleshooting for more solutions.