关于 GitHub MCP Server
GitHub MCP Server 是一个 TypeScript 服务端,让 MCP 客户端通过 GitHub API 操作 GitHub。它提供仓库、文件、议题、拉取请求和搜索功能,并支持自动创建分支及批量更新文件。
主要功能
- 01创建和更新仓库文件
- 02在一次提交中推送多个文件
- 03管理仓库、分支和派生仓库
- 04创建和管理议题与拉取请求
- 05搜索代码、仓库、议题和用户
- 06保留 Git 历史且不强制推送
适用场景
- 01更新一个或多个仓库文件
- 02查找代码、仓库或用户
- 03审查并合并拉取请求
- 04创建和管理仓库议题
MCP 相关
将 GitHub API 操作作为工具提供给 MCP 客户端,涵盖仓库、文件、议题、拉取请求和搜索功能。这是独立项目,并非 GitHub 官方 MCP 服务端。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
GitHub MCP 服务
免责声明! 这不是官方的 GitHub MCP 服务,官方版本请访问 http://github.com/github/github-mcp-server 仓库。这是一个 TypeScript 服务,加入了我认为官方服务缺少的功能;其基础代码来自 modelcontextprotocol 仓库的 servers 目录。
用于 GitHub API 的 MCP 服务,支持文件操作、仓库管理、搜索功能等。
功能
- 自动创建分支:创建或更新文件、推送更改时,如果分支不存在,则会自动创建
- 全面的错误处理:针对常见问题提供清晰的错误消息
- 保留 Git 历史记录:操作会保留适当的 Git 历史记录,不会强制推送
- 批量操作:支持单文件和多文件操作
- 高级搜索:支持搜索代码、议题/PR 和用户
工具
-
create_or_update_file- 在仓库中创建或更新单个文件
- 输入:
owner(string):仓库所有者(用户名或组织)repo(string):仓库名称path(string):创建或更新文件的路径content(string):文件内容message(string):提交消息branch(string):创建或更新文件所在的分支sha(可选 string):被替换文件的 SHA(用于更新)
- 返回:文件内容和提交详情
-
push_files- 在一次提交中推送多个文件
- 输入:
owner(string):仓库所有者repo(string):仓库名称branch(string):要推送到的分支files(array):要推送的文件,每个文件包含path和contentmessage(string):提交消息
- 返回:更新后的分支引用
-
search_repositories- 搜索 GitHub 仓库
- 输入:
query(string):搜索查询page(可选 number):分页页码perPage(可选 number):每页结果数(最多 100)
- 返回:仓库搜索结果
-
create_repository- 创建新的 GitHub 仓库
- 输入:
name(string):仓库名称description(可选 string):仓库描述private(可选 boolean):仓库是否应设为私有autoInit(可选 boolean):使用 README 初始化
- 返回:已创建仓库的详情
-
get_file_contents- 获取文件或目录的内容
- 输入:
owner(string):仓库所有者repo(string):仓库名称path(string):文件或目录的路径branch(可选 string):要从中获取内容的分支
- 返回:文件或目录内容
-
create_issue- 创建新的议题
- 输入:
owner(string):仓库所有者repo(string):仓库名称title(string):议题标题body(可选 string):议题描述assignees(可选 string[]):要指派的用户名labels(可选 string[]):要添加的标签milestone(可选 number):里程碑编号
- 返回:已创建议题的详情
-
create_pull_request- 创建新的拉取请求
- 输入:
owner(string):仓库所有者repo(string):仓库名称title(string):PR 标题body(可选 string):PR 描述head(string):包含更改的分支base(string):要合并到的分支draft(可选 boolean):创建为草稿 PRmaintainer_can_modify(可选 boolean):允许维护者编辑
- 返回:已创建拉取请求的详情
-
fork_repository- 派生仓库
- 输入:
owner(string):仓库所有者repo(string):仓库名称organization(可选 string):要派生到的组织
- 返回:已派生仓库的详情
-
create_branch- 创建新分支
- 输入:
owner(string):仓库所有者repo(string):仓库名称branch(string):新分支名称from_branch(optional string):源分支(默认为仓库默认分支)
- 返回:已创建的分支引用
-
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):每页结果数
- 返回:问题详情数组
-
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):新里程碑编号
- 返回:已更新的问题详情
-
add_issue_comment- 为问题添加评论
- 输入:
owner(string):仓库所有者repo(string):仓库名称issue_number(number):要评论的问题编号body(string):评论内容
- 返回:已创建的评论详情
-
search_code- 在 GitHub 仓库中搜索代码
- 输入:
q(string):使用 GitHub 代码搜索语法的搜索查询sort(optional string):排序字段(仅支持 'indexed')order(optional string):排序顺序('asc' 或 'desc')per_page(optional number):每页结果数(最多 100)page(optional number):页码
- 返回:包含仓库上下文的代码搜索结果
-
search_issues- 搜索问题和拉取请求
- 输入:
q(string):使用 GitHub 问题搜索语法的搜索查询sort(optional string):排序字段(comments、reactions、created 等)order(optional string):排序顺序('asc' 或 'desc')per_page(optional number):每页结果数(最多 100)page(optional number):页码
- 返回:问题和拉取请求搜索结果
-
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):页码
- 返回:用户搜索结果
-
list_commits
- 获取仓库分支的提交记录
- 输入:
owner(string):仓库所有者repo(string):仓库名称page(optional string):页码per_page(optional string):每页记录数sha(optional string):分支名称
- 返回:提交记录列表
get_issue
- 获取仓库中某个问题的内容
- 输入:
owner(string):仓库所有者repo(string):仓库名称issue_number(number):要获取的问题编号
- 返回:GitHub Issue 对象及详情
get_pull_request
- 获取特定拉取请求的详情
- 输入:
owner(字符串):仓库所有者repo(字符串):仓库名称pull_number(数字):拉取请求编号
- 返回:拉取请求详情,包括差异和评审状态
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(可选数字):页码
- 返回:拉取请求详情数组
create_pull_request_review
- 对拉取请求创建评审
- 输入:
owner(字符串):仓库所有者repo(字符串):仓库名称pull_number(数字):拉取请求编号body(字符串):评审评论文本event(字符串):评审操作('APPROVE'、'REQUEST_CHANGES'、'COMMENT')commit_id(可选字符串):要评审的提交 SHAcomments(可选数组):针对特定行的评论,每条包含:path(字符串):文件路径position(数字):差异中的行位置body(字符串):评论文本
- 返回:已创建的评审详情
merge_pull_request
- 合并拉取请求
- 输入:
owner(字符串):仓库所有者repo(字符串):仓库名称pull_number(数字):拉取请求编号commit_title(可选字符串):合并提交的标题commit_message(可选字符串):合并提交的补充说明merge_method(可选字符串):合并方式('merge'、'squash'、'rebase')
- 返回:合并结果详情
get_pull_request_files
- 获取拉取请求中更改的文件列表
- 输入:
owner(字符串):仓库所有者repo(字符串):仓库名称pull_number(数字):拉取请求编号
- 返回:已更改文件的数组,包含补丁和状态详情
get_pull_request_status
- 获取拉取请求所有状态检查的综合状态
- 输入:
owner(字符串):仓库所有者repo(字符串):仓库名称pull_number(数字):拉取请求编号
- 返回:综合状态检查结果及各项检查详情
update_pull_request_branch
- 使用 base 分支的最新更改更新拉取请求分支(相当于 GitHub 的“更新分支”按钮)
- 输入:
owner(字符串):仓库所有者repo(字符串):仓库名称pull_number(数字):拉取请求编号expected_head_sha(可选字符串):预期的拉取请求 HEAD 引用 SHA
- 返回:分支更新成功时的消息
get_pull_request_comments
- 获取拉取请求的评审评论
- 输入:
owner(字符串):仓库所有者repo(字符串):仓库名称pull_number(数字):拉取请求编号
- 返回:拉取请求评审评论数组,包含评论文本、作者和在差异中的位置等详情
get_pull_request_reviews
- 获取拉取请求的评审
- 输入:
owner(字符串):仓库所有者repo(字符串):仓库名称pull_number(数字):拉取请求编号
- 返回:拉取请求评审数组,包含评审状态(APPROVED、CHANGES_REQUESTED 等)、评审者和评审正文等详情
list_sub_issues
- 获取指定议题的子议题列表
- 输入:
owner(string):仓库所有者repo(string):仓库名称issue_number(number) 议题编号page(optional number):页码per_page(optional number):每页结果数
- 返回:议题详情数组
reprioritize_sub_issue
- 重新排序子议题
- 输入:
owner(string):仓库所有者repo(string):仓库名称pull_number(number):拉取请求编号issue_number(number) 议题编号sub_issue_id(number) 要重新排序的子议题 IDafter_id(number) 要排在其后的子议题 ID(必须指定位置参数 after 或 before 其中之一)。before_id(number) 要排在其前的子议题 ID(必须指定位置参数 after 或 before 其中之一)。
- 返回:子议题详情
remove_sub_issue
- 从议题中移除子议题
- 输入:
owner(string):仓库所有者repo(string):仓库名称pull_number(number):拉取请求编号issue_number(number) 议题编号sub_issue_id(number) 要移除的子议题 ID
- 返回:子议题详情
add_sub_issue
- 获取拉取请求的审查意见
- 输入:
owner(string):仓库所有者repo(string):仓库名称pull_number(number):拉取请求编号issue_number(number) 议题编号sub_issue_id(number) 要添加为子议题的议题 ID
- 返回:子议题详情
list_labels_for_issue
- 列出议题的所有标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称issue_number(number):议题编号per_page(optional number):每页结果数page(optional number):页码
- 返回:标签详情数组
add_labels_to_issue
- 为议题添加标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称issue_number(number):议题编号labels(string[]):要添加的标签名称数组
- 返回:应用到议题的标签详情数组
set_labels_for_issue
- 设置议题的标签,替换所有现有标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称issue_number(number):议题编号labels(optional string[]):要设置的标签名称数组。提供空数组可移除所有标签。
- 返回:应用到议题的标签详情数组
remove_label_from_issue
- 从议题中移除一个标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称issue_number(number):议题编号name(string):要移除的标签名称
- 返回:成功状态(通常为 204 No Content)
remove_all_labels_from_issue
- 移除议题的所有标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称issue_number(number):议题编号
- 返回:成功状态(通常为 204 No Content)
list_labels_for_repo
- 列出仓库的所有标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称per_page(optional number):每页结果数page(optional number):页码
- 返回:仓库标签详情数组
create_label
- 为仓库创建标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称name(string):标签名称color(可选 string):不带前导 # 的十六进制颜色代码description(可选 string):标签的简短描述
- 返回:已创建的标签详情
get_label
- 获取仓库中的单个标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称name(string):要获取的标签名称
- 返回:标签详情
update_label
- 更新仓库中的现有标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称name(string):要更新的标签当前名称new_name(可选 string):标签的新名称color(可选 string):新的十六进制颜色代码description(可选 string):新描述
- 返回:已更新的标签详情
delete_label
- 从仓库中删除标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称name(string):要删除的标签名称
- 返回:成功状态(通常为 204 No Content)
list_labels_for_milestone
- 列出里程碑中问题的标签
- 输入:
owner(string):仓库所有者repo(string):仓库名称milestone_number(number):里程碑编号per_page(可选 number):每页结果数page(可选 number):页码
- 返回:里程碑标签详情数组
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):页码
- 返回:里程碑详情数组
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)
- 返回:已创建的里程碑详情
get_milestone
- 获取仓库中的单个里程碑
- 输入:
owner(string):仓库所有者repo(string):仓库名称milestone_number(number):里程碑编号
- 返回:里程碑详情
update_milestone
- 更新仓库中的现有里程碑
- 输入:
owner(string):仓库所有者repo(string):仓库名称milestone_number(number):要更新的里程碑编号title(可选 string):新标题state(可选 string):新状态('open' 或 'closed')description(可选 string):新描述due_on(可选 string):新截止日期(ISO 8601 格式)
- 返回:已更新的里程碑详情
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 文件。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。