gh-pr-mcp
A minimal MCP (Model Context Protocol) server exposing a focused set of GitHub PR and review helpers that the gh CLI doesn't cover well: structured PR review threads, GraphQL thread resolve/unresolve, inline-comment review submission, and per-comment edit/delete via the REST API.
Published to PyPI as
gh-pr-mcp. The console script and MCP server are both namedgh-pr-mcp.
Philosophy
git and gh are already great at what they do. Wrapping them tool-by-tool just bloats the agent's tool list and gets in the way. The tools that earn a spot here are the ones that:
- Reduce token spend by composing verbose
ghJSON output into a tight summary (e.g.pr_view,pr_list,run_view,run_job_view,pr_checks), or - Use the GitHub API directly for operations the
ghCLI can't do in a single call (review-thread resolve/unresolve via GraphQL, replying to a specific review comment, editing/deleting review comments, posting a review with inline comments at specific lines).
Everything else — git status, git diff, gh pr create, gh issue list, etc. — is faster, simpler, and more flexible to call via the shell directly.
Tools
| Tool | What it does | Why it's here |
|---|---|---|
gh_pr_view |
PR details, body, reviews, comments, checks rollup, review decision + pending reviewers | Token-reducing summary |
gh_pr_list |
Open/closed PRs with mergeable state | Token-reducing summary |
gh_pr_checks |
CI check status | Token-reducing summary |
gh_pr_files |
Changed-files diffstat (status, +adds/-dels, renames), no patch blobs | Token-reducing summary for un-checked-out PRs |
gh_run_view |
Workflow run status + job list | Token-reducing summary |
gh_run_job_view |
Per-job details and (large) step logs | Helps when CI logs are massive |
gh_pr_review_threads |
Inline review comments grouped into threads, filterable by bot/human/active/outdated/resolved/unresolved | REST + GraphQL combined; gh cannot do this |
gh_pr_resolve_thread |
Mark a review thread resolved | GraphQL mutation only |
gh_pr_unresolve_thread |
Mark a review thread unresolved | GraphQL mutation only |
gh_pr_reply_comment |
Reply to a specific inline review comment by id | REST; no gh equivalent |
gh_pr_edit_comment |
Edit an existing review comment | REST; no gh equivalent |
gh_pr_delete_comment |
Delete a review comment | REST; no gh equivalent |
gh_pr_add_review |
Submit a review with inline comments at specific lines | REST; gh pr review only supports top-level body |
Recommended permission setup: allow everything in this server, and (separately) deny Bash(gh api …) so the model is funnelled through these helpers rather than rolling its own API calls.
GitHub Enterprise
Every tool picks the API host from the checkout's git remotes (gh's own remote order: upstream, github, origin), so enterprise repos work with no configuration as long as gh auth login --hostname <host> has been done. GH_HOST overrides the detection. The repo argument also accepts the three-part host/owner/name form when you need to target a different host than the checkout you're standing in.
Development
uv sync
uv run pytest # tests
uv run pyrefly check # type check
uv run gh-pr-mcp # run the server over stdio
MCP configuration
Project-scoped (worktree under active development)
.mcp.json in your project root points at the worktree:
{
"mcpServers": {
"gh-pr-mcp-dev": {
"command": "uvx",
"args": ["--from", "/path/to/gh-pr-mcp-dev", "gh-pr-mcp"]
}
}
}
Global config (stable)
From PyPI:
{
"mcpServers": {
"gh-pr-mcp": {
"command": "uvx",
"args": ["gh-pr-mcp"]
}
}
}
Or straight from the repo without PyPI:
{
"mcpServers": {
"gh-pr-mcp": {
"command": "uvx",
"args": ["--from", "git+https://github.com/gordon-to/gh-pr-mcp", "gh-pr-mcp"]
}
}
}
gh must be installed and authenticated (gh auth login) — the tools shell out to it.
Architecture
src/gh_mcp/
├── server.py # FastMCP app + tool registration
├── app.py # mcp + @tool decorator
├── run.py # subprocess helpers + input validation
└── tools/gh/
├── _api.py # gh api GET/POST/PATCH/DELETE + GraphQL helpers
├── pr_view.py # pr_view, pr_checks, pr_files, pr_review_threads
├── pr_list.py # pr_list
├── pr_review.py # pr_add_review, pr_reply_comment
├── pr_resolve_thread.py # pr_resolve_thread, pr_unresolve_thread
├── pr_edit_comment.py
├── pr_delete_comment.py
└── run_view.py # run_view, run_job_view
License
AGPL-3.0-only. If you run a modified version as a network service, the AGPL requires you to offer that modified source to its users.
Metadata
Release files for gh-pr-mcp 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gh_pr_mcp-0.1.3.tar.gz | 66.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gh_pr_mcp-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 97.2 kB
Release files / gh_pr_mcp-0.1.3.tar.gz
| Download URL | gh_pr_mcp-0.1.3.tar.gz |
|---|---|
| Size | 66.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f00b0a9fa7b80d76ca8e223983b750876f11665c1b43b7d549ebc59d5c5da966
|
|
BLAKE2b-256 checksum How to use checksums |
e90a685cdb5c695e877df32ab107ba08b539a37ffc9fa15b2af5d1cd96418353
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.
Transparency logRelease files / gh_pr_mcp-0.1.3-py3-none-any.whl
| Download URL | gh_pr_mcp-0.1.3-py3-none-any.whl |
|---|---|
| Size | 31.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f8bf00ebe1d96757c4cfb8bf5c56a7dc677d67e7c59cf6efd1433cebfb8f6d64
|
|
BLAKE2b-256 checksum How to use checksums |
5dafcf6880a4ed5933a6a01866a2949ca2501c0f84282a7f232c37b0ba6a5f95
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.
Transparency log