内容
# GitHub PR 审查 MCP 服务器
> 一个 MCP 服务器,允许任何 LLM 客户端列出、读取、审查和评论 GitHub 拉取请求 — 将您的 AI 助手转变为一个功能齐全的代码审查工具。
---
## 概述
该服务器使用 [FastMCP](https://gofastmcp.com) 封装 GitHub REST API,暴露拉取请求操作作为任何 MCP 兼容客户端可以调用的工具。将其连接到 Claude Desktop,您可以要求 Claude 审查您的开放拉取请求、读取差异、发布内联评论、批准或请求更改 — 所有这些都无需离开您的对话。
服务器在整个生命周期内维护一个单一的身份验证 `httpx` 客户端,该客户端在启动时初始化,并通过 FastMCP 的生命周期上下文在所有工具调用中共享。
---
## 工具
| 工具 | 描述 |
|---|---|
| `list_open_prs` | 列出所有开放的拉取请求,包含作者、标题、草稿状态和 URL |
| `get_pr_diff` | 获取特定拉取请求的更改文件和统一差异 |
| `get_pr_comments` | 获取拉取请求上的所有现有审查评论 |
| `post_review_comment` | 在特定文件和行上发布内联评论 |
| `approve_pr` | 批准拉取请求,附带可选的审查消息 |
| `request_changes` | 请求拉取请求上的更改,附带审查消息 |
> **注意:** `approve_pr` 和 `request_changes` 需要身份验证用户与拉取请求作者不同。GitHub 不允许自我审查。
---
## 项目结构
```
github-pr-mcp/
├── server.py # FastMCP 实例、生命周期、工具注册
├── config.py # 环境变量和常量
├── tools/
│ ├── __init__.py
│ ├── prs.py # list_open_prs, get_pr_diff
│ └── reviews.py # get_pr_comments, post_review_comment, approve_pr, request_changes
├── .env # 您的机密(从不提交)
├── .env.example # 模板
├── requirements.txt
├── Dockerfile
└── README.md
```
---
## 要求
- Python 3.11+
- [uv](https://docs.astral.sh/uv/getting-started/installation/)
- 具有 `repo` 范围的 GitHub 个人访问令牌
---
## 设置
**1. 克隆仓库:**
```bash
git clone https://github.com/Festuskipkoech/github-pr-mcp.git
cd github-pr-mcp
```
**2. 安装依赖项:**
```bash
uv sync
```
**3. 配置环境:**
```bash
cp .env.example .env
```
编辑 `.env` 并填写您的值:
```
GITHUB_TOKEN=您的个人访问令牌
GITHUB_OWNER=您的 GitHub 用户名
GITHUB_REPO=您的仓库名称
```
在 **GitHub 设置 → 开发者设置 → 个人访问令牌** 处生成令牌。启用完整的 `repo` 范围以获取读取和写入访问权限。
---
## 在本地运行
```bash
uv run python server.py
```
或使用 Streamable HTTP 传输的 FastMCP CLI:
```bash
fastmcp run server.py:mcp --transport streamable-http
```
---
## 使用 MCP 检验器测试
在一个终端中启动服务器:
```bash
fastmcp run server.py:mcp --transport streamable-http
```
在第二个终端中启动检验器:
```bash
npx -y @modelcontextprotocol/inspector
```
在检验器 UI 中:
- **传输:** Streamable HTTP
- **网址:** `http://127.0.0.1:8000/mcp`
- 点击 **连接**
**推荐的测试序列:**
| 步骤 | 工具 | 输入 |
|---|---|---|
| 1 | `list_open_prs` | _(无参数)_ |
| 2 | `get_pr_diff` | `{"pr_number": 1}` |
| 3 | `get_pr_comments` | `{"pr_number": 1}` |
| 4 | `post_review_comment` | `{"pr_number": 1, "body": "看起来不错", "path": "file.py", "line": 1}` |
---
## 与 Claude Desktop 一起使用
将以下内容添加到 `~/.config/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"github-pr-review": {
"command": "/home/your-user/.local/bin/uv",
"args": [
"run",
"--directory",
"/absolute/path/to/github-pr-mcp",
"python",
"server.py"
]
}
}
}
```
使用 `which uv` 找到 `uv` 的完整路径。凭证从 `.env` 文件中自动读取 — 无需在配置中传递它们。
重启 Claude Desktop,然后尝试:
```
列出我的仓库中的所有开放拉取请求,并为拉取请求编号 1 显示差异
```
Claude 调用 `list_open_prs` 和 `get_pr_diff` 并返回结构化结果:

完整的拉取请求差异和文件更改内联返回:

---
## 使用 Docker 运行
```bash
docker build -t github-pr-mcp .
docker run --env-file .env -p 8000:8000 github-pr-mcp
```
对于 Streamable HTTP 传输,请更新 `server.py` 以运行:
```python
mcp.run(transport="streamable-http", host="0.0.0.0", port=8000)
```
---
## 故障排除
| 错误 | 原因 | 修复 |
|---|---|---|
| `401 Unauthorized` | 无效或过期的令牌 | 在 GitHub 上重新生成 PAT |
| `403 Forbidden` | 令牌缺少写入范围 | 在您的 PAT 上启用完整的 `repo` 范围 |
| `404 Not Found` | 错误的仓库所有者或名称 | 检查 `.env` — 只需使用仓库名称,而不使用完整的 URL |
| `422 Unprocessable` on approve | 自我审查尝试 | GitHub 设计上阻止您批准自己的拉取请求 |