Skip to main content
Glama

tai-mcp-github

A minimal MCP (Model Context Protocol) server that exposes a focused set of GitHub PR review tools to AI agents.

Why

The official github/github-mcp-server exposes 60+ tools (Actions, Discussions, Dependabot, secret scanning, gists, etc.). This inflates the MCP schema sent to the LLM on every request, increasing token usage and noise. This server limits the surface to exactly what is needed for a PR review workflow — nothing more.

Related MCP server: GitHub MCP Agent Server

Tools

Tool

Description

list_pull_requests

List open (or closed/all) PRs for a repository

get_pull_request

Get full details of a specific PR

list_pr_comments

List general thread comments on a PR (conversation tab)

list_unresolved_review_threads

List unresolved inline review threads (diff comments)

resolve_review_thread

Mark an inline review thread as resolved

Requirements

  • Python 3.12+

  • uv

  • A GitHub Personal Access Token with Pull requests: Read (and Write if you want to resolve threads)

Setup

git clone <repo-url>
cd tai-mcp-github

cp .env.example .env
# Edit .env and set GITHUB_TOKEN=your_pat_here

Usage

Run the server

uv run server.py

Use with Claude Code

Add to your MCP configuration (e.g. ~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "github-pr-review": {
      "command": "uv",
      "args": ["run", "server.py"],
      "cwd": "/path/to/tai-mcp-github"
    }
  }
}

Development

Run tests

uv run --with pytest --with pytest-asyncio pytest tests/ -v

Lint and type-check

uv run --with ruff ruff check .
uv run --with ruff ruff format --check .
uv run --with mypy mypy server.py

Git hooks

Pre-commit (ruff + mypy) and pre-push (tests) hooks are provided. Install them once:

cp .git/hooks/pre-commit .git/hooks/pre-commit  # already in place after clone

Note: git hooks are local only. Run the script below on a fresh clone to activate them.

chmod +x .git/hooks/pre-commit .git/hooks/pre-push

Tech stack

  • fastmcp — MCP server framework

  • PyGithub — GitHub REST API client

  • httpx — HTTP client used for GitHub GraphQL API calls

  • python-dotenv.env file support

  • ruff — linting and formatting

  • mypy — static type checking

  • pytest — testing

Architecture

server.py          # Single-file MCP server — all tools live here
tests/
└── test_server.py # Unit tests (fully mocked, no GitHub calls)

The server is intentionally stateless — no caching, sessions, or background tasks. Each tool maps directly to one GitHub API call:

  • PR listing and detail use the GitHub REST API via PyGithub

  • Review thread listing and resolving use the GitHub GraphQL API via a single httpx POST (the GraphQL resolveReviewThread mutation is not available on the REST API)

Authentication is via a GitHub Personal Access Token passed through the GITHUB_TOKEN environment variable. No OAuth or GitHub App flows are needed.

Scope

This server is read-focused. Explicitly out of scope:

  • Git operations (commits, pushes, branch management) — do these locally

  • Any GitHub feature outside the PR review workflow (Actions, Issues, Releases, etc.)

Available Tools

5 tools
get_pull_requestA

Get full details of a specific pull request.

Args: owner: Repository owner. repo: Repository name. pr_number: Pull request number.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
pr_numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden for behavioral disclosure. It only states 'Get full details' and provides parameter names; it does not mention read-only nature, authentication requirements, rate limits, or possible errors. This is a minimal disclosure for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: one purpose sentence followed by a clean argument list. No filler or redundancy; every line provides needed information, making it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read operation with three parameters and an output schema, the description covers the core purpose and parameter semantics. It could be enhanced by mentioning alternatives or edge conditions, but the presence of an output schema removes the need to describe return values, making it sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates by listing each parameter with a brief semantic: 'Repository owner,' 'Repository name,' 'Pull request number.' This adds meaning beyond the schema's bare names and types, though the explanations are terse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get full details of a specific pull request,' which uses a specific verb and resource, clearly distinguishing it from sibling tools like list_pull_requests that operate on collections. The argument list reinforces the intent by naming owner, repo, and pr_number.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: when you need details for one specific pull request, use this tool. However, it does not explicitly state when not to use it or name alternatives (e.g., list_pull_requests for multiple PRs). The context is clear enough for an agent to infer but lacks explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pr_commentsA

List general thread comments on a pull request (conversation tab).

These are top-level comments, not inline review comments on the diff. Use list_unresolved_review_threads for inline code review comments.

Args: owner: Repository owner. repo: Repository name. pr_number: Pull request number.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
pr_numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of behavioral disclosure. It states the tool list comments (a read operation) but does not mention any authentication requirements, side effects, or rate limits. The description is adequate for a simple read tool with an output schema, but greater transparency about pagination or error scenarios would be beneficial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-sentence summary, a clarifying sentence, a sibling reference, and a clean parameter list. Every sentence adds value, and the information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 3 simple required parameters and an output schema (which presumably defines return fields), the description is complete for its complexity. It clarifies the scope of comments and excludes review threads. A slight deduction for not specifying whether the output includes pagination or ordering.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the schema provides no descriptions for the three parameters. The description includes a docstring-style list that restates 'owner', 'repo', and 'pr_number' with minimal context (e.g., 'Repository owner'), but does not explain the format required for each (e.g., username, string patterns, value ranges). Since the schema does not help and the description lacks detail, the score is low.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists 'general thread comments on a pull request (conversation tab)' and distinguishes these from 'inline review comments on the diff', which is a specific verb+resource combination. It correctly differentiates from sibling tools like list_unresolved_review_threads, which is aimed at inline code reviews.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool (for top-level comments on the conversation tab) and when not to use it (for inline code review comments). It directly names the alternative sibling tool list_unresolved_review_threads for the latter case, providing clear usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pull_requestsB

List pull requests for a repository.

Args: owner: Repository owner (user or organisation). repo: Repository name. state: Filter by state — 'open' (default), 'closed', or 'all'.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
stateNoopen

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description carries the full burden. It correctly identifies this as a listing (read) operation, but does not disclose pagination behavior, rate limits, or whether results are ordered. The default state 'open' is useful, but overall behavioral depth is moderate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using a docstring format with clear Args sections. Every sentence earns its place without fluff. Slight reduction for the verbose format (Args block could be more compact).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate complexity (3 parameters, one optional with default) and the presence of an output schema (which reduces need to describe return data), the description is reasonably complete. It covers all parameters and the basic action. Missing details about pagination or sorting are minor given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so all parameter meaning must come from the description. The description explains owner, repo, and state with default, which adds value. However, it does not clarify format nuances (e.g., owner as username vs. ID) or further constraints on state values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists pull requests for a repository, which is a specific verb and resource. It distinguishes from siblings like get_pull_request (specific PR) and list_pr_comments (comments), but does not explicitly differentiate from list_unresolved_review_threads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus siblings like get_pull_request or list_pr_comments. There is no mention of prerequisites (e.g., repository access), nor alternatives for more specific queries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_unresolved_review_threadsA

List unresolved inline review threads on a pull request.

Returns only threads that have not been resolved yet, so the agent has a clear picture of what still needs attention. Each thread includes its GitHub node ID (thread_id), file path, line number, and all comments. Pass thread_id to resolve_review_thread to mark a thread as done.

Args: owner: Repository owner. repo: Repository name. pr_number: Pull request number.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
pr_numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description bears the full burden: it discloses that only unresolved threads are returned, describes the returned thread structure (node ID, file path, line number, comments), and names the continuation tool. It does not mention pagination, rate limits, or error conditions, but is transparent about the filtering behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise – two short paragraphs plus a terse Args list. The key behavior (only unresolved) is front-loaded. No redundant or off-topic sentences. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 3 simple required parameters, an output schema existing, and fully transparent behavior, the description provides all necessary context for an agent to select and invoke the tool correctly. It explains the filtering, the thread structure, and the follow-up tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema description coverage is 0%, the description includes a concise Args section that defines each parameter (owner, repo, pr_number) beyond their names and types, providing clear purpose. The schema only has names and types, so the description adds critical meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists unresolved inline review threads on a pull request, specifying the verb 'list', the resource 'unresolved inline review threads', and distinguishing it from general comment listing or resolution tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use (to see what still needs attention) and references the sibling tool resolve_review_thread as the next step. However, it does not explicitly say when not to use it, such as for resolved threads or non-inline comments.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_review_threadA

Mark a pull request review thread as resolved.

Use list_unresolved_review_threads to get thread_id values.

Args: thread_id: GitHub GraphQL node ID of the review thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must fully disclose behavior. Only states it marks a thread as resolved, omitting details on permissions, idempotency, side effects (e.g., whether already-resolved threads error or succeed silently), or response format. Insufficient for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus an Args line, zero redundant text. Every element earns its place, front-loading the core action and then providing necessary parameter context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a one-parameter mutation tool with output schema present. Covers purpose and parameter source but lacks behavioral edge cases (errors, idempotency). Falls short of full completeness for safe autonomous invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description adds 'GitHub GraphQL node ID of the review thread' to the thread_id parameter, clarifying its type and source beyond the bare schema definition. Single parameter is well-documented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb+resource: 'Mark a pull request review thread as resolved.' Clearly distinguishes from sibling tools like list_unresolved_review_threads (which retrieves threads) and the PR listing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs users to list_unresolved_review_threads for obtaining thread_id values, establishing a clear prerequisite and companion tool use. Does not state when not to use, but context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedget_pull_request
    • First observedlist_pr_comments
    • First observedlist_pull_requests
    • First observedlist_unresolved_review_threads
    • First observedresolve_review_thread

TDQS

A4/5.0
Disambiguation5/5

Each tool targets a distinct aspect of pull request workflows: listing PRs, getting a specific PR, listing comments, listing unresolved review threads, and resolving them. There is no overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (list_pull_requests, get_pull_request, list_pr_comments, list_unresolved_review_threads, resolve_review_thread), using lowercase with underscores.

Tool Count5/5

Five tools is an appropriate and focused scope for a GitHub pull request review assistant. Each tool earns its place, covering listing, detail, comment viewing, unresolved thread viewing, and resolution.

Completeness4/5

The tool set covers the core PR review workflow well—listing, reading, and resolving threads. However, it lacks tools to create or reply to comments or threads, which agents may need to fully participate in reviews.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pxl-research/tai-mcp-github-pr'

If you have feedback or need assistance with the MCP directory API, please join our Discord server