Skip to main content
Glama
GitHub PR Issue Analyser

GitHub PR Issue Analyser

by saidsef

MCP for GitHub PR, Issues, Tags and Releases

CI Tag and Release Maintainability Codacy Badge

An MCP server that connects an LLM to GitHub's repository management features. It analyses pull requests, manages issues, and handles tags and releases, over stdio or HTTP, with a static token or GitHub OAuth2.

  • Pull requests - fetch diffs, content, linked issues and CI status, create, comment, review, merge and update, close, retarget, label and flip draft status, read and correct posted comments

  • Issues - create, update, list, search and assign, read a repository's labels, run milestones and file issues under them

  • Releases - tag commits, publish releases, and list, correct or withdraw what is published

  • Users - profile lookup, contribution activity and star growth via GraphQL

  • Repositories - list what a user, an organisation or the caller owns, and read any file or directory tree at a branch, tag or SHA

The full tool list is in docs/tools.md.

Quick start

export GITHUB_TOKEN="<github-token>"
uvx https://github.com/saidsef/mcp-github-pr-issue-analyser.git

Then add it to your client:

{
  "mcpServers": {
    "github_prs_issues": {
      "command": "uvx",
      "args": [
        "https://github.com/saidsef/mcp-github-pr-issue-analyser.git"
      ],
      "env": {
        "GITHUB_TOKEN": "<your-github-token>"
      }
    }
  }
}

For HTTP mode, Docker, Kubernetes and OAuth2, see the documentation below.

Related MCP server: GitHub MCP Server

Documentation

The pages below are also published on Read the Docs.

Page

Contents

Installation

Requirements, running from source, Docker, Kubernetes

Configuration

Auth modes, environment variables, OAuth App setup, token stores

Client configuration

Ready-to-paste configs for token and OAuth2, per client

Tools

Every tool the server registers, and the skills that drive them

Architecture

Request path from client to GitHub API

Metrics

Prometheus endpoint, metric names, scrape setup

Requirements

Python 3.14, and a GitHub personal access token with the repo and workflow scopes or a GitHub OAuth App.

Source

Our latest and greatest source of mcp-github-pr-issue-analyser can be found on GitHub. Fork us!

Contributing

We would :heart: you to contribute by making a pull request.

Please read the official Contribution Guide for more information on how you can contribute.

Available Tools

66 tools
chooseChooseAInspect

Present the user with a set of options to choose from.

Call this tool when you need the user to make a decision between discrete alternatives. Use it proactively — don't ask the user to type their choice in chat when you can present clean, clickable options instead.

The user will see a card with one button per option. When they click one, their choice appears as a message in the conversation (as if the user typed it), like:

"Which deployment strategy?" — I selected: Blue-green

IMPORTANT: After calling this tool, you MUST stop and wait for the user's response. Do not continue or take any other actions until you see the "I selected:" message.

Workflow and conventions: github_get_skill('interactive-ui').

Inputs: prompt (required), options (required), title.

github_add_inline_pr_commentGithub Add Inline Pr CommentAInspect

Adds an inline review comment to a line, or to a range of lines, in a file within a PR. The line must fall inside the PR's diff hunks: GitHub rejects a comment on an unchanged line outside any hunk, and on a path not in the diff. A deleted line exists only on side LEFT. Pass head_sha from github_get_pr_content as expected_head_sha, so line numbers taken from that diff apply to that commit. See #517.

Workflow and conventions: github_get_skill('pr-review').

Inputs: line (required), path (required), pr_number (required), repo_name (required), +6 more. Returns: id, body, author, html_url, +1 more

github_add_pr_commentsGithub Add Pr CommentsCInspect

Adds a comment to a specific pull request.

Workflow and conventions: github_get_skill('pr-review').

Inputs: comment (required), pr_number (required), repo_name (required), repo_owner (required). Returns: id, body, author, html_url, +1 more

github_add_to_projectGithub Add To ProjectA
Idempotent
Inspect

Puts an issue or pull request on a project board. One the board already holds comes back with the card it already has, so a retry adds nothing and overwrites nothing.

Workflow and conventions: github_get_skill('project-boards').

Inputs: repo_name (required), repo_owner (required), issue_number (required), project_owner (required), +1 more. Returns: object

github_api_deleteGithub Api DeleteA
Destructive
Inspect

Sends a DELETE to any path under api.github.com, or runs a GraphQL mutation that deletes or removes something, for a removal no other tool makes. Neither can be undone. GitHub decides what the token may remove. See #543.

Workflow and conventions: github_get_skill('api-requests').

Inputs: body, path, graphql, max_bytes, +1 more. Returns: body, status, has_more, truncated, +2 more

github_api_readGithub Api ReadA
Read-only
Inspect

Sends a GET to any path under api.github.com, or runs a GraphQL query, for an endpoint no other tool covers. GitHub decides what the token may read, and a refusal names the scope it lacks where GitHub says. See #543.

Workflow and conventions: github_get_skill('api-requests').

Inputs: path, params, graphql, max_bytes, +1 more. Returns: body, status, has_more, truncated, +2 more

github_api_writeGithub Api WriteAInspect

Sends a POST, PATCH or PUT to any path under api.github.com, or runs a GraphQL mutation, for a change no other tool makes. A DELETE, and a mutation that deletes or removes something, belong to github_api_delete, whose destructive hint says so. GitHub decides what the token may change. See #543.

Workflow and conventions: github_get_skill('api-requests').

Inputs: body, path, method, graphql, +2 more. Returns: body, status, has_more, truncated, +2 more

github_commit_filesGithub Commit FilesAInspect

Commits text files to a branch, writing each path in files and deleting each one set to null. GitHub signs the commit, as it does for github_create_empty_commit. A second parent makes a merge commit through the Git Database API, since the signing mutation takes one parent, and GitHub leaves that commit unsigned. Its tree starts from the second parent's, so files carries every file the branch changes as it should read after the merge. See #547.

Workflow and conventions: github_get_skill('pr-management').

Inputs: files (required), branch (required), message (required), repo_name (required), +3 more. Returns: branch, parents, html_url, tree_sha, +1 more

github_create_empty_commitGithub Create Empty CommitAInspect

Pushes a commit that changes no file, so CI starts a new run under the caller's name. A re-run keeps the privileges of the first run, which for Dependabot is a read-only token. Dependabot stops rebasing a branch once another commit is pushed to it, unless the message carries [dependabot skip], as the default does. GitHub signs the commit, as it does one made in the web interface. See #490 and #534.

Workflow and conventions: github_get_skill('pr-management').

Inputs: repo_name (required), repo_owner (required), branch, message, +3 more. Returns: branch, html_url, tree_sha, commit_sha, +2 more

github_create_issueGithub Create IssueAInspect

Creates a new issue. The update tools replace the label set as given and never re-add 'mcp'; only the create tools append it, and only when mcp_label is left enabled.

Workflow and conventions: github_get_skill('issue-management').

Inputs: body (required), title (required), repo_name (required), repo_owner (required), +3 more. Returns: body, state, title, author, +7 more

github_create_milestoneGithub Create MilestoneAInspect

Opens a milestone. A title the repository already uses fails, since titles are unique per repository. Edit the existing one with github_update_milestone.

Workflow and conventions: github_get_skill('issue-management').

Inputs: title (required), repo_name (required), repo_owner (required), state, +2 more. Returns: object

github_create_prGithub Create PrBInspect

Creates a new pull request. Labels are applied in a second call, since the create endpoint takes none, and they come back under labels so a set the token could not write is visible.

Workflow and conventions: github_get_skill('pr-management').

Inputs: base (required), body (required), head (required), title (required), +5 more. Returns: object

github_create_releaseGithub Create ReleaseBInspect

Publishes a release for a tag. A tag that already carries one fails, since overwriting published notes cannot be undone. Pass if_exists='update' to replace them deliberately, and read updated on the reply to tell which happened. See #401.

The update path sends the title, notes, draft and prerelease only, so make_latest and generate_release_notes are dropped and the generated changelog from the first publish is replaced by body alone.

Workflow and conventions: github_get_skill('release-management').

Inputs: body (required), tag_name (required), repo_name (required), repo_owner (required), +6 more. Returns: object

github_create_tagGithub Create TagAInspect

Creates a new tag. With a message it is an annotated tag, which stores the message; without one it is a lightweight ref.

Workflow and conventions: github_get_skill('release-management').

Inputs: tag_name (required), repo_name (required), repo_owner (required), sha, +1 more. Returns: object

github_delete_branchGithub Delete BranchA
Destructive
Inspect

Deletes a branch. The default branch is always refused. A branch an open pull request comes from is refused unless force is set, because deleting it closes that pull request. See #536.

Workflow and conventions: github_get_skill('pr-management').

Inputs: branch (required), repo_name (required), repo_owner (required), force, +1 more. Returns: object

github_delete_releaseGithub Delete ReleaseA
Destructive
Inspect

Deletes a release. The tag it was published from survives unless delete_tag asks for it, since the commit history usually should not move.

delete_tag=True removes the ref that the delete_tag tool refuses to touch while a release names it. No force flag is asked for here because the release goes first, so the dangling release that guard protects against cannot be what is left behind. See #404.

Workflow and conventions: github_get_skill('release-management').

Inputs: tag_name (required), repo_name (required), repo_owner (required), delete_tag. Returns: object

github_delete_tagGithub Delete TagA
Destructive
Inspect

Deletes a tag. A tag a release points at is refused unless force is set, because removing it leaves the release without the code it names.

Workflow and conventions: github_get_skill('release-management').

Inputs: tag_name (required), repo_name (required), repo_owner (required), force. Returns: object

github_dispatch_workflowGithub Dispatch WorkflowAInspect

Starts a workflow that declares a workflow_dispatch trigger, on ref, with inputs keyed by the names its file declares. GitHub takes at most 25 inputs, so more are refused before any request. The request sets return_run_details, since without it GitHub answers 204 and says nothing of the run. See #503.

Workflow and conventions: github_get_skill('pr-management').

Inputs: ref (required), repo_name (required), repo_owner (required), workflow_id (required), +1 more. Returns: object

github_get_issueGithub Get IssueA
Read-only
Inspect

Fetches a single issue by number, with its body, labels, assignees and milestone. Reads straight from the issue rather than the search index, so it sees a write immediately. See #358.

Workflow and conventions: github_get_skill('issue-management').

Inputs: repo_name (required), repo_owner (required), issue_number (required). Returns: body, state, title, author, +7 more

github_get_job_logGithub Get Job LogA
Read-only
Inspect

Fetches the end of a GitHub Actions job's log, capped at max_bytes. A job reports its failure last, so a cut keeps the tail. GitHub redirects to a storage host for one minute, and the download goes there without the token. See #500.

Workflow and conventions: github_get_skill('pr-analysis').

Inputs: job_id (required), repo_name (required), repo_owner (required), max_bytes. Returns: log, job_id, truncated, bytes_total, +1 more

github_get_latest_shaGithub Get Latest ShaA
Read-only
Inspect

Fetches the SHA of the newest commit on ref, or on the default branch when ref is omitted. Returns None if the repository has no commits. The answer is a reading rather than a pin, so a push landing afterwards moves it.

Workflow and conventions: github_get_skill('release-management').

Inputs: repo_name (required), repo_owner (required), ref. Returns: result

github_get_pr_contentGithub Get Pr ContentB
Read-only
Inspect

Fetches the content/details of a specific pull request.

Workflow and conventions: github_get_skill('pr-analysis').

Inputs: pr_number (required), repo_name (required), repo_owner (required). Returns: state, title, author, labels, +17 more

github_get_pr_diffGithub Get Pr DiffA
Read-only
Inspect

Fetches the net unified diff of a specific pull request, capped at max_bytes. bytes_total is the whole diff either way, so a truncated reply says what was left behind. See #314 and #514.

Workflow and conventions: github_get_skill('pr-analysis').

Inputs: pr_number (required), repo_name (required), repo_owner (required), max_bytes. Returns: patch, pr_number, truncated, bytes_total, +1 more

github_get_pr_linked_issuesGithub Get Pr Linked IssuesB
Read-only
Inspect

Return the issues that will be auto-closed when a pull request is merged.

Workflow and conventions: github_get_skill('pr-analysis').

Inputs: pr_number (required), repo_name (required), repo_owner (required). Returns: pr_number, linked_issues

github_get_project_fieldsGithub Get Project FieldsA
Read-only
Inspect

Lists a project's fields and the options each single-select one accepts, which is what github_set_project_field expects to be named.

Workflow and conventions: github_get_skill('project-boards').

Inputs: project_owner (required), project_number (required). Returns: object

github_get_pr_status_checksGithub Get Pr Status ChecksA
Read-only
Inspect

Return the CI check runs and commit status for a pull request's HEAD commit.

Pages through up to MAX_STATUS_CHECKS_SUITE_PAGES of check suites (50 per page). For any suite whose first 100 runs are not the full set, drains up to MAX_STATUS_CHECKS_RUN_PAGES_PER_SUITE additional pages via the supplemental query. If either cap is hit before the connection is exhausted, the result is flagged truncated=True and overall is downgraded from 'passing' to 'unknown' so the caller does not act on a partial view. head_sha names the commit read, and is None when GitHub resolves no commit for the pull request. See #515.

Workflow and conventions: github_get_skill('pr-analysis').

Inputs: pr_number (required), repo_name (required), repo_owner (required). Returns: overall, head_sha, pr_number, truncated, +2 more

github_get_releaseGithub Get ReleaseA
Read-only
Inspect

Fetches one release, by tag or the latest published one.

Workflow and conventions: github_get_skill('release-management').

Inputs: repo_name (required), repo_owner (required), tag_name. Returns: object

github_get_repository_fileGithub Get Repository FileA
Read-only
Inspect

Reads one file from a repository at ref, windowed to limit bytes from offset. bytes_total is the whole file either way and next_offset says where to carry on, so a partial read never passes for the lot. A directory belongs to github_list_repository_tree. See #409.

Workflow and conventions: github_get_skill('pr-analysis').

Inputs: path (required), repo_name (required), repo_owner (required), ref, +2 more. Returns: ref, path, binary, content, +4 more

github_get_repo_stars_sinceGithub Get Repo Stars SinceA
Read-only
Inspect

Return the repos owned by username that received the most new stars since a given date. since accepts YYYY-MM-DD or ISO 8601, defaulting to 30 days ago. Answers prompts like 'which repos gained the most stars in the last 30 days'. Counts come from the weekly star history, so they resolve to whole UTC days rather than to exact star timestamps. Cost is one request for each page of the repo listing, then roughly one request per repo for every 30 weeks of the window, which makes a 30-day window a single request per repo however popular that repo is. truncated is True when the account has more public repos than the listing could read, or when a repo's history ran longer than the walk could read, so the answer may miss some.

Workflow and conventions: github_get_skill('user-activity').

Inputs: username (required), since, top_n, max_repos. Returns: repos, since, username, truncated

github_get_skillGithub Get SkillA
Read-only
Inspect

Reads one skill in full. The same content is served as a skill:// resource, so a client that reads resources needs neither tool.

Inputs: name (required). Returns: uri, name, content, description

github_get_user_activitiesGithub Get User ActivitiesA
Read-only
Inspect

Get user activities with optional filtering by org, repo, and date range using GraphQL API. since/until accept YYYY-MM-DD or full ISO 8601 (YYYY-MM-DDTHH:MM:SSZ). Note: repo_stars is each repository's current cumulative star count, not stars gained within the requested period. Use github_get_repo_stars_since for per-period deltas.

Workflow and conventions: github_get_skill('user-activity').

Inputs: username (required), org, repo, since, +2 more. Returns: issues, commits, reviews, username, +4 more

github_get_workflow_runsGithub Get Workflow RunsA
Read-only
Inspect

Reads a workflow run by id, or every run on the commit that head names, with each run's jobs and their steps. A wait polls until every run has completed, and the server caps it so a task ends before its worker hands it to another. timed_out says a run had not completed when the tool returned. See #537.

Workflow and conventions: github_get_skill('pr-analysis').

Inputs: repo_name (required), repo_owner (required), head, run_id, +1 more. Returns: runs, timed_out, truncated

github_list_branchesGithub List BranchesB
Read-only
Inspect

Lists a repository's branches, the commit at each head and whether a protection rule covers it.

Workflow and conventions: github_get_skill('pr-management').

Inputs: repo_name (required), repo_owner (required), page, per_page, +1 more. Returns: object

github_list_milestonesGithub List MilestonesA
Read-only
Inspect

Lists a repository's milestones with the count of issues in each.

Workflow and conventions: github_get_skill('issue-management').

Inputs: repo_name (required), repo_owner (required), page, state, +1 more. Returns: object

github_list_open_issues_prsGithub List Open Issues PrsA
Read-only
Inspect

Lists open pull requests or issues. The search is fixed to is:open, so closed and merged items are out of reach here. Call github_search_issues_prs for those, and for any qualifier this tool does not expose.

Workflow and conventions: github_get_skill('issue-management').

Inputs: repo_owner (required), page, issue, per_page, +2 more. Returns: object

github_list_pr_commentsGithub List Pr CommentsA
Read-only
Inspect

Lists the comments on a pull request. Inline comments carry the file and line they sit on, so a second review can tell what it already said.

Workflow and conventions: github_get_skill('pr-review').

Inputs: pr_number (required), repo_name (required), repo_owner (required), kind, +2 more. Returns: object

github_list_project_itemsGithub List Project ItemsA
Read-only
Inspect

Lists what is on a project board with each card's field values, so a backlog can be read by Status rather than one issue at a time. A board is a GraphQL connection, which pages by cursor rather than page number, so pass next_cursor back as after until has_more comes back false.

Workflow and conventions: github_get_skill('project-boards').

Inputs: project_owner (required), project_number (required), after, per_page. Returns: object

github_list_projectsGithub List ProjectsA
Read-only
Inspect

Lists the Projects (v2) boards a user or organisation owns, with the number each other board tool takes, so a board can be found without reading its URL. The account type is resolved by GitHub, so one login serves for a person and an organisation alike. Pages by cursor: pass next_cursor back as after until has_more comes back false. See #465.

Workflow and conventions: github_get_skill('project-boards').

Inputs: project_owner (required), after, per_page. Returns: object

github_list_pr_reviewsGithub List Pr ReviewsA
Read-only
Inspect

Lists the reviews submitted on a pull request, oldest first, each with its author and verdict. A review is not a comment: github_list_pr_comments returns what was said on lines and in the thread, not whether anyone approved. Read requested_reviewers from github_get_pr_content to tell nobody has reviewed from nobody having been asked. See #408.

Workflow and conventions: github_get_skill('pr-review').

Inputs: pr_number (required), repo_name (required), repo_owner (required), page, +1 more. Returns: object

github_list_releasesGithub List ReleasesB
Read-only
Inspect

Lists a repository's releases, newest first.

Workflow and conventions: github_get_skill('release-management').

Inputs: repo_name (required), repo_owner (required), page, per_page. Returns: object

github_list_repo_labelsGithub List Repo LabelsB
Read-only
Inspect

Lists the labels defined in a repository.

Workflow and conventions: github_get_skill('issue-management').

Inputs: repo_name (required), repo_owner (required), page, per_page. Returns: object

github_list_reposGithub List ReposA
Read-only
Inspect

Lists repositories for a user, an organisation, or the caller. The owner's account type picks the endpoint, since /orgs 404s on a person and /users hides an organisation's private repositories. See #354.

Workflow and conventions: github_get_skill('user-activity').

Inputs: page, sort, owner, per_page. Returns: object

github_list_repository_treeGithub List Repository TreeA
Read-only
Inspect

Lists a repository's tree at ref, one level deep unless recursive. Each entry carries path, mode, type, size and sha. truncated is True where the tree exceeded GitHub's cap, which no amount of paging widens. See #409.

Workflow and conventions: github_get_skill('pr-analysis').

Inputs: repo_name (required), repo_owner (required), ref, path, +1 more. Returns: ref, path, total, entries, +1 more

github_list_skillsGithub List SkillsA
Read-only
Inspect

Lists the workflow guidance bundled with this server, each with the name github_get_skill takes and the skill:// URI the same content is served under. Read the one covering the task before starting it. See #414.

Inputs: no named parameters. Returns: object

github_list_tagsGithub List TagsA
Read-only
Inspect

Lists a repository's tags and the commit each points at.

Workflow and conventions: github_get_skill('release-management').

Inputs: repo_name (required), repo_owner (required), page, per_page. Returns: object

github_merge_prGithub Merge PrAInspect

Merges a specific pull request. Read head_sha from github_get_pr_content and pass it as expected_head_sha, and GitHub refuses with a 409 rather than merge a push that arrived after the read. See #517.

Workflow and conventions: github_get_skill('pr-management').

Inputs: pr_number (required), repo_name (required), repo_owner (required), commit_title, +3 more. Returns: object

github_pr_issue_analyser_uiGithub Pr Issue Analyser UiAInspect

Execute Prefab Python code in a sandbox and render the result.

The code runs in a Pyodide WASM sandbox with full Python support. Import everything you use. Use the components tool to look up available components and their import paths.

Always use PrefabApp as the outermost context manager — this enables streaming so the UI renders progressively as code is written:

from prefab_ui.components import Column, Heading, Text, Row, Badge
from prefab_ui.app import PrefabApp

with PrefabApp() as app:
    with Column(gap=4):
        Heading("Dashboard")
        with Row(gap=2):
            Text("Revenue: $1.2M")
            Badge("On Track", variant="success")

For interactive UIs, pass initial state as a dict and use .rx on stateful components for reactive bindings:

from prefab_ui.components import Column, Slider, Text
from prefab_ui.app import PrefabApp

with PrefabApp(state={"threshold": 50}) as app:
    with Column(gap=4):
        slider = Slider(value=50, min=0, max=100, name="threshold")
        Text(f"Threshold: {slider.rx}%")

slider.rx produces {{ threshold }}, a template expression that resolves against client-side state. Use Rx("key") directly, or apply pipe filters: Rx("balance").currency() produces {{ balance | currency }}.

Available pipes: upper, lower, currency, length, json, round(n), default(val), truncate(n).

Charts live in prefab_ui.components.charts:

from prefab_ui.components.charts import BarChart, ChartSeries

BarChart(
    data=[{"month": "Jan", "rev": 100}, {"month": "Feb", "rev": 200}],
    series=[ChartSeries(data_key="rev", label="Revenue")],
    x_axis="month",
)

Values passed via data are available as global variables in the code. Python features like loops, f-strings, and comprehensions all work.

Layout patterns:

  • Card sub-components (CardHeader, CardContent, CardFooter) have built-in padding. Don't add extra padding to them. For a simple card without sub-components, use Card(css_class="p-6").

  • Use Grid(columns=N, gap=4) for equal-width cards or panels. Grid handles sizing automatically — no flex classes needed. For unequal widths, pass a list: Grid(columns=[2, 1], gap=4) gives a 2:1 ratio.

  • Row is for inline elements (badges, icons + text, buttons). Prefer Grid when children should have equal or proportional widths. Row does not wrap by default.

  • Column and Row accept gap (Tailwind scale: 1-12), align (cross-axis), and justify (main-axis) as native props — prefer these over raw css_class for spacing.

  • Use css_class="overflow-hidden" on containers if chart or content edges should clip to the container boundary.

Args: code: Python code that builds a Prefab component tree. data: Values injected as variables in the sandbox namespace. sandbox: A Sandbox instance. If not provided, a new one is created on each call.

Workflow and conventions: github_get_skill('interactive-ui').

Inputs: code (required), data.

github_remove_from_projectGithub Remove From ProjectA
Destructive
Inspect

Takes an issue or pull request off a project board. The issue itself is untouched and stays open, but the field values its card held go with it.

Workflow and conventions: github_get_skill('project-boards').

Inputs: repo_name (required), repo_owner (required), issue_number (required), project_owner (required), +1 more. Returns: object

github_reply_to_review_commentGithub Reply To Review CommentAInspect

Replies on an existing review thread rather than starting a new one.

Workflow and conventions: github_get_skill('pr-review').

Inputs: body (required), pr_number (required), repo_name (required), comment_id (required), +1 more. Returns: id, body, line, path, +7 more

github_request_reviewersGithub Request ReviewersA
Idempotent
Inspect

Asks users and teams to review a pull request, or withdraws the request. Both calls answer with the pull request, so its reviewer lists show what took effect without a second read. The removal endpoint requires reviewers, so withdrawing teams alone sends an empty list. See #502.

Workflow and conventions: github_get_skill('pr-management').

Inputs: pr_number (required), repo_name (required), repo_owner (required), remove, +2 more. Returns: object

github_rerun_jobGithub Rerun JobAInspect

Re-runs one Actions job and every job that depends on it, without a commit on the branch. Each call starts another attempt, so calling it twice runs the job twice. A re-run keeps the privileges of the first run, so a Dependabot job that failed on its read-only token wants github_create_empty_commit instead. It returns the run's id as workflow_run_id, which github_get_workflow_runs follows. See #503 and #537.

Workflow and conventions: github_get_skill('pr-management').

Inputs: job_id (required), repo_name (required), repo_owner (required), enable_debug_logging. Returns: object

github_search_api_routesGithub Search Api RoutesA
Read-only
Inspect

Finds REST routes whose summary or path holds every word of the query, each with its method, path, summary, docs link and the request tool that sends it. The routes come from GitHub's OpenAPI description. See #543.

Workflow and conventions: github_get_skill('api-requests').

Inputs: query (required), limit, method. Returns: total, routes

github_search_issues_prsGithub Search Issues PrsA
Read-only
Inspect

Searches issues and pull requests by text and qualifiers. Unlike github_list_open_issues_prs the query is the caller's, so closed and merged items are reachable and any qualifier GitHub search accepts works. GitHub runs a lexical search when search_type is absent, so the default sends none. Semantic and hybrid cover issues alone, and GitHub falls back to lexical for a query that can reach a PR.

Workflow and conventions: github_get_skill('issue-management').

Inputs: query (required), page, per_page, search_type. Returns: object

github_search_prefab_componentsGithub Search Prefab ComponentsAInspect

Search the Prefab component library.

Use this tool to look up exact argument names, accepted values, and usage examples before writing component code. The skill covers patterns and layout; this tool has the API details.

The query matches component names and descriptions. Space-separated terms match independently, so "Card Badge Metric" returns all three.

When a query matches a small number of components, full details (docstrings, args, examples) are shown automatically. For broad searches, a compact listing is returned instead. Use detail to override this behavior.

Args: query: Filter by component name or description. Space-separated terms are OR-matched. detail: Show full docstrings and args. Defaults to automatic (detailed for ≤5 matches, compact otherwise). limit: Max components to return in detail mode (default 8). No limit in compact mode.

Workflow and conventions: github_get_skill('interactive-ui').

Inputs: limit, query, detail, components. Returns: result

github_search_userGithub Search UserB
Read-only
Inspect

Search for a GitHub user by username using GraphQL API.

Workflow and conventions: github_get_skill('user-activity').

Inputs: username (required). Returns: bio, url, name, email, +11 more

github_set_assigneesGithub Set AssigneesC
Idempotent
Inspect

Updates the assignees for a specific issue or pull request.

Workflow and conventions: github_get_skill('pr-management').

Inputs: assignees (required), repo_name (required), repo_owner (required), issue_number (required). Returns: object

github_set_issue_milestoneGithub Set Issue MilestoneA
Idempotent
Inspect

Files an issue under a milestone, or takes it off one. Takes the title rather than the number GitHub wants, and looks it up, which is the work github_update_issue is kept clear of. Omit the title to clear the milestone.

Workflow and conventions: github_get_skill('issue-management').

Inputs: repo_name (required), repo_owner (required), issue_number (required), milestone. Returns: body, state, title, author, +7 more

github_set_pr_draftGithub Set Pr DraftA
Idempotent
Inspect

Moves a pull request between draft and ready for review. REST accepts draft only when the pull request is created, so this goes through GraphQL.

Workflow and conventions: github_get_skill('pr-management').

Inputs: draft (required), pr_number (required), repo_name (required), repo_owner (required). Returns: object

github_set_project_fieldGithub Set Project FieldA
Idempotent
Inspect

Sets a single-select field on an issue's card, naming the field and the option rather than their node ids. An issue not yet on the board is added first, since a field value has nowhere to live otherwise.

Workflow and conventions: github_get_skill('project-boards').

Inputs: field (required), option (required), repo_name (required), repo_owner (required), +3 more. Returns: object

github_submit_reviewGithub Submit ReviewAInspect

Submits a review for a specific pull request. GitHub applies a review to the newest commit unless told otherwise, so pass head_sha from github_get_pr_content as expected_head_sha to review the commit that was read. See #517.

Workflow and conventions: github_get_skill('pr-review').

Inputs: event (required), pr_number (required), repo_name (required), repo_owner (required), +2 more. Returns: object

github_update_issueGithub Update IssueA
Idempotent
Inspect

Updates an existing issue. Only the fields supplied are sent, the rest keep their current values.

Workflow and conventions: github_get_skill('issue-management').

Inputs: repo_name (required), repo_owner (required), issue_number (required), body, +3 more. Returns: body, state, title, author, +7 more

github_update_milestoneGithub Update MilestoneA
Idempotent
Inspect

Changes a milestone in place. Only the fields supplied are sent, so closing one leaves its title and due date alone.

Workflow and conventions: github_get_skill('issue-management').

Inputs: title (required), repo_name (required), repo_owner (required), state, +3 more. Returns: object

github_update_prGithub Update PrA
Idempotent
Inspect

Updates an existing pull request. Only the fields supplied are sent, the rest keep their current values, so a title can change without restating the body. Labels take a second call, since the pull request endpoint does not take them. That call answers with the issue, which has no head, base or reviewers, so a labels-only update reads the pull request back.

Workflow and conventions: github_get_skill('pr-management').

Inputs: pr_number (required), repo_name (required), repo_owner (required), base, +4 more. Returns: state, title, author, labels, +17 more

github_update_pr_branchGithub Update Pr BranchA
Idempotent
Inspect

Updates the pull request branch with the latest upstream changes. Read head_sha from github_get_pr_content and pass it as expected_head_sha to be refused rather than to overwrite a push that landed since.

Workflow and conventions: github_get_skill('pr-management').

Inputs: pr_number (required), repo_name (required), repo_owner (required), expected_head_sha. Returns: object

github_update_pr_commentGithub Update Pr CommentA
Idempotent
Inspect

Rewrites a comment already posted. Conversation and review comments have separate id spaces, so the kind has to match where the id came from.

Workflow and conventions: github_get_skill('pr-review').

Inputs: body (required), repo_name (required), comment_id (required), repo_owner (required), +1 more. Returns: id, body, author, html_url, +1 more

github_update_releaseGithub Update ReleaseA
Idempotent
Inspect

Changes a release in place, a draft included. Only the fields supplied are sent, so correcting a title does not wipe the notes. make_latest is settable on github_create_release alone, and only on the call that first publishes the tag, since publishing again falls through to here and this tool does not send it. Move the latest badge by deleting the release and publishing it again, or in the GitHub UI.

Workflow and conventions: github_get_skill('release-management').

Inputs: tag_name (required), repo_name (required), repo_owner (required), body, +3 more. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 66 tools

    Disambiguation3/5

    Most tools target a distinct resource+action, but the generic github_api_read/write/delete trio deliberately overlaps every specific tool, and the comment family (add_pr_comments vs add_inline_pr_comment vs reply_to_review_comment vs update_pr_comment) plus list_open_issues_prs vs search_issues_prs require careful reading to pick correctly. The detailed descriptions help, but an agent can plausibly reach for a generic or wrong-shaped tool in several places.

    Naming Consistency4/5

    The vast majority follow a predictable github_verb_noun pattern (get_pr_diff, list_pr_reviews, update_issue, create_release). Outliers are limited: bare 'choose' and 'github_pr_issue_analyser_ui' break the verb_noun convention, and github_add_pr_comments uses a plural noun where others are singular.

    Tool Count2/5

    At 66 tools this is far beyond a well-scoped set, and the surface balloons well past the 'PR Issue Analyser' title into projects, releases, tags, Actions, branches, files, and a Prefab UI sandbox. Many of these belong to separate concerns an agent looking for PR/issue analysis will rarely need.

    Completeness4/5

    Coverage is broad and near-complete: full PR lifecycle (create, update, merge, draft, reviewers, inline/conversation comments, reviews), issue/milestone/label reads, releases and tags with careful delete semantics, project boards, and branch/workflow/file reads. Remaining gaps (e.g. label CRUD, comment deletion, PR review dismissal) are reachable through the generic api_* escape hatch, so no hard dead ends.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that enables AI agents to directly manage GitHub repositories, including PRs, issues, and code search, using natural language.
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      A production-grade MCP server that provides LLMs with safe, structured, tool-based access to GitHub repositories, including issue management, semantic search, and guarded write operations.
      MIT