Menghubungkan Claude Code ke Database: Query Data Nyata dengan MCP

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.

MCP Server yang Digunakan

@modelcontextprotocol/server-postgres yang resmi mendukung:

  • Membaca schema semua tabel (nama field, tipe, constraint)
  • Menjalankan query SQL dan mengembalikan hasil
  • Dukungan multiple schema

Hanya baca. Server ini dirancang khusus untuk query — tidak menjalankan INSERT, UPDATE, atau DELETE.

Instalasi

npm install -g @modelcontextprotocol/server-postgres

Konfigurasi

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.

Buat Akun Read-Only Terlebih Dahulu

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.

Verifikasi Koneksi

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.

Contoh Penggunaan Nyata

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.

Mengontrol Apa yang Bisa Dilihat Claude

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.

Menghubungkan ke Database Remote

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.

Beberapa Database

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.

Yang Berubah dalam Praktik

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.