Przejdź do głównej zawartości

Serwer GitHub MCP: zdalnie, lokalnie, toolsety i tryb lockdown

Serwer GitHub MCP to oficjalny serwer Model Context Protocol od GitHuba. Pozwala Claude Code, Codex i Cursorowi czytać i zmieniać pull requesty, zgłoszenia (issues), logi GitHub Actions i alerty bezpieczeństwa. Hostowany endpoint https://api.githubcopilot.com/mcp/ działa z tokenem PAT. Liczy się zakres: tylko toolsety (zestawy narzędzi) potrzebne do zadania i tryb lockdown w repozytoriach publicznych.

PR #412 świeci na czerwono od lunchu. Padający job to 4000 linii logu, recenzent zostawił sześć komentarzy, a ty wolałbyś oddać całą pętlę agentowi, zamiast wklejać logi do czatu. Agent to zrobi, ale tylko wtedy, gdy przeczyta logi Actions i wątki review, i tylko wtedy, gdy ufasz temu, co wolno mu wypchnąć i zmergować.

Ten artykuł jest dla programistów, którzy podpinają serwer do własnego agenta, i dla tech leadów, którzy ustalają wspólną konfigurację: jaki token, jakie toolsety i których narzędzi agent nie wywoła nigdy.

  • Przetestowaną instalację w Claude Code, Codex i Cursorze, która trzyma token poza repozytorium.
  • Tabelę uprawnień PAT, która daje każdemu przepływowi tylko te uprawnienia, których używa.
  • Ustawienia toolsetów, wykluczeń i trybu lockdown, które odsłaniają tylko to, czego potrzebuje zadanie, i filtrują treści od obcych.
  • Prompty, które zamieniają czerwony pull request w wypchniętą poprawkę i odpowiadają na wątki review, bez merge’a.
  • Odpowiedniki dla GitLaba, dla zespołów, które tam trzymają kod.

Wszyscy trzej agenci uruchamiają polecenia w powłoce, więc gh i lokalny git są dostępne bez żadnego serwera MCP. Serwer GitHub MCP opłaca się wtedy, gdy agent potrzebuje typowanego, stronicowanego dostępu do stanu GitHuba albo działa tam, gdzie nie ma powłoki. Wiele zespołów używa obu.

ZadanieNajlepsza drogaDlaczego
Commit, gałąź, rebase, diff w katalogu roboczymLokalny git przez powłokę agentaNajszybciej, bez wywołań API i bez tokena
Przeczytanie jednego padającego logu CIgh run view RUN_ID --log-failed albo get_job_logs z failed_only i tail_linesgh kosztuje mniej tokenów; narzędzie MCP samo przycina log
Przeczytanie wątków review i odpowiedź w każdymGitHub MCP (pull_request_read z metodą get_review_comments, add_reply_to_pull_request_comment, pull_request_review_write z metodą resolve_thread)Identyfikatory wątków i odpowiedzi trudno oskryptować przez gh
Triaż 50 zgłoszeń do tabeliGitHub MCP (search_issues, issue_read)Ustrukturyzowane wyniki, stronicowanie po stronie serwera
Agent bez powłoki (desktopowy klient czatu, agent hostowany)GitHub MCPJedyna droga
Ustrukturyzowana historia gita w kliencie, który nie uruchomi gitReferencyjny serwer Git, uvx mcp-server-git --repository . (tylko PyPI)Zobacz referencyjne serwery MCP

gh i serwer MCP korzystające z tego samego tokena zużywają ten sam budżet: podstawowy limit dla uwierzytelnionych użytkowników wynosi 5000 żądań na godzinę na github.com.

Zdalnie czy lokalnie: który serwer GitHub MCP uruchomić?

Dział zatytułowany „Zdalnie czy lokalnie: który serwer GitHub MCP uruchomić?”

GitHub publikuje jeden kod w dwóch postaciach. Serwer zdalny to domyślny wybór; lokalny jest dla GitHub Enterprise Server, maszyn bez dostępu do sieci zewnętrznej i zespołów, które chcą OAuth bez tokena PAT.

Zdalny (https://api.githubcopilot.com/mcp/)Lokalny (obraz Docker ghcr.io/github/github-mcp-server lub binarka z releases)
Uwierzytelnianie w Claude Code, Codex, CursorzePAT w nagłówku Authorization: Bearer, zgodnie z przewodnikami GitHuba. OAuth działa tylko w hostach, które zarejestrowały GitHub App lub OAuth AppLogowanie OAuth w przeglądarce wbudowane w oficjalny obraz, bez tokena; token tylko w pamięci. PAT w GITHUB_PERSONAL_ACCESS_TOKEN ma pierwszeństwo. Tylko github.com; GitHub Enterprise Server i ghe.com wymagają własnej aplikacji OAuth lub GitHub App albo tokena PAT
Zawężanie toolsetówŚcieżka /mcp/x/TOOLSET i /readonly albo nagłówki X-MCP-Toolsets, X-MCP-Tools, X-MCP-Exclude-Tools, X-MCP-ReadonlyFlagi --toolsets, --tools, --exclude-tools, --read-only lub GITHUB_TOOLSETS, GITHUB_TOOLS, GITHUB_EXCLUDE_TOOLS, GITHUB_READ_ONLY
Tryb lockdownNagłówek X-MCP-Lockdown: true--lockdown-mode lub GITHUB_LOCKDOWN_MODE=1
GitHub EnterpriseEnterprise Cloud z rezydencją danych pod https://copilot-api.SUBDOMAIN.ghe.com/mcp; nie Enterprise ServerOba, przez --gh-host lub GITHUB_HOST (wymuszony HTTPS)
Dodatkowe narzędziacreate_pull_request_with_copilot, Copilot Spaces, github_support_docs_searchNiedostępne
WymagaNiczego nie instalujeszDziałającego Dockera albo binarki w PATH

Zainstaluj serwer GitHub MCP w Claude Code, Codex i Cursorze

Dział zatytułowany „Zainstaluj serwer GitHub MCP w Claude Code, Codex i Cursorze”

Serwer zdalny działa tak samo u wszystkich trzech agentów: jeden adres URL i token typu bearer. Różni się tylko składnia konfiguracji.

  1. Utwórz fine-grained personal access token w Settings > Developer settings > Personal access tokens, ograniczony do repozytoriów, na których pracuje agent. Uprawnienia wybierz z tabeli w następnej sekcji.

  2. Wyeksportuj go w profilu powłoki, a nie w pliku wewnątrz repozytorium:

    Okno terminala
    # ~/.zshrc lub ~/.bashrc
    export GITHUB_PAT="github_pat_..."
  3. Zarejestruj serwer w agencie:

    Okno terminala
    # Terminal. Zakres project zapisuje .mcp.json; pojedyncze cudzysłowy zostawiają ${GITHUB_PAT}
    # nierozwinięte, więc zespół współdzieli plik, a każdy podaje własny token.
    claude mcp add -s project --transport http github https://api.githubcopilot.com/mcp/ \
    -H 'Authorization: Bearer ${GITHUB_PAT}'

    Przetestowane na 2.1.283: wynikowy .mcp.json zawiera "Authorization": "Bearer ${GITHUB_PAT}", a Claude Code rozwija zmienną przy łączeniu. Bez -s project wpis trafia do domyślnego zakresu local i zostaje tylko u ciebie.

  4. Sprawdź połączenie. W Claude Code uruchom claude mcp get github (wykonuje health check) albo /mcp w sesji. W Codex uruchom /mcp w TUI. W Cursorze otwórz sekcję MCP w ustawieniach i sprawdź, czy github pokazuje narzędzia. Potem zapytaj agenta: Call get_me and tell me which GitHub user you are authenticated as.

Wtyczka dostarcza ten sam serwer zdalny bez pisania JSON-a. Każda wtyczka oczekuje innej nazwy zmiennej i to najczęstszy powód, dla którego po instalacji nie widać żadnych narzędzi.

AgentPolecenieZmienna z tokenem
Claude Codeclaude plugin install github@claude-plugins-officialGITHUB_PERSONAL_ACCESS_TOKEN (dokładnie ta nazwa)
Codexcodex plugin add github@openai-curatedGITHUB_PAT_TOKEN
Cursor/add-plugin githubNieudokumentowana w naszych źródłach; sprawdź mcp.json wtyczki

Wtyczka dla Codex jest na liście kuratorowanego marketplace’u OpenAI, ale 2026-09-26 nie przetestowano pełnej instalacji w zalogowanym Codex; jeśli się nie uda, użyj polecenia codex mcp add z kroku 3.

Żeby w ogóle pominąć PAT, uruchom serwer lokalnie. Oficjalny obraz zawiera dane aplikacji OAuth GitHuba, przy pierwszym użyciu otwiera logowanie w przeglądarce i potrzebuje stałego portu callbacku wystawionego na loopback:

Okno terminala
# Claude Code, terminal (polecenie z dokumentacji GitHuba)
claude mcp add github -e GITHUB_OAUTH_CALLBACK_PORT=8085 -- docker run -i --rm \
-p 127.0.0.1:8085:8085 -e GITHUB_OAUTH_CALLBACK_PORT ghcr.io/github/github-mcp-server

W Codex i Cursorze podajesz te same argumenty docker run jako command/args, z GITHUB_OAUTH_CALLBACK_PORT = "8085" w env. Bez wystawionego portu serwer przechodzi na device-code flow GitHuba i wypisuje kod do wpisania na github.com/login/device.

Copilot CLI ma serwer GitHub MCP preinstalowany jako github-mcp-server, z domyślnie włączonymi narzędziami tylko do odczytu. Sprawdzisz go przez /mcp show github-mcp-server, poszerzysz na sesję przez copilot --add-github-mcp-toolset actions, a wyłączysz przez copilot --disable-builtin-mcps. Artykuł o GitHub Copilot opisuje cloud agenta, którego serwer GitHuba używa tokena tylko do odczytu, ograniczonego do bieżącego repozytorium.

Serwer zrobi tyle, na ile pozwala token, i nic więcej, więc to token jest twoją prawdziwą granicą uprawnień. Nadawaj je według zadania:

ZadanieScope klasycznego PATUprawnienie fine-grained PAT (tylko wybrane repozytoria)
Odczyt kodu, zgłoszeń, PR-ów, logów CIrepoContents, Issues, Pull requests, Actions: read
Komentarze, otwieranie PR-ów, wypychanie plikówrepoContents, Issues, Pull requests: read and write
Zmiana pliku w .github/workflows/repo + workflowWorkflows: read and write
Zespoły i członkowie organizacjiread:orgMembers (uprawnienie organizacji): read
Gisty, powiadomienia, klasyczne projektygist, notifications, projectodpowiednie uprawnienie

Zanim zaczniesz szukać brakującego narzędzia, pamiętaj o dwóch zachowaniach:

  • Klasyczny PAT filtruje narzędzia przy starcie. Serwer odczytuje scope’y tokena z nagłówka X-OAuth-Scopes i ukrywa narzędzia, które wymagają scope’u, którego nie nadałeś. Token z samym repo nie pokaże narzędzi do gistów ani powiadomień. Scope’y tokena sprawdzisz poleceniem curl -sI -H "Authorization: Bearer $GITHUB_PAT" https://api.github.com/user | grep -i x-oauth-scopes.
  • Fine-grained PAT pokazuje wszystkie narzędzia. API egzekwuje uprawnienia przy wywołaniu, więc agent widzi narzędzie, wywołuje je i dostaje 403. To oczekiwane zachowanie; listę narzędzi zawężaj toolsetami.

Ogranicz serwer GitHub MCP do toolsetów potrzebnych w zadaniu

Dział zatytułowany „Ogranicz serwer GitHub MCP do toolsetów potrzebnych w zadaniu”

Bez konfiguracji serwer ładuje domyślne toolsety: context, repos, issues, pull_requests i users. Naprawa CI potrzebuje jeszcze actions; triaż nie potrzebuje niczego, co zapisuje. Mniej narzędzi to lepszy wybór narzędzia przez model i mniej miejsca na pomyłkę.

Na serwerze zdalnym masz dwie dźwignie:

  • Ścieżka URL, jeden toolset na adres: https://api.githubcopilot.com/mcp/x/actions, a na końcu dowolnego z nich /readonly (https://api.githubcopilot.com/mcp/x/actions/readonly, https://api.githubcopilot.com/mcp/readonly).
  • Nagłówki, do łączenia: X-MCP-Toolsets: repos,issues,pull_requests,actions, X-MCP-Tools dla pojedynczych narzędzi, X-MCP-Readonly: true.

Ścieżka przyjmuje tylko jeden toolset, więc konfiguracja do naprawy CI, która łączy kilka, używa nagłówka:

Okno terminala
claude mcp add -s project --transport http github https://api.githubcopilot.com/mcp/ \
-H 'Authorization: Bearer ${GITHUB_PAT}' \
-H "X-MCP-Toolsets: context,repos,issues,pull_requests,actions" \
-H "X-MCP-Lockdown: true"

Na serwerze lokalnym to samo zawężenie daje --toolsets context,repos,issues,pull_requests,actions (lub GITHUB_TOOLSETS), plus --read-only. Tryb tylko do odczytu wygrywa z jawną listą --tools: narzędzie zapisujące, które wymienisz, i tak zostanie pominięte.

Tool search jest domyślnie włączony w Claude Code i Codex, więc schematy ładują się na żądanie. claude plugin details github pokazuje stały koszt bliski zera tokenów, ale to polecenie nie liczy schematów narzędzi MCP (sprawdzone na 2.1.283), więc mierz przez /context. Boli dopiero wynik narzędzia: pełny log Actions albo lista 30 zgłoszeń ląduje w oknie kontekstu. Uruchom /context w Claude Code przed naprawą CI i po niej, żeby to zobaczyć, i każ agentowi wywoływać get_job_logs z failed_only: true i ustawionym tail_lines, tak jak w promptcie poniżej. Więcej o przycinaniu wyników przeczytasz w artykule o obniżaniu kosztu tokenów MCP.

Agent, który czyta zgłoszenia i komentarze w publicznym repozytorium, czyta tekst pisany przez obcych, a ten tekst może zawierać instrukcje. Tryb lockdown to filtr GitHuba na tę sytuację: w repozytoriach publicznych serwer sprawdza, czy autor każdego elementu ma uprawnienie push, i ukrywa treści od osób, które go nie mają. Repozytoriów prywatnych to nie dotyczy.

Co agent widzi w trybie lockdown:

  • issue_read (get) i pull_request_read (get, get_diff, get_files, get_commits) zwracają błąd, gdy autor nie ma uprawnienia push.
  • Komentarze, pod-zgłoszenia, komentarze review i same review są filtrowane: elementy od osób bez uprawnienia push znikają.
  • Treści od github-actions[bot] i copilot zawsze przechodzą, więc wyniki CI pozostają widoczne.

Włączasz go przez --lockdown-mode lub GITHUB_LOCKDOWN_MODE=1 lokalnie albo nagłówek X-MCP-Lockdown: true na serwerze zdalnym. W trybie HTTP flaga operatora jest górną granicą: nagłówek może lockdown włączyć, ale nie wyłączyć.

Napraw czerwony pull request na podstawie logu Actions

Dział zatytułowany „Napraw czerwony pull request na podstawie logu Actions”

To pełny przykład użycia. Działa tak samo w Claude Code, Codex i Cursorze, gdy serwer ma toolset actions, a lokalny checkout jest na gałęzi PR-a.

Co powinieneś zobaczyć (nazwy narzędzi zaobserwowane na działającym serwerze zdalnym 2026-09-26):

  • actions_list zwraca przebiegi gałęzi, a agent wybiera najnowszy z conclusion: failure.
  • get_job_logs zwraca kilkaset linii każdego padającego joba zamiast tysięcy.
  • Po pushu na PR-ze startuje nowy przebieg, a agent raportuje dowody i się zatrzymuje.

Agent czyta GitHuba przez MCP, ale zmienia kod w lokalnym checkoucie, więc każda zmiana jest widoczna w git diff i przechodzi przez lokalne hooki, zamiast pojawić się jako zdalny commit z push_files.

Pojedyncza naprawa CI to jeden krok dłuższej pętli. Tu serwer prowadzi zgłoszenie aż do zmergowanego pull requesta, a człowiek stoi przy jedynej bramce, która ma znaczenie.

  1. Triaż. Agent czyta otwarte zgłoszenia przez search_issues i issue_read i proponuje etykiety oraz priorytet. Przy toolsecie issues w trybie tylko do odczytu nie może jeszcze niczego zmienić.

  2. Gałąź i implementacja. Wybierasz zgłoszenie. Agent tworzy lokalną gałąź, pisze zmianę i testy, a potem otwiera pull request przez create_pull_request z odnośnikiem do zgłoszenia.

  3. Naprawa na podstawie logu CI. Gdy checki padają, agent wykonuje prompt z poprzedniej sekcji: czyta log, odtwarza błąd, poprawia, wypycha. Powtarza, aż wymagane checki przejdą.

  4. Komentarze review. Recenzenci, ludzie albo boty AI do code review, zostawiają komentarze. Agent czyta je przez pull_request_read z metodą get_review_comments, która zwraca też threadId każdego wątku, odpowiada w każdym wątku przez add_reply_to_pull_request_comment, wypycha poprawki i oznacza wątek jako rozwiązany przez pull_request_review_write z metodą resolve_thread dopiero wtedy, gdy zmiana jest w gałęzi.

  5. Merge. Człowiek zatwierdza i merguje, gdy spełnione są reguły ochrony gałęzi. Agent nigdy nie wywołuje merge_pull_request (zabezpieczenie opisano niżej).

Token zmerguje wszystko, co może zmergować jego właściciel, więc usuń to narzędzie także po stronie klienta:

W .claude/settings.json. Reguła deny na samą nazwę narzędzia usuwa je z kontekstu modelu:

{
"permissions": {
"deny": ["mcp__github__merge_pull_request", "mcp__github__delete_file"]
}
}

Nagłówek X-MCP-Exclude-Tools działa w każdym kliencie, który wysyła własne nagłówki, a serwer lokalny przyjmuje tę samą listę jako --exclude-tools lub GITHUB_EXCLUDE_TOOLS. Traktuj go jako uzupełnienie po stronie serwera dla reguły deny w Claude Code i listy disabled_tools w Codex: narzędzie znika, zanim zobaczy je jakikolwiek klient.

Ostatnią linią obrony jest ochrona gałęzi z wymaganymi status checkami i wymaganym zatwierdzającym review: nawet źle skonfigurowany agent jej nie obejdzie.

Nie czytasz każdej linii, którą agent wypycha. Sprawdzasz, czy są dowody, a resztę egzekwuje repozytorium.

  • Odtwórz przed poprawką, zalicz po poprawce. Prompt zmusza agenta, żeby pokazał padające polecenie, a potem to samo polecenie przechodzące. Poprawka bez odtworzenia błędu wraca do agenta.
  • Wymagane checki są wyrocznią. Ochrona gałęzi oznacza joby CI jako wymagane, więc „zielony” znaczy, że ten sam zestaw testów, który złapał błąd, teraz przechodzi. Obserwujesz to przez gh pr checks 412 --watch.
  • Jeden recenzent podpisuje zmianę. Człowiek zatwierdza pull request, najpierw czytając raport agenta i diff testów; co sprawdzać, opisuje artykuł o przeglądzie pull requestów od agenta.
  • Każda akcja zostawia ślad. Komentarze, odpowiedzi i pushe pojawiają się na pull requeście pod użytkownikiem tokena. Do przebiegów automatycznych użyj tokena osobnego konta technicznego, żeby w historii odróżnić działania agenta od twoich.
  • Wycofanie to revert. Agent pracuje zwykłymi commitami na gałęzi, więc git revert cofa każdą jego zmianę.

Zespoły na GitLabie mają dwie opcje. Własny serwer GitLaba działa zdalnie pod https://gitlab.com/api/v4/mcp (lub https://YOUR_GITLAB/api/v4/mcp dla instancji self-managed). Według źródeł wtórnych (wyciągów z wyszukiwarki z dokumentacji GitLaba, której nie dało się pobrać 2026-09-26) to funkcja GitLab Duo w wersji beta dla planów Premium i Ultimate. Dla pozostałych planów jest społecznościowy zereight/gitlab-mcp (2 tys. gwiazdek, npm @zereight/mcp-gitlab 2.1.66 na 2026-09-26), uruchamiany lokalnie z tokenem PAT.

Okno terminala
# Oficjalny, zdalny z OAuth (tego adresu używa wtyczka gitlab w claude-plugins-official)
claude mcp add --transport http gitlab https://gitlab.com/api/v4/mcp
# Społecznościowy, lokalny z PAT wyeksportowanym jako GITLAB_PAT w profilu powłoki.
# Narzędzia do pipeline'ów są opcjonalne: GITLAB_TOOLSETS=pipelines (starsza forma: USE_PIPELINE=true)
claude mcp add -s project gitlab -e 'GITLAB_PERSONAL_ACCESS_TOKEN=${GITLAB_PAT}' \
-e GITLAB_API_URL=https://gitlab.com/api/v4 -e GITLAB_TOOLSETS=pipelines \
-- npx -y @zereight/mcp-gitlab

Przetestowane na 2.1.283: apostrofy zostawiają odwołanie nierozwinięte, a .mcp.json zawiera "${GITLAB_PAT}", nie token.

GITLAB_API_URL musi wskazywać korzeń API (/api/v4), a nie adres strony. Dla agenta tylko do odczytu ustaw GITLAB_PERMISSION_MODE=readonly; modify pozwala tworzyć i aktualizować, ale bez narzędzi do usuwania. Scope’y tokena GitLaba dobierasz według tej samej zasady co na GitHubie: read_api i read_repository do odczytu, api tylko wtedy, gdy agent musi zapisywać.

ObjawPrzyczynaRozwiązanie
Bad credentials lub 401Token wygasł, został odwołany lub źle wpisany; albo zmienna nie jest ustawiona w powłoce, z której uruchomiono agentaUtwórz nowy PAT, wyeksportuj go i uruchom agenta ponownie z tej powłoki. Przy tokenach fine-grained sprawdź listę repozytoriów
Wtyczka zainstalowana, zero narzędziWtyczka czyta ustaloną zmienną (GITHUB_PERSONAL_ACCESS_TOKEN w Claude Code, GITHUB_PAT_TOKEN w Codex; w Cursorze sprawdź mcp.json wtyczki)Wyeksportuj dokładnie tę nazwę, której oczekuje wtyczka
Brakuje oczekiwanego narzędziaKlasyczny PAT bez scope’u je ukrywa albo włączony jest tryb tylko do odczytu lub filtr toolsetówSprawdź x-oauth-scopes, ścieżkę URL i nagłówki X-MCP-*
Narzędzie widoczne, wywołanie zwraca 403Fine-grained PAT pokazuje wszystkie narzędzia; API odrzuca wywołanieNadaj uprawnienie albo usuń toolset, żeby agent przestał próbować
search_code nie znajduje niczego na twojej gałęziWyszukiwanie kodu indeksuje tylko gałąź domyślną, a forki tylko w niektórych przypadkachKod z gałęzi przeszukuj lokalnie przez rg
Błędy limitu 403 lub 429 w trakcie pracyLimit 5000 żądań na godzinę na token dzielą gh, skrypty i serwer MCPStronicuj małymi porcjami, masowe odczyty rób przez gh, daj automatyzacji własny token
claude mcp add github https://… nie łączy się z niczymBez --transport http Claude Code zapisuje URL jako polecenie stdioUsuń wpis i dodaj go ponownie z --transport http
Logowanie OAuth w Dockerze nigdy się nie kończyPort callbacku nie jest wystawiony na loopbackDodaj -p 127.0.0.1:8085:8085 i GITHUB_OAUTH_CALLBACK_PORT=8085 albo użyj device-code flow
Zgłoszenie kontrybutora „nie istnieje”Tryb lockdown ukrywa treści autorów bez uprawnienia pushW repozytoriach publicznych to oczekiwane. Najpierw przeczytaj zgłoszenie sam (gh issue view N). Lockdownu nie da się ograniczyć do jednego repozytorium: sesja bez --lockdown-mode, GITHUB_LOCKDOWN_MODE lub X-MCP-Lockdown przestaje filtrować wszystkie publiczne repozytoria w tej sesji. Jeśli agent musi je przeczytać, uruchom taką sesję tylko do odczytu (https://api.githubcopilot.com/mcp/readonly, X-MCP-Readonly: true lub lokalnie --read-only) bez narzędzi zapisujących, a potem wróć do konfiguracji z lockdownem. Rola Triage nie pomoże: nie daje uprawnienia push, które ma dopiero rola Write i wyższe

Problemy z połączeniem, które nie dotyczą tylko GitHuba, opisuje artykuł o problemach z połączeniem MCP.