MCP aracılığıyla PostgreSQL'i Claude Code'a bağla, salt okunur hesap ve izin kontrolü kur; Claude şemayı doğrudan okusun, sorgu yazsın, veri analiz etsin.
Bir veritabanı bağlandıktan sonra Claude Code farklı çalışır. Tablo yapısını prompt'a kopyalamana ya da alan adlarını açıklamana gerek kalmaz — Claude doğrudan bağlanır, şemayı kendisi okur, sorguları yazar ve sonuçları analiz eder.
Bu makale PostgreSQL'i örnek alarak yapılandırmadan gerçek kullanıma kadar tüm süreci anlatıyor.
Resmi @modelcontextprotocol/server-postgres şunları destekler:
Yalnızca okuma. Bu Server yalnızca sorgular için tasarlanmıştır; INSERT, UPDATE veya DELETE çalıştırmaz.
npm install -g @modelcontextprotocol/server-postgres
.claude/settings.json dosyasını (proje düzeyi) düzenle:
{
"mcpServers": {
"db": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://readonly_user:password@localhost:5432/myapp_production"
]
}
}
}
Bağlantı dizesi biçimi: postgresql://USER:PASSWORD@HOST:PORT/DATABASE
Parolayı yapılandırma dosyasına yazmak istemiyorsan ortam değişkeni kullan:
{
"mcpServers": {
"db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "postgresql://readonly_user:password@localhost:5432/myapp_production"
}
}
}
}
.claude/settings.json git'e commit edilecekse içinde düz metin parola olmadığından emin ol. Hassas yapılandırmayı .claude/settings.local.json dosyasına koy ve .gitignore'a ekle.
Claude'a yazma yetkisi olan bir hesap verme. PostgreSQL'de salt okunur bir kullanıcı oluştur:
-- Salt okunur kullanıcı oluştur
CREATE USER claude_readonly WITH PASSWORD 'your_password';
-- Bağlantı yetkisi ver
GRANT CONNECT ON DATABASE myapp_production TO claude_readonly;
-- Şema kullanım yetkisi ver
GRANT USAGE ON SCHEMA public TO claude_readonly;
-- Tüm mevcut tablolara SELECT yetkisi ver
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;
-- Gelecekte oluşturulacak tablolara da aynı yetkiyi uygula
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO claude_readonly;
Claude'un görmesini istemediğin tablolar varsa (örneğin sessions veya audit_logs), o tablolara yetki vermemen yeterli; ya da ayrı bir şemaya taşı.
Claude Code'u yeniden başlat ve sor:
Veritabanındaki tüm tabloları listele
Claude "veritabanına erişimim yok" demek yerine tablo adlarını listeliyorsa MCP bağlantısı çalışıyor demektir.
Yapılandırma tamamlandıktan sonra Claude çok daha fazlasını yapabilir. Birkaç pratik senaryo:
Senaryo 1: Veri yapısını anlama
users ve orders tabloları arasındaki ilişki nedir?
Yabancı anahtar kısıtlamaları var mı?
Claude, tablo yapısını ve kısıtlamaları okumak için doğrudan information_schema'yı sorgular ve sana net bir açıklama sunar — şemayı yapıştırman gerekmez.
Senaryo 2: Veri analizi
Son 30 günde kayıt olan kullanıcıların kaçı
en az bir sipariş verdi?
Kayıt kanalına göre grupla.
Claude SQL yazar, çalıştırır ve sonuçları analiz eder. Sorgu yanlışsa (alan adı uyuşmazlığı gibi), hatayı görüp kendisi düzeltir.
Senaryo 3: Hata ayıklama
orders tablosunda status = 'pending' olan ama
created_at 7 günü geçmiş kayıt var mı?
Kaç tane ve en yenisi ne zaman oluşturulmuş?
Bu tür anlık sorgular eskiden SQL yazmanı ya da bir veritabanı aracı açmanı gerektiriyordu. Artık sadece ne istediğini söylemen yeterli.
Senaryo 4: Geliştirme desteği
users tablosuna last_login_at sütunu eklemek istiyorum.
Migrasyon SQL'ini yaz ve mevcut indekslerin yeterli olup olmadığını kontrol et.
Claude mevcut tablo yapısını okur, migrasyonu yazar ve indeks durumunu analiz eder — hepsi tek seferde.
Varsayılan olarak Claude, izin verdiğin tüm tabloların tam şemasına ve verilerine erişebilir. Bunu ihtiyacına göre kısıtla.
Tablo bazında kontrol
Yalnızca belirli tablolara yetki ver:
-- Tüm tablolar yerine belirli tablolar
GRANT SELECT ON TABLE users, orders, products TO claude_readonly;
-- sessions, payment_tokens, audit_logs erişim almaz
Görünümle hassas alanları filtrele
Tabloda hassas alanlar varsa (parola hash'i, API anahtarı, telefon numarası), bunları gizleyen bir görünüm oluştur:
CREATE VIEW users_safe AS
SELECT id, email, created_at, plan, status
FROM users;
-- password_digest, phone, payment_method_id dahil değil
GRANT SELECT ON users_safe TO claude_readonly;
-- orijinal tabloya yetki verme
Claude yalnızca görünümü sorgulayabilir, orijinal alanları göremez.
Satır limiti
@modelcontextprotocol/server-postgres, sorgu sonuçlarına varsayılan olarak bir satır limiti uygular (genellikle 1.000 satır); bu Claude'un tüm tabloyu çekmesini önler. Bu limit makuldür — artırma.
Üretim veritabanları genellikle portlarını doğrudan açmaz. SSH tüneli kullan:
# localhost:5433'ü uzak sunucunun 5432 portuna yönlendir
ssh -L 5433:localhost:5432 [email protected] -N
Yapılandırma dosyasında yerel portu kullan:
"postgresql://readonly_user:password@localhost:5433/myapp_production"
pgBouncer gibi bir bağlantı havuzu aracı da kullanabilirsin.
Proje birden fazla veritabanı kullanıyorsa (ana + analitik + önbellek), birden fazla MCP Server yapılandır:
{
"mcpServers": {
"main-db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://...ana..."]
},
"analytics-db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://...analitik..."]
}
}
}
Claude her ikisine de bağlanır. Hangisini sorgulamasını istediğini söylemen yeterli.
Veritabanı bağlandıktan sonra en belirgin değişiklik: veri ile ilgili konuşmalar artık ön hazırlık gerektirmiyor. Şemayı açıklamana, alan türlerini anlatmana gerek yok — ne istediğini söyle, Claude kendisi araştırır.
Hata ayıklamada özellikle işe yarıyor. Eski akış: veritabanını sorgula → sonuçları kopyala → Claude'a yapıştır → analiz et. Yeni akış: sorunu açıkla → Claude doğrudan sorgular → sonuçları al.