pr-reviewer-mcp
README.md
# pr-reviewer-mcp
An MCP server exposing AI-powered GitHub PR review as tools, adapted from
[codewarrior](https://github.com/srivastava-aryan/codewarrior) (a webhook-driven
GitHub App) into an on-demand tool server.
## Why this exists
The original app reviews automatically when a PR opens — event-driven.
This version reviews when explicitly asked, by you or by an agent —
tool-driven. Same review pipeline (LangChain + Gemini), different trigger
model and a different auth model (PAT instead of GitHub App installation
tokens, since there's a human in the loop at call time instead of a webhook).
## Tools
| Tool | Description |
|---|---|
| `list_open_prs` | List open PRs for a repo |
| `get_pr_diff` | Fetch the raw diff, no AI |
| `review_file` | AI review of a single file in a PR |
| `review_pr` | Full AI review: all files in parallel + synthesized summary |
| `post_review_comment` | Post a review as a PR comment |
## Setup
```bash
npm install
cp .env.example .env
```
Fill in `.env`:
- `GITHUB_TOKEN` — fine-grained PAT with **Pull requests** (read/write) and
**Contents** (read) permissions on the repos you want to review
- `GOOGLE_API_KEY` — from Google AI Studio
## Running locally
```bash
npm start
```
This starts the server on stdio. It won't print anything to stdout (that
channel is reserved for the MCP protocol) — status logs go to stderr.
## Connecting to CLI or VS Code
Add to your MCP config (`claude_desktop_config.json` or equivalent):
```json
{
"mcpServers": {
"pr-reviewer": {
"command": "node",
"args": ["/absolute/path/to/pr-reviewer-mcp/src/index.js"],
"env": {
"GITHUB_TOKEN": "your-token-here",
"GOOGLE_API_KEY": "your-key-here"
}
}
}
}
```
Restart your IDE, then you can ask things like:
> "Review PR #12 on srivastava-aryan/dsa-tracker"
and it will call `review_pr`, decide whether to post it, and call
`post_review_comment` if you confirm.
## What changed from the original app
- **Auth**: `github-auth.js` now uses a personal access token via
`@octokit/rest` directly, instead of `@octokit/auth-app` + installation
tokens. No webhook server, no Express, no `smee-client`.
- **Trigger**: no webhook listener. Review happens when a tool is called.
- **Logging**: `console.log` → `console.error` in the review pipeline,
since stdout is reserved for MCP protocol messages on stdio transport.
- **Everything else** — prompts, parallel file review, synthesis step — is
unchanged from the original `reviewer.js` and `diff-fetcher.js`.
## Next steps worth exploring
- Swap stdio transport for HTTP/SSE if you want to host this remotely
instead of running it locally per-user
- Add a `list_recent_reviews` tool backed by a small DB, so repeated
reviews on the same PR don't re-run from scratch
- Add resource support (`server.resource`) to expose PR diffs as
browsable MCP resources rather than only tool outputs
TDQS
A3.8/5.0
Scored across 5 tools
Disambiguation5/5
Each tool targets a distinct operation: listing PRs, fetching diffs, reviewing individual files, reviewing full PRs, and posting comments. No functional overlap.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern in snake_case (list_open_prs, get_pr_diff, review_file, review_pr, post_review_comment), making them predictable.
Tool Count5/5
Five tools is appropriate for a focused PR review server—enough to cover core functionality without being excessive or thin.
Completeness4/5
Covers the full review workflow (list, diff, review file, review PR, post comment). Lacks tools for approval or dismissal, but those are outside the stated scope.
Maintenance
ActivityInactive
ResponsivenessNo issues