Cara Menjalankan MCP Server di VPS: Deployment, HTTPS, hingga Pengujian
MCP server sering kali mulai dari lingkungan yang sederhana. Kamu membuat server di laptop, menjalankannya melalui stdio, lalu menghubungkannya dengan MCP client untuk mencoba beberapa tool.
Model tersebut bekerja dengan baik selama server hanya digunakan secara lokal. Kebutuhannya berubah ketika MCP server harus tersedia untuk anggota tim, automation, atau aplikasi lain yang berjalan dari mesin berbeda.
Pada kondisi tersebut, server perlu dipindahkan ke lingkungan yang dapat berjalan terus-menerus dan dapat diakses melalui jaringan. VPS menjadi salah satu pilihan karena kamu mendapatkan sistem operasi, IP publik, resource komputasi, serta kontrol penuh terhadap konfigurasi server.
Artikel ini membahas cara menjalankan MCP server di VPS mulai dari persiapan sistem operasi, deployment menggunakan Node.js, konfigurasi Streamable HTTP, HTTPS, autentikasi, firewall, logging, sampai pengujian akhir.
Memahami Arsitektur MCP Server yang Berjalan di VPS
MCP server lokal dan MCP server remote memiliki pola deployment yang berbeda.
Pada deployment lokal, MCP client biasanya menjalankan server sebagai proses lokal melalui stdio. Proses tersebut hidup mengikuti aplikasi client yang memanggilnya.
Pada deployment remote, MCP server berdiri sebagai layanan terpisah. Client mengirim request melalui jaringan ke endpoint MCP yang tersedia pada server.
Spesifikasi MCP 2026-07-28 mendefinisikan dua standard transport binding utama, yaitu stdio dan Streamable HTTP. Untuk server yang ingin diakses melalui jaringan, Streamable HTTP menjadi pilihan yang sesuai karena setiap pesan MCP dapat dikirim melalui HTTP POST menuju satu endpoint.
Secara sederhana, arsitektur yang akan kita bangun terlihat seperti berikut.
MCP Client → HTTPS → Nginx → MCP Server Node.js → Tool/API/Database
Nginx menerima trafik publik pada port 443. Aplikasi Node.js hanya mendengarkan koneksi lokal, sehingga port aplikasi tidak perlu dibuka langsung ke internet.
Struktur tersebut memberikan batas yang lebih jelas antara transport publik dan aplikasi MCP yang menjalankan tool.
1. Menyiapkan VPS untuk MCP Server
Kebutuhan resource MCP server sangat bergantung pada pekerjaan yang dilakukan setiap tool.
MCP server yang hanya melakukan request API sederhana atau mengambil data ringan dapat dimulai dari resource kecil. Server yang melakukan query database besar, memproses file, menjalankan browser automation, atau mengeksekusi banyak request secara bersamaan membutuhkan CPU dan RAM yang lebih besar.
Sebagai baseline awal, kamu dapat menggunakan sekitar 1 vCPU dan 1 GB RAM untuk eksperimen ringan. Kamu sebaiknya meningkatkan resource ketika proses mulai mengalami penggunaan CPU tinggi, memory pressure, atau swap yang terlalu sering.
Gunakan distribusi Linux LTS yang masih mendapat dukungan keamanan. Ubuntu 26.04 LTS merupakan Ubuntu LTS terbaru pada Oktober 2026, sedangkan Ubuntu 24.04 LTS masih tetap berada dalam masa dukungan resmi.
Jika VPS belum memiliki sistem operasi, kamu dapat mengikuti panduan install Ubuntu di Cloud VPS.
Setelah Ubuntu siap, hubungkan komputer ke VPS melalui SSH.
|
1 |
ssh root@IP_VPS_KAMU |
Jika kamu belum terbiasa melakukan remote server, panduan akses VPS melalui SSH dapat menjadi rujukan sebelum melanjutkan.
Perbarui package index dan package yang tersedia.
|
1 2 |
apt update apt upgrade -y |
Tahap ini memberikan environment dasar sebelum Node.js dan dependency MCP dipasang.
2. Memilih Transport MCP untuk Server Remote
Transport menentukan bagaimana MCP client bertukar pesan dengan MCP server.
Kamu tidak perlu memilih antara stdio, SSE, dan Streamable HTTP sebagai tiga teknologi yang setara seperti pada beberapa implementasi MCP lama.
Untuk server pada VPS, gunakan Streamable HTTP.
MCP 2026-07-28 juga memindahkan state protokol ke model per-request. Request membawa informasi protokol dan capability yang dibutuhkan sehingga server tidak harus mempertahankan session protokol seperti implementasi generasi sebelumnya.
Perubahan tersebut membuat deployment remote menjadi lebih sederhana untuk dikembangkan menuju beberapa instance server di kemudian hari.
3. Menginstal Node.js dan MCP TypeScript SDK
Artikel ini menggunakan implementasi Node.js dan TypeScript SDK resmi MCP.
Pastikan Node.js yang digunakan masih berada pada versi yang didukung oleh dependency proyek. Jika Node.js belum tersedia, kamu dapat mengikuti panduan instal Node.js dan NPM di VPS Ubuntu.
Buat direktori untuk MCP server.
|
1 2 3 4 5 |
mkdir -p /opt/mcp-server cd /opt/mcp-server npm init -y npm pkg set type=module |
Kemudian instal MCP TypeScript SDK v2 beserta adapter yang diperlukan.
|
1 2 3 4 5 6 |
npm install \ @modelcontextprotocol/server \ @modelcontextprotocol/express \ @modelcontextprotocol/node \ express \ zod |
SDK v2 menggunakan paket yang lebih modular. @modelcontextprotocol/server menangani MCP server, sedangkan package node dan express menyediakan adapter untuk deployment HTTP pada Node.js.
4. Membuat MCP Server dengan Streamable HTTP
Sekarang buat file server.js.
Contoh berikut membuat MCP server sederhana yang mempunyai satu tool bernama health-check.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import { createMcpExpressApp } from '@modelcontextprotocol/express'; import { toNodeHandler } from '@modelcontextprotocol/node'; import { createMcpHandler, McpServer } from '@modelcontextprotocol/server'; import * as z from 'zod/v4'; function buildServer() { const server = new McpServer({ name: 'mcp-server-vps', version: '1.0.0' }); server.registerTool( 'health-check', { description: 'Memeriksa apakah MCP server berjalan normal', inputSchema: z.object({}) }, async () => ({ content: [ { type: 'text', text: 'MCP server berjalan normal.' } ] }) ); return server; } const handler = createMcpHandler(buildServer); const app = createMcpExpressApp(); app.use('/mcp', (req, res, next) => { const authorization = req.headers.authorization; const token = authorization?.replace(/^Bearer\s+/i, ''); if (!process.env.MCP_API_KEY || token !== process.env.MCP_API_KEY) { return res.status(401).json({ error: 'Unauthorized' }); } next(); }); const nodeHandler = toNodeHandler(handler); app.all('/mcp', (req, res) => { void nodeHandler(req, res, req.body); }); const PORT = Number(process.env.PORT || 3000); app.listen(PORT, '127.0.0.1', () => { console.log( `MCP Server berjalan di http://127.0.0.1:${PORT}/mcp` ); }); |
Contoh tersebut sengaja menggunakan server factory melalui createMcpHandler. TypeScript SDK v2 menggunakan pola ini untuk melayani implementasi MCP modern dan tetap menyediakan struktur yang lebih mudah dikembangkan.
Tool health-check dapat diganti dengan fungsi yang sesuai dengan kebutuhan aplikasi. Kamu dapat membuat tool untuk mengambil data database, mengakses API internal, membaca dokumen, atau menjalankan proses tertentu.
Setiap tool sebaiknya memiliki nama, deskripsi, dan input schema yang jelas. Metadata tersebut membantu MCP client memahami fungsi tool sebelum model memutuskan untuk memanggilnya.
5. Mengamankan MCP Server dengan Token
Contoh sebelumnya menggunakan Bearer token sederhana untuk membatasi siapa yang dapat mengakses endpoint.
Simpan token sebagai environment variable dan jangan menuliskannya langsung ke repository.
Sebagai contoh:
|
1 |
export MCP_API_KEY="ganti-dengan-token-random-yang-kuat" |
Bearer token statis cocok untuk prototipe, pengujian, automation internal, atau integrasi antarsistem yang aksesnya sangat terbatas.
Namun, kamu perlu membedakan pola tersebut dari authorization MCP secara penuh.
Spesifikasi authorization MCP untuk transport HTTP menggunakan mekanisme berbasis OAuth 2.1. MCP server berperan sebagai resource server, sedangkan client menggunakan access token yang diterbitkan oleh authorization server.
Jika MCP server nantinya akan digunakan oleh banyak pengguna, aplikasi eksternal, atau lingkungan enterprise, gunakan authorization yang memberikan identitas client, scope, revocation, dan lifecycle token yang lebih baik.
Dengan pendekatan tersebut, kamu tidak perlu membagikan satu token statis kepada semua pengguna.
6. Menempatkan Nginx di Depan MCP Server
Aplikasi Node.js pada contoh sebelumnya hanya mendengarkan alamat 127.0.0.1.
Konfigurasi tersebut disengaja karena port 3000 tidak perlu menerima koneksi langsung dari internet. Nginx akan bertindak sebagai reverse proxy yang menghubungkan trafik publik dengan aplikasi MCP.
Pasang Nginx.
|
1 |
apt install nginx -y |
Buat konfigurasi berikut.
|
1 |
nano /etc/nginx/sites-available/mcp.conf |
Isi konfigurasinya.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
server { listen 80; server_name mcp.domainkamu.com; location /mcp { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_buffering off; proxy_read_timeout 300; } } |
Aktifkan konfigurasi tersebut.
|
1 2 3 4 5 |
ln -s /etc/nginx/sites-available/mcp.conf \ /etc/nginx/sites-enabled/mcp.conf nginx -t systemctl reload nginx |
Sekarang request menuju mcp.domainkamu.com/mcp akan diteruskan ke aplikasi Node.js pada localhost.
Aktifkan HTTPS
MCP server dapat membawa token, data tool, output database, atau informasi internal. Karena itu, endpoint publik sebaiknya tidak menggunakan HTTP polos.
Pasang Certbot.
|
1 |
apt install certbot python3-certbot-nginx -y |
Kemudian buat sertifikat TLS.
|
1 |
certbot --nginx -d mcp.domainkamu.com |
Jika kamu membutuhkan penjelasan proses sertifikat secara lebih terperinci, panduan install Let’s Encrypt di Cloud VPS dapat menjadi referensi tambahan.
Setelah proses selesai, endpoint MCP dapat diakses melalui:
|
1 |
https://mcp.domainkamu.com/mcp |
Pada tahap ini, MCP server sudah mempunyai tiga lapisan dasar. Aplikasi hanya mendengarkan localhost, Nginx menangani trafik publik, dan HTTPS mengenkripsi komunikasi jaringan.
Kalau MCP server mulai digunakan oleh beberapa workflow atau menjalankan tool yang membutuhkan resource komputasi lebih besar, kamu dapat menempatkannya pada Cloud VPS DomaiNesia. Infrastruktur tersebut menyediakan resource server yang dapat disesuaikan ketika workload MCP berkembang.
7. Menjalankan MCP Server sebagai Service
Menjalankan server menggunakan:
|
1 |
node server.js |
cukup untuk pengujian awal.
Namun, proses tersebut akan berhenti ketika terminal ditutup atau aplikasi mengalami crash.
Systemd dapat menjalankan MCP server sebagai service dan menghidupkannya kembali ketika proses gagal.
Buat file:
|
1 |
nano /etc/systemd/system/mcp-server.service |
Isi konfigurasi berikut.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[Unit] Description=MCP Server After=network.target [Service] Type=simple WorkingDirectory=/opt/mcp-server ExecStart=/usr/bin/node /opt/mcp-server/server.js Environment="NODE_ENV=production" Environment="MCP_API_KEY=ganti-dengan-token-random-yang-kuat" Restart=on-failure RestartSec=5 User=mcp Group=mcp [Install] WantedBy=multi-user.target |
Untuk production, kamu sebaiknya membuat user Linux khusus seperti mcp dan memberikan permission hanya pada file yang benar-benar dibutuhkan aplikasi.
Aktifkan service.
|
1 2 3 |
systemctl daemon-reload systemctl enable --now mcp-server systemctl status mcp-server |
Jika status service menunjukkan active (running), MCP server sudah tidak bergantung pada sesi terminal.
8. Membatasi Port dengan Firewall
Arsitektur yang kita gunakan hanya membutuhkan beberapa port publik.
SSH membutuhkan port administrasi server, HTTP dapat digunakan untuk redirect atau proses sertifikat, sedangkan HTTPS digunakan oleh MCP client.
Port Node.js 3000 tidak perlu dibuka ke internet.
Konfigurasikan UFW.
|
1 2 3 4 5 6 |
ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw enable ufw status |
Kamu tidak perlu menjalankan:
|
1 |
ufw allow 3000 |
karena Nginx dan aplikasi Node.js berkomunikasi melalui localhost.
Kalau sebelumnya port aplikasi pernah dibuka untuk testing, hapus rule tersebut setelah reverse proxy berfungsi.
Panduan setup UFW untuk mengamankan VPS dapat membantu jika kamu membutuhkan aturan berdasarkan port atau sumber IP tertentu.
Jalankan MCP Server pada Infrastruktur yang Siap Bertumbuh
Saat tool bertambah, resource MCP server dapat ikut meningkat karena setiap proses mempunyai karakter workload yang berbeda.
Dapatkan akses root penuh dan resource VPS yang dapat disesuaikan dengan kebutuhan MCP server, automation, API, maupun aplikasi berbasis AI.
9. Menambahkan Logging dan Monitoring
Server yang berhasil menyala belum tentu siap digunakan dalam jangka panjang.
Kamu perlu mengetahui kapan aplikasi error, berapa banyak request yang masuk, dan apakah ada pola akses yang tidak normal.
Systemd menyimpan output service melalui journal.
Pantau log menggunakan:
|
1 |
journalctl -u mcp-server -f |
Nginx juga menyediakan access log dan error log.
Lokasi umumnya:
|
1 2 |
/var/log/nginx/access.log /var/log/nginx/error.log |
Log tersebut membantu kamu membedakan beberapa jenis masalah.
Error 401 biasanya berkaitan dengan autentikasi. Error 502 dapat menunjukkan bahwa Nginx tidak dapat menghubungi proses Node.js. Error 500 biasanya berasal dari aplikasi atau tool yang dijalankan MCP server.
Untuk server production, jangan menyimpan seluruh log tanpa batas. Terapkan log rotation dan tentukan retention berdasarkan kebutuhan audit serta kapasitas disk.
Monitoring uptime juga dapat ditambahkan untuk memeriksa ketersediaan endpoint. Monitoring tersebut membantu tim mengetahui gangguan lebih cepat sebelum masalah dilaporkan oleh pengguna.
10. Menguji MCP Server
Pengujian MCP sebaiknya tidak hanya memastikan bahwa port dapat diakses.
Kamu juga perlu memastikan bahwa client dapat mengenali server, membaca tool yang tersedia, dan menjalankan tool tersebut.
Tool resmi yang praktis untuk pekerjaan ini adalah MCP Inspector.
Jalankan:
|
1 2 3 |
npx @modelcontextprotocol/inspector \ --server-url https://mcp.domainkamu.com/mcp \ --transport http |
Setelah Inspector terhubung, periksa daftar tool yang tersedia pada MCP server.
Tool health-check seharusnya muncul pada server.
Jalankan tool tersebut dan pastikan server mengembalikan respons:
|
1 |
MCP server berjalan normal. |
Jika respons berhasil, jalur berikut sudah bekerja.
|
1 2 3 4 5 6 7 8 9 10 11 |
MCP Inspector ↓ HTTPS ↓ Nginx ↓ Node.js ↓ MCP Handler ↓ Tool |
Pengujian seperti ini lebih berguna daripada sekadar memastikan proses Node.js memiliki status running.
11. Menghubungkan MCP Server ke AI Client
Setelah endpoint berhasil diuji menggunakan Inspector, kamu dapat menghubungkannya dengan MCP client yang digunakan sehari-hari.
Client modern yang mendukung remote MCP melalui HTTP dapat diarahkan langsung menuju endpoint:
|
1 |
https://mcp.domainkamu.com/mcp |
Tambahkan authorization header jika client menyediakan konfigurasi tersebut.
|
1 |
Authorization: Bearer TOKEN_KAMU |
Untuk client yang belum mendukung remote HTTP secara langsung, bridge seperti mcp-remote masih dapat digunakan sebagai compatibility layer.
Contoh konfigurasi dasarnya dapat berbentuk seperti berikut.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "mcpServers": { "mcp-vps": { "command": "npx", "args": [ "mcp-remote", "https://mcp.domainkamu.com/mcp", "--header", "Authorization: Bearer token-rahasia-kamu" ] } } } |
Nama menu dan format konfigurasi dapat berbeda antara Claude, VS Code, Cursor, Windsurf, serta client MCP lainnya. Karena implementasi client berkembang cukup cepat, sebaiknya ikuti dokumentasi versi client yang sedang kamu gunakan.
Bridge seperti mcp-remote tidak perlu dijadikan jalur utama apabila client sudah mendukung Streamable HTTP secara native. Bridge tersebut lebih tepat digunakan sebagai compatibility layer untuk client yang hanya menyediakan mekanisme lokal stdio atau belum menyediakan konfigurasi remote HTTP yang dibutuhkan.
12. Melakukan Verifikasi Setelah Client Terhubung
Setelah menyimpan konfigurasi MCP, restart aplikasi client agar konfigurasi baru dapat dimuat.
Periksa indikator koneksi MCP pada aplikasi yang digunakan. Tampilan indikator berbeda pada setiap client, tetapi biasanya client akan menunjukkan status aktif ketika server berhasil terhubung.
Selanjutnya, uji salah satu tool sederhana dari antarmuka chat.
Kamu dapat memulai dengan tool:
|
1 2 3 4 |
health-check get-server-time read-status list-public-data |
Pastikan alur request dan response berjalan dengan normal sebelum kamu menambahkan fungsi yang mempunyai permission lebih besar.
Jangan langsung menghubungkan MCP server dengan resource produksi yang mempunyai akses luas.
Mulailah dari tool dengan risiko rendah. Setelah koneksi stabil, uji authentication menggunakan token valid dan token tidak valid.
Pastikan tool hanya dapat mengakses resource yang memang dibutuhkan. Validasi setiap input sebelum data diteruskan menuju API, filesystem, atau database.
Error dari aplikasi juga sebaiknya tidak membocorkan secret, credential, maupun detail internal yang tidak diperlukan oleh client.
Tahap pengujian bertahap membantu kamu mengurangi risiko ketika MCP server mulai mendapatkan akses ke sistem yang lebih sensitif.
Hal yang Perlu Direncanakan saat MCP Server Mulai Berkembang
Menjalankan MCP server pada VPS memberikan fleksibilitas besar, tetapi fleksibilitas tersebut membuat kamu bertanggung jawab terhadap sistem operasi, dependency, credential, firewall, monitoring, dan kapasitas server.
Kamu karena itu perlu merencanakan beberapa hal sejak awal.
Pertama, pantau resource berdasarkan workload nyata. Tool yang hanya mengambil data API mempunyai pola resource yang berbeda dengan tool yang melakukan query database, pemrosesan file, browser automation, atau inference lokal.
Kedua, pisahkan permission berdasarkan fungsi tool. MCP server yang hanya perlu membaca data tidak seharusnya mempunyai hak untuk menghapus atau memodifikasi resource yang sama.
Ketiga, rotasi credential secara berkala. Token yang pernah tersimpan dalam repository, chat, screenshot, atau log harus dianggap berisiko dan sebaiknya diganti.
Keempat, simpan backup konfigurasi penting di luar VPS. Konfigurasi Nginx, service systemd, environment, dan source code seharusnya dapat dipulihkan tanpa bergantung pada satu instance server.
Kelima, perbarui dependency MCP secara terkontrol. MCP masih berkembang aktif, sehingga perubahan SDK dan specification perlu diuji terlebih dahulu sebelum diterapkan pada server production.
Kesimpulan
Cara menjalankan MCP server di VPS tidak berhenti pada menjalankan proses Node.js dari server remote. Deployment yang baik perlu membangun beberapa lapisan agar aplikasi dapat digunakan secara stabil dan aman.
Streamable HTTP menangani komunikasi MCP melalui jaringan. Nginx dan HTTPS mengamankan jalur publik. Autentikasi membatasi client yang dapat mengakses server. Systemd menjaga proses tetap berjalan, sedangkan firewall membatasi port yang dapat dijangkau dari internet.
Logging dan MCP Inspector kemudian membantu kamu memastikan seluruh rangkaian tersebut benar-benar bekerja.
Setelah fondasi tersebut siap, kamu dapat mulai menambahkan tool yang lebih kompleks secara bertahap. Gunakan permission minimum, validasi setiap input, dan pantau resource berdasarkan pekerjaan nyata yang dilakukan MCP server.










