MCP server exposing a focused set of GitHub PR and review helpers the gh CLI can't do in one shot
Project description
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.
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gh_pr_mcp-0.1.0.tar.gz.
File metadata
- Download URL: gh_pr_mcp-0.1.0.tar.gz
- Upload date:
- Size: 62.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f5140b2535d06cb1ebc21b8dd35c95a188cc1a4a582a4d3c69ca9e7e018b1d9
|
|
| MD5 |
0277ee11469cea1a5a16974869aab17c
|
|
| BLAKE2b-256 |
3296a7b9f0eadf517e2f6ec7b07d49a24626931b6c1b82090082f4012c5cf9c1
|
Provenance
The following attestation bundles were made for gh_pr_mcp-0.1.0.tar.gz:
Publisher:
publish.yml on gordon-to/gh-pr-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gh_pr_mcp-0.1.0.tar.gz -
Subject digest:
0f5140b2535d06cb1ebc21b8dd35c95a188cc1a4a582a4d3c69ca9e7e018b1d9 - Sigstore transparency entry: 1872413320
- Sigstore integration time:
-
Permalink:
gordon-to/gh-pr-mcp@cee4a1a486a2e481492019d036601625b8de8259 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gordon-to
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cee4a1a486a2e481492019d036601625b8de8259 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file gh_pr_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: gh_pr_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 28.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a625745aa7a84daa0cf96e4fa1381bc5f2f4f829fd467d943141c24a2bbbf1f5
|
|
| MD5 |
febcbb52f259d850a9272358adb4aee4
|
|
| BLAKE2b-256 |
f60d87608f33a59d73dea3c08c98879939e72b917250bb1d0b5c1d994e1762c7
|
Provenance
The following attestation bundles were made for gh_pr_mcp-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on gordon-to/gh-pr-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gh_pr_mcp-0.1.0-py3-none-any.whl -
Subject digest:
a625745aa7a84daa0cf96e4fa1381bc5f2f4f829fd467d943141c24a2bbbf1f5 - Sigstore transparency entry: 1872413383
- Sigstore integration time:
-
Permalink:
gordon-to/gh-pr-mcp@cee4a1a486a2e481492019d036601625b8de8259 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gordon-to
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cee4a1a486a2e481492019d036601625b8de8259 -
Trigger Event:
workflow_dispatch
-
Statement type: