> 技术文档 > [MCP系列] 之 github-mcp-server_github mcp

[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 环境。
    • 资源开销:容器化运行可能增加资源消耗。

类型 优点 缺点 适用场景 Command (Stdio) 轻量级、易集成、跨平台 性能有限、扩展性差 本地开发、简单工具集成 HTTP 标准化、可扩展、灵活 配置复杂、性能开销 分布式系统、网络服务 NPM Package 易用、高度集成、无需额外服务 语言限制、扩展性有限 Node.js 项目 PIP Package 易用、高度集成、无需额外服务 语言限制、扩展性有限 Python 项目 Docker Image 隔离性强、可移植、易扩展 配置复杂、资源开销 分布式部署、容器化环境

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