Github Mcp

io.github.jaimenbell由 GitHub 账号 jaimenbell 发布v0.1.1更新于 Nov 3, 2026

MCP server for the GitHub REST API: issues, PRs, repos; read always on, write env-gated.

已验证STDIO仅桌面效率与工作流开发者工具

概览

AI 生成的概览

面向 GitHub REST API 的本地 MCP 服务器,让助手读取仓库、议题、PR、文件与提交,议题/PR 写操作默认关闭。

可以做什么
  • 读取仓库元数据、搜索公开仓库、查询公开用户或组织资料
  • 列出并获取议题与拉取请求,列出某个分支或引用上的提交
  • 读取仓库文件内容,二进制文件只做识别而不解码
  • 创建议题、评论议题或 PR、开关议题、添加标签、在 PR 差异行发表评审评论(写操作组,默认关闭)
适用场景
适合在桌面 MCP 宿主中让助手查询 GitHub 仓库、议题、拉取请求和文件内容;在刻意启用写操作后,也可用于提交议题或发表评论。它是作品集性质的参考实现,并非 GitHub 官方 MCP 服务器,不追求与官方版本功能对齐。
运行要求
以本地 Python 进程运行(Python 3.12 及以上),从 PyPI 包 jaimenbell-github-mcp 安装并写入 MCP 宿主配置。读取工具无需令牌即可使用,但受 GitHub 未认证速率限制;在 GITHUB_TOKEN 中提供细粒度个人访问令牌可提高限额,写操作则必须提供。写操作还需将 GITHUB_MCP_ENABLE_WRITE 设为 1。需要能访问 GitHub REST API 的网络。
安装前请注意
写操作受门控:除非设置 GITHUB_MCP_ENABLE_WRITE 为 1 且提供 GITHUB_TOKEN,否则保持关闭;一旦启用,助手就能在真实仓库上创建议题、发表评论、关闭议题、添加标签和发布评审评论。令牌通过宿主配置的环境变量传入,应仅授予所需仓库与权限。无令牌读取每小时仅 60 次请求,可能返回速率限制错误。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Github Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

github-mcp

[PyPI] [MCP Registry] [License: MIT] [tests] [CI]

A public read+write MCP server over the GitHub REST API, built to the desktop-mcp/rag-mcp/mcp-factory standard (own pyproject, fastmcp server, honest README, real test suite) with env-gated tool groups (write disabled by default). Not the official GitHub MCP server -- see below.

Quickstart (60 seconds)

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

The write tool group (issue/PR mutations) is off by default -- see Env vars below to enable it.

What this is / is not

This is a reference portfolio implementation demonstrating a hardened read+write MCP server pattern over a real external SaaS API (GitHub) -- env-gated tool groups, typed error/rate-limit handling, auth that degrades gracefully, a real test suite. It exists to show, concretely, "I build read/write MCP servers over external APIs" with a link a client can click.

It is NOT the official GitHub MCP server. It does not aim for parity with GitHub's own MCP offering (GraphQL, Actions, webhooks, GitHub Apps are all out of scope -- see below). It started life as a factory-scaffolded read-only demo (mcp-factory's generated/github_read_server.py) and was hand-hardened into this standalone read+write server -- the scaffold-then-harden path is itself part of the story this repo tells.

Tools (14)

One row per tool -- the two groups below just control default-on/off state, not what exists.

ToolGroupWhat it does
get_reporeadRepo metadata (stars, language, license, default branch, archived flag...)
list_issuesreadList issues on a repo (PRs filtered out)
get_issuereadFetch a single issue
list_pull_requestsreadList pull requests on a repo
get_pull_requestreadFetch a single pull request
get_file_contentreadRead a repo file's content (base64-decoded, binary detected not decoded)
search_reposreadSearch public repositories
get_userreadPublic user/org profile
list_commitsreadList commits on a branch/ref
create_issuewriteOpen an issue
comment_on_issuewriteComment on an issue/PR
update_issue_statewriteOpen/close an issue
add_labelswriteAdd labels to an issue/PR
create_pr_review_commentwriteCreate a PR review comment on a diff line

read is always on and works unauthenticated (GitHub's 60 req/hr tier). write is env-gated and OFF by default -- requires GITHUB_MCP_ENABLE_WRITE=1 and GITHUB_TOKEN.

A disabled write call returns a structured policy_refusal error (never a silent no-op, never a crash). A write call with the group enabled but no token returns a structured auth_required error -- the group gate and the token precondition are checked independently, both before any network call.

Write-safety-off-by-default

This is defense-in-depth, mirroring desktop-mcp's input group: harness-level permission prompts are the first gate, but the server itself refuses every write tool unless its own environment explicitly opts in with GITHUB_MCP_ENABLE_WRITE=1, and even then refuses without a GITHUB_TOKEN. A misconfigured or overly-permissive MCP host cannot turn on GitHub mutations this process wasn't deliberately configured to allow. The registration this repo ships with (see ~/.claude.json's github-mcp entry) has the write group absent from env -- enabling it is a deliberate per-registration operator choice, not a code change.

Honest-capabilities table

Every claim below maps to the file that implements it and the test(s) that verify it -- no capability is asserted without a corresponding implementation and test.

ClaimImplementationVerified by
Repo metadata (stars, language, license, default branch, archived flag...)github_mcp/groups/read.py::get_repotests/test_read.py::TestGetRepo, live: tests/test_live_smoke.py::test_live_get_repo_real_json
List / fetch issues (PRs filtered from list)github_mcp/groups/read.py::list_issues, get_issuetests/test_read.py::TestListIssues, TestGetIssue
List / fetch pull requestsgithub_mcp/groups/read.py::list_pull_requests, get_pull_requesttests/test_read.py::TestListPullRequests, TestGetPullRequest
Read a repo file's content (base64-decoded, binary detected not decoded)github_mcp/groups/read.py::get_file_contenttests/test_read.py::TestGetFileContent
Search public repositoriesgithub_mcp/groups/read.py::search_repostests/test_read.py::TestSearchRepos
Public user/org profilegithub_mcp/groups/read.py::get_usertests/test_read.py::TestGetUser
List commits on a branch/refgithub_mcp/groups/read.py::list_commitstests/test_read.py::TestListCommits
Open an issuegithub_mcp/groups/write.py::create_issuetests/test_write.py::TestCreateIssue
Comment on an issue/PRgithub_mcp/groups/write.py::comment_on_issuetests/test_write.py::TestCommentOnIssue
Open/close an issuegithub_mcp/groups/write.py::update_issue_statetests/test_write.py::TestUpdateIssueState
Add labels to an issue/PRgithub_mcp/groups/write.py::add_labelstests/test_write.py::TestAddLabels
Create a PR review comment on a diff linegithub_mcp/groups/write.py::create_pr_review_commenttests/test_write.py::TestCreatePrReviewComment
Write group OFF by default, structured refusal when disabledgithub_mcp/config.py::group_enabled, gated_writetests/test_config.py::TestGroupEnabled, tests/test_write.py::TestGateDisabledByDefault
Write tools require a token even when the group is enabledgithub_mcp/config.py::check_write_preconditionstests/test_config.py::TestCheckWritePreconditions, tests/test_write.py::TestAuthRequiredWhenGroupEnabled
Fine-grained PAT auth, degrades to unauthenticated tier when absentgithub_mcp/client.py::_headerstests/test_client.py::TestAuthHeaderInjection, tests/test_read.py::TestUnauthDegrade
GitHub primary rate-limit (403 + X-RateLimit-Reset) and secondary rate-limit (403 + Retry-After, no X-RateLimit-Remaining) both surface as a typed error with reset/retry time, never a crashgithub_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
Malformed owner/repo/path (control chars etc.) that would raise httpx.InvalidURL surfaces as a typed error, never an uncaught exceptiongithub_mcp/client.py::requesttests/test_client.py::TestNetworkError::test_malformed_path_raises_invalid_url_caught_as_network_error
Generic 4xx/5xx surfaces as a typed error, never a crashgithub_mcp/client.py::_api_errortests/test_client.py::TestApiError
Non-JSON / malformed responses and network failures surface as typed errorsgithub_mcp/client.py::_handle_response, requesttests/test_client.py::TestDecodeError, TestNetworkError

Limitations (read before relying on this)

  • REST v1 only. No GraphQL API coverage.
  • No webhooks / GitHub App auth. Fine-grained PAT only.
  • No Actions/workflow-dispatch tools. Issue/PR CRUD is the v1 write surface.
  • Unauthenticated read is rate-limited to 60 req/hr by GitHub itself (10 req/min for search) -- expect rate_limited errors under sustained unauthenticated use; set GITHUB_TOKEN (even a read-only fine-grained PAT) to raise this considerably.
  • get_file_content truncates past 100KB and reports (rather than decodes) non-UTF-8 files.
  • No pagination beyond a single page for list endpoints (limit, capped per-endpoint, is the only page-size control in v1).
  • Not registered with the mcp-factory hub. Ships as a standalone repo (own pyproject, system Python312 install), matching the rag-mcp/desktop-mcp model.

Env vars

VarEffectDefault
GITHUB_MCP_ENABLE_WRITEenable the write tool groupunset (off)
GITHUB_TOKENfine-grained PAT; read works without it (degraded unauth rate), write requires itunset
GITHUB_MCP_LIVE1 to run the real-network smoke test (see Testing)unset (skip)

Usage examples

jsonc
// 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", ...}}

Testing

CI (.github/workflows/ci.yml) runs this suite on every push/PR and fails the build if the Tests badge above drifts from what the suite actually reports -- see 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 namepython 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

Install

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

Setup / connect

  1. pip install -r requirements.txt on Python 3.12+.
  2. (Optional) generate a fine-grained PAT scoped to the repos you want read+write access to (Issues: read/write, Pull requests: read/write, Contents: read is enough for v1). Read tools work with no token at all -- they just run at GitHub's unauthenticated 60 req/hr tier.
  3. Add to your MCP host config (e.g. ~/.claude.json):
jsonc
{  "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. To enable write tools for a given deployment, add "GITHUB_MCP_ENABLE_WRITE": "1" to that entry's env block. This is a registration-time operator decision, not a code change.

Registered in ~/.claude.json as github-mcp (stdio, system Python312, read group always on, write group absent from env -- off).

Commercial support

Maintained by Jaimen Bell. For production MCP integrations, custom servers, or agent-reliability work, see jaimenbell.dev.

Building your own MCP server? The MCP Starter Kit has templates, a build playbook, and packaging war-stories from shipping this one.

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

来源:README.md,提交 14758b7

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.1最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分