1. 快速开始示例

1.1 本地部署示例

# 1. 创建GitHub Personal Access Token
# 访问 https://github.com/settings/personal-access-tokens/new
# 选择所需权限:repo, read:packages, read:org

# 2. 设置环境变量
export GITHUB_PERSONAL_ACCESS_TOKEN="your_token_here"

# 3. 使用Docker运行
docker run -i --rm \
  -e GITHUB_PERSONAL_ACCESS_TOKEN \
  ghcr.io/github/github-mcp-server

# 4. 或者从源码构建运行
go build -o github-mcp-server cmd/github-mcp-server/main.go
./github-mcp-server stdio

1.2 VS Code 集成示例

使用一键安装按钮:点击README中的"Install in VS Code"按钮

手动配置 - 在VS Code MCP配置中添加:

{
  "mcp": {
    "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}"
        }
      }
    },
    "inputs": [
      {
        "type": "promptString",
        "id": "github_token",
        "description": "GitHub Personal Access Token",
        "password": true
      }
    ]
  }
}

1.3 Claude Desktop 集成示例

配置文件位置

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "github": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "GITHUB_PERSONAL_ACCESS_TOKEN=your_token_here",
        "ghcr.io/github/github-mcp-server"
      ]
    }
  }
}

2. 工具集配置示例

2.1 基本工具集配置

# 启用特定工具集
./github-mcp-server --toolsets repos,issues,pull_requests,actions stdio

# 使用环境变量
GITHUB_TOOLSETS="repos,issues,pull_requests,actions" ./github-mcp-server stdio

# 启用所有工具集
./github-mcp-server --toolsets all stdio

# 只读模式
./github-mcp-server --read-only stdio

2.2 Docker 工具集配置

# 启用特定工具集
docker run -i --rm \
  -e GITHUB_PERSONAL_ACCESS_TOKEN=<your-token> \
  -e GITHUB_TOOLSETS="repos,issues,pull_requests,actions,code_security" \
  ghcr.io/github/github-mcp-server

# 启用动态工具集
docker run -i --rm \
  -e GITHUB_PERSONAL_ACCESS_TOKEN=<your-token> \
  -e GITHUB_DYNAMIC_TOOLSETS=1 \
  ghcr.io/github/github-mcp-server

# 只读模式
docker run -i --rm \
  -e GITHUB_PERSONAL_ACCESS_TOKEN=<your-token> \
  -e GITHUB_READ_ONLY=1 \
  ghcr.io/github/github-mcp-server

2.3 企业版配置示例

# GitHub Enterprise Server
docker run -i --rm \
  -e GITHUB_PERSONAL_ACCESS_TOKEN=<your-token> \
  -e GITHUB_HOST="https://github.enterprise.com" \
  ghcr.io/github/github-mcp-server

# GitHub Enterprise Cloud (data residency)
docker run -i --rm \
  -e GITHUB_PERSONAL_ACCESS_TOKEN=<your-token> \
  -e GITHUB_HOST="https://yourcompany.ghe.com" \
  ghcr.io/github/github-mcp-server

3. 常见使用场景示例

3.1 仓库管理场景

// AI工具可以执行的自然语言命令示例

"帮我在 microsoft/vscode 仓库中搜索包含 'extension' 的文件"
 调用 search_code 工具

"创建一个新的仓库叫 my-awesome-project"
 调用 create_repository 工具

"获取 react 仓库的 README.md 文件内容"
 调用 get_file_contents 工具

"在 main 分支上创建一个新文件 docs/api.md"
 调用 create_or_update_file 工具

3.2 Issue 管理场景

"列出我的仓库中所有开放的 bug 标签的 issues"
 调用 list_issues 工具参数: labels: ["bug"], state: "OPEN"

"创建一个新的 issue 标题为 'Fix login bug'"
 调用 create_issue 工具

"给 issue #123 添加评论说明问题已经修复"
 调用 add_issue_comment 工具

"将 issue #456 分配给 Copilot 来处理"
 调用 assign_copilot_to_issue 工具

3.3 CI/CD 自动化场景

"运行仓库中的 CI 工作流"
 调用 run_workflow 工具

"检查最新的构建状态"
 调用 list_workflow_runs 工具

"获取失败作业的日志来诊断问题"
 调用 get_job_logs 工具参数: failed_only: true

"取消正在运行的工作流"
 调用 cancel_workflow_run 工具

3.4 Pull Request 管理场景

"创建一个从 feature-branch 到 main 的 PR"
 调用 create_pull_request 工具

"获取 PR #789 的文件变更列表"
 调用 get_pull_request_files 工具

"合并已通过审查的 PR"
 调用 merge_pull_request 工具

"请求 Copilot 审查这个 PR"
 调用 request_copilot_review 工具

4. 高级配置示例

4.1 自定义翻译配置

// github-mcp-server-config.json
{
  "TOOL_GET_ISSUE_DESCRIPTION": "获取GitHub仓库中特定issue的详细信息",
  "TOOL_CREATE_ISSUE_DESCRIPTION": "在GitHub仓库中创建新的issue",
  "TOOL_LIST_WORKFLOWS_DESCRIPTION": "列出仓库中的所有GitHub Actions工作流"
}
# 导出当前翻译配置
./github-mcp-server --export-translations

# 使用环境变量覆盖描述
export GITHUB_MCP_TOOL_GET_ISSUE_DESCRIPTION="获取issue的详细信息和状态"
./github-mcp-server stdio

4.2 内容窗口大小配置

# 设置较大的内容窗口以处理大文件
./github-mcp-server --content-window-size 10000 stdio

# 使用环境变量
GITHUB_CONTENT_WINDOW_SIZE=10000 ./github-mcp-server stdio

4.3 日志和调试配置

# 启用命令日志记录
./github-mcp-server --enable-command-logging --log-file debug.log stdio

# 使用环境变量
GITHUB_ENABLE_COMMAND_LOGGING=1 GITHUB_LOG_FILE=debug.log ./github-mcp-server stdio

5. 编程接口使用示例

5.1 Go 库使用示例

package main

import (
    "context"
    "log"
    
    "github.com/github/github-mcp-server/internal/ghmcp"
    "github.com/github/github-mcp-server/pkg/github"
)

func main() {
    // 创建服务器配置
    config := ghmcp.MCPServerConfig{
        Version:           "1.0.0",
        Host:              "", // 使用默认的 GitHub.com
        Token:             "your-github-token",
        EnabledToolsets:   []string{"repos", "issues"},
        DynamicToolsets:   false,
        ReadOnly:          false,
        ContentWindowSize: 5000,
    }
    
    // 创建 MCP 服务器实例
    server, err := ghmcp.NewMCPServer(config)
    if err != nil {
        log.Fatalf("Failed to create MCP server: %v", err)
    }
    
    // 这里可以添加自定义工具
    // server.AddTool(customTool, customHandler)
    
    log.Println("MCP Server created successfully")
}

5.2 自定义工具实现示例

// 自定义工具实现
func CustomRepositoryTool(getClient github.GetClientFn, t translations.TranslationHelperFunc) (tool mcp.Tool, handler server.ToolHandlerFunc) {
    return mcp.NewTool("custom_repo_info",
            // 工具描述和参数定义
            mcp.WithDescription(t("CUSTOM_REPO_INFO_DESCRIPTION", "获取自定义仓库信息")),
            mcp.WithString("owner",
                mcp.Required(),
                mcp.Description("仓库所有者"),
            ),
            mcp.WithString("repo", 
                mcp.Required(),
                mcp.Description("仓库名称"),
            ),
        ),
        // 工具处理函数
        func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
            // 获取参数
            owner, err := github.RequiredParam[string](request, "owner")
            if err != nil {
                return mcp.NewToolResultError(err.Error()), nil
            }
            
            repo, err := github.RequiredParam[string](request, "repo")
            if err != nil {
                return mcp.NewToolResultError(err.Error()), nil
            }
            
            // 获取 GitHub 客户端
            client, err := getClient(ctx)
            if err != nil {
                return nil, fmt.Errorf("failed to get GitHub client: %w", err)
            }
            
            // 调用 GitHub API
            repository, resp, err := client.Repositories.Get(ctx, owner, repo)
            if err != nil {
                return nil, fmt.Errorf("failed to get repository: %w", err)
            }
            defer resp.Body.Close()
            
            // 处理结果
            result := map[string]interface{}{
                "name":        repository.GetName(),
                "description": repository.GetDescription(),
                "stars":       repository.GetStargazersCount(),
                "forks":       repository.GetForksCount(),
                "language":    repository.GetLanguage(),
            }
            
            // 序列化并返回结果
            r, err := json.Marshal(result)
            if err != nil {
                return nil, fmt.Errorf("failed to marshal result: %w", err)
            }
            
            return mcp.NewToolResultText(string(r)), nil
        }
}

5.3 工具集注册示例

// 创建自定义工具集
func createCustomToolset(getClient github.GetClientFn, t translations.TranslationHelperFunc) *toolsets.Toolset {
    customToolset := toolsets.NewToolset("custom", "自定义工具集")
        
    // 添加只读工具
    customToolset.AddReadTools(
        toolsets.NewServerTool(CustomRepositoryTool(getClient, t)),
        toolsets.NewServerTool(AnotherReadOnlyTool(getClient, t)),
    )
    
    // 添加写操作工具
    customToolset.AddWriteTools(
        toolsets.NewServerTool(CustomCreateTool(getClient, t)),
    )
    
    return customToolset
}

// 注册到工具集组
func setupCustomToolsets() *toolsets.ToolsetGroup {
    tsg := toolsets.NewToolsetGroup(false) // false = 允许写操作
    
    // 注册默认工具集
    defaultToolset := github.DefaultToolsetGroup(false, getClient, getGQLClient, getRawClient, translator, 5000)
    
    // 添加自定义工具集
    customToolset := createCustomToolset(getClient, translator)
    tsg.AddToolset(customToolset)
    
    return tsg
}

6. 故障排除和调试示例

6.1 常见问题诊断

# 1. 检查token权限
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.github.com/user

# 2. 启用详细日志
./github-mcp-server --enable-command-logging --log-file debug.log stdio

# 3. 测试特定工具集
./github-mcp-server --toolsets context stdio

# 4. 检查企业版连接
./github-mcp-server --gh-host "https://github.enterprise.com" stdio

6.2 性能优化配置

# 减少内容窗口大小以处理大量数据
./github-mcp-server --content-window-size 1000 stdio

# 只启用必需的工具集
./github-mcp-server --toolsets "repos,issues" stdio

# 启用只读模式提高性能
./github-mcp-server --read-only stdio

6.3 错误处理示例

// 在工具实现中的错误处理
func ExampleToolWithErrorHandling(getClient github.GetClientFn, t translations.TranslationHelperFunc) (tool mcp.Tool, handler server.ToolHandlerFunc) {
    return mcp.NewTool("example_tool",
            mcp.WithDescription("示例工具"),
        ),
        func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
            client, err := getClient(ctx)
            if err != nil {
                return nil, fmt.Errorf("failed to get GitHub client: %w", err)
            }
            
            // API调用
            result, resp, err := client.Repositories.Get(ctx, "owner", "repo")
            if err != nil {
                // 使用错误处理器创建详细的错误响应
                return ghErrors.NewGitHubAPIErrorResponse(ctx,
                    "failed to get repository",
                    resp,
                    err,
                ), nil
            }
            defer resp.Body.Close()
            
            // 检查HTTP状态码
            if resp.StatusCode != 200 {
                body, _ := io.ReadAll(resp.Body)
                return mcp.NewToolResultError(fmt.Sprintf("API error: %s", string(body))), nil
            }
            
            return github.MarshalledTextResult(result), nil
        }
}

7. 最佳实践示例

7.1 安全配置最佳实践

# 1. 使用环境变量而不是硬编码token
export GITHUB_PAT="your_token_here"

# 2. 创建.env文件(记得添加到.gitignore)
echo "GITHUB_PAT=your_token_here" > .env
echo ".env" >> .gitignore

# 3. 使用最小权限原则
# 只授予必要的scope:repo, read:packages, read:org

# 4. 定期轮换token
# 建议每90天更新一次PAT

# 5. 限制配置文件权限
chmod 600 ~/.config/mcp-server.json

7.2 生产环境部署示例

# docker-compose.yml
version: '3.8'
services:
  github-mcp-server:
    image: ghcr.io/github/github-mcp-server:latest
    environment:
      - GITHUB_PERSONAL_ACCESS_TOKEN=${GITHUB_PAT}
      - GITHUB_TOOLSETS=repos,issues,pull_requests,actions
      - GITHUB_READ_ONLY=false
      - GITHUB_CONTENT_WINDOW_SIZE=5000
      - GITHUB_ENABLE_COMMAND_LOGGING=true
      - GITHUB_LOG_FILE=/logs/github-mcp.log
    volumes:
      - ./logs:/logs
    restart: unless-stopped
    stdin_open: true
    tty: true

7.3 监控和日志分析

# 分析日志中的API调用模式
grep "API Request" debug.log | awk '{print $3}' | sort | uniq -c

# 监控错误率
grep "ERROR" debug.log | wc -l

# 查看最频繁使用的工具
grep "Tool Called" debug.log | awk '{print $4}' | sort | uniq -c | sort -nr

这些示例展示了 GitHub MCP Server 的各种使用场景,从简单的本地部署到复杂的生产环境配置,为用户提供了全面的参考指南。