使用说明
GitHub MCP服务器
一个模型上下文协议(MCP)服务器,提供GitHub集成功能,专门用于通过MCP接口创建GitHub问题。
概述
此MCP服务器允许AI助手和其他MCP客户端通过创建问题和探索存储库/文档与GitHub存储库进行交互。它实现了MCP协议,为GitHub操作提供了一个标准化的接口。
特性
- 创建GitHub问题:在GitHub存储库中创建新问题
- 发现存储库:列出用户/组织存储库并搜索公共存储库
- 阅读文档:获取README和markdown文档,或任意文件
- 输入验证:使用Zod模式进行稳健的参数验证
- 错误处理:使用适当的MCP错误代码进行全面的错误处理
- 类型安全:具有严格类型检查的完整TypeScript实现
先决条件
- Node.js(v18或更高版本)
- npm或纱线
- GitHub个人访问令牌
安装
- 克隆存储库:
git clone <repository-url>
cd git_mcp
- 安装依赖项:
npm install
- 设置环境变量:
cp .env.example .env
- 编辑
.env并添加您的GitHub令牌:
GITHUB_TOKEN=your_github_token_here
配置
GitHub令牌设置
- 转到GitHub设置→ 开发人员设置→ 个人访问令牌→ 代币(经典)
- 生成具有以下作用域的新令牌:
repo(完全控制私有存储库)public_repo(访问公共存储库)
- 复制令牌并将其添加到您的
.env文件
环境变量
| 变量 | 描述 | 必填 |
|---|---|---|
GITHUB_TOKEN |
您的GitHub个人访问令牌 | 是 |
用法
发展模式
以热重新加载的开发模式运行服务器:
npm run dev
生产模式
- 构建项目:
npm run build
- 启动服务器:
npm start
MCP客户端集成
服务器通过stdio传输进行通信,使其与任何MCP客户端兼容。以下是如何在MCP客户端中配置它:
{
"mcpServers": {
"github": {
"command": "node",
"args": ["dist/github-mcp-server.js"],
"env": {
"GITHUB_TOKEN": "your_token_here"
}
}
}
}
api参考
可用工具
创建问题
在指定的存储库中创建新的GitHub问题。
参数:
title(string,必填):问题的标题body(string,可选):问题的正文/描述owner(字符串,必填):存储库所有者(用户名或组织)repo(string,必填):存储库名称labels(字符串数组,可选):要添加到问题中的标签assignees(字符串数组,可选):要分配给问题的用户名
示例用法:
{
"name": "create-issue",
"arguments": {
"title": "Fix login bug",
"body": "Users are unable to log in with their credentials",
"owner": "myorg",
"repo": "myproject",
"labels": ["bug", "high-priority"],
"assignees": ["developer1"]
}
}
答复:
{
"content": [
{
"type": "text",
"text": "Successfully created issue #123: Fix login bug\nURL: https://github.com/myorg/myproject/issues/123"
}
]
}
列出用户存储库
列出用户或经过身份验证的用户的存储库。
参数:
username(string,可选):如果省略,则列出经过身份验证的用户的存储库visibility(“all”|“public”|“private”,可选,默认为“all”)per_page(整数,1-100,默认值50)page(整数,默认值1)
例子:
{ "name": "list-user-repos", "arguments": { "visibility": "public" } }
列出组织仓库
列出组织中的存储库。
参数:
org(字符串,必填)type(“全部”|“公共”|“私有”|“分支”|“源”|“成员”,默认为“全部”)per_page(整数,1-100,默认值50)page(整数,默认值1)
例子:
{ "name": "list-org-repos", "arguments": { "org": "myorg", "type": "public" } }
搜索仓库
使用GitHub搜索语法搜索公共存储库。
参数:
q(string,必填):查询,例如。"lang:ts topic:mcp sdk"sort(“星号”|“叉号”|“求助问题”|“已更新”)order(“desc”|“asc”,默认为“desc“)per_page(整数,1-100,默认值30)page(整数,默认值1)
例子:
{ "name": "search-repos", "arguments": { "q": "mcp in:name language:TypeScript" } }
获取自述文件
从存储库中获取README文件作为文本。
参数:
owner(字符串,必填)repo(字符串,必填)ref(字符串,可选):分支、标记或SHA
例子:
{ "name": "get-readme", "arguments": { "owner": "myorg", "repo": "myrepo" } }
列出文档
列出常用文档目录和根目录中的markdown文档文件。
参数:
owner(字符串,必填)repo(字符串,必填)ref(字符串,可选)
例子:
{ "name": "list-docs", "arguments": { "owner": "myorg", "repo": "myrepo" } }
获取文件
将任意存储库文件作为文本获取。
参数:
owner(字符串,必填)repo(字符串,必填)path(字符串,必填)ref(字符串,可选)
例子:
{ "name": "get-file", "arguments": { "owner": "myorg", "repo": "myrepo", "path": "docs/intro.md" } }
错误处理
服务器实现了全面的错误处理:
- 无效参数:退货
InvalidParams带有详细验证消息的错误代码 - GitHub API错误:退货
InternalError带有GitHub API错误详细信息 - 身份验证错误:退货
InternalErrorGitHub令牌无效时 - 未知工具:退货
MethodNotFound对于不受支持的工具请求
发展
项目结构
src/
├── github-mcp-server.ts # Main server implementation
package.json # Dependencies and scripts
tsconfig.json # TypeScript configuration
README.md # This documentation
关键组件
- GitHubMCPServer类:处理MCP协议的主服务器类
- 架构验证:使用Zod进行稳健的参数验证
- 错误处理:使用适当的MCP错误代码进行全面的错误处理
- 传输层:使用stdio传输进行MCP通信
代码更改
1.修复语法错误
问题:双人间 this 第34行的关键字
// Before (incorrect)
this this.server.setRequestHandler(...)
// After (correct)
this.server.setRequestHandler(...)
2.添加了模式定义
问题:缺失 CreateIssueRequestSchema 定义
解决方案:创建了全面的Zod模式并进行了验证:
const CreateIssueRequestSchema = z.object({
title: z.string().describe("The title of the issue"),
body: z.string().optional().describe("The body/description of the issue"),
owner: z.string().describe("The repository owner (username or organization)"),
repo: z.string().describe("The repository name"),
labels: z.array(z.string()).optional().describe("Labels to add to the issue"),
assignees: z.array(z.string()).optional().describe("Usernames to assign to the issue"),
});
3.已实现的工具处理程序
问题:空 handleRequest() 方法
解决方案:通过以下方式完成实施:
- 使用Zod进行参数验证
- GitHub API集成
- 正确的错误处理
- 符合MCP的响应
4.添加了服务器启动
问题:服务器已创建但从未启动 解决方案:添加了完整的启动顺序:
- 传输初始化
- 服务器连接
- 主要执行功能
- 优雅的停机处理
5.进口增加
问题:缺少类型导入导致linter错误 解决方案:独立的运行时和类型导入:
import { CallToolRequestSchema, ListToolsRequestSchema, ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
import type { Tool, CallToolResult, TextContent } from "@modelcontextprotocol/sdk/types.js";
已添加依赖关系
- 动物圈:用于健壮参数检查的运行时模式验证
- @类型/节点:Node.js的TypeScript定义
测试
手动测试
- 启动服务器:
npm run dev
- 使用支持创建问题工具的MCP客户端进行测试
集成测试
通过发送正确的MCP协议消息,可以使用任何符合MCP的客户端对服务器进行测试。
故障排除
常见问题
-
“GITHUB_TOKEN环境变量是必需的”
- 确保您的
.env文件包含有效GITHUB_TOKEN - 验证令牌是否具有所需的权限
- 确保您的
-
“创建问题失败:404未找到”
- 检查存储库所有者和名称是否正确
- 确保令牌可以访问存储库
-
“无效参数”
- 验证是否提供了所有必需的参数
- 检查参数类型是否与架构匹配
调试模式
通过设置启用调试日志记录 DEBUG 环境变量:
DEBUG=* npm run dev
贡献
- 分叉存储库
- 创建要素分支
- 进行更改
- 如果适用,添加测试
- 提交拉取请求
许可证
ISC许可证-有关详细信息,请参阅许可证文件
支持
对于问题和疑问:
- 检查故障排除部分
- 查看GitHub API文档
- 在存储库中打开问题
更新日志
v1.0.0
- 初始版本
- GitHub问题创建功能
- MCP协议合规性
- 全面的错误处理
- TypeScript实现
