Panduan Matang Sebelum Coding: Seni Merancang MCP Server
Mengapa Persiapan MCP itu Krusial?
Ketika pertama kali berhasil menghubungkan server lokal ke MCP Inspector, rasanya seperti memegang kendali penuh. Kita melihat status berubah menjadi Connected, data resource muncul, dan fungsi bawaan berjalan lancar. Namun, ketika mulai dihadapkan pada skala data yang sesungguhnya—seperti database berisi 100.000 produk—banyak pengembang pemula langsung mengambil langkah keliru dengan menuangkan seluruh data mentah tersebut ke dalam sebuah jalur Resource.
Akibatnya bisa ditebak: memori server jebol, waktu tunggu meroket, atau batasan token (Context Window) dari sisi AI langsung habis dalam sekali panggil.
Membangun Model Context Protocol (MCP) Server bukan sekadar menulis rute API Express.js biasa. Ini adalah tentang membangun jembatan logika antara aplikasi backend kita dengan “otak” kecerdasan buatan. AI tidak bisa melihat susunan kode JavaScript Anda; mereka hanya memahami apa yang Anda deskripsikan dan batasi. Oleh karena itu, fase perencanaan (preparation stage) yang matang adalah penentu utama apakah AI Anda akan menjadi asisten yang jenius atau justru menjadi agen yang kebingungan dan boros biaya billing.
Hubungan Host, Client, dan Server MCP
Sebelum melangkah lebih jauh, mari kita pahami alur kerja protokol ini melalui diagram sederhana:
graph TD
Host[AI Host / Aplikasi Client e.g., Claude Desktop, Cursor] <-->|Protokol MCP| Server[MCP Server e.g., SQLite, GitHub, Filesystem]
Server <-->|Query / API Call| DB[(Database / API / Layanan Eksternal)]
Di sini, server MCP bertindak sebagai perantara yang mengekspos resource, resource template, dan tools agar dapat dipanggil secara otomatis oleh AI Host saat dibutuhkan.
Arsitektur Inti MCP: Memilih Senjata yang Tepat
Sebelum mulai menulis baris kode pertama di file server.js Anda, Anda harus merencanakan dengan matang bagaimana data Anda akan disajikan kepada AI. Di dalam ekosistem MCP, ada tiga pilar utama yang harus dialokasikan secara bijak:
1. Resources (Dokumen Pasif Siap Baca)
Resources bertindak seperti perpustakaan atau dokumen read-only bagi AI. Fitur ini sangat cocok untuk data statis atau koleksi berskala kecil-menengah yang wajib dibaca secara utuh sebagai konteks pembantu.
- Karakteristik: Bersifat pasif dan hanya bisa dibaca (Get/Read).
- Contoh Ideal: File log sistem hari ini, dokumentasi API internal, konfigurasi toko, atau daftar 50 kategori utama.
2. Resource Templates (Jalur Dinamis Berparameter)
Resource Templates adalah cetakan jalur (URI) yang memiliki variabel dinamis di dalam kurung kurawal {}. Ini adalah solusi cerdas untuk menghindari penulisan ratusan rute statis yang berulang di kode Anda.
- Karakteristik: Pasti dinamis dan berbasis parameter real-time.
- Contoh Ideal: Mengambil detail spesifik satu barang berdasarkan ID uniknya (
sqlite://products/{id}). Ketika AI membutuhkan data produk nomor 57, template ini akan mengekstrak variabel tersebut dan melakukan query spesifik ke database tanpa menarik data lainnya.
3. Tools (Fungsi Aksi & Pencarian Kompleks)
Tools adalah “tangan” bagi AI untuk melakukan aksi nyata (Read & Write) atau mengeksekusi operasi logika yang rumit di sisi server.
- Karakteristik: Aktif, membutuhkan argumen ketat, dan mampu memanipulasi database atau sistem.
- Contoh Ideal: Fungsi pencarian produk dengan filter berlapis (
cari_produkdengan argumen kata kunci, rentang harga, dan batas hasil). Membiarkan mesin database (seperti SQLite) bekerja menyaring 100.000 data dalam hitungan milidetik jauh lebih superior dibanding menyuruh AI membaca seluruh baris data secara manual.
Metode Paten Perencanaan MCP Server
Untuk menghasilkan rancangan yang kokoh, para pengembang profesional mengombinasikan dua pendekatan utama sebelum menyentuh text editor mereka:
A. Schema-Driven Development (SDD)
Mulailah perencanaan dari Skema Data (JSON Schema). AI mendeteksi kapabilitas server Anda murni dari skema input dan deskripsi teks yang Anda daftarkan. Buatlah tabel perencanaan Requirement & Goals seperti contoh di bawah ini sebelum mulai koding:
| Fitur MCP | Nama Identifikasi | Deskripsi untuk AI (Goals) | Spesifikasi Input & Output (Requirements) |
|---|---|---|---|
| Tool | list_products |
“Gunakan tool ini hanya ketika user mencari atau memfilter produk berdasarkan kategori spesifik.” | Input: category (string, required)Output: Array JSON berisi [{ id, name, price }] dengan batas maksimal 50 data. |
| Resource Template | product_detail |
“Menampilkan data teknis lengkap, deskripsi, dan sisa stok dari satu produk tertentu.” | URI Template: sqlite://products/{id}Output: Object detail tunggal dari baris database yang cocok. |
B. “AI-First” Mindset (Backward Design)
Metode ini mengajak kita untuk bekerja mundur dari hasil akhir yang diharapkan dalam obrolan pengguna:
- Simulasikan Obrolan: Bayangkan pengguna bertanya, “Tolong cariin buku pemrograman JavaScript yang harganya di bawah 100 ribu.”
- Petakan Kebutuhan AI: Agar bisa menjawab kalimat di atas, data apa saja yang harus tersedia? AI butuh pencarian teks fleksibel (operator
LIKEdi SQL) dan penyaringan angka (operator<). - Implementasikan Proteksi Kueri: Karena input teks ini berasal dari luar, kueri SQL wajib menggunakan parameterized queries (menggunakan placeholder
?) untuk mencegah celah keamanan fatal seperti SQL Injection.
Contoh Implementasi Sederhana (TypeScript)
Berikut adalah contoh bagaimana Anda mendefinisikan Tool list_products menggunakan SDK MCP resmi di sisi server:
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
// Inisialisasi Server MCP
const server = new Server(
{
name: "sqlite-mcp-server",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
}
);
// 1. Definisikan List Tools yang Tersedia
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "list_products",
description: "Gunakan tool ini untuk mengambil produk berdasarkan kategori tertentu.",
inputSchema: {
type: "object",
properties: {
category: {
type: "string",
description: "Nama kategori produk (contoh: 'buku', 'elektronik')"
}
},
required: ["category"]
}
}
]
};
});
// 2. Tangani Eksekusi Tool
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "list_products") {
const category = request.params.arguments?.category as string;
// Di sini Anda bisa melakukan query ke database SQLite sesungguhnya
// Contoh dummy data response:
const mockProducts = [
{ id: 1, name: "Buku Belajar JavaScript", price: 85000, category: "buku" },
{ id: 2, name: "Buku Panduan TypeScript", price: 95000, category: "buku" }
].filter(p => p.category === category.toLowerCase());
return {
content: [
{
type: "text",
text: JSON.stringify(mockProducts, null, 2)
}
]
};
}
throw new Error("Tool tidak ditemukan");
});
// Jalankan server menggunakan StdIO
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("MCP Server running on stdio");
Prinsip Efisiensi Token dan Penanganan Error
Hal terakhir yang tidak boleh luput dari perencanaan adalah bagaimana server Anda merespons situasi di luar skenario normal:
- Pangkas Struktur yang Tidak Perlu: Jangan mengirimkan seluruh kolom tabel database ke AI jika yang dibutuhkan pengguna hanya nama dan harga. Semakin ramping JSON yang Anda kirimkan, semakin cepat proses komputasi AI dan semakin hemat penggunaan token Anda.
- Gunakan Penanganan Error yang Ramah AI: Jika kueri SQL tidak menemukan data, jangan biarkan server mengembalikan kode error mentah atau membuat aplikasi crash. Kembalikan pesan tekstual yang jelas dalam objek MCP, contohnya: “Kategori produk tidak ditemukan. Silakan instruksikan user untuk mencoba kata kunci lain.” AI yang membaca pesan ini akan memahami situasi dengan baik dan meneruskannya kepada pengguna dengan bahasa yang alami.
Penutup
Merancang MCP Server yang hebat membutuhkan pergeseran paradigma dari sekadar pengembang web biasa menjadi seorang arsitek konteks buatan. Dengan menerapkan perencanaan yang matang melalui pembagian Resource yang tepat, pemanfaatan Tools yang presisi, serta pendefinisian skema yang ketat, server MCP Anda akan siap menghadapi lonjakan data sebesar apa pun dengan performa yang tetap optimal.