Przejdź do głównej zawartości

Rejestry i bramki MCP: dopuszczanie serwerów w organizacji

Organizacja dopuszcza serwery MCP na czterech poziomach: weryfikuje każdy serwer w Official MCP Registry i w repozytorium dostawcy, zapisuje zatwierdzone serwery w jednym recenzowanym katalogu, egzekwuje ten katalog w zarządzanej konfiguracji każdego agenta i kieruje wywołania przez bramkę tam, gdzie potrzebny jest dziennik audytu. Official MCP Registry to indeks w wersji zapoznawczej (preview), a nie zweryfikowana lista.

Wiosną dział bezpieczeństwa zatwierdził GitHub MCP i Sentry MCP. Pół roku później claude mcp list na przypadkowym laptopie pokazuje jedenaście serwerów, w tym wpis figma wskazujący na pakiet niezwiązanego wydawcy, a jeden z użytkowników Codeksa ma serwer Postgres, którego nikt nie przejrzał. Nikt nie złamał reguły, bo nie było reguły, którą narzędzie mogłoby wyegzekwować, i nikt nie potrafi powiedzieć, które serwery działały w zeszłym tygodniu na danych produkcyjnych.

Ta strona jest dla tech leada, który odpowiada za listę zatwierdzonych serwerów, i dla CTO, który musi pokazać audytorom, że ta lista działa. Zakłada, że znasz już zabezpieczanie serwerów MCP, czyli skanowanie i tryby tylko do odczytu dla pojedynczego serwera. Pliki polityk poszczególnych narzędzi, które niosą tę listę, opisuje strona jedna polityka dla wszystkich agentów kodujących.

  • Powtarzalną procedurę weryfikacji: Official MCP Registry potwierdza tożsamość, repozytorium dostawcy daje podstawę zaufania, a gotowy prompt przeprowadza całość.
  • Tabelę decyzyjną: stały zestaw serwerów, katalog zatwierdzonych czy lista zakazanych.
  • Jeden plik katalogu, z którego generujesz allowedMcpServers dla Claude Code, requirements.toml dla Codeksa i listę kontrolną dla Cursora.
  • Ścieżkę z bramką dla zespołów, które potrzebują jednego punktu wejścia, skanowania sekretów i logów wywołań.
  • Mechaniczne testy, które dowodzą, że lista działa na każdej maszynie, oraz spis tego, co psuje się przy wdrożeniu.

Official MCP Registry to publiczny indeks metadanych serwerów MCP: nazwy, wersji, pakietów i zdalnych adresów URL. Jego README nazywa go „an app store for MCP servers”. Wystartował w wersji zapoznawczej 2025-09-08, a jego API jest zamrożone w wersji v0.1 od 2025-10-24; ogólnej dostępności (GA) nie ogłoszono (sprawdzone 2026-09-26). Według stanu na 2026-09-26 rejestr zawierał 36 176 serwerów w najnowszej wersji, policzonych przez API rejestru podczas przygotowywania tej strony.

Trzy cechy decydują o tym, jak go używać:

CechaCo oznacza dla twojej listy
Tylko weryfikacja przestrzeni nazw. Nazwy io.github.<user>/… wymagają, by wydawca uwierzytelnił się jako ten użytkownik GitHuba; nazwy com.example/… wymagają dowodu własności domeny przez DNS albo HTTP.Nazwa io.github.getsentry/sentry-mcp dowodzi, kto opublikował wpis. Nie dowodzi, że serwer jest bezpieczny ani że to ten, o który ci chodziło.
Minimalna moderacja. Polityka moderacji rejestru mówi, że nie usuwa „low-quality or buggy servers” ani „servers with security vulnerabilities”, a konsumenci powinni zakładać „minimal-to-no moderation”.Obecność w rejestrze nigdy nie jest zatwierdzeniem. Kilka wpisów */github, */figma i */sentry pochodzi od wydawców niezwiązanych z tymi dostawcami.
Wersje mogą odstawać od pakietów. Według stanu na 2026-09-26 wpis Sereny miał wersję 1.5.3, a PyPI 1.7.0; Next.js DevTools miał 0.3.6 wobec 0.4.0 w npm.Przypinaj wersje z rejestru pakietów, z którego instalujesz, a nie z MCP Registry.

Rejestr zakłada istnienie agregatorów: usług, które kopiują jego dane „on a regular but infrequent basis (e.g., once per hour)” i dodają coś od siebie, na przykład oceny albo skanowanie bezpieczeństwa. Agregator, który dodatkowo udostępnia OpenAPI rejestru, to subrejestr (subregistry). To jest model prywatnego rejestru: twoja własna, przefiltrowana i przejrzana kopia, a nie żywa zależność od publicznego indeksu.

Który wzorzec listy dozwolonych pasuje do twojej organizacji?

Dział zatytułowany „Który wzorzec listy dozwolonych pasuje do twojej organizacji?”

Wybierz wzorzec, zanim napiszesz jakikolwiek plik. Ostrzejsze wzorce odbierają programistom swobodę, więc dopasuj je do ryzyka, a nie do przyzwyczajeń.

WzorzecCo mogą programiściKiedy go wybraćMechanizm w Claude Code
Stały zestawUżywać dokładnie wdrożonych serwerów; nic nie dodająKod regulowany, kontraktorzy, runnery CImanaged-mcp.json
Katalog zatwierdzonychDodać dowolny serwer z listy; reszta jest blokowanaWiększość zespołów produktowychallowedMcpServers + allowManagedMcpServersOnly: true
Dostarczone plus własneDostają twoje zdalne serwery automatycznie i zachowują własneWczesne wdrożenie, repozytoria niskiego ryzykamanagedMcpServers
Tylko lista zakazanychDodać wszystko poza znanymi złymi serweramiWyłącznie tymczasowo, zanim zbudujesz katalogdeniedMcpServers

Dalsza część strony buduje katalog zatwierdzonych, bo na nim kończy większość organizacji, a trzy pozostałe wzorce to podzbiory jego kroków.

  1. Przeszukaj rejestr i zostaw tylko przestrzeń nazw dostawcy. API rejestru zwraca każdy wpis pasujący do nazwy produktu, z pakietami i zdalnymi adresami; linia select zostawia przestrzeń nazw dostawcy:

    Okno terminala
    # terminal; wymaga curl i jq
    curl -s "https://registry.modelcontextprotocol.io/v0.1/servers?search=sentry&version=latest" \
    | jq '.servers[]
    | select(.server.name | startswith("io.github.getsentry/"))
    | {name: .server.name, version: .server.version,
    repo: .server.repository.url,
    packages: [.server.packages[]?.identifier],
    remotes: [.server.remotes[]?.url]}'

    Według stanu na 2026-09-26 wpis dostawcy to io.github.getsentry/sentry-mcp 0.42.0 z pakietem npm @sentry/mcp-server i zdalnym adresem https://mcp.sentry.dev/mcp. Usuń linię select, aby zobaczyć pozostałe wyniki dla sentry: każdy z nich to kandydat na listę zakazanych, nie dozwolonych.

  2. Potwierdź tożsamość poza rejestrem. repository.url musi należeć do organizacji dostawcy na GitHubie, a README dostawcy musi wskazywać ten sam pakiet lub URL. Sam pakiet sprawdź przez npm view <package> name version repository.url deprecated albo https://pypi.org/pypi/<package>/json.

  3. Wybieraj zdalny URL, gdy dostawca go oferuje. Serwer HTTP hostowany przez dostawcę, z OAuth, nie uruchamia żadnego kodu na laptopie, a wzorce URL łatwiej egzekwować niż dokładne polecenia. Zapisz wariant tylko do odczytu, jeśli istnieje, na przykład https://api.githubcopilot.com/mcp/readonly GitHuba.

  4. Przeskanuj i sklasyfikuj. Uruchom skan ze strony zabezpieczanie serwerów MCP i oznacz serwer jako tylko do odczytu albo z możliwością zapisu. Serwery z zapisem, które dotykają produkcji, wymagają podpisu imiennie wskazanej osoby od bezpieczeństwa.

  5. Zapisz decyzję w katalogu (następna sekcja) razem z dowodami: nazwą w rejestrze, repozytorium, przypiętą wersją, transportem, przełącznikiem tylko do odczytu i osobą zatwierdzającą.

Zbuduj katalog zatwierdzonych serwerów jako prywatny rejestr

Dział zatytułowany „Zbuduj katalog zatwierdzonych serwerów jako prywatny rejestr”

W większości organizacji prywatny rejestr to przejrzany plik w repozytorium polityk, a nie serwer. Jest jedynym źródłem konfiguracji każdego narzędzia, a pull request jest zapisem zatwierdzenia.

# mcp-catalog/servers.yaml — jeden wpis na zatwierdzony serwer
- name: github
registry_name: io.github.github/github-mcp-server
repository: https://github.com/github/github-mcp-server
transport: http
url: https://api.githubcopilot.com/mcp/readonly
version: remote # hostowany przez dostawcę; nie ma czego przypinać
read_only: true
evidence: "wpis w rejestrze + README dostawcy, sprawdzone 2026-09-26"
approver: "@acme/platform-security"
- name: sentry
registry_name: io.github.getsentry/sentry-mcp
repository: https://github.com/getsentry/sentry-mcp
transport: http
url: https://mcp.sentry.dev/mcp
version: 0.42.0 # wpis w rejestrze i npm @sentry/mcp-server, 2026-09-26
read_only: false # narzędzia z zapisem wymienione w zatwierdzającym PR
evidence: "wpis w rejestrze + npm view @sentry/mcp-server, 2026-09-26"
approver: "@acme/platform-security"
- name: playwright
registry_name: io.github.microsoft/playwright-mcp
repository: https://github.com/microsoft/playwright-mcp
transport: stdio
command: [npx, "@playwright/mcp@0.0.82"]
version: 0.0.82
read_only: true
evidence: "npm view @playwright/mcp version, 2026-09-26"
approver: "@acme/frontend-leads"

Przy każdym wpisie podaj programistom dokładne polecenie instalacji. Każda linia poniżej pasuje do listy dozwolonych Claude Code i do identity w Codeksie z następnej sekcji: adresy URL pasują do wzorców, a polecenia zgadzają się argument po argumencie.

Okno terminala
# terminal; Claude Code
claude mcp add --transport http github https://api.githubcopilot.com/mcp/readonly
claude mcp add --transport http sentry https://mcp.sentry.dev/mcp
claude mcp add playwright -- npx @playwright/mcp@0.0.82
# terminal; Codex
codex mcp add github --url https://api.githubcopilot.com/mcp/readonly
codex mcp add sentry --url https://mcp.sentry.dev/mcp
codex mcp add playwright -- npx @playwright/mcp@0.0.82

W Codeksie klucz wymagania musi się zgadzać z nazwą, której używa programista, więc name jest częścią kontraktu, a nie etykietą.

Warto znać jeszcze dwie formy katalogu:

  • Marketplace pluginów. Claude Code nie ma wbudowanego rejestru MCP do przeglądania. Dokumentacja Anthropic o zarządzanym MCP sugeruje dystrybucję zatwierdzonych serwerów jako pluginów w zespołowym marketplace pluginów, dzięki czemu programiści instalują je z /plugin.
  • Subrejestr. Jeśli utrzymujesz wiele wewnętrznych serwerów, uruchom agregator, który co godzinę kopiuje publiczny rejestr z parametrem updated_since, filtruje go do zatwierdzonych nazw i dodaje twoje serwery. Publikowanie własnych serwerów w publicznym rejestrze opisuje strona tworzenie własnego serwera MCP.

Każde narzędzie egzekwuje listę w innym miejscu i według innych reguł dopasowania. Generuj wszystkie trzy pliki z servers.yaml i sprawdzaj je w CI testem zgodności ze strony jedna polityka dla wszystkich agentów kodujących.

Umieść listę w zarządzanym źródle ustawień: w ustawieniach zarządzanych z serwera (konsola administracyjna claude.ai), we wdrożonym managed-settings.json, w profilu MDM albo w polityce rejestru systemu. allowManagedMcpServersOnly: true nie pozwala użytkownikom poszerzać listy we własnych ustawieniach; listy zakazanych nadal łączą się ze wszystkich zakresów.

{
"allowManagedMcpServersOnly": true,
"allowedMcpServers": [
{ "serverUrl": "https://api.githubcopilot.com/mcp/readonly" },
{ "serverUrl": "https://mcp.sentry.dev/*" },
{ "serverCommand": ["npx", "@playwright/mcp@0.0.82"] }
],
"deniedMcpServers": [
{ "serverUrl": "https://*.untrusted.example.com/*" }
]
}

O tym, czy lista naprawdę działa, decydują reguły dopasowania:

  • Gdy lista ma choć jeden wpis serverUrl, każdy zdalny serwer musi pasować do wzorca URL; gdy ma choć jeden serverCommand, każdy serwer stdio musi pasować do polecenia dokładnie, argument po argumencie. ["npx", "-y", "server"] nie pasuje do ["npx", "server"].
  • Wpis serverName nie jest zabezpieczeniem, bo nazwę wybiera użytkownik.
  • Dopasowanie do listy zakazanych zawsze wygrywa.
  • Aby dostarczyć zdalne serwery wszystkim bez przejmowania wyłącznej kontroli, wpisz je w managedMcpServers (v2.1.259 lub nowsza, według dokumentacji zarządzanego MCP i dziennika zmian Claude Code, sprawdzonych 2026-09-26). Wpisy muszą być serwerami HTTP albo SSE pod adresem https://, bez command, i ładują się bez wpisu na liście dozwolonych.
  • Dla stałego zestawu wdróż managed-mcp.json do /Library/Application Support/ClaudeCode/ (macOS), /etc/claude-code/ (Linux i WSL) albo C:\Program Files\ClaudeCode\ (Windows). Nie da się go dostarczyć przez ustawienia zarządzane z serwera.

Bramka (gateway) to proces między agentem a serwerami MCP: agent łączy się z jednym wpisem, a bramka uruchamia serwery za nim albo pośredniczy w ruchu do nich. Dodaj ją, gdy potrzebujesz przynajmniej jednej z tych rzeczy:

  • Jednego punktu wejścia dla kilku narzędzi. Jeden profil obsługuje Claude Code, Cursora i innych klientów, więc lista dozwolonych w narzędziu kurczy się do jednego wpisu bramki.
  • Izolacji. Serwery stdio działają w kontenerach, a nie w sesji programisty.
  • Centralnych kontroli. Skanowania sekretów w argumentach i odpowiedziach, weryfikacji podpisów obrazów serwerów i logów wywołań w jednym miejscu.

Docker MCP Gateway to opcja zweryfikowana w tej witrynie. Według stanu na 2026-09-26 repozytorium docker/mcp-gateway miało 1,6 tys. gwiazdek na GitHubie, a repozytorium katalogu docker/mcp-registry 558 gwiazdek i 1,5 tys. forków ze zgłoszeń serwerów (GitHub). Dla audytu liczą się domyślne ustawienia gateway run:

FlagaDomyślnieCo robi
--log-callswłączonaLoguje każde wywołanie narzędzia z nazwą narzędzia i tylko kształtem argumentów; surowe wartości argumentów nie trafiają do logu
--block-secretswłączonaSkanuje argumenty wywołań i tekstowe odpowiedzi w poszukiwaniu wartości wyglądających na sekrety, przed wykonaniem i po nim
--verify-signatureswłączona dla obrazów Docker MCPWymaga obrazów wskazanych przez digest i weryfikuje je przed pobraniem lub uruchomieniem
--block-networkwyłączonaDodatkowo ogranicza dostęp serwerów do sieci
Okno terminala
# terminal; linie dostawcy z README docker/mcp-gateway
docker mcp catalog pull mcp/docker-mcp-catalog
docker mcp profile create --name dev-tools \
--server catalog://mcp/docker-mcp-catalog/github
docker mcp client connect claude-code --profile dev-tools --global

Następnie dopuść na liście samo polecenie bramki, dokładnie w takiej postaci, w jakiej uruchamia je klient, żeby nie przeszedł żaden inny serwer stdio:

{ "serverCommand": ["docker", "mcp", "gateway", "run", "--profile", "dev-tools"] }

To tylko przykład. Odczytaj polecenie, które naprawdę zapisało docker mcp client connect (claude mcp list, potem claude mcp get <name>), i skopiuj je na listę, bo wpis musi pasować argument po argumencie.

Poza Docker Desktop najpierw uruchom docker mcp feature enable profiles. Profile można wypychać do rejestru OCI i z niego pobierać; w ten sposób jeden przejrzany profil trafia na każdą maszynę.

Materiały badawcze tej witryny wymieniają jeszcze dwie ścieżki z bramką, których tu nie testowano: proxy LiteLLM ma bramkę MCP obok bramki modeli, a polityka Claude apps gateway jest jednym ze źródeł zarządzanych, z których Claude Code czyta managedMcpServers. Zanim na którejś się oprzesz, sprawdź ją w jej własnej dokumentacji.

Bramka zmienia też koszt kontekstu: jeden wpis może udostępnić wszystkie narzędzia swojego profilu. Trzymaj osobne profile dla zespołów, mierz /context w Claude Code przed podłączeniem i po nim, a gdy lista narzędzi rośnie, sięgnij po techniki ze strony jak obniżyć koszt tokenów MCP.

Egzekwowanie mówi, co wolno uruchomić; audyt mówi, co zostało uruchomione. Zbieraj oba sygnały w jednym miejscu.

  • Telemetria Claude Code. Przy skonfigurowanym eksporcie OpenTelemetry ustaw OTEL_LOG_TOOL_DETAILS=1, aby zdarzenia narzędzi zawierały nazwy serwerów i narzędzi MCP. Agreguj je po serwerze, żeby zobaczyć rzeczywiste użycie w każdym zespole.
  • Logi bramki. Wysyłaj log wywołań bramki do tego samego kolektora i ustaw alert na wywołania narzędzi spoza oczekiwanego profilu.
  • Dzienniki audytu usług. Przy serwerach z możliwością zapisu to dziennik audytu samej usługi pokazuje, co się zmieniło.

Jak udowodnić, że lista działa na każdej maszynie?

Dział zatytułowany „Jak udowodnić, że lista działa na każdej maszynie?”

Nikt nie czyta każdego wywołania narzędzia. Sprawdzaj konfigurację mechanicznie na maszynie kontrolnej dla każdej platformy, a potem na próbce całej floty przy każdym wydaniu.

  1. Test negatywny w Claude Code. Przy wdrożonym managed-mcp.json polecenie claude mcp add --transport http test https://example.com/mcp musi zakończyć się błędem Cannot add MCP server: enterprise MCP configuration is active and has exclusive control over MCP servers. Przy liście dozwolonych dodanie serwera spoza listy musi zwrócić not allowed by enterprise policy. URL nie musi istnieć; kontrola polityki odrzuca polecenie wcześniej.

  2. Kontrola inwentarza. claude mcp list pokazuje tylko serwery z katalogu. Jeśli przy managed-mcp.json nadal widać własny serwer użytkownika, Claude Code nie czyta pliku: sprawdź ścieżkę i uprawnienia katalogów nadrzędnych. /status pokazuje wpisy managedMcpServers, które zostały odrzucone, i powód.

  3. Test niezgodnej nazwy w Codeksie. Zarejestruj zatwierdzony URL pod złą nazwą i sprawdź, że Codex go wyłącza. To dowodzi, że plik wymagań jest wczytany, a nie tylko że akurat skonfigurowano właściwe serwery.

  4. Kontrola bramki. Wywołaj jedno narzędzie przez bramkę i sprawdź, że wywołanie pojawia się w kolektorze z zespołem i nazwą narzędzia.

  5. Zatwierdzenie. Tech lead jest właścicielem katalogu i zatwierdza dodania; osoba odpowiedzialna za bezpieczeństwo podpisuje każdy serwer z zapisem i dostępem do produkcji; zespół platformowy odpowiada za wdrożenie i powyższe testy. Wyniki każdego wydania zapisuj w repozytorium polityk.

Miarą, którą raportujesz zarządowi, jest pokrycie egzekwowania: odsetek sprawdzonych maszyn, na których testy negatywne przechodzą, osobno dla każdego narzędzia. Wszystko poniżej 100% to błąd wdrożenia, a nie kwestia polityki.

Programiści tracą serwer bez żadnego komunikatu. Claude Code po cichu usuwa zablokowane serwery z /mcp. Naprawa: opublikuj katalog i listę usuwanych serwerów przed wdrożeniem i pokaż komunikat z testu negatywnego, żeby ludzie rozpoznawali działanie polityki.

Codex wyłącza zatwierdzony serwer. Nazwa różni się od klucza wymagania albo różnią się argumenty (npx -y … wobec identity bez -y). Naprawa: opublikuj dokładną linię codex mcp add dla każdego wpisu katalogu i generuj wymagania z tego samego pliku.

Zadania CI padają przy starcie. Zadanie, które przekazuje --mcp-config na maszynie z managed-mcp.json, kończy się komunikatem You cannot dynamically configure MCP servers when an enterprise MCP config is present. Naprawa: daj runnerom CI własny plik zarządzany z serwerami, których potrzebuje zadanie.

Serwer dostarczony w ustawieniach nigdy się nie ładuje. managedMcpServers odrzuca adresy http://, wpisy z command i odwołania ${VAR}, a Claude Code starszy niż v2.1.259 ignoruje ten klucz. Naprawa: przeczytaj /status, popraw wpis i ustal minimalną wersję klienta we wdrożeniu.

Użytkownicy i tak poszerzyli listę. Brakuje allowManagedMcpServersOnly, więc dołączyły się listy z poziomu użytkownika. Naprawa: dodaj flagę. Przy więcej niż jednym źródle zarządzanym odczyt blokady ze wszystkich źródeł wymaga v2.1.273 lub nowszej, według dokumentacji zarządzanego MCP w Claude Code (sprawdzone 2026-09-26).

Zmiana profilu bramki weszła bez przeglądu. Ktoś dodał serwer do wspólnego profilu i wszyscy klienci go dostali. Naprawa: trzymaj profile w repozytorium polityk, wypychaj je do rejestru OCI tylko z CI i traktuj diff profilu jak diff listy dozwolonych.