Przejdź do głównej zawartości

Serwery MCP dla baz danych: Postgres MCP Pro, DBHub, MCP Toolbox, Supabase, Neon i MongoDB

Serwer MCP dla bazy danych pozwala Claude Code, Codeksowi lub Cursorowi odczytać żywy schemat, wykonywać zapytania i sprawdzać plany zapytań zamiast zgadywać strukturę tabel. Według stanu na wrzesień 2026 najlepsze opcje to Postgres MCP Pro do strojenia Postgresa, DBHub dla kilku silników SQL, MCP Toolbox od Google oraz serwery Supabase, Neona i MongoDB. Każdy powinien działać tylko do odczytu.

Ta strona jest dla programistów i tech leadów, którzy już pracują z agentem i chcą, żeby działał na prawdziwych danych. Agent napisał zapytanie do tabeli payment, choć nazywa się payments, przyjął, że created_at to string, choć kolumna ma typ timestamptz, a potem zaproponował indeks dla zapytania, które nigdy się nie wykonuje. Każdy z tych błędów bierze się ze zgadywania. Połączenie tylko do odczytu zastępuje zgadywanie dowodami, a migracja wdrażana przez CI trzyma agenta z dala od zapisów.

  • Rolę Postgresa tylko do odczytu, z limitem czasu zapytań, przez którą łączy się każdy serwer z tej strony
  • Sprawdzone polecenia instalacji Postgres MCP Pro, DBHub, MCP Toolbox, Supabase, Neona i MongoDB we wszystkich trzech agentach
  • Gotowy workflow, który znajduje najwolniejsze zapytania na stagingu i proponuje indeksy z planami przed i po
  • Pętlę zmiany schematu, w której agent sprawdza bazę, pisze plik migracji, a wdraża go CI
  • Pułapki: błędną nazwę pakietu, którą wciąż publikują starsze poradniki, i flagi, które już nie istnieją

Wybieraj najpierw według bazy, potem według zadania. Liczby gwiazdek GitHuba odczytano 26.09.2026 (API GitHuba) i zapisano w dossier badawczym MCP tej strony.

SerwerBazyPrzełącznik tylko do odczytuWybierz, gdyPopularność (26.09.2026)
Postgres MCP Pro (Crystal DBA)PostgreSQL--access-mode=restrictedStroisz Postgresa: najcięższe zapytania, plany, porady indeksowe, kontrola kondycji★3,3 tys.
DBHub (Bytebase)Postgres, MySQL, MariaDB, SQL Server, Oracle, SQLitereadonly = true dla narzędzia w dbhub.tomlJeden serwer dla kilku silników, z limitem wierszy i czasu zapytań★3,6 tys.
MCP Toolbox for Databases (Google)Postgres, MySQL, BigQuery, Spanner, MongoDB, Redis i inneBrak w serwerze (sprawdzone w 1.13.1, 26.09.2026); użyj roli tylko do odczytu i wąskiego zestawu narzędziChcesz gotowych narzędzi monitoringu albo własnych narzędzi w tools.yaml★16,5 tys.
Supabase MCP (Supabase)Projekty Supabaseread_only=true w URL-uBaza stoi na Supabase i chcesz też dokumentacji i konfiguracji★2,9 tys.
Neon MCP (Neon)Projekty Neonareadonly=true w URL-uBaza stoi na Neonie i chcesz gałęzi do bezpiecznych eksperymentów★650
MongoDB MCP Server (MongoDB)MongoDB i Atlas--readOnlyBazy dokumentowe i zarządzanie Atlasem★1,1 tys.

Warto znać jeszcze dwa. CLI Prismy uruchamia lokalny serwer MCP poleceniem prisma mcp, ale jego narzędzia obejmują migrate-dev (które stosuje migracje; prisma@6 udostępnia też migrate-reset), więc kieruj go wyłącznie na jednorazową bazę deweloperską. SQLite nie potrzebuje osobnego serwera: DBHub przyjmuje DSN SQLite, a stary serwer referencyjny mcp-server-sqlite nie miał wydania od 25.04.2025.

Utwórz rolę tylko do odczytu, zanim cokolwiek podłączysz

Dział zatytułowany „Utwórz rolę tylko do odczytu, zanim cokolwiek podłączysz”

Przełącznik w serwerze to druga linia obrony. Pierwsza to rola bazodanowa, która nie może pisać, bo rola działa nawet wtedy, gdy ktoś pomyli flagę albo serwer zmieni domyślne ustawienia. Wykonaj to raz na każdej bazie stagingowej jako właściciel, w psql:

-- Postgres: rola logowania, która czyta, widzi statystyki zapytań i nic więcej
CREATE ROLE agent_ro LOGIN;
\password agent_ro
REVOKE CREATE ON SCHEMA public FROM PUBLIC; -- Postgres 14 i starsze: PUBLIC nadal może tworzyć tabele
GRANT CONNECT ON DATABASE app TO agent_ro;
GRANT USAGE ON SCHEMA public TO agent_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO agent_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO agent_ro;
GRANT pg_read_all_stats TO agent_ro; -- widzi tekst zapytań wszystkich użytkowników w pg_stat_statements
ALTER ROLE agent_ro SET default_transaction_read_only = on;
ALTER ROLE agent_ro SET statement_timeout = '30s';

\password pyta o hasło i wysyła je zahaszowane, więc nie trafia ono do historii powłoki ani do logu serwera. Granicą są uprawnienia: rola ma SELECT i nic więcej. default_transaction_read_only to tylko druga warstwa, bo każdy klient może ją wyłączyć dla własnej sesji przez SET albo BEGIN READ WRITE. ALTER DEFAULT PRIVILEGES obejmuje tylko tabele, które później utworzy rola wykonująca to polecenie. Jeśli migracje działają jako inny właściciel, wykonaj je także jako ten właściciel, inaczej nowe tabele pozostaną dla agenta niewidoczne. Ciąg połączenia (connection string) wyeksportuj w powłoce jako STAGING_DATABASE_URL, nigdy w pliku śledzonym przez Git.

Zainstaluj Postgres MCP Pro w Claude Code, Codeksie i Cursorze

Dział zatytułowany „Zainstaluj Postgres MCP Pro w Claude Code, Codeksie i Cursorze”

Postgres MCP Pro to pakiet Pythona w PyPI (postgres-mcp 0.3.0, wydany 16.05.2025), więc uruchamiasz go przez uvx. Według stanu na 26.09.2026 od 16 miesięcy nie ma nowego wydania w PyPI, więc przypnij wersję (uvx postgres-mcp==0.3.0) i traktuj zestaw postgres/monitor z Toolboksa, opisany niżej, jako utrzymywaną alternatywę dla workflow z wolnymi zapytaniami. Pakiet npm o tej samej nazwie to zupełnie inny projekt. Przykłady w README używają --access-mode=unrestricted, więc zmieniaj tę flagę za każdym razem, gdy któryś kopiujesz.

Okno terminala
# Terminal, root repozytorium: zapisuje .mcp.json; ${STAGING_DATABASE_URL} jest rozwijane z powłoki przy starcie
claude mcp add -s project postgres -e 'DATABASE_URI=${STAGING_DATABASE_URL}' \
-- uvx postgres-mcp==0.3.0 --access-mode=restricted

Porady indeksowe wymagają dwóch rozszerzeń w bazie: pg_stat_statements (statystyki zapytań; musi być w shared_preload_libraries) i hypopg (indeksy hipotetyczne). Zarządzane usługi Postgresa zwykle oferują oba. Bez nich serwer nadal czyta schematy i wykonuje explain_query, ale get_top_queries i narzędzia indeksowe nie mają na czym pracować.

Znajdź wolne zapytania na stagingu i zaproponuj indeksy

Dział zatytułowany „Znajdź wolne zapytania na stagingu i zaproponuj indeksy”

Od tego przykładu zacznij, bo od początku do końca działa tylko do odczytu, a wynik da się zmierzyć. Postgres MCP Pro udostępnia get_top_queries, analyze_workload_indexes, analyze_query_indexes, explain_query i analyze_db_health. Z hypopg narzędzie explain_query potrafi zaplanować zapytanie tak, jakby indeks już istniał.

Powinieneś zobaczyć krótką tabelę z jednym wierszem na zapytanie i instrukcją CREATE INDEX CONCURRENTLY w każdym wierszu. Jeśli w każdym wierszu jest „brak poprawy”, w obciążeniu dominuje coś, czego indeks nie naprawi, na przykład skan sekwencyjny małej tabeli albo oczekiwanie na blokady. Wtedy poproś o analyze_db_health.

Drugi prompt jest ważny, bo indeks nie zawsze jest rozwiązaniem. Pętlę N+1 albo nieograniczony include taniej usunąć niż indeksować, a agent widzi to tylko wtedy, gdy ma jednocześnie statystyki zapytań i kod.

Podłącz DBHub, MCP Toolbox, Supabase, Neona i MongoDB

Dział zatytułowany „Podłącz DBHub, MCP Toolbox, Supabase, Neona i MongoDB”

Poniżej reszta katalogu. Każda podsekcja podaje sprawdzone polecenie instalacji i ustawienie, które trzyma serwer w trybie tylko do odczytu.

DBHub 1.3.1 (npm @bytebase/dbhub) przeniósł zabezpieczenia do pliku dbhub.toml. Stare flagi --readonly i --max-rows zatrzymują teraz serwer z błędem. Odwołania ${VAR} w pliku są rozwijane ze zmiennych środowiskowych, więc plik można commitować bez hasła.

dbhub.toml
[[sources]]
id = "staging"
dsn = "${STAGING_DATABASE_URL}"
query_timeout = 30
[[tools]]
name = "execute_sql"
source = "staging"
readonly = true
max_rows = 500
Okno terminala
claude mcp add -s project dbhub -- npx -y @bytebase/dbhub@1.3.1 --transport stdio --config ./dbhub.toml

Dla pojedynczego pliku SQLite możesz pominąć TOML i podać --dsn "sqlite:///absolute/path/dev.db". Bez dbhub.toml narzędzia nie mają żadnego ustawienia tylko do odczytu, więc samego DSN używaj wyłącznie na danych, które możesz stracić, albo wpisz DSN SQLite do pliku TOML powyżej.

Toolbox od Google (npm @toolbox-sdk/server 1.13.1) ładuje gotowy zestaw narzędzi dla danej bazy. README opisuje składnię --prebuilt=<database>/<toolset>. Zestaw monitor dla Postgresa zawiera list_query_stats, get_query_plan, list_database_stats, list_active_queries, long_running_transactions i list_locks, a nie ma w nim execute_sql. To najwęższa droga do opisanego wyżej przykładu z wolnymi zapytaniami. Połączenie konfigurujesz zmiennymi środowiskowymi, takimi jak POSTGRES_HOST, POSTGRES_DATABASE, POSTGRES_USER i POSTGRES_PASSWORD.

Okno terminala
claude mcp add -s project toolbox-pg \
-e POSTGRES_HOST=staging-db -e POSTGRES_DATABASE=app -e POSTGRES_USER=agent_ro -e 'POSTGRES_PASSWORD=${AGENT_RO_PASSWORD}' \
-- npx -y @toolbox-sdk/server --prebuilt=postgres/monitor --stdio

Supabase udostępnia zdalny serwer pod https://mcp.supabase.com/mcp z OAuth. Wpisz projekt i tryb tylko do odczytu w URL, żeby token wydany dla tej sesji nie sięgał innych projektów ani nie mógł pisać.

Okno terminala
claude mcp add -s project --transport http supabase \
"https://mcp.supabase.com/mcp?project_ref=PROJECT_REF&read_only=true&features=database,docs"
# następnie uruchom /mcp w Claude Code i zaloguj się

PROJECT_REF to identyfikator projektu z URL-a panelu Supabase. README Supabase prosi o przeczytanie wytycznych bezpieczeństwa przed podłączeniem, a powód jest konkretny: wiersze z twoich tabel trafiają do modelu. Treść zgłoszenia supportowego „zignoruj poprzednie instrukcje” jest dla ciebie danymi, a dla agenta potencjalnym poleceniem. Podłączaj projekt deweloperski, nie produkcję. Wtyczka supabase w claude-plugins-official łączy ten serwer z dwoma skillami i 26.09.2026 miała 118 617 instalacji w katalogu Claude Marketplace. Instalujesz ją poleceniem claude plugin install supabase@claude-plugins-official w Claude Code albo codex plugin add supabase@openai-curated w Codeksie.

Pakiet npm Neona @neondatabase/mcp-server-neon jest przestarzały; npm odsyła do serwera zdalnego. Użyj URL-a z readonly=true i opcjonalnie projectId:

Okno terminala
claude mcp add -s project --transport http neon "https://mcp.neon.tech/mcp?readonly=true&projectId=PROJECT_ID"
# następnie uruchom /mcp w Claude Code i zaloguj się

Przy OAuth uprawnienie tylko do odczytu jest ustalane w chwili autoryzacji. Późniejsza zmiana URL-a nie rozszerza istniejącego tokenu, więc żeby zmienić tryb, autoryzujesz się ponownie. Jeśli w projekcie włączony jest IP Allow Neona, serwer MCP potrzebuje własnych wpisów na liście dozwolonych adresów, wymienionych w README Neona.

Serwer MongoDB (npm mongodb-mcp-server 3.0.4) czyta ciąg połączenia ze zmiennej MDB_MCP_CONNECTION_STRING. --readOnly usuwa z serwera wszystkie narzędzia tworzące, zmieniające i usuwające dane, zanim agent zobaczy ich listę.

Okno terminala
claude mcp add -s project mongodb -e 'MDB_MCP_CONNECTION_STRING=${STAGING_MONGODB_URI}' \
-- npx -y mongodb-mcp-server@latest --readOnly

Serwer MCP daje agentowi żywe dane. Skill daje mu zasady dostawcy, jak dobrze z tych danych korzystać. W pracy z bazami te dwie rzeczy się uzupełniają:

DostawcaInstalacja skilliCo dodają
Supabasenpx skills add supabase/agent-skillssupabase (Auth, Storage, Edge Functions i inne) oraz supabase-postgres-best-practices (wydajność i RLS)
Neonnpx skills add neondatabase/agent-skillsOsiem skilli, w tym neon-postgres-branches i neon-postgres-egress-optimizer
Prismanpx skills add prisma/skillsDziewięć skilli, w tym prisma-cli, prisma-client-api i prisma-upgrade-v7

Listy skilli odczytano narzędziem skills 1.7.0 26.09.2026. Pełne porównanie skilli backendowych znajdziesz w najlepszych skillach backendowych i platformowych.

Schemat każdego narzędzia zajmuje kontekst agenta przez całą sesję. Zmierz to: uruchom /context w Claude Code przed dodaniem serwera i po nim, a dla wtyczki claude plugin details supabase@claude-plugins-official. Zawęź to, co się ładuje, przełącznikami samego serwera: sufiksem /<toolset> w Toolboksie, features=database,docs w Supabase i parametrami category w Neonie. W Codeksie enabled_tools i disabled_tools we wpisie serwera w config.toml filtrują narzędzia po stronie klienta. Więcej technik opisuje strona o ograniczaniu kosztu tokenów MCP.

Wdróż zmianę schematu bez dawania agentowi prawa zapisu

Dział zatytułowany „Wdróż zmianę schematu bez dawania agentowi prawa zapisu”

Agent nigdy nie stosuje migracji. Sprawdza bazę przez serwer tylko do odczytu, pisze plik migracji, a twój pipeline CI stosuje go po przeglądzie. Zostaje jedna audytowana ścieżka do bazy, a pracę agenta najpierw weryfikują maszyny, zanim spojrzy na nią człowiek.

  1. Sprawdź bazę przez MCP. Agent czyta bieżącą tabelę, jej indeksy, szacunkową liczbę wierszy i zapytania, które jej dotyczą. Nic się nie zmienia.

  2. Napisz plik migracji, nie stosuj go. Plik trafia tam, gdzie oczekuje go twoje narzędzie do migracji. W Prismie prisma migrate dev --create-only tworzy migrację bez jej stosowania (tylko na lokalnej bazie deweloperskiej).

  3. Niech najpierw sprawdzą to maszyny. CI lintuje SQL, stosuje migrację na jednorazowej bazie zbudowanej z bieżącego schematu, uruchamia testy i zapisuje EXPLAIN dla zapytań, których dotyczy zmiana. npx -y squawk-cli migrations/*.sql (squawk-cli 2.66.0) wyłapuje instrukcje zakładające blokady, na przykład indeks utworzony bez CONCURRENTLY.

  4. Przeglądaj dowody, nie każdą linię. Recenzent czyta pull request: wynik lintera, plany przed i po oraz migrację wsteczną. Zatwierdza właściciel kodu odpowiedzialny za schemat. Zobacz, jak przeglądać pull request agenta.

  5. Zastosuj w CI. Po merge’u pipeline stosuje migrację na stagingu, a potem na produkcji za osobnym zatwierdzeniem, poleceniem wdrożeniowym twojego narzędzia do migracji. Wycofanie to migracja wsteczna albo DROP INDEX CONCURRENTLY. Wzorce zmian expand-and-contract opisują wzorce migracji baz danych.

Kroki 1 i 2 wykonuj w trybie planowania, żeby agent pokazał plan, zanim zapisze plik. Przy pracy bez nadzoru tryb -p odrzuca wywołania narzędzi, które nie zostały wcześniej dopuszczone, więc jawnie zezwól na serwer MCP i zapis w katalogu migracji:

Okno terminala
claude -p "$(cat prompt.txt)" --allowedTools "mcp__postgres__*" "Write(migrations/**)"

W CI ładuj konfigurację MCP jawnie przez --strict-mcp-config --mcp-config ci-mcp.json i dawaj zadaniu wyłącznie dane logowania tylko do odczytu.

Sprawdzasz dowody, które zostawia każdy krok, a nie podsumowanie agenta:

  • Każda odpowiedź pokazuje swój SQL. Poproś o dokładne instrukcje, które agent wykonał. Błędny join widać w pięciu liniach SQL, a błędnego wniosku nie widać.
  • Porada indeksowa ma plany. Przyjmuj indeks tylko z EXPLAIN przed i po ze stagingu oraz listą tabel, które spowolni. Po wdrożeniu porównaj średni czas tego samego zapytania w pg_stat_statements.
  • Migracje przechodzą bramki. Squawk, zastosowanie na świeżej bazie, zestaw testów i migracja wsteczna to wymagane kontrole. Zatwierdza właściciel schematu.
  • Zapis jest niemożliwy z założenia. Rola tylko do odczytu razem z przełącznikiem serwera sprawiają, że destrukcyjna instrukcja kończy się błędem w bazie. Sprawdź to raz: poproś agenta o wykonanie DELETE FROM orders WHERE false i potwierdź, że baza odmówiła.

Co psuje się w serwerach MCP dla baz danych i jak to naprawić?

Dział zatytułowany „Co psuje się w serwerach MCP dla baz danych i jak to naprawić?”

npx postgres-mcp startuje, ale nie pojawiają się narzędzia Postgresa. Pakiet npm postgres-mcp (1.0.4) to niezwiązany projekt. Starsze poradniki, w tym wcześniejsze wersje tej strony, publikują to polecenie. Usuń wpis i zainstaluj Postgres MCP Pro poleceniem uvx postgres-mcp==0.3.0 --access-mode=restricted.

DBHub kończy działanie komunikatem „—readonly flag is no longer supported”. DBHub 1.3.1 czyta zabezpieczenia wyłącznie z dbhub.toml. Przenieś readonly i max_rows do bloku [[tools]], jak powyżej, i uruchamiaj serwer z --config.

Agent może pisać, choć prosiłeś o tryb tylko do odczytu. Sprawdź każdą warstwę: flagę serwera (każdy serwer zapisuje ją inaczej i żadna nie jest wymienna), a potem uprawnienia roli. Wykonaj SELECT has_table_privilege('agent_ro', 'orders', 'INSERT');. Wynik musi brzmieć false. Domyślny tryb tylko do odczytu w sesji nie jest dowodem, bo klient może go wyłączyć.

get_top_queries nic nie zwraca albo zgłasza błąd. Brakuje pg_stat_statements w shared_preload_libraries albo statystyki właśnie wyzerowano. Włącz rozszerzenie, odczekaj, aż staging obsłuży trochę ruchu, i zapytaj ponownie.

Neon nadal pozwala pisać po dodaniu readonly=true. Token OAuth zachował uprawnienia z pierwszej autoryzacji. Wyloguj się i autoryzuj ponownie z nowym URL-em.

Zapytania przekraczają limit czasu albo zwracają ogromne wyniki. Zostaw statement_timeout na roli i max_rows w DBHub. W Codeksie tool_timeout_sec we wpisie serwera podnosi limit klienta, gdy uzasadnione zapytanie potrzebuje więcej czasu. Proś o agregaty, nie o surowe wiersze.

Agent używa starych nazw tabel po migracji. Czyta własną wcześniejszą odpowiedź, a nie bazę. Poproś go o ponowną inspekcję tabeli albo zacznij nową sesję. Problemy z połączeniem w ogóle opisuje strona o problemach z połączeniem MCP.