g

github

version-controldeveloper-tools

1.2k 查看 · 2026-07-07 更新

GitHub MCP 服务器

GitHub MCP 服务器是一个 Model Context Protocol (MCP) 服务器,它提供了与 GitHub API 的无缝集成,使开发者和工具能够实现高级自动化和交互功能。

使用 Docker 在 VS Code 中安装 使用 Docker 在 VS Code Insiders 中安装

使用场景

  • 自动化 GitHub 工作流和流程。
  • 从 GitHub 仓库中提取和分析数据。
  • 构建与 GitHub 生态系统交互的 AI 驱动工具和应用程序。

前提条件

  1. 要在容器中运行服务器,您需要安装 Docker
  2. 安装 Docker 后,还需要确保 Docker 正在运行。镜像是公开的;如果拉取时遇到错误,可能是您的令牌已过期,需要执行 docker logout ghcr.io
  3. 最后,您需要 创建一个 GitHub 个人访问令牌。MCP 服务器可以使用许多 GitHub API,因此请启用您认为适合授予 AI 工具的权限(要了解有关访问令牌的更多信息,请参阅 文档)。

安装

在 VS Code 中使用

为了快速安装,请使用此 README 顶部的一键安装按钮之一。完成该流程后,切换代理模式(位于 Copilot Chat 文本输入旁边),服务器将启动。

对于手动安装,请将以下 JSON 块添加到 VS Code 的用户设置(JSON)文件中。您可以通过按 Ctrl + Shift + P 并键入 Preferences: Open User Settings (JSON) 来完成此操作。

json { "mcp": { "inputs": [ { "type": "promptString", "id": "github_token", "description": "GitHub 个人访问令牌", "password": true } ], "servers": { "github": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${input:github_token}" } } } } }

可选地,您可以将类似的示例(即没有 mcp 键)添加到工作区中的 .vscode/mcp.json 文件中。这将允许您与他人共享配置。

json { "inputs": [ { "type": "promptString", "id": "github_token", "description": "GitHub 个人访问令牌", "password": true } ], "servers": { "github": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${input:github_token}" } } } }有关在 VS Code 中使用 MCP 服务器工具的更多信息,请参阅 代理模式文档

与 Claude Desktop 一起使用

json { "mcpServers": { "github": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>" } } } }

从源代码构建

如果您没有 Docker,可以使用 go buildcmd/github-mcp-server 目录中构建二进制文件,并使用 github-mcp-server stdio 命令以及设置为您的令牌的 GITHUB_PERSONAL_ACCESS_TOKEN 环境变量。要指定构建输出位置,请使用 -o 标志。您应该配置服务器以使用构建的可执行文件作为其 command。例如:

JSON { "mcp": { "servers": { "github": { "command": "/path/to/github-mcp-server", "args": ["stdio"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>" } } } } }

工具配置

GitHub MCP 服务器支持通过 --toolsets 标志启用或禁用特定功能组。这使您可以控制哪些 GitHub API 功能对您的 AI 工具可用。仅启用所需的功能集可以帮助 LLM 进行工具选择并减少上下文大小。

可用工具集

以下工具集是可用的(默认情况下全部启用):

工具集描述
repos仓库相关工具(文件操作、分支、提交)
issues问题相关工具(创建、读取、更新、评论)
users与 GitHub 用户相关的所有内容
pull_requests拉取请求操作(创建、合并、审查)
code_security代码扫描警报和安全特性
experiments实验性功能(不被视为稳定)

指定工具集

要指定希望 LLM 可用的工具集,可以通过两种方式传递允许列表:

  1. 使用命令行参数

    bash github-mcp-server --toolsets repos,issues,pull_requests,code_security

  2. 使用环境变量: bash GITHUB_TOOLSETS="repos,issues,pull_requests,code_security" ./github-mcp-server

如果同时提供了两者,则环境变量 GITHUB_TOOLSETS 优先于命令行参数。

使用 Docker 时的工具集

当使用 Docker 时,可以将工具集作为环境变量传递:

bash docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN= -e GITHUB_TOOLSETS="repos,issues,pull_requests,code_security,experiments" ghcr.io/github/github-mcp-server

“all” 工具集

特殊工具集 all 可用于启用所有可用工具集,而不管其他任何配置如何:

bash ./github-mcp-server --toolsets all

或者使用环境变量:

bash GITHUB_TOOLSETS="all" ./github-mcp-server

动态工具发现

注意:此功能目前处于测试阶段,在某些环境中可能不可用。请进行测试并在遇到任何问题时告知我们。

与其一开始就启用所有工具,您可以开启动态工具集发现。动态工具集允许 MCP 主机根据用户提示列出并启用工具集。这有助于避免模型因可用工具数量过多而感到困惑的情况。

使用动态工具发现

当使用二进制文件时,可以传递 --dynamic-toolsets 标志。

bash ./github-mcp-server --dynamic-toolsets当使用 Docker 时,可以将工具集作为环境变量传递:

bash docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN= -e GITHUB_DYNAMIC_TOOLSETS=1 ghcr.io/github/github-mcp-server

GitHub Enterprise Server

可以使用 --gh-host 标志和 GITHUB_HOST 环境变量来设置 GitHub Enterprise Server 的主机名。 请在主机名前加上 https:// URI 方案,否则默认为 http://,而 GitHub Enterprise Server 不支持 http://

json "github": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "-e", "GITHUB_HOST", "ghcr.io/github/github-mcp-server" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${input:github_token}", "GITHUB_HOST": "https://" } }

i18n / 覆盖描述

可以通过在同一目录下创建一个 github-mcp-server-config.json 文件来覆盖工具的描述。

该文件应包含一个 JSON 对象,其中键是工具名称,值是新的描述。例如:

json { "TOOL_ADD_ISSUE_COMMENT_DESCRIPTION": "替代描述", "TOOL_CREATE_BRANCH_DESCRIPTION": "在 GitHub 仓库中创建一个新的分支" }

你可以通过运行带有 --export-translations 标志的二进制文件来导出现有的翻译。

此标志会保留你所做的任何翻译/覆盖,并添加自上次导出以来二进制文件中新增的任何翻译。

sh ./github-mcp-server --export-translations cat github-mcp-server-config.json

你也可以使用环境变量来覆盖描述。环境变量的名称与 JSON 文件中的键相同,但需加上 GITHUB_MCP_ 前缀并全部大写。

例如,要覆盖 TOOL_ADD_ISSUE_COMMENT_DESCRIPTION 工具,可以设置以下环境变量:

sh export GITHUB_MCP_TOOL_ADD_ISSUE_COMMENT_DESCRIPTION="替代描述"

工具

用户

  • get_me - 获取已认证用户的信息
    • 不需要参数

问题

  • get_issue - 获取仓库中某个问题的内容

    • owner: 仓库所有者 (字符串, 必填)
    • repo: 仓库名称 (字符串, 必填)
    • issue_number: 问题编号 (数字, 必填)
  • get_issue_comments - 获取 GitHub 问题的评论

    • owner: 仓库所有者 (字符串, 必填)
    • repo: 仓库名称 (字符串, 必填)
    • issue_number: 问题编号 (数字, 必填)
  • create_issue - 在 GitHub 仓库中创建新问题

    • owner: 仓库所有者 (字符串, 必填)
    • repo: 仓库名称 (字符串, 必填)
    • title: 问题标题 (字符串, 必填)
    • body: 问题正文内容 (字符串, 可选)
    • assignees: 分配给此问题的用户名 (字符串数组, 可选)
    • labels: 应用于此问题的标签 (字符串数组, 可选)
  • add_issue_comment - 向问题添加评论

    • owner: 仓库所有者 (字符串, 必填)
    • repo: 仓库名称 (字符串, 必填)
    • issue_number: 问题编号 (数字, 必填)
    • body: 评论文本 (字符串, 必填)
  • list_issues - 列出并过滤仓库的问题

    • owner: 仓库所有者 (字符串, 必填)
    • repo: 仓库名称 (字符串, 必填)
    • state: 按状态过滤 ( open , closed , all ) (字符串, 可选)
    • labels: 按标签过滤 (字符串数组, 可选)
    • sort: 排序依据 ( created , updated , comments ) (字符串, 可选)
    • direction: 排序方向 ( asc , desc ) (字符串, 可选)
    • since: 按日期过滤 (ISO 8601 时间戳) (字符串, 可选)
    • page: 页码 (数字, 可选)
    • perPage: 每页结果数 (数字, 可选)
  • update_issue - 更新 GitHub 仓库中的现有问题

    • owner: 仓库所有者 (字符串, 必填)- repo: 仓库名称(字符串,必填)
    • issue_number: 要更新的问题编号(数字,必填)
    • title: 新标题(字符串,可选)
    • body: 新描述(字符串,可选)
    • state: 新状态(openclosed)(字符串,可选)
    • labels: 新标签(字符串数组,可选)
    • assignees: 新指派人员(字符串数组,可选)
    • milestone: 新里程碑编号(数字,可选)
  • search_issues - 搜索问题和拉取请求

    • query: 搜索查询(字符串,必填)
    • sort: 排序字段(字符串,可选)
    • order: 排序顺序(字符串,可选)
    • page: 页码(数字,可选)
    • perPage: 每页结果数(数字,可选)

拉取请求

  • get_pull_request - 获取特定拉取请求的详细信息

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 拉取请求编号(数字,必填)
  • list_pull_requests - 列出并过滤仓库的拉取请求

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • state: PR 状态(字符串,可选)
    • sort: 排序字段(字符串,可选)
    • direction: 排序方向(字符串,可选)
    • perPage: 每页结果数(数字,可选)
    • page: 页码(数字,可选)
  • merge_pull_request - 合并一个拉取请求

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 拉取请求编号(数字,必填)
    • commit_title: 合并提交的标题(字符串,可选)
    • commit_message: 合并提交的消息(字符串,可选)
    • merge_method: 合并方法(字符串,可选)
  • get_pull_request_files - 获取拉取请求中更改的文件列表

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 拉取请求编号(数字,必填)
  • get_pull_request_status - 获取拉取请求的所有状态检查的综合状态

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 拉取请求编号(数字,必填)
  • update_pull_request_branch - 使用基础分支的最新更改更新拉取请求分支

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 拉取请求编号(数字,必填)
    • expectedHeadSha: 拉取请求 HEAD 引用的预期 SHA(字符串,可选)
  • get_pull_request_comments - 获取拉取请求的审查评论

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 拉取请求编号(数字,必填)
  • get_pull_request_reviews - 获取拉取请求的审查

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 拉取请求编号(数字,必填)
  • create_pull_request_review - 在拉取请求审查上创建审查

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 拉取请求编号(数字,必填)
    • body: 审查评论文本(字符串,可选)
    • event: 审查操作(APPROVEREQUEST_CHANGESCOMMENT)(字符串,必填)
    • commitId: 要审查的提交 SHA(字符串,可选)
    • comments: 行特定评论对象数组,用于在拉取请求更改上放置评论(数组,可选)
      • 对于内联评论:提供 pathposition(或 line)和 body
      • 对于多行评论:提供 pathstart_lineline、可选的 side/start_sidebody
  • create_pull_request - 创建新的拉取请求

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • title: PR 标题(字符串,必填)
    • body: PR 描述(字符串,可选)- head: 包含更改的分支(字符串,必填)
    • base: 要合并到的分支(字符串,必填)
    • draft: 创建为草稿 PR(布尔值,可选)
    • maintainer_can_modify: 允许维护者编辑(布尔值,可选)
  • add_pull_request_review_comment - 向拉取请求添加审查评论或回复现有评论

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pull_number: 拉取请求编号(数字,必填)
    • body: 审查评论的文本(字符串,必填)
    • commit_id: 要评论的提交的 SHA(除非使用 in_reply_to,否则为必填项)(字符串,必填)
    • path: 需要评论的文件的相对路径(除非使用 in_reply_to,否则为必填项)(字符串,必填)
    • line: 拉取请求差异中该评论适用的行号(数字,可选)
    • side: 差异的一侧进行评论(LEFT 或 RIGHT)(字符串,可选)
    • start_line: 对于多行评论,范围的第一行(数字,可选)
    • start_side: 对于多行评论,差异的起始侧(LEFT 或 RIGHT)(字符串,可选)
    • subject_type: 评论针对的级别(line 或 file)(字符串,可选)
    • in_reply_to: 要回复的审查评论的 ID(数字,可选)。当指定时,仅需要 body 参数,其他参数将被忽略。
  • update_pull_request - 更新 GitHub 仓库中的现有拉取请求

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 要更新的拉取请求编号(数字,必填)
    • title: 新标题(字符串,可选)
    • body: 新描述(字符串,可选)
    • state: 新状态(open 或 closed)(字符串,可选)
    • base: 新基础分支名称(字符串,可选)
    • maintainer_can_modify: 允许维护者编辑(布尔值,可选)
  • request_copilot_review - 请求 GitHub Copilot 对拉取请求进行审查(实验性;受 GitHub API 支持限制)

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • pullNumber: 拉取请求编号(数字,必填)
    • 注意: 目前,此工具仅适用于 github.com

仓库

  • create_or_update_file - 在仓库中创建或更新单个文件

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • path: 文件路径(字符串,必填)
    • message: 提交信息(字符串,必填)
    • content: 文件内容(字符串,必填)
    • branch: 分支名称(字符串,可选)
    • sha: 如果是更新文件,则为文件的 SHA(字符串,可选)
  • list_branches - 列出 GitHub 仓库中的分支

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • page: 页码(数字,可选)
    • perPage: 每页结果数(数字,可选)
  • push_files - 在单次提交中推送多个文件

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • branch: 要推送到的分支(字符串,必填)
    • files: 要推送的文件,每个文件包含路径和内容(数组,必填)
    • message: 提交信息(字符串,必填)
  • search_repositories - 搜索 GitHub 仓库

    • query: 搜索查询(字符串,必填)
    • sort: 排序字段(字符串,可选)
    • order: 排序顺序(字符串,可选)
    • page: 页码(数字,可选)
    • perPage: 每页结果数(数字,可选)
  • create_repository - 创建新的 GitHub 仓库

    • name: 仓库名称(字符串,必填)
    • description: 仓库描述(字符串,可选)
    • private: 仓库是否私有(布尔值,可选)
    • autoInit: 自动初始化并带有 README(布尔值,可选)
  • get_file_contents - 获取文件或目录的内容

    • owner: 仓库所有者(字符串,必填)- repo: 仓库名称(字符串,必填)
    • path: 文件路径(字符串,必填)
    • ref: Git 引用(字符串,可选)
  • fork_repository - 分叉一个仓库

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • organization: 目标组织名称(字符串,可选)
  • create_branch - 创建一个新的分支

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • branch: 新分支名称(字符串,必填)
    • sha: 用于创建分支的 SHA 值(字符串,必填)
  • list_commits - 获取仓库中某个分支的提交列表

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • sha: 分支名、标签或提交 SHA(字符串,可选)
    • path: 仅包含此文件路径的提交(字符串,可选)
    • page: 页码(数字,可选)
    • perPage: 每页结果数(数字,可选)
  • get_commit - 从仓库中获取提交的详细信息

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • sha: 提交 SHA、分支名或标签名(字符串,必填)
    • page: 页码,用于提交中的文件(数字,可选)
    • perPage: 每页结果数,用于提交中的文件(数字,可选)
  • search_code - 在 GitHub 仓库中搜索代码

    • query: 搜索查询(字符串,必填)
    • sort: 排序字段(字符串,可选)
    • order: 排序顺序(字符串,可选)
    • page: 页码(数字,可选)
    • perPage: 每页结果数(数字,可选)

用户

  • search_users - 搜索 GitHub 用户
    • q: 搜索查询(字符串,必填)
    • sort: 排序字段(字符串,可选)
    • order: 排序顺序(字符串,可选)
    • page: 页码(数字,可选)
    • perPage: 每页结果数(数字,可选)

代码扫描

  • get_code_scanning_alert - 获取代码扫描警报

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • alertNumber: 警报编号(数字,必填)
  • list_code_scanning_alerts - 列出仓库中的代码扫描警报

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • ref: Git 引用(字符串,可选)
    • state: 警报状态(字符串,可选)
    • severity: 警报严重性(字符串,可选)
    • tool_name: 用于代码扫描的工具名称(字符串,可选)

密钥扫描

  • get_secret_scanning_alert - 获取密钥扫描警报

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • alertNumber: 警报编号(数字,必填)
  • list_secret_scanning_alerts - 列出仓库中的密钥扫描警报

    • owner: 仓库所有者(字符串,必填)
    • repo: 仓库名称(字符串,必填)
    • state: 警报状态(字符串,可选)
    • secret_type: 以逗号分隔的密钥类型列表(字符串,可选)
    • resolution: 解决状态(字符串,可选)

通知

  • list_notifications – 列出 GitHub 用户的通知

    • filter: 应用于响应的过滤器 (default, include_read_notifications, only_participating)
    • since: 仅显示在此时间之后更新的通知(ISO 8601 格式)
    • before: 仅显示在此时间之前更新的通知(ISO 8601 格式)
    • owner: 可选的仓库所有者(字符串)
    • repo: 可选的仓库名称(字符串)
    • page: 页码(数字,可选)
    • perPage: 每页结果数(数字,可选)
  • get_notification_details – 获取特定 GitHub 通知的详细信息

    • notificationID: 通知的 ID(字符串,必填)
  • dismiss_notification – 通过标记为已读或完成来忽略通知- threadID: 通知线程的ID(字符串,必填)

    • state: 通知的新状态(readdone
  • mark_all_notifications_read – 将所有通知标记为已读

    • lastReadAt: 描述最后一次检查通知的时间点(可选,RFC3339/ISO8601 字符串,默认:现在)
    • owner: 可选的仓库所有者(字符串)
    • repo: 可选的仓库名称(字符串)
  • manage_notification_subscription – 管理通知线程的订阅(忽略、关注或删除)

    • notificationID: 通知线程的ID(字符串,必填)
    • action: 要执行的操作:ignorewatchdelete(字符串,必填)
  • manage_repository_notification_subscription – 管理仓库的通知订阅(忽略、关注或删除)

    • owner: 仓库的所有者账户(字符串,必填)
    • repo: 仓库的名称(字符串,必填)
    • action: 要执行的操作:ignorewatchdelete(字符串,必填)

资源

仓库内容

  • 获取仓库内容 获取特定路径下的仓库内容。

    • 模板: repo://{owner}/{repo}/contents{/path*}
    • 参数:
      • owner: 仓库所有者(字符串,必填)
      • repo: 仓库名称(字符串,必填)
      • path: 文件或目录路径(字符串,可选)
  • 获取特定分支的仓库内容 获取给定分支下特定路径的仓库内容。

    • 模板: repo://{owner}/{repo}/refs/heads/{branch}/contents{/path*}
    • 参数:
      • owner: 仓库所有者(字符串,必填)
      • repo: 仓库名称(字符串,必填)
      • branch: 分支名称(字符串,必填)
      • path: 文件或目录路径(字符串,可选)
  • 获取特定提交的仓库内容 获取给定提交下特定路径的仓库内容。

    • 模板: repo://{owner}/{repo}/sha/{sha}/contents{/path*}
    • 参数:
      • owner: 仓库所有者(字符串,必填)
      • repo: 仓库名称(字符串,必填)
      • sha: 提交SHA(字符串,必填)
      • path: 文件或目录路径(字符串,可选)
  • 获取特定标签的仓库内容 获取给定标签下特定路径的仓库内容。

    • 模板: repo://{owner}/{repo}/refs/tags/{tag}/contents{/path*}
    • 参数:
      • owner: 仓库所有者(字符串,必填)
      • repo: 仓库名称(字符串,必填)
      • tag: 标签名称(字符串,必填)
      • path: 文件或目录路径(字符串,可选)
  • 获取特定拉取请求的仓库内容 获取给定拉取请求下特定路径的仓库内容。

    • 模板: repo://{owner}/{repo}/refs/pull/{prNumber}/head/contents{/path*}
    • 参数:
      • owner: 仓库所有者(字符串,必填)
      • repo: 仓库名称(字符串,必填)
      • prNumber: 拉取请求编号(字符串,必填)
      • path: 文件或目录路径(字符串,可选)

库的使用

此模块导出的 Go API 目前应被视为不稳定,并可能进行破坏性更改。将来我们可能会提供稳定性;如果有任何用例需要这种稳定性,请提出问题。

许可证

本项目根据 MIT 开源许可协议的条款获得许可。请参阅 MIT 以了解完整条款。

服务配置

[{'mcpServers': {'github': {'args': ['run', '-i', '--rm', '-e', 'GITHUB_PERSONAL_ACCESS_TOKEN', 'ghcr.io/github/github-mcp-server'], 'command': 'docker', 'env': {'GITHUB_PERSONAL_ACCESS_TOKEN': '<YOUR_TOKEN>'}}}}]

来源