Kalau kamu udah pasang MCPProxy di VPS buat federasiin banyak server MCP (kayak yang dibahas di instalasi MCPProxy di Ubuntu Server), cepat atau lambat bakal ada server yang butuh credential, entah itu password database, API key, atau client secret. Masalahnya, defaultnya credential ini nangkring polos di file mcp_config.json, dan ikut nongol plaintext tiap kali ada yang query upstream_servers:list. Artikel ini bahas cara amankan credential MCP server itu tanpa perlu OS keyring, yang di VPS headless biasanya malah error.
Kenapa Perlu Amankan Credential MCP Server
MCPProxy sebenarnya punya fitur Convert to secret yang nyimpen credential ke OS keyring: Keychain di macOS, Credential Manager di Windows, Secret Service di Linux. Tapi Secret Service itu jalan lewat D-Bus dan biasanya cuma tersedia kalau ada desktop environment yang jalan. Di VPS headless, kamu bakal ketemu error failed to store secret: provider for keyring is not available on this system pas coba convert. Padahal plaintext credential yang nangkring di config itu risikonya nyata, apalagi kalau nanti ke-commit tanpa sengaja ke backup atau repository.
Opsi bikin dbus session plus gnome-keyring-daemon manual sebenarnya bisa, tapi ribet dan sering nggak stabil di lingkungan headless atau container. Udah banyak kasus serupa di tool lain yang tetap gagal walau gnome-keyring udah diinstall. Belum lagi kalau MCPProxy kamu jalan sebagai systemd service dengan hardening ketat semacam ProtectSystem=strict dan PrivateTmp=true, nyisipin dbus session ke situ berarti ngelonggarin proteksi yang udah bagus. Jadi daripada maksa keyring, ada cara lebih simpel yang tetap aman.
Cara Amankan Credential Tanpa OS Keyring
Ide dasarnya: pindahin credential keluar dari config MCPProxy, taruh di file .env terpisah yang cuma bisa dibaca user proses MCPProxy, terus panggil server-nya lewat wrapper script yang source file itu sebelum jalanin command asli. Hasilnya, MCPProxy sendiri cuma tahu nama command wrapper-nya, bukan isi credential di dalamnya, jadi respons upstream_servers:list otomatis bersih dari plaintext.
Pola ini paling pas buat server tipe stdio yang MCPProxy jalanin sebagai command lokal. Kalau ada variable yang emang bukan rahasia, misalnya host atau port yang publik, nggak masalah tetap ditaruh di env config biasa. Yang wajib dipindah cuma yang beneran sensitif: password, token, API key, atau client secret.
Langkah pertama, siapin folder khusus di dalam direktori config MCPProxy biar tetap masuk ReadWritePaths kalau service-nya di-hardening lewat systemd:
sudo mkdir -p /etc/mcpproxy/secrets /etc/mcpproxy/scripts
Buat file .env isi credential-nya, ganti sesuai kebutuhan server kamu:
sudo tee /etc/mcpproxy/secrets/nama-server.env > /dev/null <<EOF
DB_HOST="127.0.0.1"
DB_USER="app_user"
DB_PASS="passwordkamu"
EOF
sudo chown mcpproxy:mcpproxy /etc/mcpproxy/secrets/nama-server.env
sudo chmod 600 /etc/mcpproxy/secrets/nama-server.env
Terus bikin wrapper script yang source file .env itu sebelum ngejalanin command server aslinya:
sudo tee /etc/mcpproxy/scripts/run-nama-server.sh > /dev/null <<EOF
#!/bin/bash
set -a
source /etc/mcpproxy/secrets/nama-server.env
set +a
exec npx -y nama-mcp-server-package
EOF
sudo chown mcpproxy:mcpproxy /etc/mcpproxy/scripts/run-nama-server.sh
sudo chmod 750 /etc/mcpproxy/scripts/run-nama-server.sh
Edit Config MCPProxy Pakai jq
Langkah terakhir, ganti field command server itu di mcp_config.json biar nunjuk ke wrapper script, terus hapus object env-nya. Backup dulu sebelum diedit, terus pakai jq biar nggak salah ketik JSON manual:
sudo cp /etc/mcpproxy/mcp_config.json /etc/mcpproxy/mcp_config.json.bak-$(date +%s)
sudo jq '
.mcpServers = [.mcpServers[] |
if .name == "nama-server" then
.command = "/etc/mcpproxy/scripts/run-nama-server.sh" | .args = [] | del(.env)
else . end
]
' /etc/mcpproxy/mcp_config.json | sudo tee /etc/mcpproxy/mcp_config.json.tmp > /dev/null
sudo mv /etc/mcpproxy/mcp_config.json.tmp /etc/mcpproxy/mcp_config.json
sudo chown mcpproxy:mcpproxy /etc/mcpproxy/mcp_config.json
sudo chmod 660 /etc/mcpproxy/mcp_config.json
Jangan ganti ownership file config itu ke root. Kebanyakan install MCPProxy dari paket resmi punya ExecStartPost yang jalanin chgrp dan chmod ke file config setiap restart, dan proses itu jalan sebagai user service-nya sendiri, biasanya mcpproxy. Kalau ownership-nya keliru diubah ke root, ExecStartPost gagal, service masuk auto-restart loop, dan kamu bakal ketemu status activating (auto-restart) yang bikin bingung kalau nggak ngecek log lebih dulu.
Verifikasi Setelah Amankan Credential
Sebelum restart, cek dulu hasil edit-nya biar nggak kaget:
jq ".mcpServers[] | {name, command, args, env}" /etc/mcpproxy/mcp_config.json
Pastikan field env udah null dan command udah nunjuk ke wrapper script. Kalau udah sesuai, restart service-nya:
sudo systemctl restart mcpproxy
sudo systemctl status mcpproxy --no-pager | head -10
Status harus active (running). Cek juga dari Web UI MCPProxy atau lewat tool upstream_servers, server yang tadi diedit harus tetap healthy alias connected, dan field env-nya kosong.
Troubleshooting Umum
Ada beberapa kejadian yang sering muncul pas nerapin cara amankan credential ini. Kalau service gagal start setelah edit config, cek dulu ownership file mcp_config.json, paling sering itu penyebabnya. Kalau wrapper script-nya nggak ketemu command aslinya (muncul error semacam command not found), biasanya karena $PATH di systemd beda dari shell interaktif kamu, ganti pakai path absolut hasil which npx atau which node di dalam script.
Satu lagi yang gampang kejebak: kalau nanti mau kasih akses folder /etc/mcpproxy ke user lain lewat SFTP, jangan buru-buru pakai setfacl buat nambahin default ACL. ACL yang nabrak sama permission dasar bisa bikin semua file gagal di-stat sama sekali, muncul sebagai drwxrws---+ tapi ls -la malah error Permission denied di semua entry. Cukup masukin user itu ke grup service-nya pakai usermod -aG dan buka permission grup biasa lewat chmod -R g+rwX, nggak perlu ACL sama sekali kalau grup POSIX-nya udah cukup.
Penutup
Cara amankan credential ini emang bukan enkripsi beneran kayak OS keyring, tapi buat VPS pribadi yang cuma kamu yang pegang akses root-nya, memisahkan credential dari config MCPProxy plus permission file yang ketat udah nutup risiko utama: proses lain, atau siapa pun yang query API MCPProxy, nggak bakal ketemu plaintext-nya lagi. Kalau server MCPProxy kamu ke depannya butuh header Authorization: Bearer buat koneksi HTTP atau SSE (bukan stdio), cara wrapper script ini nggak langsung kepake, karena headers dikelola beda dari environment variable proses. Ada baiknya juga rutin ganti password dan secret secara berkala, apalagi kalau pernah ada insiden kebocoran config sebelumnya. Selengkapnya soal manajemen secret bawaan MCPProxy bisa dicek di dokumentasi CLI resminya.
























