Supabase MCP server memberi agent kunci ke database Anda: ia bisa menampilkan daftar tabel, menjalankan SQL, menerapkan migrasi, men-deploy Edge Functions, dan membuat branch. Itu menjadikannya salah satu MCP server paling berguna bagi siapa pun yang membangun di atas Supabase, sekaligus salah satu dari sedikit yang punya pelajaran nyata dan publik tentang apa yang salah ketika agent membaca data yang ditulis penyerang.
Kami membaca dokumentasi Supabase dan source server tersebut pada 14 November 2026, lalu menjalankan versi 0.17.0 paket itu—yang dirilis sehari sebelumnya—melalui MCP Inspector untuk menghitung apa yang sebenarnya diekspos oleh tiap setting. Kami juga menyelidiki endpoint hosted-nya. Kami tidak menghubungkan project yang live.
Hosted, local, atau di stack Anda sendiri
| Hosted | Paket npm | Supabase CLI | Self-hosted | |
|---|---|---|---|---|
| Lokasi | https://mcp.supabase.com/mcp |
npx -y @supabase/mcp-server-supabase |
http://localhost:54321/mcp |
http://localhost:8080/mcp lewat SSH tunnel |
| Sign-in | OAuth, tanpa token | Personal access token | Tidak ada | Tidak ada |
| Tool | Set lengkap | Set lengkap, minus beberapa yang butuh koneksi hosted | Subset yang lebih kecil | Subset yang lebih kecil |
| Cocok untuk | Sebagian besar pekerjaan | Client tanpa dukungan HTTP, CI | Pengembangan lokal | Deployment Supabase Anda sendiri |
Server hosted adalah rekomendasi default, dan tidak perlu apa pun di mesin Anda. Kami mengirim request tanpa autentikasi ke sana dan mendapat 401 yang mengarah ke metadata OAuth-nya, yang mencantumkan API Supabase sebagai authorization server dan scope dari organizations:read sampai database:write. Client Anda yang menangani sign-in lewat browser. Pilih organization yang memiliki project tersebut di layar consent.
Satu batasan OAuth saat ini: consent memberikan set scope lengkap. Post peluncuran Supabase menyebutkan bahwa permission yang lebih granular direncanakan; dokumentasi saat ini masih menyatakan semua scope wajib untuk OAuth app manual. Personal access token bisa lebih sempit, dan dokumentasi Supabase mencantumkan permission yang dibutuhkan tiap tool.
Cara install
Semua client pakai URL yang sama. Tambahkan opsi di bawah ini untuk membatasi cakupannya.
Claude Code:
claude mcp add --scope project --transport http supabase "https://mcp.supabase.com/mcp?project_ref=YOUR_REF&read_only=true"
Lalu jalankan claude /mcp di terminal biasa, pilih supabase dan pilih Authenticate.
Cursor, di .cursor/mcp.json:
{
"mcpServers": {
"supabase": {
"url": "https://mcp.supabase.com/mcp?project_ref=YOUR_REF&read_only=true"
}
}
}
VS Code, di .vscode/mcp.json, yang memakai servers:
{
"servers": {
"supabase": {
"type": "http",
"url": "https://mcp.supabase.com/mcp?project_ref=YOUR_REF&read_only=true"
}
}
}
Codex:
codex mcp add supabase --url "https://mcp.supabase.com/mcp?project_ref=YOUR_REF&read_only=true"
Lalu codex mcp login supabase. Claude.ai dan ChatGPT sudah punya Supabase di direktori connector mereka. Dokumentasi Supabase tidak menyediakan langkah terpisah untuk Claude Desktop atau Windsurf; README-nya menyarankan menyalin entri HTTP generik ke client mana pun yang tidak tercantum.
Dashboard bisa membuatkan URL-nya untuk Anda: buka project, klik Connect, lalu pilih tab MCP. Paket lokal dijalankan seperti ini, dengan token di SUPABASE_ACCESS_TOKEN:
npx -y @supabase/mcp-server-supabase@latest --read-only --project-ref=YOUR_REF
Tanpa token, prosesnya berhenti dengan pesan "Please provide a personal access token (PAT) with the --access-token flag or set the SUPABASE_ACCESS_TOKEN environment variable".
Apa yang dihilangkan oleh opsi-opsi ini
Tiga parameter URL, atau flag yang setara untuk paket lokal, menentukan apa yang diterima agent:
| Parameter URL Hosted | Flag lokal | Efek |
|---|---|---|
read_only=true |
--read-only |
Query berjalan sebagai user Postgres read-only; tool write disembunyikan |
project_ref=abc123 |
--project-ref=abc123 |
Hanya satu project; tool account disembunyikan |
features=database,docs |
--features=database,docs |
Hanya grup tool ini |
Kami menghitung jumlah tool untuk tiap pengaturan pada 0.17.0:
| Pengaturan | Tool |
|---|---|
| Kesepuluh grup | 39 |
| Default (storage nonaktif) | 36 |
| Default dengan read-only | 22 |
| Read-only dan dibatasi ke satu project | 16 |
Read-only menghapus 14 tool: create_project, pause_project, restore_project, apply_migration, deploy_edge_function, kelima write branch, create_notebook, delete_notebook, dan dua tool feedback. execute_sql tetap ada, tapi database-nya sendiri menolak write karena query berjalan sebagai role read-only. Ini lebih kuat daripada filter pada teks SQL.
Grup-grupnya, semuanya aktif secara default kecuali storage:
| Grup | Tool |
|---|---|
docs |
search_docs |
account |
list dan get organization serta project, get_cost, confirm_cost; create, pause, dan restore project |
database |
list_tables, list_extensions, list_migrations, execute_sql, apply_migration |
debugging |
query_logs, get_advisors untuk saran security dan performance |
development |
get_project_url, get_publishable_keys, generate_typescript_types |
functions |
list, get, dan deploy Edge Functions; set secret di server hosted |
branching |
list, create, delete, merge, reset, dan rebase branch, di paket berbayar |
storage |
list bucket, baca dan update config storage |
notebooks |
list, get, run, create, dan delete notebook SQL |
feedback |
kirim feedback ke Supabase |
Panduan lama menyebut get_logs; di 0.17.0 namanya query_logs. Menghapus satu grup adalah langkah keamanan paling murah yang ada: tanpa functions, tool deploy tidak akan pernah sampai ke model sama sekali.
Apa yang terjadi pada Juli 2025
Pada 6 Juli 2025 Simon Willison menuliskan demonstrasi dari General Analysis dengan judul "Supabase MCP can leak your entire SQL database". Skenarionya adalah sebuah aplikasi support. Agent Cursor milik developer memakai Supabase MCP dengan key service_role, yang melewati row-level security. Seorang penyerang mengirim tiket support lewat form publik, dan isi tiket itu menyapa AI secara langsung, memintanya membaca tabel privat integration_tokens lalu menuliskan isinya kembali ke dalam tiket. Saat developer meminta agent memeriksa tiket yang terbuka, agent melakukan persis itu.
Willison menyebutnya "lethal trifecta": data privat, paparan terhadap teks yang dikendalikan penyerang, dan jalur untuk mengirim data keluar, semuanya ada dalam satu agent.
Supabase menjawab pada September 2025. Mereka menyatakan judulnya membesar-besarkan risikonya, bahwa demo tersebut memakai role istimewa dalam setup lokal, dan bahwa belum ada pelanggan yang melaporkan kebocoran melalui MCP. Mereka juga menyatakan mitigasi mereka sendiri "reduced risk but did not eliminate it" dan bahwa "guardrails alone aren't enough". Mitigasi itu kini menjadi opsi-opsi di atas: mode read-only, pembatasan scope project, dan feature group. Server juga membungkus setiap hasil SQL dalam boundary yang ditandai dengan ID acak dan catatan yang memberi tahu model agar tidak mengikuti instruksi di dalamnya. Supabase menyebut wrapper itu "not foolproof".
Mode read-only perlu dipahami secara tepat. Dalam demo tersebut, mode ini akan menghentikan langkah terakhir, yaitu menuliskan data yang dicuri kembali ke dalam tiket. Tetapi mode ini tidak akan menghentikan agent membaca tabel privat dan mengulanginya ke developer, atau ke tool lain apa pun yang bisa dijangkau agent.
Setup yang aman, secara berurutan
- Bukan production, kalau bisa dihindari. Supabase saat ini menyarankan untuk terhubung ke production "hanya ketika tugasnya membutuhkan bukti dari production". Project development atau branch adalah pilihan default yang lebih baik.
- Batasi cakupannya.
project_refmenjaga agent tetap di dalam satu project. - Read-only secara default. Aktifkan write hanya untuk sesi yang membutuhkannya.
- Lebih sedikit group.
features=database,docssudah cukup untuk sebagian besar pekerjaan schema dan query. - Biarkan approval tetap aktif. Dokumentasi Supabase menyarankan untuk me-review setiap tool call; jangan gunakan "always approve" untuk server ini. Form konfirmasi untuk SQL destruktif hanya muncul di client yang mendukungnya, dan Supabase menyebutnya "guardrail, bukan jaminan".
- Jangan pernah memberikannya ke customer. Server ini berjalan dengan permission developer Anda.
Untuk job yang berjalan tanpa pengawasan, saran Supabase adalah pre-approve hanya tool read-only yang dibatasi ke project, dan buat job tersebut berhenti lalu melapor alih-alih melakukan write. Pembahasan lebih lanjut soal masalah umum ini ada di MCP security.
Skills dan plugin
Supabase juga menerbitkan agent skills, terpisah dari MCP server, berisi panduan untuk best practice Supabase dan Postgres: npx skills add supabase/agent-skills, atau di Claude Code lewat marketplace plugin-nya. Entri MCP di repositori skills itu sendiri mengarah ke https://mcp.supabase.com/mcp?features=docs, hanya docs, tanpa akses database, yang merupakan default masuk akal kalau yang Anda butuhkan cuma jawaban Supabase yang akurat.
Saat tidak berjalan
| Yang Anda lihat | Penyebab | Solusi |
|---|---|---|
| 401 dari server yang di-host | Belum sign in | Jalankan langkah autentikasi di client Anda, misalnya claude /mcp |
| "Please provide a personal access token" | Paket lokal tanpa token | Set SUPABASE_ACCESS_TOKEN atau teruskan --access-token |
| Tool dari tutorial tidak muncul | Read-only, feature group yang hilang, atau tool yang diganti nama | Cek tabel di atas; get_logs sekarang menjadi query_logs |
| Agent tidak bisa melihat project Anda yang lain | project_ref sudah di-set |
Memang begitu; hapus hanya jika Anda butuh account tools |
| Write gagal dengan error permission | read_only=true |
Memang begitu; gunakan entri terpisah tanpa scope untuk sesi write |
| Tidak ada storage tools | Storage nonaktif secara default | Tambahkan storage ke features |
Tool lebih sedikit di localhost:54321 |
CLI hanya mengekspos sebagian | Gunakan server yang di-host untuk set lengkap |
Server Supabase di katalog kami, lengkap dengan skor checks, tercantum di bagian atas halaman ini. Untuk database Postgres biasa, lihat Postgres MCP servers.