pr-reviewer-mcp
pr-reviewer-mcp
An MCP server exposing AI-powered GitHub PR review as tools, adapted from 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 for a repo |
| Fetch the raw diff, no AI |
| AI review of a single file in a PR |
| Full AI review: all files in parallel + synthesized summary |
| Post a review as a PR comment |
Setup
npm install
cp .env.example .envFill in .env:
GITHUB_TOKEN— fine-grained PAT with Pull requests (read/write) and Contents (read) permissions on the repos you want to reviewGOOGLE_API_KEY— from Google AI Studio
Running locally
npm startThis 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):
{
"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.jsnow uses a personal access token via@octokit/restdirectly, instead of@octokit/auth-app+ installation tokens. No webhook server, no Express, nosmee-client.Trigger: no webhook listener. Review happens when a tool is called.
Logging:
console.log→console.errorin 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.jsanddiff-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_reviewstool backed by a small DB, so repeated reviews on the same PR don't re-run from scratchAdd resource support (
server.resource) to expose PR diffs as browsable MCP resources rather than only tool outputs