github-mcp-gateway
github-mcp-gateway
Удалённый MCP-сервер, который даёт любому MCP-клиенту аутентифицированный доступ к GitHub — репозиториям, issue, pull request, содержимому файлов и поиску — через настоящий OAuth 2.1 на Cloudflare Workers.
Работает с Claude Code, Claude.ai / Cowork и любым MCP-клиентом, соответствующим спецификации. Аутентификация — это user-to-server поток от GitHub App: сервер может достать только те репозитории, которые вы сами выбрали на экране установки GitHub, а не всё, что видно из вашего аккаунта.
Это исходный код, который вы запускаете, а не сервис, на который вы подписываетесь. Общего экземпляра нет. Вы разворачиваете собственный Worker под собственный GitHub App, и ваши учётные данные никогда не покидают ваш аккаунт — см. Ограничения дизайна (осознанные). Настройка — один скрипт и около десяти минут:
git clone https://github.com/mazze93/github-mcp-gateway cd github-mcp-gateway && ./scripts/setup.sh <your-github-login>
Что вы получаете
21 инструмент | репозитории (6), задачи/issue (5), pull request (5), содержимое файлов (3), код и поиск задач (2) — каждый список инструментов с пагинацией |
Настоящий OAuth 2.1 | PKCE, Dynamic Client Registration и Client ID Metadata Documents, на базе собственного |
Самопродлевающиеся токены | 8-часовые GitHub-токены прозрачно обновляются против 6-месячного refresh-токена; MCP-клиент никогда не видит ни одного из них |
Защищённый релиз | multi-arch toolchain image, non-root и distroless, подписанный keyless с cosign, опубликованный с SBOM и SLSA происхождением |
Протестировано против реального рантайма | 66 тестов на |
Related MCP server: Cloudflare GitHub OAuth MCP Server
Зачем это существует и какова его форма
MCP-клиент не может общаться с GitHub API напрямую с вашими учётными данными — ему нужно что-то посередине, что (а) доказывает, кто спрашивает, (б) держит настоящий GitHub-токен, (в) превращает вызовы инструментов в GitHub API-запросы. Этот Worker и есть средний слой, и он играет две роли OAuth одновременно:
OAuth-клиент для GitHub (выше по потоку) — он проводит вас через собственный консенсус GitHub и обменивает полученный код на токен.
OAuth-сервер для MCP-клиента (ниже по потоку) — клиент никогда не видит ваш GitHub GitHub-токен. Он получает свой собственный токен от этого Worker, ограниченный только этим Worker. Собственная библиотека Cloudflare
@cloudflare/workers-oauth-providerреализует этот нижний поток: OAuth 2.1, PKCE и Dynamic Client Registration (DCR) — именно DCR позволяет клиенту зарегистрировать себя при первом подключении без необходимости вручную создавать учётные данные для него.
MCP client ──OAuth (DCR, PKCE)──▶ this Worker ──OAuth (GitHub App)──▶ GitHub
│
▼
Workers KV (OAUTH_KV)
state · refresh tokens · approved clientsПочему GitHub App вместо классического OAuth App
Собственный шаблон Cloudflare использует классическое OAuth App, что проще, но URL — all-or-nothing repo scope и токен, который никогда не истекает, если вы сами не запрограммируете истечение. Эта сборка использует GitHub App с user-to-server token flow вместо:
Ограничение на уровне репозитория при установке — вы выбираете точно, какие репозитории этот сервер может трогать (собственная выборка установки GitHub), а не «всё, что видит этот аккаунт».
Токены, которые реально истекают и сами обновляются — когда включён «Expire user authorization tokens», GitHub возвращает 8-часовой access-токен плюс 6-месячный refresh-токен, и использование refresh-токена чеканит новую пару. Пока вы пользуетесь этим сервером хотя бы раз в 6 месяцев, он никогда не устареет, и вам не придётся вручную чеканить новый токен.
Цикл обработки показан из-за обработки жизненный цикл токена, ниже.
1. Создайте GitHub App
Перейдите на github.com/settings/apps/new (личный аккаунт) или github.com/organizations/<org>/settings/apps/new (владение принадлежит org — используйте, если хотите его под org, а не под личным аккаунтом).
Поле | Значение |
GitHub App name |
|
Homepage URL |
|
Callback URL |
|
Webhook | Снимите галочку «Active» — этот сервер не использует webhook'и |
Repository permissions → Contents | Чтение и запись |
Repository permissions → Issues | Чтение и запись |
Repository permissions → Pull requests | Чтение и запись |
Repository permissions → Metadata | Чтение (обязательно, авто-выбрано) |
Где может быть установлен GitHub App? | Только в этом аккаунте |
После создания:
Указывайте на Client ID в верхней части страницы настроек приложения.
Нажмите Generate a new client secret — скопируйте сейчас, он показывается только один раз.
В разделе Optional features найдите User-to-server token expiration и нажмите Opt-in. Это то, что вообще создаёт refresh-токены, — пропустите, и сервер упадёт на шаге callback с явной ошибкой, которая говорит вам вернуться и сделать это.
Перейдите в Install App (левый сайдбар) и установите в ваш аккаунт, выбрав Only select repositories — выберите репозитории, к которым этому серверу быть допущенным (позже можно добрать с того же экрана).
Вам понадобится второй GitHub App, настроенный идентично, но с callback URL http://localhost:8788/callback, если вы хотите итерировать локально с wrangler dev перед деплоем.
2. Создайте пространство имён KV
Самый быстрый путь — ./scripts/setup.sh <ваш-github-login> устанавливает зависимости, создаёт пространство имён и переписывает wrangler.jsonc с вашим space id и вашим login. Затем переходите к шагу 3.
Вручную:
cd github-mcp-gateway
npm ci
npx wrangler kv namespace create OAUTH_KVСкопируйте возвращённый id в wrangler.jsonc под kv_namespaces[0].id, заменив закоммиченное значение. Это значение — живое пространство сопровождающего, а не плейсхолдер, — репозиторий является живым деплоем, а также шаблоном, поэтому проверенный конфиг является реальным. Это идентификатор, а не учётная запись: он не даёт форку ничего, но оставить его на месте означает, что ваш Worker запускается против пространства, которое ваш аккаунт не может достать.
3. Установите секреты и var allowlist
npx wrangler secret put GITHUB_APP_CLIENT_ID
npx wrangler secret put GITHUB_APP_CLIENT_SECRET
openssl rand -hex 32 | npx wrangler secret put COOKIE_ENCRYPTION_KEYALLOWED_GITHUB_LOGINS — это var, а не секрет — добавьте его в wrangler.json под верхнеуровневый блок "vars":
GXP5 Это allowlist на усмотрение, проверяемый на этапе OAuth-коллбэка: даже если только вы можете пройти GitHub consent экран только для вашего собственного аккаунта это делает гейт кода код-эксплицитным, а не неявным на «кто может аутентифицироваться». Незаданное или пустое значение отрицает всех — он проваливается закрытым, поэтому пропущенный шаг блокирует вас, а не открывает сервер.
4. Деплой
npx wrangler deploy5. Подключите клиент
Укажите любой MCP-клиент на:
https://github-mcp-gateway.<your-subdomain>.workers.dev/mcpClaude Code:
claude mcp add --transport http github-mcp-gateway <url>Claude.ai / Cowork: добавьте свой MCP-коннектор с этим URL.
Клиент регистрирует себя через DCR, перенаправляет вас через этот сервер, затем GitHub, и возвращается с инструментами.
Локальная разработка
cp .dev.vars.example .dev.vars # fill in the *local* GitHub App's credentials
npx wrangler devwrangler dev служит на http://localhost:8788 — укажите MCP-клиент (например, MCP Inspector) на http://localhost:8788/mcp.
Жизненный цикл токена
Существует два независимых токен отношения, на разных тактовых частотах:
Cowork ↔ этот Worker. Стандартные OAuth 2.1 access/refresh-токены, выпущенные
workers-oauth-provider. Иом обновляет их автоматически, по спецификации MCP — здесь нечего менеджерить.Этот Worker ↔ GitHub. 8-часовой access-токен + 6-месячный refresh-токен.
src/github-client.tsпроверяет истечение срока действия перед каждым вызовом GitHub API и прозрачно обновляет, когда он становится в пределах 5 минут, сохраняя повернутую пару вOAUTH_KVподgithub:tokens:{ваш-логин}. Это намеренно не подключено кworkers-oauth-provider's точкеtokenExchangeCallback— у этого механизма есть открытый upstream-баг (пропсы, устаревающие после обновления, вызывали повторные циклы аутентификации; см. Ссылки) — поэтому вместо этого обрабатывается напрямую в слое инструментов, где это проще рассуждать и тестировать.
Если GitHub refresh-токен сам по себе истекает (не используется 6+ месяцев) или вы отзываете доступ приложения, следующий вызов инструмента падает с чётким сообщением ReauthorizationRequiredError, инструктируя вас отключиться и заново подключиться в Cowork. Здесь нет тихого режима отказа — он либо работает тихо в фоне вовремя, либо говорит вам точно, что делать.
Инструменты
Модуль | Инструменты |
|
|
|
|
|
|
|
|
|
|
Все инструменты списка принимают per_page и page для пагинации.
github_merge_pull_request и github_delete_file — две деструктивные операции: необратимые как только вызываются. Клиент должен подтвердить с вами перед вызовом.
github_update_repo (description, homepage, topics) требует, чтобы у GitHub App было разрешение репозитория Administration. В текущей конфигурации приложения (Contents/Issues/PRs/Metadata) его нет — добавьте разрешение в настройках приложения и полтавно заново согласие на установку, чтобы активировать инструмент, либо вносите такие изменения через CLI gh.
Проектные ограничения (осознанные)
Прочитайте это перед внедрением — это выбор, а не пробелы в качестве.
Один оператор на одно развёртывание
Этот сервер однотенантный по построению. ALLOWED_GITHUB_LOGINS ограничивает callback OAuth; и хотя переменная принимает список через запятую, а хранилище токенов уже разбито по логинам (github:tokens:{login}), целевая форма — одно развёртывание на человека.
Это следствие модели угроз. Общее развёртывание означало бы, что в KV-пространстве имён одного оператора лежат чужие refresh-токены GitHub — шестимесячные права с доступом на запись в репозитории. Это делает оператора хранителем учётных данных с обязательством уведомления об утечках, на инфраструктуре без таких гарантий. Самостоятельный хостинг оставляет каждую учётную запись в аккаунте, которому принадлежит аккаунт, — в этом весь смысл дизайна.
Итак: сделайте форк и запускайте собственный экземпляр. Именно для этого существует ./scripts/setup.sh. Настройка занимает примерно десять минут, а бесплатного тарифа Cloudflare достаточно для личного использования.
Область репозитория определяется при установке, а не этим сервером
По поскольку это GitHub App, и "классическое OAuth-приложение", доступность репозитории — те, которые вы выбирайте на экране установления GitHub. Этот сервер не может их расширить", и ни один вызов инструмента не может выйти за его пределы. Чтобы изменить область, измените установку.
github_update_repo требует разрешение, которое не входит в комплект приложения
Ему нужны разрешения репозитория Administration. Добавьте его в настройках приложения и повторно одобрите установку, либо используйте gh CLI для изменения описания и тем.
Это не размещённый сервис
Публичного экземпляра, на который можно указать клиенту, не существ. Любой URL workers.dev, который вы найдете в этом репозитории (в deploy.yml, SECURITY.md или в заголовке Dockerfile), — это собственный деплой мейнтейнера, и его список разрешённых вас отклонит. Это исходный код, который вы запускаете сами, и не сервис, под который вы регистрируетесь.
Заметки по безопасности и известные upstream-проблемы, учтённые в этой сборке
CSRF, повторное использование state, фиксация сессии — обрабатывается в
src/oauth/workers-oauth-utils.tsс помощью пары CSR-токен + cookie на форме подтверждения, одноразового KV-флаг, создаваемого в KV (время жизни 10 минут), и cookie сессии (SHA-256-хеш state-токена), подтверждающего, что браузер, завершающий callback GitHub, — это тот же, который начал процедуру.workers-oauth-providerIssue #133 — ошибка обработки пути при валидации аудитории в каких-то версиях вызывала ошибки именно для подключений Claude.ai и Cocoon. Эта сборка не добавляет компоненты пути в какой-либо индикатор ресурса (/mcpи/sseрегистрируются в корнеapiHandlers, а не вложенными в более длинный путь) — это докуменен. Если первая попытка подключения Cowork падает на этапе обмена токенами, сначала это очевидно всходе: смотрите upstream.Issue #108 (проверка аудитории RFC 8707 с путями) — та же первопричина, что и выше; то же обходное решение.
Issue #29 (несовпадение redirect URI в проде) — есть сообщения, что для некоторых клиентов динамически зарегистрированные redirect URIs в проде ведут себя иначе, чем в
wrangler dev. Если редирект Cowork не работает только после деплоя — а локально работает, искать следует именно это.Префикс cookie
__Host-по всему проекту — гарантире имм (браузер enforced), что cookie может быть установлена только этим конкретным origin по HTTPS, без атрибутаDomain, способного расширить область её действия.
Ссылки
Cloudflare Agents — Build a Remote MCP Server
cloudflare/workers-oauth-provider— использование низьоуровневой низкоуровневой реализации OAuth 2.1, от которой это зависитGitHub Docs — Refreshing user access tokens
workers-oauth-providerIssue #133 (сбои подключения Claude.ai) и Issue #108 (баг пути аудитории RFC 8707)
This server cannot be installed
Maintenance
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Cloudflare Workers-deployed MCP server that provides secure remote access to MCP tools through GitHub OAuth authentication. Includes example tools for basic math operations, user info retrieval, and image generation with configurable user access controls.241Apache 2.0
- FlicenseNot gradedqualityDmaintenanceA reference MCP server for Cloudflare Workers that provides remote connection support with integrated GitHub OAuth authentication. It enables developers to build and deploy authenticated remote tools with user-specific access controls and persistent state management.
- FlicenseNot gradedqualityCmaintenanceA remote MCP server for Cloudflare Workers featuring built-in GitHub OAuth for secure user authentication and identity-based access control to tools. It provides a reference implementation for managing remote MCP connections with persistent state and OAuth provider integration.1
- AlicenseNot gradedqualityBmaintenanceEnables remote MCP connections with GitHub OAuth authentication, providing tools like add, userInfoOctokit, and image generation (restricted) deployed on Cloudflare Workers.11MIT
Related MCP Connectors
An MCP server that gives your AI access to the source code and docs of all public github repos
Hosted remote MCP server for YNAB on Cloudflare Workers with OAuth
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mazze93/github-mcp-gateway'
If you have feedback or need assistance with the MCP directory API, please join our Discord server