mcpField
G
github-mcp

github-mcp

本地服务
github.com/jaimenbell版本控制011 周前更新

关于 github-mcp

github-mcp 是供 Agent 和其他 MCP 客户端调用 GitHub REST API 的参考 MCP 服务。读取操作默认可用;修改 Issue 和 Pull Request 则需要显式启用环境变量并提供令牌。

主要功能

  1. 01读取仓库信息、文件和提交记录
  2. 02列出并获取 Issue 和 Pull Request
  3. 03搜索公开仓库并查看用户资料
  4. 04创建 Issue 并评论 Issue 或 PR
  5. 05更新 Issue 状态、添加标签及评论 PR 差异行
  6. 06类型化 API 错误和写入门控

适用场景

  1. 01检查仓库详情和源文件
  2. 02查看 Issue、Pull Request 和提交记录
  3. 03搜索公开仓库并查看用户资料
  4. 04启用写入后修改 Issue 或 PR

MCP 相关

将 GitHub REST API 操作作为 MCP 工具提供。读取工具始终可用;写入工具需要设置 GITHUB_MCP_ENABLE_WRITE=1 并提供 GITHUB_TOKEN。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"jaimenbell-github": {
"command": "uvx",
"args": [
"jaimenbell-github-mcp"
]
}
}
}
启动命令uvx jaimenbell-github-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypijaimenbell-github-mcp0.1.1

工具

14

收录的工具列表 · 更新于 2 周前

参数类型必填说明
repostring是
ownerstring是

详细介绍

github-mcp

PyPI MCP Registry License: MIT tests CI

一个通过 GitHub REST API 提供公开读写能力的 MCP 服务,遵循 desktop-mcp/rag-mcp/mcp-factory 标准(独立的 pyproject、fastmcp 服务、真实可靠的 README、完整的测试套件),并通过环境变量控制 工具组(默认禁用写入)。这不是 GitHub 官方 MCP 服务 ——详情见下文。

快速开始(60 秒)

pip install jaimenbell-github-mcp
// Add to your MCP host config (e.g. Claude Desktop/Code's mcpServers block)
{
  "mcpServers": {
    "github-mcp": {
      "command": "github-mcp"
    }
  }
}

write 工具组(问题/PR 修改)默认关闭——如需启用,请参阅下文的 环境变量。

是什么 / 不是什么

这是一个参考作品集实现,用于展示基于真实外部 SaaS API(GitHub)的强化型 读写 MCP 服务模式——通过环境变量控制工具组、强类型错误/速率限制处理、可平稳降级的身份验证以及完整的测试套件。它的存在是为了通过一个客户端可以点击的链接,具体展示“我能构建基于外部 API 的读写 MCP 服务”。

**这不是 GitHub 官方 MCP 服务。**它不打算与 GitHub 自己的 MCP 服务保持功能一致(GraphQL、Actions、webhook、GitHub Apps 均不在范围内——详见下文)。它最初是一个由工厂脚手架生成的只读演示(mcp-factory 的 generated/github_read_server.py),之后经过手动强化,成为这个独立的读写服务——先搭建脚手架再强化的过程本身,也是本仓库要讲述的一部分。

工具(14 个)

每个工具占一行——下面的两个组只控制默认启用或禁用状态, 不决定工具是否存在。

工具组功能
get_reporead仓库元数据(星标数、语言、许可证、默认分支、归档标志……)
list_issuesread列出仓库中的问题(已过滤掉 PR)
get_issueread获取单个问题
list_pull_requestsread列出仓库中的拉取请求
get_pull_requestread获取单个拉取请求
get_file_contentread读取仓库文件的内容(base64 解码;检测二进制文件但不解码)
search_reposread搜索公开仓库
get_userread公开用户/组织资料
list_commitsread列出分支/ref 上的提交
create_issuewrite创建问题
comment_on_issuewrite在问题/PR 上发表评论
update_issue_statewrite打开/关闭问题
add_labelswrite为问题/PR 添加标签
create_pr_review_commentwrite在差异行上创建 PR 审查评论

read 始终启用,无需身份验证即可使用(GitHub 每小时 60 次请求的等级)。 write 由环境变量控制,且默认关闭——需要同时设置 GITHUB_MCP_ENABLE_WRITE=1 和 GITHUB_TOKEN。

禁用状态下调用写入工具会返回结构化的 policy_refusal 错误(不会静默无操作,也不会崩溃)。启用工具组但未提供令牌时调用写入工具,则会返回结构化的 auth_required 错误——工具组开关和令牌前置条件会分别检查,且均在发起任何网络调用之前进行。

默认关闭写入安全功能

这是纵深防御设计,与 desktop-mcp 的 input 组一致:宿主级权限提示是第一道关卡,但除非通过 GITHUB_MCP_ENABLE_WRITE=1 在环境中明确启用,否则服务本身会拒绝所有写入工具;即使启用了,缺少 GITHUB_TOKEN 时也会拒绝。配置错误或权限过宽的 MCP 主机无法启用此进程未被有意配置为允许的 GitHub 修改操作。此仓库提供的注册配置(参见 ~/.claude.json 中的 github-mcp 条目)未在 env 中包含写入组——启用该组是操作人员针对特定注册配置有意作出的选择,而非代码更改。

能力声明核对表

以下每项声明均对应实现它的文件及验证它的测试——每项能力声明都有相应的实现和测试作为依据。

声明实现验证方式
仓库元数据(星标数、语言、许可证、默认分支、归档标记……)github_mcp/groups/read.py::get_repotests/test_read.py::TestGetRepo,实时测试:tests/test_live_smoke.py::test_live_get_repo_real_json
列出 / 获取议题(从列表中筛除 PR)github_mcp/groups/read.py::list_issues、get_issuetests/test_read.py::TestListIssues、TestGetIssue
列出 / 获取拉取请求github_mcp/groups/read.py::list_pull_requests、get_pull_requesttests/test_read.py::TestListPullRequests、TestGetPullRequest
读取仓库文件内容(进行 base64 解码,检测到二进制文件时不解码)github_mcp/groups/read.py::get_file_contenttests/test_read.py::TestGetFileContent
搜索公开仓库github_mcp/groups/read.py::search_repostests/test_read.py::TestSearchRepos
公开用户 / 组织资料github_mcp/groups/read.py::get_usertests/test_read.py::TestGetUser
列出分支 / 引用上的提交github_mcp/groups/read.py::list_commitstests/test_read.py::TestListCommits
创建议题github_mcp/groups/write.py::create_issuetests/test_write.py::TestCreateIssue
在议题 / PR 上发表评论github_mcp/groups/write.py::comment_on_issuetests/test_write.py::TestCommentOnIssue
打开 / 关闭议题github_mcp/groups/write.py::update_issue_statetests/test_write.py::TestUpdateIssueState
为议题 / PR 添加标签github_mcp/groups/write.py::add_labelstests/test_write.py::TestAddLabels
针对差异中的某一行创建 PR 审查评论github_mcp/groups/write.py::create_pr_review_commenttests/test_write.py::TestCreatePrReviewComment
写入工具组默认关闭;禁用时会结构化地拒绝请求github_mcp/config.py::group_enabled、gated_writetests/test_config.py::TestGroupEnabled、tests/test_write.py::TestGateDisabledByDefault
即使启用了工具组,写入工具也需要令牌github_mcp/config.py::check_write_preconditionstests/test_config.py::TestCheckWritePreconditions、tests/test_write.py::TestAuthRequiredWhenGroupEnabled
使用细粒度 PAT 身份验证;缺少令牌时降级为未身份验证级别github_mcp/client.py::_headerstests/test_client.py::TestAuthHeaderInjection、tests/test_read.py::TestUnauthDegrade
GitHub 主要速率限制(403 + X-RateLimit-Reset)和次要速率限制(403 + Retry-After,无 X-RateLimit-Remaining)都会作为带有重置 / 重试时间的类型化错误返回,绝不会导致崩溃github_mcp/client.py::_rate_limit_error、_is_rate_limit_responsetests/test_client.py::TestRateLimitError、tests/test_client.py::TestRateLimitError::test_secondary_rate_limit_no_ratelimit_headers_retry_after_only、tests/test_read.py::TestUnauthDegrade::test_get_repo_rate_limited_without_token_is_typed
格式错误的所有者 / 仓库 / 路径(控制字符等)若会触发 httpx.InvalidURL,则会作为类型化错误返回,绝不会抛出未捕获的异常github_mcp/client.py::requesttests/test_client.py::TestNetworkError::test_malformed_path_raises_invalid_url_caught_as_network_error
通用 4xx / 5xx 错误会作为类型化错误返回,绝不会导致崩溃github_mcp/client.py::_api_errortests/test_client.py::TestApiError
非 JSON / 格式错误的响应和网络故障会作为类型化错误返回github_mcp/client.py::_handle_response、requesttests/test_client.py::TestDecodeError、TestNetworkError

局限性(依赖前请阅读)

  • 仅支持 REST v1。 不覆盖 GraphQL API。
  • 不支持 Webhook / GitHub App 身份验证。 仅支持细粒度 PAT。
  • 没有 Actions/工作流派发工具。 Issue/PR 的 CRUD 是 v1 的写入范围。
  • 未通过身份验证的读取请求受 GitHub 自身的速率限制,每小时 60 次(搜索每分钟 10 次)——持续未通过身份验证地使用时,预计会出现 rate_limited 错误;设置 GITHUB_TOKEN(即使是只读的细粒度 PAT)也能大幅提高限额。
  • get_file_content 会截断超过 100KB 的内容,并会报告而非解码非 UTF-8 文件。
  • 列表端点不支持跨页分页(limit 受各端点限制,是 v1 中唯一的页面大小控制项)。
  • 未在 mcp-factory hub 中注册。 作为独立仓库发布(使用自己的 pyproject,通过系统 Python312 安装),与 rag-mcp/desktop-mcp 模式一致。

环境变量

变量作用默认值
GITHUB_MCP_ENABLE_WRITE启用 write 工具组未设置(关闭)
GITHUB_TOKEN细粒度 PAT;不设置也可读取(但未经身份验证的速率限额较低),写入则需要此令牌未设置
GITHUB_MCP_LIVE设置为 1 以运行真实网络冒烟测试(见“测试”)未设置(跳过)

使用示例

// A tool call from the MCP host, illustrative -- not a shell command.
{"tool": "get_repo", "arguments": {"owner": "anthropics", "repo": "anthropic-sdk-python"}}
// -> {"ok": true, "full_name": "anthropics/anthropic-sdk-python", "stargazers_count": 1234, ...}

// write group disabled (default):
{"tool": "create_issue", "arguments": {"owner": "o", "repo": "r", "title": "bug"}}
// -> {"ok": false, "error": {"type": "policy_refusal", "group": "write", "required_env": "GITHUB_MCP_ENABLE_WRITE", ...}}

// write group enabled, no token set:
{"tool": "create_issue", "arguments": {"owner": "o", "repo": "r", "title": "bug"}}
// -> {"ok": false, "error": {"type": "auth_required", "tool": "create_issue", ...}}

测试

CI(.github/workflows/ci.yml)会在每次推送/PR 时运行此测试套件;如果上方的 Tests 徽章与测试套件实际报告的结果不符,就会导致构建失败——参见 scripts/check_readme_counts.py。

# unit suite (respx-mocked api.github.com, no real network touched)
python -m pytest -q

# handshake check -- prints every registered tool name
python scripts/list_tools.py

# real-network read smoke (get_repo against a stable public repo;
# no write smoke exists anywhere in this suite -- see safety rails above)
GITHUB_MCP_LIVE=1 python -m pytest -q -k live_get_repo

安装

pip install -r requirements.txt   # or: pip install .
# deps: fastmcp==3.4.2, httpx==0.28.1
# test-only: pytest==9.0.3, respx==0.23.1

设置 / 连接

  1. 在 Python 3.12+ 环境中运行 pip install -r requirements.txt。
  2. (可选)生成一个细粒度 PAT,并将其权限范围限定为你希望获得读写权限的仓库(Issues:读取/写入,Pull requests:读取/写入,Contents:读取即可满足 v1 的要求)。读取工具完全无需令牌——它们会使用 GitHub 未经身份验证的每小时 60 次请求限额。
  3. 添加到 MCP 主机配置中(例如 ~/.claude.json):
{
  "mcpServers": {
    "github-mcp": {
      "command": "C:\\Users\\<you>\\AppData\\Local\\Programs\\Python\\Python312\\python.exe",
      "args": ["C:\\Users\\<you>\\projects\\github-mcp\\run_server.py"],
      "env": {
        "GITHUB_TOKEN": "your-fine-grained-pat-here"
        // GITHUB_MCP_ENABLE_WRITE intentionally absent -- write stays off
        // until you deliberately opt in per-deployment.
      }
    }
  }
}
  1. 要为某个部署启用写入工具,请在对应条目的 env 块中添加 "GITHUB_MCP_ENABLE_WRITE": "1"。这是注册时由运营人员作出的决定,而非代码更改。

在 ~/.claude.json 中注册为 github-mcp(stdio、系统 Python312,始终启用 read 组,env 中不包含 write 组,即关闭)。

商业支持

由 Jaimen Bell 维护。如需生产环境的 MCP 集成、定制服务或 Agent 可靠性方面的工作,请参阅 jaimenbell.dev。

正在构建自己的 MCP 服务?MCP Starter Kit 提供模板、构建指南,以及发布此服务过程中积累的打包经验。

mcp-name: io.github.jaimenbell/github-mcp

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。