Bikin Custom MCP Server Sendiri? Ini 5 Tips Biar Tool Kalian Nggak Bikin Claude Bingung

Setelah mencoba berbagai plugin dari komunitas, kalian pasti sampai pada satu titik di mana kalian butuh tool spesifik yang cuma ada di server kalian sendiri. Misalnya, script Python buat sinkronisasi user, atau script Bash buat ngecek health status node Carbonio.

Kabar baiknya, arsitektur Model Context Protocol (MCP) memungkinkan kita membungkus script lokal tersebut menjadi tool yang bisa dieksekusi langsung oleh Claude Code. Tapi sebelum kalian buru-buru coding, ada beberapa best practice yang wajib kalian terapkan agar MCP server buatan kalian tidak malah membuat Claude “halusinasi”.

Berikut adalah 5 tips jitu membuat MCP Server untuk System Engineer:

1. Deskripsi Fungsi = “Prompt” Terselubung

Saat kalian membuat tool di MCP, kalian wajib memberikan nama fungsi dan deskripsinya (docstring). Jangan tulis deskripsi asal-asalan! Claude memilih tool mana yang akan dipakai murni berdasarkan deskripsi ini.

  • Bad Description: Fungsi untuk cek antrean. (Terlalu ambigu)
  • Good Description: Mengecek antrean email (mail queue) di server Postfix menggunakan perintah postqueue -p. Kembalikan data ini jika user menanyakan kenapa email lambat masuk atau pending.

Semakin spesifik deskripsinya, semakin presisi Claude tahu kapan harus memanggil tool tersebut.

2. Utamakan “Read-Only” di Awal (Safety First!)

Jangan langsung membuat tool yang sifatnya destruktif atau mengubah konfigurasi (seperti restart_service atau delete_mailbox). Mulailah dengan membuat tool berbasis Read-Only (hanya membaca data).

Contoh tool Read-Only yang sangat berguna:

  • get_mail_logs: Menarik 100 baris terakhir dari /var/log/mail.log.
  • check_disk_space: Mengecek sisa kapasitas storage di Proxmox atau NAS.
  • get_service_status: Mengecek systemctl status dari komponen Zimbra.

Jika Claude terbukti bisa membaca dan menganalisis data ini dengan baik, baru pelan-pelan kalian tambahkan tool yang sifatnya “Write/Execute” dengan memberikan layer konfirmasi (Prompt user sebelum eksekusi).

3. Error Handling yang “Cerewet”

Kalau script kalian gagal (misal gagal konek ke database atau salah path), jangan biarkan script tersebut hanya crash (mengembalikan exit code 1 tanpa pesan).

Tangkap error-nya (Try/Catch) dan kembalikan pesannya sebagai string ke Claude. Kenapa? Karena kalau Claude melihat pesan error-nya, dia bisa menganalisis masalahnya dan bahkan menyarankan solusi ke kalian!

Contoh Return Value dari Tool:

“Error: Gagal membaca file konfigurasi di /etc/haproxy/haproxy.cfg. Pastikan permission file sudah benar atau jalankan dengan sudo.”

4. Gunakan Framework “FastMCP” (Python)

Kalian tidak perlu pusing memikirkan boilerplate JSON-RPC atau koneksi stdio yang rumit. Di ekosistem Python, sudah ada library bernama FastMCP.

Dengan FastMCP, mengubah fungsi Python biasa menjadi tool MCP hanya butuh satu baris decorator @mcp.tool().

Contoh Cepat:

from fastmcp import FastMCP
import subprocess

mcp = FastMCP("MailServerAdmin")

@mcp.tool()
def cek_antrean_postfix() -> str:
    """Mengecek jumlah email yang nyangkut di antrean Postfix."""
    result = subprocess.run(['mailq'], capture_output=True, text=True)
    return result.stdout

Cukup jalankan script ini, dan tool kalian siap di-add ke Claude Code!

5. Jangan Bikin “Monolith”, Pecah Jadi Micro-Tools

Jangan membuat satu fungsi “Sapu Jagat” bernama manage_server(action, parameter). AI sangat buruk dalam menebak parameter berlapis.

Lebih baik pecah fungsi tersebut menjadi micro-tools yang kecil tapi spesifik:

  • get_spam_score(ip_address)
  • block_ip(ip_address)
  • restart_antispam_engine()

Dengan fungsi yang terpisah, Claude bisa merangkai logika pemanggilan tool secara otomatis berdasarkan konteks percakapan.

Kesimpulan

Membuat custom MCP Server adalah gerbang menuju automasi tingkat lanjut. Kalian pada dasarnya sedang membangun “API khusus” agar otak AI bisa berinteraksi langsung dengan environment Linux kalian.

Leave a Reply

Your email address will not be published. Required fields are marked *