tai-mcp-github
Provides tools for managing GitHub pull requests, including listing, viewing details, comments, and review threads.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tai-mcp-githubList unresolved review threads in PR #42"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 open (or closed/all) PRs for a repository |
| Get full details of a specific PR |
| List general thread comments on a PR (conversation tab) |
| List unresolved inline review threads (diff comments) |
| Mark an inline review thread as resolved |
Requirements
Python 3.12+
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_hereUsage
Run the server
uv run server.pyUse 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/ -vLint and type-check
uv run --with ruff ruff check .
uv run --with ruff ruff format --check .
uv run --with mypy mypy server.pyGit 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 cloneNote: 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-pushTech stack
fastmcp — MCP server framework
PyGithub — GitHub REST API client
httpx — HTTP client used for GitHub GraphQL API calls
python-dotenv —
.envfile supportruff — 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
httpxPOST (the GraphQLresolveReviewThreadmutation 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 toolsget_pull_requestA
Get full details of a specific pull request.
Args: owner: Repository owner. repo: Repository name. pr_number: Pull request number.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | ||
| owner | Yes | ||
| pr_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | ||
| owner | Yes | ||
| pr_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | ||
| owner | Yes | ||
| state | No | open |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | ||
| owner | Yes | ||
| pr_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
get_pull_request - First observed
list_pr_comments - First observed
list_pull_requests - First observed
list_unresolved_review_threads - First observed
resolve_review_thread
TDQS
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.
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.
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.
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
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
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
An MCP server that gives your AI access to the source code and docs of all public github repos
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables AI agents to retrieve detailed GitHub Pull Request information using git commit hashes, branch names, or PR numbers. It automatically detects repositories and extracts comprehensive PR data including descriptions, labels, and reviews via the GitHub CLI.115ISC
- AlicenseBqualityBmaintenanceMCP server that exposes GitHub operations as tools for AI agents, enabling code search, issue management, and PR review.12MIT
- FlicenseAqualityBmaintenanceAn MCP server exposing AI-powered GitHub PR review as tools.5-
- FlicenseAqualityDmaintenanceMCP server exposing GitHub tools for issues, pull requests, and code browsing via the GitHub REST API. Designed for local LLM clients with flat arguments and streamable HTTP support.15-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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