Pendahuluan

Server MCP memungkinkan lo menghubungkan sumber data kustom dan membuatnya bisa dipakai langsung di dalam Cursor. Ini sangat berguna ketika lo butuh konteks dari tempat seperti browser, database, atau log error dan sistem. Menyiapkan server MCP itu sederhana, dan dengan Cursor bisa dilakukan dengan cepat. Di panduan ini, kita akan ngebahas cara membangun server MCP buat Postgres. Tujuan kita adalah bikin Cursor bisa menjalankan kueri SQL langsung ke database Postgres dan mengekspos skema tabel secara terstruktur.
Tutorial ini dirancang untuk ngajarin fundamental membangun server MCP.

Apa itu MCP Server?

Server MCP adalah proses yang berkomunikasi dengan Cursor dan menyediakan akses ke data atau tindakan eksternal. Ini bisa diimplementasikan dengan beberapa cara, tapi di sini kita akan pakai metode paling sederhana: server yang berjalan lokal di komputermu lewat stdio (stream masukan/keluaran standar). Ini menghindari pertimbangan keamanan yang rumit dan memungkinkan kita fokus pada logika MCP itu sendiri. Salah satu use case paling umum untuk MCP adalah akses database. Saat membangun dashboard, menjalankan analisis, atau membuat migration, sering kali perlu melakukan query dan menginspeksi database. Server MCP Postgres kita akan mendukung dua kapabilitas inti: menjalankan query arbitrer dan menampilkan daftar skema tabel. Meski kedua tugas ini bisa dikerjakan dengan SQL biasa, MCP menawarkan fitur yang membuatnya lebih kuat dan lebih umum berguna. Tools menyediakan cara untuk mengekspos tindakan seperti mengeksekusi query, sementara resources memungkinkan kita berbagi konteks terstandarisasi seperti informasi skema. Nanti dalam panduan ini kita juga akan melihat prompts, yang memungkinkan alur kerja yang lebih advanced. Di balik layar, kita akan mengandalkan paket npm postgres untuk mengeksekusi pernyataan SQL ke database. MCP SDK akan berfungsi sebagai pembungkus (wrapper) di sekitar pemanggilan ini, sehingga kita bisa mengintegrasikan fungsionalitas Postgres secara mulus ke dalam Cursor.

Cara Membangun MCP Server

Langkah pertama membangun server adalah men-setup proyek baru. Kita bakal mulai dengan bikin folder baru dan inisialisasi proyek Bun
> mkdir postgres-mcp-server
> Bun init
Dari sini, pilih proyek Blank. Setelah boilerplate selesai di-setup, kita perlu instal dependensi yang dibutuhkan. zod diperlukan untuk mendefinisikan skema untuk i/o di MCP SDK
bun add postgres @modelcontextprotocol/sdk zod
Berikutnya, kita bakal buka repo masing-masing library dan ambil tautan ke konten mentah file README masing-masing. Ini bakal kita pakai sebagai konteks saat membangun server Sekarang, kita bakal mendefinisikan bagaimana server seharusnya berperilaku. Untuk itu, kita bikin spec.md dan tulis tujuan tingkat tinggi
# Spec

- Izinkan mendefinisikan DATABASE_URL lewat konfigurasi env MCP
- Query data Postgres lewat tool
  - Secara default, readonly
  - Izinkan operasi tulis dengan menyetel ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Akses tabel sebagai `resources`
- Pakai Zod untuk definisi skema
Seperti yang kelihatan, ini spesifikasi yang cukup ringan. Feel free buat nambah detail sesuai kebutuhan. Bareng tautan README, kita bakal nyusun prompt final
Baca yang berikut dan ikuti @spec.md untuk paham apa yang kita mau. Semua dependensi yang diperlukan sudah terinstal
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
Dengan tiga komponen ini (spesifikasi, dokumentasi MCP SDK, dan dokumentasi library Postgres), kita bisa pakai Cursor buat scaffold implementasi server. Cursor bakal bantu nyatuin semua bagian, menghasilkan kode yang menghubungkan MCP SDK dengan Postgres. Setelah beberapa kali prompt bolak-balik, sekarang kita punya versi pertama MCP server yang jalan. Buat nyoba, kita bisa pakai MCP Inspector
npx @modelcontextprotocol/inspector bun run index.ts

Menguji Server MCP

Setelah implementasi awal selesai, kita bisa mengujinya pakai MCP Inspector. Inspector memberi cara buat melihat apa yang diekspos server dan memverifikasi bahwa tools dan resources berperilaku seperti yang diharapkan. Kita perlu memastikan query bisa dieksekusi dan informasi skema dikembalikan dengan benar. Antarmuka MCP Inspector Kalau semuanya terlihat oke, kita bisa menghubungkan server langsung ke Cursor dan mengujinya di lingkungan nyata. Pada tahap ini, Cursor bisa menggunakan server MCP Postgres seolah-olah itu kemampuan bawaan, sehingga kita bisa menjalankan query dan menginspeksi database secara langsung.

Langkah Berikutnya

Menjalankan server MCP secara lokal via stdio adalah titik awal yang bagus, tapi tim sering butuh akses bersama ke database yang sama lewat server MCP mereka. Dalam skenario seperti ini, men-deploy server MCP sebagai layanan HTTP terpusat jadi perlu. Server MCP yang di-deploy menawarkan beberapa keunggulan dibanding instance stdio individual:
  • Akses database bersama: Banyak anggota tim bisa melakukan query ke instance database yang sama lewat Cursor
  • Konfigurasi terpusat: Pembaruan skema dan perubahan izin dikelola di satu tempat
  • Keamanan yang lebih baik: Autentikasi, rate limiting, dan kontrol akses yang tepat bisa diterapkan
  • Observability: Pola penggunaan dan metrik performa bisa dipantau di seluruh tim
Untuk mewujudkannya, kamu cukup mengganti metode transport dari stdio ke HTTP. Walaupun kita nggak akan membahas seluruh setup-nya, ini prompt awal yang bagus yang bisa kamu kasih ke Cursor
Based on the existing MCP server, create a new file that implements the HTTP protocol.

Move shared logic to mcp-core, and name each transport implementation by name (mcp-server-stdio, mcp-server-http)

@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md 
Hasil akhirnya bisa dilihat di sini: pg-mcp-server