A Monday pull request digest
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.
Verified MCP server: GitHub
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]
Verification
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
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.
| Tool | What 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
Copy the block for the app you use. Each one is the configuration this server was verified with.
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]
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]
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]
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
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.
01
Download the app from getroutines.ai/download, drag it to Applications, and sign in.
02
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.
03
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.
04
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.
05
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.
06
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
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.
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.
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.
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
Real errors captured during the verification run, printed exactly as the server returned them.
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.
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.
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.
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.
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
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]
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.
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]
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]
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.
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]
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
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]
31,908 stars, last push 2026-07-31, owner github (Organization), language Go, license MIT at access time.
[2]
Latest release v1.8.0, published 2026-07-30, with 6,002 downloads counted across its nine binary assets.
[3]
The MIT License text, Copyright (c) 2025 GitHub. We read the file, not the badge.
[4]
Documents both run paths: the hosted endpoint https://api.githubcopilot.com/mcp/ and the container image ghcr.io/github/github-mcp-server.
[5]
Names github.com/login/oauth as the authorization server and lists the scopes it accepts, repo and read:org among them.
[6]
Stops at version 2025.4.8 and carries the deprecation notice "Package no longer supported."
[7]
The claude_desktop_config.json route, which covers servers running on your Mac rather than hosted ones.
[8]
Settings, then Connectors, then Add custom connector: the Claude Desktop path for a hosted server.
[9]
The claude mcp add --transport http syntax, with this server as the worked example.
[10]
The mcp.json shape for a remote server: a url key plus a headers object.
[11]
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