Verified MCP server: GitHub

The GitHub MCP server, verified live from a real Mac.

  • Verified2026-08-03macOS 14.4.1
  • Packagegithub/github-mcp-server v1.8.0
  • Self-reportedgithub-mcp-server github-mcp-server/remote-112de3b831975632257acbdeb73b577f32ea1762
  • MCP protocol2025-06-18
  • Runtimev25.8.1 (test client)

The short answer

Last verified 2026-08-03

The GitHub MCP server is GitHub's own server for the Model Context Protocol, written in Go and published by the github organization itself. There are two supported ways to run it: the endpoint GitHub hosts at api.githubcopilot.com/mcp/, which any MCP client reaches over HTTPS with a GitHub token, and a container image you run yourself. We verified the hosted one, because it is the path that needs no Docker and no build step. We completed the MCP handshake against it, enumerated all 47 tools it returns by default, and ran one real read-only call. We then opened a second session with the read-only header on and watched the count drop to 28, with every write tool gone from the list. The raw output, including the exact errors, is on this page. [1][4][3]

  • Tools

    47, enumerated live

  • Credentials

    GitHub token or OAuth [4][5]

  • Transport

    Streamable HTTP, hosted by GitHub [4]

  • Maintainer

    github (official) [1]

  • Downloads

    6,002 on the v1.8.0 binaries [2]

  • License

    MIT [3]

Verification

How this MCP server was verified.

Method

The server we verified is the one GitHub hosts at https://api.githubcopilot.com/mcp/, so there is no local process and no startup banner to read. We spoke Streamable HTTP to it from this Mac: first a raw JSON-RPC initialize on the wire, which is the block printed below, then the same handshake through the MCP SDK client, then tools/list, then one real read-only tool call. We also opened a second session carrying the read-only header, and tools/list came back with 28 tools instead of 47. Authentication was a personal access token read from an already signed-in gh CLI; it is printed nowhere. This server is not an npm package, it is a Go binary and a container image, so the package line above carries the latest tagged release read from the GitHub releases API, while the endpoint reports its own build as its self-reported version. One thing about the block printed below: it is that capture with two pieces taken out so it fits on a page, the long instructions string and the two base64 icon blobs, and the untruncated capture is banked in the verification receipts.

Startup banner

event: message
data: {"jsonrpc":"2.0","id":1,"result":{"capabilities":{"completions":{},"prompts":{},"resources":{},"tools":{}},"protocolVersion":"2025-06-18","serverInfo":{"name":"github-mcp-server","title":"GitHub MCP Server","version":"github-mcp-server/remote-112de3b831975632257acbdeb73b577f32ea1762"}}}

One real tool call

tools/call search_repositories {"query": "repo:github/github-mcp-server", "minimal_output": true}
{"total_count":1,"incomplete_results":false,"items":[{"id":942771284,"name":"github-mcp-server","full_name":"github/github-mcp-server","description":"GitHub's official MCP Server","html_url":"https://github.com/github/github-mcp-server","language":"Go","stargazers_count":31908,"forks_count":4703,"open_issues_count":349,"updated_at":"2026-08-03T03:05:44Z","created_at":"2025-03-04T16:42:04Z","topics":["github","mcp","mcp-server"],"private":false,"fork":false,"archived":false,"default_branch":"main"}]}

Real lines from the captured result: enough to prove the call answered.

Tools

Every tool, enumerated from the running server.

The server answered tools/list with 47 tools on 2026-08-03. The names, descriptions and parameters below are its own words, copied from that response and never edited.

ToolWhat it does
add_comment_to_pending_reviewbody*lineowner*path*pullNumber*repo*sidestartLinestartSidesubjectType*

Add review comment to the requester's latest pending pull request review. A pending review needs to already exist to call this (check with the user if not sure).

add_issue_commentbodycomment_idissue_number*owner*reactionrepo*

Add a comment and/or reaction to a specific issue or issue comment in a GitHub repository. Use this tool with pull requests as well (in this case pass pull request number as issue_number), but only if user is not asking specifically to add or react to review comments. At least one of body or reaction is required.

add_reply_to_pull_request_commentbodycommentId*owner*pullNumberreactionrepo*

Add a reply and/or reaction to an existing pull request comment. This can create a new comment linked as a reply to the specified comment, add an emoji reaction to the specified comment, or do both. At least one of body or reaction is required.

assign_copilot_to_issuebase_refcustom_instructionsissue_number*owner*repo*

Assign Copilot to a specific issue in a GitHub repository. This tool can help with the following outcomes: - a Pull Request created with source code changes to resolve the issue More information can be found at: - https://docs.github.com/en/copilot/concepts/agents/cloud-agent/about-cloud-agent

create_branchbranch*from_branchowner*repo*

Create a new branch in a GitHub repository

create_or_update_filebranch*content*message*owner*path*repo*sha

Create or update a single file in a GitHub repository. If updating, you should provide the SHA of the file you want to update. Use this tool to create or update a file in a GitHub repository remotely; do not use it for local file operations. In order to obtain the SHA of original file version before updating, use the following git command: git rev-parse <branch>:<path to file> SHA MUST be provided for existing file updates.

create_pull_requestbase*bodydrafthead*maintainer_can_modifyowner*repo*reviewerstitle*

Create a new pull request in a GitHub repository.

create_pull_request_with_copilotbase_refowner*problem_statement*repo*title*

Delegate a task to GitHub Copilot coding agent to perform in the background. The agent will create a pull request with the implementation. You should use this tool if the user asks to create a pull request to perform a specific task, or if the user asks Copilot to do something.

create_repositoryautoInitdescriptionname*organizationprivate

Create a new GitHub repository in your account or specified organization

delete_filebranch*message*owner*path*repo*

Delete a file from a GitHub repository

fork_repositoryorganizationowner*repo*

Fork a GitHub repository to your account or specified organization

get_commitdetailowner*pageperPagerepo*sha*

Get details for a commit from a GitHub repository

get_copilot_job_statusid*owner*repo*

Get the status of a GitHub Copilot coding agent job. Use this to check if a previously submitted task has completed and to get the pull request URL once it's created. Provide the job ID (from create_pull_request_with_copilot) or pull request number (from assign_copilot_to_issue), or any pull request you want agent sessions for.

get_file_contentsfieldsowner*pathrefrepo*sha

Get the contents of a file or directory from a GitHub repository

get_labelname*owner*repo*

Get a specific label from a repository.

get_latest_releaseowner*repo*

Get the latest release in a GitHub repository

get_me

Get details of the authenticated GitHub user. Use this when a request is about the user's own profile for GitHub. Or when information is missing to build other tool calls.

get_release_by_tagowner*repo*tag*

Get a specific release by its tag name in a GitHub repository

get_tagowner*repo*tag*

Get details about a specific git tag in a GitHub repository

get_team_membersorg*team_slug*

Get member usernames of a specific team in an organization. Limited to organizations accessible with current credentials

get_teamsuser

Get details of the teams the user is a member of. Limited to organizations accessible with current credentials

issue_readissue_number*method*owner*pageperPagerepo*

Get information about a specific issue in a GitHub repository.

issue_writeassigneesbodyduplicate_ofissue_fieldsissue_numberlabelsmethod*milestoneowner*repo*statestate_reasontitletype

Create a new or update an existing issue in a GitHub repository.

list_branchesowner*pageperPagerepo*

List branches in a GitHub repository

list_commitsauthorfieldsowner*pagepathperPagerepo*shasinceuntil

Get list of commits of a branch in a GitHub repository. Returns at least 30 results per page by default, but can return more if specified using the perPage parameter (up to 100).

list_issue_fieldsowner*repo

List issue fields for a repository or organization. Returns field definitions including name, type (text, number, date, single_select), and for single_select fields the list of valid option names. When repo is omitted, returns org-level fields directly.

list_issue_typesowner*repo

List supported issue types for a repository or its owner organization. When repo is omitted, returns org-level issue types directly.

list_issuesafterdirectionfield_filtersfieldslabelsorderByowner*perPagerepo*sincestate

List issues in a GitHub repository. For pagination, use the 'endCursor' from the previous response's 'pageInfo' in the 'after' parameter.

list_pull_requestsbasedirectionfieldsheadowner*pageperPagerepo*sortstate

List pull requests in a GitHub repository. If the user specifies an author, then DO NOT use this tool and use the search_pull_requests tool instead.

list_releasesfieldsowner*pageperPagerepo*

List releases in a GitHub repository

list_repository_collaboratorsaffiliationowner*pageperPagerepo*

List collaborators of a GitHub repository. Results are paginated; the response includes `nextPage`, `prevPage`, `firstPage`, and `lastPage` fields. To get the next page, use the `nextPage` value as the `page` parameter.

list_tagsowner*pageperPagerepo*

List git tags in a GitHub repository

merge_pull_requestcommit_messagecommit_titlemerge_methodowner*pullNumber*repo*

Merge a pull request in a GitHub repository.

pull_request_readaftermethod*owner*pageperPagepullNumber*repo*

Get information on a specific pull request in GitHub repository.

pull_request_review_writebodycommitIDeventmethod*owner*pullNumber*repo*threadId

Create and/or submit, delete review of a pull request. Available methods: - create: Create a new review of a pull request. If "event" parameter is provided, the review is submitted. If "event" is omitted, a pending review is created. - submit_pending: Submit an existing pending review of a pull request. This requires that a pending review exists for the current user on the specified pull request. The "body" and "event" parameters are used when submitting the review. - delete_pending: Delete an existing pending review of a pull request. This requires that a pending review exists for the current user on the specified pull request. - resolve_thread: Resolve a review thread. Requires only "threadId" parameter with the thread's node ID (e.g., PRRT_kwDOxxx). The owner, repo, and pullNumber parameters are not used for this method. Resolving an already-resolved thread is a no-op. - unresolve_thread: Unresolve a previously resolved review thread. Requires only "threadId" parameter. The owner, repo, and pullNumber parameters are not used for this method. Unresolving an already-unresolved thread is a no-op.

push_filesbranch*files*message*owner*repo*

Push multiple files to a GitHub repository in a single commit

request_copilot_reviewowner*pullNumber*repo*

Request a GitHub Copilot code review for a pull request. Use this for automated feedback on pull requests, usually before requesting a human reviewer.

run_secret_scanningfiles*owner*repo*

Scan files, content, or recent changes for secrets such as API keys, passwords, tokens, and credentials. This tool is intended for targeted scans of specific files, snippets, or diffs provided directly as content. The files parameter accepts either a single string or an array of strings containing raw file contents or diff hunks, and returns detected secrets with their locations and related secret scanning metadata. Content must not be empty. For full repository scanning, other mechanisms are available. Caveats: - Only files within the codebase should be scanned. Files outside of the codebase should not be sent. - Files listed in .gitignore should be skipped.

search_codefieldsorderpageperPagequery*sort

Fast and precise code search across ALL GitHub repositories using GitHub's native search engine. Best for finding exact symbols, functions, classes, or specific code patterns.

search_commitsorderpageperPagequery*sort

Search for commits across GitHub repositories using GitHub's commit search syntax. Useful for finding specific changes, authors, or messages across one or many repositories. Searches the default branch only.

search_issuesfieldsorderownerpageperPagequery*reposort

Search for issues in GitHub repositories using issues search syntax already scoped to is:issue

search_pull_requestsfieldsorderownerpageperPagequery*reposort

Search for pull requests in GitHub repositories using issues search syntax already scoped to is:pr

search_repositoriesminimal_outputorderpageperPagequery*sort

Find GitHub repositories by name, description, readme, topics, or other metadata. Perfect for discovering projects, finding examples, or locating specific repositories across GitHub.

search_usersorderpageperPagequery*sort

Find GitHub users by username, real name, or other profile information. Useful for locating developers, contributors, or team members.

sub_issue_writeafter_idbefore_idissue_number*method*owner*replace_parentrepo*sub_issue_id*

Add a sub-issue to a parent issue in a GitHub repository.

update_pull_requestbasebodydraftmaintainer_can_modifyowner*pullNumber*repo*reviewersstatetitle

Update an existing pull request in a GitHub repository.

update_pull_request_branchexpectedHeadShaowner*pullNumber*repo*

Update the branch of a pull request with the latest changes from the base branch.

Parameters marked with * are required.

Setup

Working configs, one per app.

Copy the block for the app you use. Each one is the configuration this server was verified with.

Claude Desktop

Claude Desktop reaches a hosted server through a custom connector, not through the JSON config file. Open Settings, then Connectors, click Add, and choose Add custom connector:

Name    GitHub
URL     https://api.githubcopilot.com/mcp/

Claude then sends you through GitHub sign-in, so there is no token to paste: the endpoint publishes its own OAuth authorization record, and we read that record live. The claude_desktop_config.json route from the local-server quickstart does not apply here, because this server runs on GitHub rather than on your Mac. [8][7][5]

Claude Code

One command in your terminal. The Claude Code documentation uses this exact server as its remote example:

claude mcp add --transport http github https://api.githubcopilot.com/mcp/ \
  --header "Authorization: Bearer YOUR_GITHUB_PAT"

Swap YOUR_GITHUB_PAT for a fine-grained token from your GitHub token settings. The command saves the configuration without checking it, so run /mcp afterwards: a good token reads connected, a bad one reads failed. [9]

Cursor

Add to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json inside one project:

{
  "mcpServers": {
    "github": {
      "url": "https://api.githubcopilot.com/mcp/",
      "headers": {
        "Authorization": "Bearer ${env:GITHUB_PAT}"
      }
    }
  }
}

The url key is what marks the entry as remote, so there is no command line and no container to pull. Export GITHUB_PAT in your shell before you launch Cursor, or paste the token itself where the env reference sits. Cursor picks the file up on restart. [10]

Routines

No JSON file and no terminal. In Routines: Settings, then Assistant, then Connections, then Add MCP Server. The form already opens in URL (SSE/HTTP) mode, which is the mode this server needs:

Name          GitHub
Server URL    https://api.githubcopilot.com/mcp/
Bearer token  YOUR_GITHUB_PAT

Leave the Command (stdio) toggle alone: this server is a web address, not a command. Click Test Connection first, which opens the connection and reports the tool count without saving anything. [11]

No terminal needed

Set the GitHub MCP server up without the terminal.

If you have never opened Terminal and never want to, this is your path. Routines is a Mac app that connects MCP servers for you: paste one web address and one token, and this server's tools are available to your AI in chat and in scheduled routines.

  1. 01

    Install Routines

    Download the app from getroutines.ai/download, drag it to Applications, and sign in.

  2. 02

    Make a GitHub token

    Open github.com/settings/personal-access-tokens and generate a fine-grained token. Give it read access to only the repositories you want your AI to see, and copy the token before you close the page: GitHub shows it once.

  3. 03

    Open the MCP settings

    Click your account at the bottom of the sidebar and choose Settings. Open the Assistant section, then the Connections tab, scroll to MCP Servers, and click Add MCP Server.

  4. 04

    Stay in URL (SSE/HTTP) mode

    The form opens in URL mode already, which is what a hosted server needs, so leave the Command (stdio) toggle alone. Name: GitHub. Server URL: https://api.githubcopilot.com/mcp/. Keep the trailing slash.

  5. 05

    Paste the token, then test

    Put the token in the Bearer token field. Click Test Connection: Routines opens the connection and reports how many tools it found, forty-seven for this one. Then click Add Server.

  6. 06

    Use it

    The tools work in chat right away. To let a scheduled routine use them, open the routine, find the Tools & connections card, and tick the server under Apps.

Routine ideas

Routines worth scheduling.

Once the server is connected, a scheduled routine can use its tools while you are away. Copy a prompt, paste it into Routines, and pick a time.

A Monday pull request digest

Prompt

Every Monday at 9:00, list the open pull requests in my main repository, note how long each one has been waiting and who is due to review it, and save the list as pr-digest.md.

A release notes draft

Prompt

Every Friday at 17:00, read the commits merged into main this week in my main repository, group them into features, fixes and chores, and write a draft release note as release-draft.md.

A stale issue sweep

Prompt

On the first Monday of each month at 10:00, search my repository for open issues with no activity in 60 days, summarize each one in a line, and save the list as stale-issues.md so I can close or revive them.

Troubleshooting

The errors we hit, and what fixed them.

Real errors captured during the verification run, printed exactly as the server returned them.

The connection is refused before any tool appears

What you see

HTTP/2 401
content-type: text/plain; charset=utf-8
www-authenticate: Bearer error="invalid_request", error_description="No access token was provided in this request", resource_metadata="https://api.githubcopilot.com/.well-known/oauth-protected-resource/mcp/"
bad request: missing required Authorization header

The fix

The endpoint accepts nothing anonymously. Your client has to send an Authorization header carrying a GitHub token: that is the Bearer token field in Routines, the --header flag in Claude Code, and the headers block in Cursor. Clients that support OAuth, Claude Desktop among them, obtain the header for you after sign-in, and the resource_metadata address in that reply is the record they read to begin it.

The token is there and GitHub still rejects it

What you see

HTTP/2 401
content-type: text/plain; charset=utf-8
www-authenticate: Bearer error="invalid_token", error_description="Token is not authorized", resource_metadata="https://api.githubcopilot.com/.well-known/oauth-protected-resource/mcp/"
unauthorized: AuthenticateToken authentication failed

The fix

We produced this on purpose with a token that looks right and is not. Expired tokens, revoked tokens and a stray space pasted into the field all land here. Generate a fresh fine-grained token, paste it again, and test the connection before you save it.

A repository comes back as 404 even though it exists

What you see

failed to resolve git reference: failed to get repository info: GET https://api.github.com/repos/openai/internal-private-does-not-exist: 404 Not Found []

The fix

A repository your token cannot see and a repository that does not exist answer identically, which is deliberate on GitHub's side. Check the owner and the name first, then check that your fine-grained token actually lists that repository: a token scoped to three repos is blind to the fourth.

The assistant invents a tool name

What you see

MCP error -32602: unknown tool "list_repos"

The fix

There is no list_repos on this server. Repository discovery is search_repositories, and every real name is in the table above. When you see this, name the tool in your prompt: ask for search_repositories rather than for a list of repos.

You want it to read your code and never write to it

What you see

MCP error -32602: unknown tool "create_repository"

The fix

Send the header X-MCP-Readonly: true and the write tools are not merely refused, they are absent: we opened a second session with that header and tools/list returned 28 tools instead of 47, create_repository among the missing. Clients that let you set custom headers, Cursor and Claude Code among them, can do this today. A fine-grained token with read-only permissions is the belt to that pair of braces.

FAQ

Questions people ask.

What is the GitHub MCP server?

It is GitHub's own Model Context Protocol server. Connect it and an AI assistant can search repositories, read files, read issues and pull requests, and, if you allow it, write. It is written in Go and lives in the github/github-mcp-server repository. You can point a client at the copy GitHub hosts, which is what this page verified, or run the container image yourself. [1][4]

What tools does the GitHub MCP server include?

The hosted server answered tools/list with 47 tools on the day of this run: search (search_repositories, search_code, search_issues, search_pull_requests, search_commits, search_users), reading (get_file_contents, list_commits, get_commit, list_branches, list_tags, list_releases, issue_read, pull_request_read and more), and writing (issue_write, create_pull_request, push_files, create_or_update_file, merge_pull_request and the rest). The table above is that response, word for word.

Do I need Docker to use the GitHub MCP server?

No. GitHub hosts the server at https://api.githubcopilot.com/mcp/ and every configuration on this page points there, which is why none of them installs anything. The container image ghcr.io/github/github-mcp-server is the other supported path, for people who want the server running on their own machine. [4]

Is @modelcontextprotocol/server-github still the GitHub MCP server?

No, and this trips people up because that package name is still all over old tutorials. It stopped at version 2025.4.8 and now carries npm's deprecation notice, "Package no longer supported." The maintained server is github/github-mcp-server, published by GitHub itself, and that is the one this page ran. [6][1]

Can I stop it from writing to my repositories?

Yes, in two ways, and we tested one of them. Send the header X-MCP-Readonly: true and the write tools disappear from the list: our read-only session enumerated 28 tools instead of 47. The other way is the credential itself, since a fine-grained personal access token with read-only permissions cannot write no matter what the tool list offers.

What credentials does the GitHub MCP server need?

A GitHub personal access token, or an OAuth sign-in in clients that support one. The endpoint publishes its own authorization record, which names github.com/login/oauth as the authorization server and lists the scopes it accepts, repo and read:org among them. Give a token the least it needs: fine-grained tokens can be limited to named repositories. [5][4]

Which apps can use the GitHub MCP server?

Any MCP client that can talk to a remote HTTP server: Claude Desktop through a custom connector, Claude Code, Cursor and Routines all can, and the exact configuration for each is above. The Claude Code documentation uses this very server as its worked remote example. [8][9][10][11]

Sources

Every external claim, receipted.

Anything on this page we did not observe in the run is linked here, with the date we read it. The run itself is the receipt for the rest.

  1. [1]

    GitHub API: github/github-mcp-serveraccessed 2026-08-03

    31,908 stars, last push 2026-07-31, owner github (Organization), language Go, license MIT at access time.

  2. [2]

    GitHub API: github-mcp-server releasesaccessed 2026-08-03

    Latest release v1.8.0, published 2026-07-30, with 6,002 downloads counted across its nine binary assets.

  3. [3]

    github-mcp-server LICENSE fileaccessed 2026-08-03

    The MIT License text, Copyright (c) 2025 GitHub. We read the file, not the badge.

  4. [4]

    github-mcp-server READMEaccessed 2026-08-03

    Documents both run paths: the hosted endpoint https://api.githubcopilot.com/mcp/ and the container image ghcr.io/github/github-mcp-server.

  5. [5]

    GitHub MCP protected resource metadataaccessed 2026-08-03

    Names github.com/login/oauth as the authorization server and lists the scopes it accepts, repo and read:org among them.

  6. [6]

    npm registry: @modelcontextprotocol/server-githubaccessed 2026-08-03

    Stops at version 2025.4.8 and carries the deprecation notice "Package no longer supported."

  7. [7]

    modelcontextprotocol.io: Connect to local MCP serversaccessed 2026-08-03

    The claude_desktop_config.json route, which covers servers running on your Mac rather than hosted ones.

  8. [8]

    modelcontextprotocol.io: Connect to remote MCP serversaccessed 2026-08-03

    Settings, then Connectors, then Add custom connector: the Claude Desktop path for a hosted server.

  9. [9]

    Claude Code docs: MCPaccessed 2026-08-03

    The claude mcp add --transport http syntax, with this server as the worked example.

  10. [10]

    Cursor docs: Model Context Protocolaccessed 2026-08-03

    The mcp.json shape for a remote server: a url key plus a headers object.

  11. [11]

    Routines: Connectorsaccessed 2026-08-03

    How Routines runs one-click OAuth connectors and any MCP server.

This page describes GitHub as it behaved in one dated run on one Mac. Versions move: if something here no longer matches what you see, the capture date at the top says how old the reading is.

Behind this directory

Routines, the app behind this directory, connects MCP servers like this one without a terminal: see how connectors work. Your notes stay markdown files on your Mac, and there is no cloud bill. Download Routines