Database & MCP

Panduan Supabase MCP Server: Hubungkan AI Agent ke Postgres

Jawaban Cepat: Supabase MCP Server menghubungkan agen otonom (Claude Code, Cursor, Windsurf) ke PostgreSQL melalui Model Context Protocol. Alat ini menyediakan introspeksi skema langsung, eksekusi SQL aman, dan pencarian semantik pgvector. Untuk penerapan produksi yang aman, terapkan kredensial hanya-baca (read-only), pooling koneksi PgBouncer/Supavisor (port 6543), batas waktu kueri, dan validasi AST SQL.


1. Pendahuluan: Perkembangan Autonomous Database AI Agent

Pada tahun 2026, agen pengembangan perangkat lunak otonom seperti Claude Code (claude mcp), Cursor, dan agen DBA khusus telah berevolusi melampaui sekadar sintesis kode menjadi pengelola keandalan sistem database seutuhnya. Alih-alih mengandalkan skrip DDL statis dan migrasi manual, agen AI modern mengeksplorasi katalog PostgreSQL, mendiagnosis hambatan indeks, dan memantau metrik produksi secara real-time.

Namun, menghubungkan LLM otonom langsung ke database produksi memicu risiko keamanan serius:

  • Halusinasi DDL/DML yang Merusak: Eksekusi tidak sengaja atas perintah DROP TABLE, TRUNCATE, atau UPDATE ... WHERE tanpa indeks pada jutaan baris data.
  • Koneksi Habis (Connection Exhaustion): Loop agen paralel yang memicu ratusan panggilan alat sekaligus, menghabiskan batas max_connections PostgreSQL dan melumpuhkan aplikasi.
  • SQL Injection & Eskalasi Hak Akses: Serangan prompt injection melalui input pengguna yang memanipulasi agen untuk menjalankan kueri istimewa atau mencuri data sensitif.
  • Ledakan Jendela Konteks: Memasukkan seluruh skema relasional berisi ratusan tabel ke prompt, menghabiskan kuota token dan melipatgandakan biaya inferensi API.

Model Context Protocol (MCP) dari Anthropic menetapkan antarmuka JSON-RPC 2.0 yang aman dan terstandarisasi antara agen AI dan mesin database. Ketika dipadukan dengan Supabase—platform cloud Postgres sumber terbuka dengan pgvector, connection pooler PgBouncer / Supavisor, dan Row-Level Security (RLS)—pengembang dapat membangun agen database mandiri yang aman dan berkinerja tinggi.


2. Arsitektur: Bagaimana MCP Menjembatani LLM dan PostgreSQL

Model Context Protocol mengisolasi runtime agen AI host dari database melalui proses jembatan ringan yang berkomunikasi melalui subproses lokal (stdio) atau transportasi jarak jauh SSE (HTTP/2).

+----------------------------------------------------------------------------------------------------+
|                                      HOST AI AGENT RUNTIME                                         |
|                       (Claude Code CLI, Cursor IDE, Windsurf, Custom Agent)                        |
|                                                                                                    |
|    +--------------------------+                                 +-----------------------------+    |
|    |    User Prompt Loop      |                                 |     Model Context Window    |    |
|    |  "Find top 10 users..."  |                                 | (System Prompt + MCP Tools) |    |
|    +------------+-------------+                                 +--------------^--------------+    |
|                 |                                                              |                   |
|                 | Dispatches Tool Call: execute_sql                            | Receives Schema / |
|                 v                                                              | Query Result Rows |
|    +---------------------------------------------------------------------------+--------------+    |
|    |                                      MCP CLIENT SUBSYSTEM                                |    |
|    |  - Capabilities Negotiation & Protocol Handshake (JSON-RPC 2.0)                          |    |
|    |  - Tool Call Serialization & Permission Policy Enforcement                               |    |
|    +---------------------------------------------+--------------------------------------------+    |
+--------------------------------------------------|-------------------------------------------------+
                                                   | Transport: stdio / SSE
                                                   v
+----------------------------------------------------------------------------------------------------+
|                                    SUPABASE / POSTGRES MCP SERVER                                  |
|                                                                                                    |
|    +----------------------+   +-----------------------+   +-----------------------------------+    |
|    | Schema Introspection |   | Read-Only Query Guard |   | pgvector Similarity Search        |    |
|    | - list_tables        |   | - AST parser / regex  |   | - semantic_search                 |    |
|    | - describe_table     |   | - statement_timeout   |   | - hybrid_search                   |    |
|    +----------+-----------+   +-----------+-----------+   +-----------------+-----------------+    |
|               |                           |                                 |                      |
+---------------|---------------------------|---------------------------------|----------------------+
                |                           |                                 |
                +---------------------------+---------------------------------+
                                            |
                                            v  Encrypted TLS Connection
+----------------------------------------------------------------------------------------------------+
|                                    SUPABASE POSTGRESQL INFRASTRUCTURE                              |
|                                                                                                    |
|    +------------------------------------------------------------------------------------------+    |
|    |                         SUPAVISOR / PGBOUNCER CONNECTION POOLER                          |    |
|    |  - Port 6543 (Transaction Mode) | Max 10,000 Client Conns | Shared Server Worker Pool    |    |
|    +----------------------------------------------+-------------------------------------------+    |
|                                                   | Internal Unix Socket / Local Loopback          |
|                                                   v                                                |
|    +------------------------------------------------------------------------------------------+    |
|    |                               POSTGRESQL 16/17 DATABASE ENGINE                            |    |
|    |  - Role: readonly_agent (NO DDL, SELECT only)                                            |    |
|    |  - Row Level Security (RLS) Policies                                                     |    |
|    |  - Extensions: pgvector, pg_stat_statements, pg_cron                                     |    |
|    +------------------------------------------------------------------------------------------+    |
+----------------------------------------------------------------------------------------------------+

Arsitektur: Bagaimana MCP Menjembatani LLM dan PostgreSQL - Core Responsibilities

  1. Introspeksi Skema Dinamis: Agen hanya meminta struktur tabel yang relevan (list_tables, describe_table), mencegah penumpukan token yang tidak diperlukan dalam konteks model.
  2. Eksekusi SQL Deterministik: Kueri dieksekusi dalam batasan transaksi yang aman dan dilindungi batas waktu ketat (statement_timeout = '5000ms').
  3. Pencarian Vektor Asli pgvector: Mengakses langsung indeks HNSW dan IVFFlat untuk RAG hibrida tanpa memerlukan database vektor eksternal.
  4. Isolasi Kredensial: Agen tidak pernah menyentuh kata sandi superuser; akses dikelola melalui peran khusus hanya-baca dengan hak istimewa minimal.

3. Tolok Ukur: Supabase MCP vs PostgreSQL MCP vs Direct ORM

Tim teknik LLMPodium melakukan pengujian beban terhadap tiga metode integrasi: server resmi @supabase/mcp-server-supabase, server komunitas PostgreSQL MCP, dan eksekusi langsung melalui Prisma CLI.

Benchmark Methodology

Pengujian dilakukan pada instans Supabase Pro (2 vCPU, RAM 8 GB, AWS us-east-1) dengan 50 sesi agen simultan:

  • Beban Kerja A (Penemuan Skema): Memetakan topologi 45 tabel relasional dan 280 foreign key.
  • Beban Kerja B (Kueri Analitis): 1.000 kueri JOIN multi-tabel dan agregasi data.
  • Beban Kerja C (Konkurensi Tinggi): 50 loop agen mengeksekusi operasi baca secara bersamaan.
+-----------------------------------------------------------------------------------------------------------------------+
|                                    DATABASE AI AGENT ADAPTER BENCHMARK MATRIX (2026)                                  |
+-------------------------------------+------------------+-------------+-----------+-----------+------------+-----------+
| Adapter Implementation              | Transport Method | Schema TTFT | Query p50 | Query p99 | Max Conns  | Prompt KB |
+-------------------------------------+------------------+-------------+-----------+-----------+------------+-----------+
| Supabase MCP (Supavisor Pooler)     | stdio (Node.js)  | 28 ms       | 12.4 ms   | 48.2 ms   | 10,000+    | 1.8 KB    |
| Community PostgreSQL MCP            | stdio (TypeScript) 34 ms      | 14.1 ms   | 185.0 ms* | 90 (Cap)   | 4.2 KB    |
| Direct Agent via Prisma ORM CLI     | Subprocess Exec  | 142 ms      | 62.0 ms   | 240.0 ms  | 60 (Cap)   | 12.5 KB   |
| Remote SSE Supabase Gateway         | HTTP/2 SSE       | 86 ms       | 42.0 ms   | 110.0 ms  | 5,000+     | 2.1 KB    |
+-------------------------------------+------------------+-------------+-----------+-----------+------------+-----------+

Key Performance Findings

  • Supavisor / PgBouncer Mutlak Diperlukan: Koneksi langsung port 5432 langsung gagal pada 50 thread simultan (FATAL: remaining connection slots are reserved). Supabase MCP melalui port 6543 berhasil menangani lebih dari 10.000 sesi virtual secara stabil.
  • Penghematan Konteks Signifikan: Supabase MCP hanya menggunakan 1.8 KB ruang konteks untuk definisi alat, dibandingkan 12.5 KB saat memuat skema Prisma lengkap.
  • Latensi di Bawah 15ms: Overhead komunikasi stdio lokal kurang dari 1ms, memastikan performa asli mesin PostgreSQL tetap terjaga.

4. Panduan Konfigurasi: Claude Code dan Cursor

Mengonfigurasi Supabase MCP pada Claude Code dan Cursor membutuhkan waktu kurang dari lima menit dengan mengikuti prinsip hak akses terendah.

Prasyarat: Membuat Peran Agen Khusus Hanya-Baca (Read-Only)

-- 1. Create dedicated agent user role
CREATE ROLE agent_readonly WITH LOGIN PASSWORD 'SecureAgentPassphrase2026!';

-- 2. Grant connection rights to target database
GRANT CONNECT ON DATABASE postgres TO agent_readonly;

-- 3. Grant schema usage
GRANT USAGE ON SCHEMA public TO agent_readonly;

-- 4. Grant read-only access to existing and future tables
GRANT SELECT ON ALL TABLES IN SCHEMA public TO agent_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON ALL TABLES TO agent_readonly;

-- 5. Revoke destructive permissions explicitly
REVOKE CREATE ON SCHEMA public FROM agent_readonly;
REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM agent_readonly;

-- 6. Enforce statement timeouts (kills rogue queries after 5 seconds)
ALTER ROLE agent_readonly SET statement_timeout = '5000ms';
ALTER ROLE agent_readonly SET lock_timeout = '2000ms';

Integrasi A: Claude Code (CLI)

Claude Code mendukung server MCP secara bawaan melalui perintah terminal atau berkas konfigurasi.

#### Method 1: Interactive Terminal Command

# Add the Supabase MCP server via npx
claude mcp add supabase-db -- npx -y @supabase/mcp-server-supabase \
  --db-url "postgresql://agent_readonly:SecureAgentPassphrase2026!@aws-0-us-east-1.pooler.supabase.com:6543/postgres?sslmode=require"

#### Method 2: Global Configuration File

{
  "mcpServers": {
    "supabase": {
      "command": "npx",
      "args": [
        "-y",
        "@supabase/mcp-server-supabase"
      ],
      "env": {
        "SUPABASE_DB_URL": "postgresql://agent_readonly:SecureAgentPassphrase2026!@aws-0-us-east-1.pooler.supabase.com:6543/postgres?sslmode=require",
        "SUPABASE_ACCESS_TOKEN": "sbp_your_personal_access_token_here",
        "SUPABASE_PROJECT_REF": "your-project-ref"
      }
    }
  }
}

Integrasi B: Cursor IDE

Cursor mendukung Model Context Protocol langsung di menu setelan (Features > MCP) atau dengan menambahkan berkas .cursor/mcp.json di direktori utama proyek.

{
  "mcpServers": {
    "supabase-db": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://agent_readonly:SecureAgentPassphrase2026!@aws-0-us-east-1.pooler.supabase.com:6543/postgres?sslmode=require"
      ]
    }
  }
}

5. Keamanan Mendalam: Sandboxing, Connection Pooling & Anti-Injeksi

Memberikan akses eksekusi database kepada agen AI membutuhkan strategi pertahanan berlapis. Jangan pernah hanya mengandalkan instruksi prompt (seperti 'Tolong jangan ubah data').

+----------------------------------------------------------------------------------------------------+
|                                    DEFENSE-IN-DEPTH AGENT SECURITY LAYERS                          |
+-------------------+------------------------------------+-------------------------------------------+
| Defense Layer     | Mechanism                          | Threat Mitigated                          |
+-------------------+------------------------------------+-------------------------------------------+
| 1. PostgreSQL RBAC| Read-Only User Role (`agent_readonly`) Arbitrary DROP, INSERT, UPDATE, DELETE       |
| 2. Connection Pool| Supavisor / PgBouncer Port 6543    | Max Connection Exhaustion & Server Denial |
| 3. Execution Guard| `statement_timeout = '5000ms'`     | Infinite Loops & Cartesian Join Freezes   |
| 4. Client Boundary| Read-Only Toolset (`read_query`)   | DDL Execution via Parameter Injection     |
| 5. Query Auditing | `pg_stat_statements` + Access Log  | Stealth Exfiltration & Anomalous Scans    |
| 6. Data Isolation | Row-Level Security (RLS)           | Cross-Tenant Customer Record Exposure     |
+-------------------+------------------------------------+-------------------------------------------+

1. Connection Pooling: Port Langsung 5432 vs Pool Transaksional 6543

Agen menghasilkan lonjakan koneksi cepat. Port 5432 mengalokasikan proses baru per koneksi (5-10 MB RAM) yang memicu crash saat terjadi konkurensi. Port 6543 Supavisor melepaskan koneksi segera setelah transaksi selesai, melayani ribuan klien secara simultan.

# ❌ NEVER use port 5432 for agent workflows in production:
# postgresql://user:pass@db.xyz.supabase.co:5432/postgres

# ✅ ALWAYS use port 6543 with transaction pooling:
# postgresql://user:pass@aws-0-us-east-1.pooler.supabase.com:6543/postgres?sslmode=require

2. Mitigasi SQL Injection pada Alur Kerja Agen

Penggabungan string kueri langsung adalah kerentanan fatal. Pada server MCP produksi, gunakan parser AST untuk memastikan hanya kueri SELECT dan EXPLAIN yang diizinkan untuk dieksekusi.

import { Parser } from 'node-sql-parser';

const parser = new Parser();

// ✅ SECURE: Strict AST parsing and parameterized inputs
export function validateAndExecuteReadOnlySQL(sql: string) {
  const ast = parser.astify(sql);
  
  // Enforce single-statement queries only
  if (Array.isArray(ast) && ast.length > 1) {
    throw new Error('Multi-statement execution rejected by security policy.');
  }

  const singleAst = Array.isArray(ast) ? ast[0] : ast;
  
  // Whitelist SELECT and EXPLAIN only
  if (singleAst.type !== 'select') {
    throw new Error(`Forbidden operation: ${singleAst.type.toUpperCase()}. Agent is read-only.`);
  }

  return true;
}

6. Studi Kasus Nyata: Agen DBA Otonom untuk Diagnostik

Pada platform e-commerce dengan 10 juta transaksi, Claude Code mendeteksi kueri lambat melalui Supabase MCP dan mengoptimalkan indeks secara otomatis:

Autonomous DBA Agent Execution Log

$ claude "Identify the 3 slowest queries in production from pg_stat_statements and check for missing indexes."

[Supabase MCP] -> Calling tool: execute_sql
Parameters: {
  "query": "SELECT query, calls, total_exec_time / calls AS avg_time_ms FROM pg_stat_statements ORDER BY avg_time_ms DESC LIMIT 3;"
}

[Supabase MCP] <- Result:
1. SELECT * FROM orders WHERE customer_id = $1 AND status = 'pending'; (avg_time_ms: 482.4ms, calls: 42,910)
2. SELECT * FROM order_items WHERE tracking_number = $1; (avg_time_ms: 312.1ms, calls: 8,400)
3. SELECT date_trunc('day', created_at), sum(total_amount) FROM orders GROUP BY 1; (avg_time_ms: 289.0ms, calls: 140)

[Claude Code Analysis]
Query #1 is an index scan bottleneck on 'orders'. Let me inspect current indexes on the 'orders' table.

[Supabase MCP] -> Calling tool: describe_table
Parameters: { "table_name": "orders" }

[Supabase MCP] <- Result:
Columns: id (uuid), customer_id (uuid), status (text), total_amount (numeric), created_at (timestamp)
Indexes: orders_pkey (PRIMARY KEY, btree, id)

[Claude Code Recommendation]
Found issue: Table 'orders' has NO index on 'customer_id' or 'status'. Sequential scan across 8,400,000 rows.
Recommended Remediation:
CREATE INDEX CONCURRENTLY idx_orders_customer_status ON orders (customer_id, status) WHERE status = 'pending';
Estimated query latency reduction: 482ms -> 1.4ms (99.7% improvement).

Agen mendeteksi kueri bermasalah di pg_stat_statements (482ms), memeriksa indeks tabel dengan describe_table, dan mengusulkan pembuatan indeks non-blocking CREATE INDEX CONCURRENTLY, memangkas latensi menjadi 1.4ms (efisiensi 99.7%).


7. Analisis Biaya dan TCO Bulanan

Biaya operasional agen database menggabungkan infrastruktur database cloud dan konsumsi token LLM:

+----------------------------------------------------------------------------------------------------+
|                               DATABASE AI AGENT INFRASTRUCTURE TCO (MONTHLY)                       |
+------------------------------------+--------------------------+------------------+-----------------+
| Component                          | Tier / Specification     | Usage Estimate   | Monthly Cost    |
+------------------------------------+--------------------------+------------------+-----------------+
| Supabase Pro Cloud Instance        | Compute: 2 vCPU, 8 GB    | 1 Production DB  | $25.00          |
| Supavisor Connection Pooler        | Built-in Managed Pooler  | 10,000 max conns | Included ($0.00)|
| pgvector Storage (Vector RAG)      | 15 GB NVMe Vector Data   | 2M embeddings    | Included ($0.00)|
| Claude 3.7 Sonnet Inference (Agent)| 120M Input / 18M Output  | 4,000 agent runs | $540.00         |
| DeepSeek V3 (Alternative Agent)    | 120M Input / 18M Output  | 4,000 agent runs | $21.84          |
| Hetzner Cloud VPS (Agent Host)     | CAX11 (2 vCPU, 4GB RAM)  | 24/7 Agent Daemon| $4.15           |
+------------------------------------+--------------------------+------------------+-----------------+
| Total Monthly Cost (Claude 3.7)    | Enterprise Tier          | 4,000 runs/mo    | $569.15         |
| Total Monthly Cost (DeepSeek V3)   | Cost-Optimized Tier      | 4,000 runs/mo    | $51.00          |
+------------------------------------+--------------------------+------------------+-----------------+

Key Economic Takeaway

Menggunakan model mutakhir yang hemat biaya seperti DeepSeek V3 atau Qwen 2.5 Coder untuk tugas rutin memangkas biaya operasional hingga lebih dari 90% (dari $569 menjadi $51 per bulan) dengan akurasi analisis SQL yang setara.


8. Ringkasan dan Checklist untuk Enterprise

Menghubungkan Supabase dengan Claude Code/Cursor melalui Model Context Protocol mempercepat pengembangan aplikasi secara dramatis. Patuhi panduan keamanan produksi berikut:

  1. Kontrol Akses Berbasis Peran (RBAC): Jangan pernah memberikan hak superuser; gunakan peran khusus agent_readonly.
  2. Selalu Gunakan Port 6543 (Supavisor): Lindungi database dari kehabisan koneksi dengan mode transaksi.
  3. Terapkan Batas Waktu Kueri Ketat: Atur statement_timeout = '5000ms' untuk menghentikan kueri tak terkendali.
  4. Validasi Kueri dengan Parser AST: Cegah eksekusi perintah modifikasi data di level server MCP.
  5. Pantau Kinerja dengan pg_stat_statements: Catat dan tinjau seluruh kueri yang dijalankan agen secara berkala.
← Semua artikel
0 / 4