github-pr-review
Enables LLM clients to list, read, review, and comment on GitHub pull requests, turning an AI assistant into a fully capable code reviewer.
README
GitHub PR Review MCP Server
An MCP server that gives any LLM client the ability to list, read, review, and comment on GitHub pull requests — turning your AI assistant into a fully capable code reviewer.
Overview
This server wraps the GitHub REST API using FastMCP, exposing pull request operations as tools any MCP-compatible client can call. Connect it to Claude Desktop and you can ask Claude to review your open PRs, read diffs, post inline comments, approve, or request changes — all without leaving your conversation.
The server maintains a single authenticated httpx client across its lifetime, initialised on startup and shared across all tool calls via FastMCP's lifespan context.
Tools
| Tool | Description |
|---|---|
list_open_prs |
List all open PRs with author, title, draft status, and URL |
get_pr_diff |
Get file changes and unified diffs for a specific PR |
get_pr_comments |
Get all existing review comments on a PR |
post_review_comment |
Post an inline comment on a specific file and line |
approve_pr |
Approve a PR with an optional review message |
request_changes |
Request changes on a PR with a review message |
Note:
approve_prandrequest_changesrequire the authenticated user to be different from the PR author. GitHub does not permit self-review.
Project Structure
github-pr-mcp/
├── server.py # FastMCP instance, lifespan, tool registration
├── config.py # Environment variables and constants
├── tools/
│ ├── __init__.py
│ ├── prs.py # list_open_prs, get_pr_diff
│ └── reviews.py # get_pr_comments, post_review_comment, approve_pr, request_changes
├── .env # Your secrets (never committed)
├── .env.example # Template
├── requirements.txt
├── Dockerfile
└── README.md
Requirements
- Python 3.11+
- uv
- A GitHub Personal Access Token with
reposcope
Setup
1. Clone the repository:
git clone https://github.com/Festuskipkoech/github-pr-mcp.git
cd github-pr-mcp
2. Install dependencies:
uv sync
3. Configure your environment:
cp .env.example .env
Edit .env and fill in your values:
GITHUB_TOKEN=your_personal_access_token
GITHUB_OWNER=your_github_username
GITHUB_REPO=your_repository_name
Generate a token at GitHub Settings → Developer Settings → Personal Access Tokens. Enable full repo scope for read and write access.
Running Locally
uv run python server.py
Or with the FastMCP CLI on Streamable HTTP transport:
fastmcp run server.py:mcp --transport streamable-http
Testing with MCP Inspector
Start the server in one terminal:
fastmcp run server.py:mcp --transport streamable-http
Launch the Inspector in a second terminal:
npx -y @modelcontextprotocol/inspector
In the Inspector UI:
- Transport: Streamable HTTP
- URL:
http://127.0.0.1:8000/mcp - Click Connect
Recommended test sequence:
| Step | Tool | Input |
|---|---|---|
| 1 | list_open_prs |
(no arguments) |
| 2 | get_pr_diff |
{"pr_number": 1} |
| 3 | get_pr_comments |
{"pr_number": 1} |
| 4 | post_review_comment |
{"pr_number": 1, "body": "Looks good", "path": "file.py", "line": 1} |
Using with Claude Desktop
Add the following to ~/.config/Claude/claude_desktop_config.json:
{
"mcpServers": {
"github-pr-review": {
"command": "/home/your-user/.local/bin/uv",
"args": [
"run",
"--directory",
"/absolute/path/to/github-pr-mcp",
"python",
"server.py"
]
}
}
}
Use the full path to uv (find it with which uv). Credentials are read from the .env file automatically — no need to pass them in the config.
Restart Claude Desktop, then try:
List all open pull requests in my repo and show me the diff for PR number 1
Claude calls list_open_prs and get_pr_diff and returns structured results:

Full PR diff and file changes returned inline:

Running with Docker
docker build -t github-pr-mcp .
docker run --env-file .env -p 8000:8000 github-pr-mcp
For Streamable HTTP transport, update server.py to run with:
mcp.run(transport="streamable-http", host="0.0.0.0", port=8000)
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
401 Unauthorized |
Invalid or expired token | Regenerate PAT on GitHub |
403 Forbidden |
Token lacks write scope | Enable full repo scope on your PAT |
404 Not Found |
Wrong owner or repo name | Check .env — use just the repo name, not the full URL |
422 Unprocessable on approve |
Self-review attempt | GitHub blocks approving your own PRs by design |
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
E2B
Using MCP to run code via e2b.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.