mcpField
G
GitHub MCP Server

GitHub MCP Server

本地服务
github.com/marcusdb版本控制079 周前更新

关于 GitHub MCP Server

GitHub MCP Server 是一个 TypeScript 服务端,让 MCP 客户端通过 GitHub API 操作 GitHub。它提供仓库、文件、议题、拉取请求和搜索功能,并支持自动创建分支及批量更新文件。

主要功能

  1. 01创建和更新仓库文件
  2. 02在一次提交中推送多个文件
  3. 03管理仓库、分支和派生仓库
  4. 04创建和管理议题与拉取请求
  5. 05搜索代码、仓库、议题和用户
  6. 06保留 Git 历史且不强制推送

适用场景

  1. 01更新一个或多个仓库文件
  2. 02查找代码、仓库或用户
  3. 03审查并合并拉取请求
  4. 04创建和管理仓库议题

MCP 相关

将 GitHub API 操作作为工具提供给 MCP 客户端,涵盖仓库、文件、议题、拉取请求和搜索功能。这是独立项目,并非 GitHub 官方 MCP 服务端。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"github-mcp-server-ts": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"build"
]
}
}
}
启动命令docker run -i --rm build

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocibuild

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

GitHub MCP 服务

免责声明! 这不是官方的 GitHub MCP 服务,官方版本请访问 http://github.com/github/github-mcp-server 仓库。这是一个 TypeScript 服务,加入了我认为官方服务缺少的功能;其基础代码来自 modelcontextprotocol 仓库的 servers 目录。


用于 GitHub API 的 MCP 服务,支持文件操作、仓库管理、搜索功能等。

功能
  • 自动创建分支:创建或更新文件、推送更改时,如果分支不存在,则会自动创建
  • 全面的错误处理:针对常见问题提供清晰的错误消息
  • 保留 Git 历史记录:操作会保留适当的 Git 历史记录,不会强制推送
  • 批量操作:支持单文件和多文件操作
  • 高级搜索:支持搜索代码、议题/PR 和用户

工具

  1. create_or_update_file

    • 在仓库中创建或更新单个文件
    • 输入:
      • owner(string):仓库所有者(用户名或组织)
      • repo(string):仓库名称
      • path(string):创建或更新文件的路径
      • content(string):文件内容
      • message(string):提交消息
      • branch(string):创建或更新文件所在的分支
      • sha(可选 string):被替换文件的 SHA(用于更新)
    • 返回:文件内容和提交详情
  2. push_files

    • 在一次提交中推送多个文件
    • 输入:
      • owner(string):仓库所有者
      • repo(string):仓库名称
      • branch(string):要推送到的分支
      • files(array):要推送的文件,每个文件包含 path 和 content
      • message(string):提交消息
    • 返回:更新后的分支引用
  3. search_repositories

    • 搜索 GitHub 仓库
    • 输入:
      • query(string):搜索查询
      • page(可选 number):分页页码
      • perPage(可选 number):每页结果数(最多 100)
    • 返回:仓库搜索结果
  4. create_repository

    • 创建新的 GitHub 仓库
    • 输入:
      • name(string):仓库名称
      • description(可选 string):仓库描述
      • private(可选 boolean):仓库是否应设为私有
      • autoInit(可选 boolean):使用 README 初始化
    • 返回:已创建仓库的详情
  5. get_file_contents

    • 获取文件或目录的内容
    • 输入:
      • owner(string):仓库所有者
      • repo(string):仓库名称
      • path(string):文件或目录的路径
      • branch(可选 string):要从中获取内容的分支
    • 返回:文件或目录内容
  6. create_issue

    • 创建新的议题
    • 输入:
      • owner(string):仓库所有者
      • repo(string):仓库名称
      • title(string):议题标题
      • body(可选 string):议题描述
      • assignees(可选 string[]):要指派的用户名
      • labels(可选 string[]):要添加的标签
      • milestone(可选 number):里程碑编号
    • 返回:已创建议题的详情
  7. create_pull_request

    • 创建新的拉取请求
    • 输入:
      • owner(string):仓库所有者
      • repo(string):仓库名称
      • title(string):PR 标题
      • body(可选 string):PR 描述
      • head(string):包含更改的分支
      • base(string):要合并到的分支
      • draft(可选 boolean):创建为草稿 PR
      • maintainer_can_modify(可选 boolean):允许维护者编辑
    • 返回:已创建拉取请求的详情
  8. fork_repository

    • 派生仓库
    • 输入:
      • owner(string):仓库所有者
      • repo(string):仓库名称
      • organization(可选 string):要派生到的组织
    • 返回:已派生仓库的详情
  9. create_branch

    • 创建新分支
    • 输入:
      • owner (string):仓库所有者
      • repo (string):仓库名称
      • branch (string):新分支名称
      • from_branch (optional string):源分支(默认为仓库默认分支)
    • 返回:已创建的分支引用
  10. list_issues

    • 列出并筛选仓库问题
    • 输入:
      • owner (string):仓库所有者
      • repo (string):仓库名称
      • state (optional string):按状态筛选('open'、'closed'、'all')
      • labels (optional string[]):按标签筛选
      • sort (optional string):按('created'、'updated'、'comments')排序
      • direction (optional string):排序方向('asc'、'desc')
      • since (optional string):按日期筛选(ISO 8601 时间戳)
      • page (optional number):页码
      • per_page (optional number):每页结果数
    • 返回:问题详情数组
  11. update_issue

    • 更新现有问题
    • 输入:
      • owner (string):仓库所有者
      • repo (string):仓库名称
      • issue_number (number):要更新的问题编号
      • title (optional string):新标题
      • body (optional string):新描述
      • state (optional string):新状态('open' 或 'closed')
      • labels (optional string[]):新标签
      • assignees (optional string[]):新受理人
      • milestone (optional number):新里程碑编号
    • 返回:已更新的问题详情
  12. add_issue_comment

    • 为问题添加评论
    • 输入:
      • owner (string):仓库所有者
      • repo (string):仓库名称
      • issue_number (number):要评论的问题编号
      • body (string):评论内容
    • 返回:已创建的评论详情
  13. search_code

    • 在 GitHub 仓库中搜索代码
    • 输入:
      • q (string):使用 GitHub 代码搜索语法的搜索查询
      • sort (optional string):排序字段(仅支持 'indexed')
      • order (optional string):排序顺序('asc' 或 'desc')
      • per_page (optional number):每页结果数(最多 100)
      • page (optional number):页码
    • 返回:包含仓库上下文的代码搜索结果
  14. search_issues

    • 搜索问题和拉取请求
    • 输入:
      • q (string):使用 GitHub 问题搜索语法的搜索查询
      • sort (optional string):排序字段(comments、reactions、created 等)
      • order (optional string):排序顺序('asc' 或 'desc')
      • per_page (optional number):每页结果数(最多 100)
      • page (optional number):页码
    • 返回:问题和拉取请求搜索结果
  15. search_users

    • 搜索 GitHub 用户
    • 输入:
      • q (string):使用 GitHub 用户搜索语法的搜索查询
      • sort (optional string):排序字段(followers、repositories、joined)
      • order (optional string):排序顺序('asc' 或 'desc')
      • per_page (optional number):每页结果数(最多 100)
      • page (optional number):页码
    • 返回:用户搜索结果
  16. list_commits

  • 获取仓库分支的提交记录
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • page (optional string):页码
    • per_page (optional string):每页记录数
    • sha (optional string):分支名称
  • 返回:提交记录列表
  1. get_issue
  • 获取仓库中某个问题的内容
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • issue_number (number):要获取的问题编号
  • 返回:GitHub Issue 对象及详情
  1. get_pull_request
  • 获取特定拉取请求的详情
  • 输入:
    • owner(字符串):仓库所有者
    • repo(字符串):仓库名称
    • pull_number(数字):拉取请求编号
  • 返回:拉取请求详情,包括差异和评审状态
  1. list_pull_requests
  • 列出并筛选仓库的拉取请求
  • 输入:
    • owner(字符串):仓库所有者
    • repo(字符串):仓库名称
    • state(可选字符串):按状态筛选('open'、'closed'、'all')
    • head(可选字符串):按 head 用户/组织和分支筛选
    • base(可选字符串):按 base 分支筛选
    • sort(可选字符串):按('created'、'updated'、'popularity'、'long-running')排序
    • direction(可选字符串):排序方向('asc'、'desc')
    • per_page(可选数字):每页结果数(最多 100)
    • page(可选数字):页码
  • 返回:拉取请求详情数组
  1. create_pull_request_review
  • 对拉取请求创建评审
  • 输入:
    • owner(字符串):仓库所有者
    • repo(字符串):仓库名称
    • pull_number(数字):拉取请求编号
    • body(字符串):评审评论文本
    • event(字符串):评审操作('APPROVE'、'REQUEST_CHANGES'、'COMMENT')
    • commit_id(可选字符串):要评审的提交 SHA
    • comments(可选数组):针对特定行的评论,每条包含:
      • path(字符串):文件路径
      • position(数字):差异中的行位置
      • body(字符串):评论文本
  • 返回:已创建的评审详情
  1. merge_pull_request
  • 合并拉取请求
  • 输入:
    • owner(字符串):仓库所有者
    • repo(字符串):仓库名称
    • pull_number(数字):拉取请求编号
    • commit_title(可选字符串):合并提交的标题
    • commit_message(可选字符串):合并提交的补充说明
    • merge_method(可选字符串):合并方式('merge'、'squash'、'rebase')
  • 返回:合并结果详情
  1. get_pull_request_files
  • 获取拉取请求中更改的文件列表
  • 输入:
    • owner(字符串):仓库所有者
    • repo(字符串):仓库名称
    • pull_number(数字):拉取请求编号
  • 返回:已更改文件的数组,包含补丁和状态详情
  1. get_pull_request_status
  • 获取拉取请求所有状态检查的综合状态
  • 输入:
    • owner(字符串):仓库所有者
    • repo(字符串):仓库名称
    • pull_number(数字):拉取请求编号
  • 返回:综合状态检查结果及各项检查详情
  1. update_pull_request_branch
  • 使用 base 分支的最新更改更新拉取请求分支(相当于 GitHub 的“更新分支”按钮)
  • 输入:
    • owner(字符串):仓库所有者
    • repo(字符串):仓库名称
    • pull_number(数字):拉取请求编号
    • expected_head_sha(可选字符串):预期的拉取请求 HEAD 引用 SHA
  • 返回:分支更新成功时的消息
  1. get_pull_request_comments
  • 获取拉取请求的评审评论
  • 输入:
    • owner(字符串):仓库所有者
    • repo(字符串):仓库名称
    • pull_number(数字):拉取请求编号
  • 返回:拉取请求评审评论数组,包含评论文本、作者和在差异中的位置等详情
  1. get_pull_request_reviews
  • 获取拉取请求的评审
  • 输入:
    • owner(字符串):仓库所有者
    • repo(字符串):仓库名称
    • pull_number(数字):拉取请求编号
  • 返回:拉取请求评审数组,包含评审状态(APPROVED、CHANGES_REQUESTED 等)、评审者和评审正文等详情
  1. list_sub_issues
  • 获取指定议题的子议题列表
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • issue_number (number) 议题编号
    • page (optional number):页码
    • per_page (optional number):每页结果数
  • 返回:议题详情数组
  1. reprioritize_sub_issue
  • 重新排序子议题
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • pull_number (number):拉取请求编号
    • issue_number (number) 议题编号
    • sub_issue_id (number) 要重新排序的子议题 ID
    • after_id (number) 要排在其后的子议题 ID(必须指定位置参数 after 或 before 其中之一)。
    • before_id (number) 要排在其前的子议题 ID(必须指定位置参数 after 或 before 其中之一)。
  • 返回:子议题详情
  1. remove_sub_issue
  • 从议题中移除子议题
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • pull_number (number):拉取请求编号
    • issue_number (number) 议题编号
    • sub_issue_id (number) 要移除的子议题 ID
  • 返回:子议题详情
  1. add_sub_issue
  • 获取拉取请求的审查意见
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • pull_number (number):拉取请求编号
    • issue_number (number) 议题编号
    • sub_issue_id (number) 要添加为子议题的议题 ID
  • 返回:子议题详情
  1. list_labels_for_issue
  • 列出议题的所有标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • issue_number (number):议题编号
    • per_page (optional number):每页结果数
    • page (optional number):页码
  • 返回:标签详情数组
  1. add_labels_to_issue
  • 为议题添加标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • issue_number (number):议题编号
    • labels (string[]):要添加的标签名称数组
  • 返回:应用到议题的标签详情数组
  1. set_labels_for_issue
  • 设置议题的标签,替换所有现有标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • issue_number (number):议题编号
    • labels (optional string[]):要设置的标签名称数组。提供空数组可移除所有标签。
  • 返回:应用到议题的标签详情数组
  1. remove_label_from_issue
  • 从议题中移除一个标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • issue_number (number):议题编号
    • name (string):要移除的标签名称
  • 返回:成功状态(通常为 204 No Content)
  1. remove_all_labels_from_issue
  • 移除议题的所有标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • issue_number (number):议题编号
  • 返回:成功状态(通常为 204 No Content)
  1. list_labels_for_repo
  • 列出仓库的所有标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • per_page (optional number):每页结果数
    • page (optional number):页码
  • 返回:仓库标签详情数组
  1. create_label
  • 为仓库创建标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • name (string):标签名称
    • color (可选 string):不带前导 # 的十六进制颜色代码
    • description (可选 string):标签的简短描述
  • 返回:已创建的标签详情
  1. get_label
  • 获取仓库中的单个标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • name (string):要获取的标签名称
  • 返回:标签详情
  1. update_label
  • 更新仓库中的现有标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • name (string):要更新的标签当前名称
    • new_name (可选 string):标签的新名称
    • color (可选 string):新的十六进制颜色代码
    • description (可选 string):新描述
  • 返回:已更新的标签详情
  1. delete_label
  • 从仓库中删除标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • name (string):要删除的标签名称
  • 返回:成功状态(通常为 204 No Content)
  1. list_labels_for_milestone
  • 列出里程碑中问题的标签
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • milestone_number (number):里程碑编号
    • per_page (可选 number):每页结果数
    • page (可选 number):页码
  • 返回:里程碑标签详情数组
  1. list_milestones
  • 列出仓库的里程碑
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • state (可选 string):按状态筛选('open'、'closed'、'all',默认:'open')
    • sort (可选 string):按 ('due_on'、'completeness',默认:'due_on') 排序
    • direction (可选 string):排序方向('asc'、'desc',默认:'asc')
    • per_page (可选 number):每页结果数
    • page (可选 number):页码
  • 返回:里程碑详情数组
  1. create_milestone
  • 为仓库创建里程碑
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • title (string):里程碑标题
    • state (可选 string):状态('open' 或 'closed',默认:'open')
    • description (可选 string):里程碑描述
    • due_on (可选 string):截止日期(ISO 8601 格式:YYYY-MM-DDTHH:MM:SSZ)
  • 返回:已创建的里程碑详情
  1. get_milestone
  • 获取仓库中的单个里程碑
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • milestone_number (number):里程碑编号
  • 返回:里程碑详情
  1. update_milestone
  • 更新仓库中的现有里程碑
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • milestone_number (number):要更新的里程碑编号
    • title (可选 string):新标题
    • state (可选 string):新状态('open' 或 'closed')
    • description (可选 string):新描述
    • due_on (可选 string):新截止日期(ISO 8601 格式)
  • 返回:已更新的里程碑详情
  1. delete_milestone
  • 从仓库中删除里程碑
  • 输入:
    • owner (string):仓库所有者
    • repo (string):仓库名称
    • milestone_number (number):要删除的里程碑编号
  • 返回:成功状态(通常为 204 No Content)

搜索查询语法

代码搜索
  • language:javascript:按编程语言搜索
  • repo:owner/name:在指定仓库中搜索
  • path:app/src:在指定路径中搜索
  • extension:js:按文件扩展名搜索
  • 示例:q: "import express" language:typescript path:src/
Issues 搜索
  • is:issue 或 is:pr:按类型筛选
  • is:open 或 is:closed:按状态筛选
  • label:bug:按标签搜索
  • author:username:按作者搜索
  • 示例:q: "memory leak" is:issue is:open label:bug
用户搜索
  • type:user 或 type:org:按账号类型筛选
  • followers:>1000:按关注者数量筛选
  • location:London:按所在地搜索
  • 示例:q: "fullstack developer" location:London followers:>100

如需了解详细的搜索语法,请参阅 GitHub 的搜索文档。

设置

个人访问令牌

创建 GitHub 个人访问令牌,并授予适当权限:

  • 前往 Personal access tokens(位于 GitHub Settings > Developer settings 中)
  • 选择此令牌可访问的仓库(Public、All 或 Select)
  • 创建具有 repo 范围的令牌(“对私有仓库的完全控制”)
    • 或者,如果只使用公开仓库,则仅选择 public_repo 范围
  • 复制生成的令牌
在 Claude Desktop 中使用

若要在 Claude Desktop 中使用,请将以下内容添加到 claude_desktop_config.json:

Docker
{
  "mcpServers": {
    "github": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "GITHUB_PERSONAL_ACCESS_TOKEN",
        "mcp/github"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}
NPX
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-github"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}

构建

Docker 构建:

docker build -t mcp/github -f src/github/Dockerfile .

许可证

此 MCP 服务采用 MIT 许可证。这意味着您可以自由使用、修改和分发该软件,但须遵守 MIT 许可证的条款和条件。详情请参阅项目仓库中的 LICENSE 文件。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。