[MCP系列] 之 github-mcp-server_github mcp
本系列是关于MCP的实践使用教程,关于MCP的基础,架构请查阅官方手册:
Introduction - Model Context Protocol
环境准备
客户端工具:vscode + github copilot
运行环境:
- 客户端: vscode运行于Windows
- MCP服务端:github-mcp-server运行于Ubuntu22.04
注:vscode从1.99版本才开始支持MCP
github MCP Server服务的环境搭建
1. 打开vscode,通过Remote Explorer插件连接到Ubuntu
2. 启动MCP服务
MCP服务启动有2中配置方式,
a: 通过描述文件配置
在工作目录创建一个文件.vscode/mcp.json,文件内容如下:
{ \"inputs\": [ { \"type\": \"promptString\", \"id\": \"github_token\", \"description\": \"GitHub Personal Access Token\", \"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}\" } } }}
配置完成之后,json文件中的servers字段下会出现服务控制按钮,点击Start,既可以让vscode启动mcp服务
启动成可以在输出MCP:github的OUTPUT窗口看到如下日志
在第一次启动过程中会提示输入github的token,请正确输入即可。
关于如何获取github的token,请查阅其他资料。
b: 通过手动方式配置
打开vscode后,Ctrl + Shift + P, 在命令窗口输入
然后选择mcp服务的运行类型
以下是这几种类型的介绍和优缺点,在测试阶段一般请优先选择Docker Image的方式构建mcp服务,此种方式处理需要本地配置docker以外,不需要依赖其他的环境,安装较为简单不易出错。当主机环境不适用此种方式时,请优选Command(stdio)这个二进制bin档的方式。NPM或者PIP通常依赖较多,环境容易出错。HTTP更适用于企业环境。
MCP服务的搭建方法
1. Command (Stdio)
- 解释: MCP Server 以命令行工具的形式运行,通过标准输入输出(Stdio)与客户端通信。
- 优点:
- 易于集成:可以直接通过命令行调用,无需额外的网络配置。
- 轻量级:不需要运行额外的服务或容器。
- 跨平台:只要支持命令行的环境都可以运行。
- 缺点:
- 性能有限:Stdio 的通信速度可能较慢,尤其在高并发场景下。
- 扩展性差:难以支持复杂的分布式部署。
2. HTTP
- 解释: MCP Server 以 HTTP 服务的形式运行,客户端通过 HTTP 请求与其交互。
- 优点:
- 标准化:HTTP 是通用协议,易于与其他系统集成。
- 可扩展性:支持分布式部署和负载均衡。
- 灵活性:可以通过 REST 或 GraphQL 提供丰富的 API。
- 缺点:
- 配置复杂:需要设置服务器和网络环境。
- 性能开销:HTTP 请求的开销可能较高,尤其在低延迟场景下。
3. NPM Package
- 解释: MCP Server 以 NPM 包的形式分发,直接在 Node.js 环境中运行。
- 优点:
- 易于使用:开发者可以通过简单的
npm install
安装和使用。 - 与 JavaScript/TypeScript 项目高度集成。
- 无需额外的服务:直接在代码中调用,无需运行独立的服务。
- 易于使用:开发者可以通过简单的
- 缺点:
- 语言限制:仅适用于 Node.js 环境。
- 扩展性有限:难以支持分布式部署。
4. PIP Package
- 解释: MCP Server 以 PIP 包的形式分发,直接在 Python 环境中运行。
- 优点:
- 易于使用:通过
pip install
安装,适合 Python 开发者。 - 与 Python 项目高度集成。
- 无需额外的服务:直接在代码中调用。
- 易于使用:通过
- 缺点:
- 语言限制:仅适用于 Python 环境。
- 扩展性有限:难以支持分布式部署。
5. Docker Image
- 解释: MCP Server 以 Docker 镜像的形式分发,运行在容器中。
- 优点:
- 隔离性强:容器化运行,避免环境依赖问题。
- 可移植性:可以在任何支持 Docker 的环境中运行。
- 易于扩展:支持分布式部署和容器编排(如 Kubernetes)。
- 缺点:
- 配置复杂:需要安装和配置 Docker 环境。
- 资源开销:容器化运行可能增加资源消耗。
3. 如果使用docker的方式搭建,搭建完成,可以通过docker ps命令查看服务启动是否正常。
在对话窗口点击工具图标,可以看到github-mcp-server支持的接口列表,如下
使用MCP服务端
MCP服务启动后,可以使用github copilot 的对话框,来使用github mcp server提供的能力为我们服务。
为了能利用MCP Server的能力,我们需要让github copilot处于Aggent的交互模式下。
案例1:
list the top 10 most popular repos on github and summarize what they have in common
github copilot会自动调用search_repositories的接口来返回我们期望的结果,这里就正常返回了当前10个最流行的github仓库。
案例2:
获取仓库的信息
输入提示语:
请帮忙对rdkcentral/aamp最新的10笔提交做code review
结果如下:
Github MCP Server支持的接口
GitHub MCP Server 提供了一系列与 GitHub API 交互的接口能力,主要分为以下几个方面:
核心特性 (根据 README.md):
- 自动创建分支: 在创建/更新文件或推送更改时,如果分支不存在,会自动创建。
- 全面的错误处理: 为常见问题提供清晰的错误消息。
- Git 历史保护: 操作会维护正确的 Git 历史,不会强制推送。
- 批量操作: 支持单文件和多文件操作。
- 高级搜索: 支持搜索代码、问题/拉取请求和用户。
详细接口能力 (根据您提供的列表):
1. 用户 (Users)
get_me
: 获取当前认证用户的详细信息。search_users
: 搜索 GitHub 用户 (可按关注者、仓库数量、加入时间等排序)。
2. 问题 (Issues)
get_issue
: 获取仓库中特定问题的详细内容。get_issue_comments
: 获取 GitHub 问题的评论列表。create_issue
: 在指定的 GitHub 仓库中创建一个新问题 (可设置标题、内容、分配人、标签等)。add_issue_comment
: 向指定的问题添加一条评论。list_issues
: 列出并根据条件(如状态、标签、排序方式、时间等)筛选仓库中的问题。update_issue
: 更新仓库中已有问题的属性 (如标题、描述、状态、标签、分配人、里程碑等)。search_issues
: 根据查询条件搜索问题和拉取请求 (支持 GitHub 的高级搜索语法)。
3. 拉取请求 (Pull Requests)
get_pull_request
: 获取特定拉取请求的详细信息。list_pull_requests
: 列出并根据条件(如状态、排序方式等)筛选仓库中的拉取请求。merge_pull_request
: 合并一个拉取请求 (可指定合并标题、消息和合并方法)。get_pull_request_files
: 获取特定拉取请求中已更改的文件列表。get_pull_request_status
: 获取特定拉取请求所有状态检查的组合状态。update_pull_request_branch
: 使用基础分支的最新更改来更新拉取请求分支 (相当于 GitHub 上的 “Update branch” 按钮)。get_pull_request_comments
: 获取拉取请求的审查评论列表。get_pull_request_reviews
: 获取对拉取请求进行的审查列表。create_pull_request_review
: 对拉取请求进行审查操作 (如批准、请求更改、评论,可附带提交ID和行级评论)。create_pull_request
: 创建一个新的拉取请求 (需指定标题、头分支、基础分支,可选描述、是否草稿等)。add_pull_request_review_comment
: 向拉取请求添加审查评论,或回复一个已有的评论 (可指定文件、行号、评论内容等)。update_pull_request
: 更新已存在的拉取请求的属性 (如标题、描述、状态、基础分支等)。
4. 仓库 (Repositories)
create_or_update_file
: 在仓库中创建或更新单个文件 (需指定路径、提交信息、内容,可选分支和SHA值用于更新)。list_branches
: 列出 GitHub 仓库中的所有分支 (支持分页)。push_files
: 在一次提交中推送多个文件到指定分支。search_repositories
: 根据查询条件搜索 GitHub 仓库 (支持排序和分页)。create_repository
: 创建一个新的 GitHub 仓库 (可设置名称、描述、是否私有、是否自动初始化README)。get_file_contents
: 获取仓库中指定路径的文件或目录内容 (可指定Git引用,如分支、标签或commit SHA)。fork_repository
: 复刻 (Fork) 一个 GitHub 仓库到当前用户或指定组织下。create_branch
: 基于指定的 SHA 创建一个新的分支。list_commits
: 获取仓库特定分支或路径下的提交历史列表 (支持分页)。get_commit
: 获取仓库中特定提交 (通过SHA、分支名或标签名指定) 的详细信息 (支持分页查看提交中的文件)。search_code
: 在 GitHub 仓库中根据关键词搜索代码 (支持排序和分页,使用 GitHub 代码搜索语法)。
5. 代码扫描 (Code Scanning)
get_code_scanning_alert
: 获取特定编号的代码扫描警报的详细信息。list_code_scanning_alerts
: 列出仓库的代码扫描警报 (可按Git引用、状态、严重性、工具名称筛选)。
6. 密钥扫描 (Secret Scanning)
get_secret_scanning_alert
: 获取特定编号的密钥扫描警报的详细信息。list_secret_scanning_alerts
: 列出仓库的密钥扫描警报 (可按状态、密钥类型、解决状态筛选)。
7. 资源 (Resources) - 通过 URI 模板访问仓库内容
这部分定义了通过特定格式的 URI 直接访问仓库内容的模板:
- 获取仓库内容:
repo://{owner}/{repo}/contents{/path*}
- 可用于获取仓库根目录或指定路径下的文件/目录列表。
- 获取特定分支的仓库内容:
repo://{owner}/{repo}/refs/heads/{branch}/contents{/path*}
- 获取特定提交的仓库内容:
repo://{owner}/{repo}/sha/{sha}/contents{/path*}
- 获取特定标签的仓库内容:
repo://{owner}/{repo}/refs/tags/{tag}/contents{/path*}
- 获取特定拉取请求头部的仓库内容:
repo://{owner}/{repo}/refs/pull/{prNumber}/head/contents{/path*}
这些接口使得 MCP 客户端能够以编程方式与 GitHub 进行丰富的交互,涵盖了代码管理、协作和监控的多个方面。
参考
1. https://www.youtube.com/watch?v=d3QpQO6Paeg&ab_channel=GitHub
2. Use MCP servers in VS Code (Preview)
3. https://github.com/github/github-mcp-server