Skip to main content

gh-pr-mcp

PyPI Python CI License: AGPL-3.0 uv 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 named gh-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:

  1. Reduce token spend by composing verbose gh JSON output into a tight summary (e.g. pr_view, pr_list, run_view, run_job_view, pr_checks), or
  2. Use the GitHub API directly for operations the gh CLI 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)

Source distribution for gh-pr-mcp 0.1.3
File Size Uploaded
gh_pr_mcp-0.1.3.tar.gz 66.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gh-pr-mcp 0.1.3
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page