Hubungkan PostgreSQL ke Claude Code via MCP, siapkan akun read-only dengan kontrol izin, dan biarkan Claude membaca schema, menulis query, serta menganalisis data secara langsung.
Setelah database terhubung, cara kerja Claude Code berubah. Kamu tidak perlu menyalin struktur tabel ke prompt atau menjelaskan nama field — Claude langsung terhubung, membaca schema sendiri, menulis query, dan menganalisis hasilnya.
Artikel ini menggunakan PostgreSQL sebagai contoh dan membahas seluruh proses dari konfigurasi hingga penggunaan nyata.
@modelcontextprotocol/server-postgres yang resmi mendukung:
Hanya baca. Server ini dirancang khusus untuk query — tidak menjalankan INSERT, UPDATE, atau DELETE.
npm install -g @modelcontextprotocol/server-postgres
Edit .claude/settings.json (level proyek):
{
"mcpServers": {
"db": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://readonly_user:password@localhost:5432/myapp_production"
]
}
}
}
Format connection string: postgresql://USER:PASSWORD@HOST:PORT/DATABASE
Jika tidak ingin menyimpan password di file konfigurasi, gunakan variabel lingkungan:
{
"mcpServers": {
"db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "postgresql://readonly_user:password@localhost:5432/myapp_production"
}
}
}
}
Jika .claude/settings.json akan di-commit ke git, pastikan tidak ada password dalam teks biasa. Simpan konfigurasi sensitif di .claude/settings.local.json dan tambahkan ke .gitignore.
Jangan berikan akun dengan hak tulis kepada Claude. Buat pengguna read-only di PostgreSQL:
-- Buat pengguna read-only
CREATE USER claude_readonly WITH PASSWORD 'your_password';
-- Berikan hak koneksi
GRANT CONNECT ON DATABASE myapp_production TO claude_readonly;
-- Berikan hak penggunaan schema
GRANT USAGE ON SCHEMA public TO claude_readonly;
-- Berikan SELECT pada semua tabel yang ada
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;
-- Terapkan hal yang sama untuk tabel yang akan dibuat di masa depan
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO claude_readonly;
Jika ada tabel yang tidak ingin dilihat Claude (seperti sessions atau audit_logs), cukup jangan berikan izin pada tabel tersebut, atau pindahkan ke schema terpisah.
Restart Claude Code, lalu tanyakan:
Tampilkan daftar semua tabel di database
Jika Claude mengembalikan daftar nama tabel alih-alih berkata "saya tidak punya akses ke database," koneksi MCP berhasil.
Setelah dikonfigurasi, Claude bisa melakukan lebih banyak hal. Beberapa skenario praktis:
Skenario 1: Memahami struktur data
Apa hubungan antara tabel users dan orders?
Apakah ada foreign key constraint?
Claude langsung query information_schema untuk membaca struktur tabel dan constraint, lalu memberikan penjelasan yang jelas — tanpa perlu menempel schema.
Skenario 2: Analisis data
Dari pengguna yang mendaftar dalam 30 hari terakhir,
berapa persentase yang sudah melakukan setidaknya satu pesanan?
Kelompokkan berdasarkan channel pendaftaran.
Claude menulis SQL, menjalankannya, dan menganalisis hasilnya. Jika query salah (misalnya nama field tidak cocok), ia melihat error dan memperbaikinya sendiri.
Skenario 3: Debugging
Cari pesanan dengan status = 'pending' yang sudah lebih dari 7 hari.
Berapa banyak dan kapan yang terbaru dibuat?
Pencarian ad hoc seperti ini dulu membutuhkan penulisan SQL sendiri atau membuka alat database secara manual. Sekarang cukup deskripsikan apa yang dibutuhkan.
Skenario 4: Dukungan pengembangan
Saya ingin menambahkan kolom last_login_at ke tabel users.
Tuliskan SQL migrasinya dan periksa apakah indeks yang ada sudah cukup.
Claude membaca struktur tabel saat ini, menulis migrasi, dan menganalisis kondisi indeks sekaligus.
Secara default, Claude dapat mengakses schema lengkap dan data semua tabel yang telah diberi izin. Batasi sesuai kebutuhan.
Kontrol per tabel
Berikan izin hanya ke tabel tertentu:
-- Hanya tabel tertentu, bukan semua
GRANT SELECT ON TABLE users, orders, products TO claude_readonly;
-- sessions, payment_tokens, audit_logs tidak mendapat akses
Filter kolom sensitif dengan view
Jika tabel memiliki field sensitif (hash password, API key, nomor telepon), buat view yang menyembunyikannya:
CREATE VIEW users_safe AS
SELECT id, email, created_at, plan, status
FROM users;
-- mengecualikan password_digest, phone, payment_method_id
GRANT SELECT ON users_safe TO claude_readonly;
-- jangan berikan akses ke tabel asli
Claude hanya bisa query view dan tidak pernah melihat field aslinya.
Batas baris
@modelcontextprotocol/server-postgres secara default menerapkan batas baris pada hasil query (biasanya 1.000 baris), mencegah Claude menarik seluruh tabel. Batas ini wajar — tidak perlu ditingkatkan.
Database produksi biasanya tidak mengekspos portnya secara langsung. Gunakan SSH tunnel:
# Teruskan localhost:5433 ke port 5432 server remote
ssh -L 5433:localhost:5432 [email protected] -N
Gunakan port lokal di konfigurasi:
"postgresql://readonly_user:password@localhost:5433/myapp_production"
Bisa juga menggunakan connection pooler seperti pgBouncer.
Jika proyek menggunakan beberapa database (utama + analitik + cache), konfigurasikan beberapa MCP Server:
{
"mcpServers": {
"main-db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://...utama..."]
},
"analytics-db": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://...analitik..."]
}
}
}
Claude terhubung ke keduanya. Cukup beritahu mana yang harus di-query.
Perubahan paling nyata setelah menghubungkan database adalah percakapan terkait data tidak lagi membutuhkan persiapan. Tidak perlu menjelaskan schema, tidak perlu menyebutkan tipe field — katakan apa yang dibutuhkan dan Claude akan mencarinya sendiri.
Sangat berguna saat debugging. Alur lama: query database → salin hasil → tempel ke Claude → analisis. Alur baru: deskripsikan masalah → Claude query langsung → langsung dapat kesimpulan.