Model Context Protocol (MCP) adalah standar terbuka Anthropic untuk menghubungkan model AI ke alat dan sumber data eksternal. Bayangkan seperti standar USB-C untuk integrasi AI — alih-alih setiap asisten AI mengimplementasikan sistem plugin kustomnya sendiri, MCP memberikan satu protokol yang dapat dipahami oleh klien mana pun yang kompatibel. Saya telah membangun server MCP untuk alat internal di Commsult Indonesia sejak awal 2025, dan keuntungan produktivitas dari mengekspos data ERP kami ke Claude melalui server MCP yang tepat sangat signifikan.
MCP mendefinisikan protokol klien-server melalui stdio atau HTTP/SSE. Model AI (klien) menemukan alat dan sumber daya yang tersedia dari server MCP Anda, lalu memanggil alat tersebut selama percakapan. Server Anda menangani eksekusi alat dan mengembalikan hasil. Protokol berbasis JSON-RPC 2.0, stateful, dan mendukung tiga primitif: Tools (fungsi yang dapat dieksekusi), Resources (data yang dapat dibaca), dan Prompts (template prompt yang dapat digunakan ulang).
Anthropic menyediakan SDK resmi untuk TypeScript dan Python. TypeScript SDK adalah yang paling matang dan yang saya gunakan dalam produksi. Install dengan npm install @modelcontextprotocol/sdk. SDK menangani negosiasi protokol, manajemen sesi, dan serialisasi. Anda fokus pada mendefinisikan alat dan mengimplementasikan handler-nya.
┌─────────────────────────────────────────────────────────────┐
│ MCP Architecture Flow │
│ │
│ Claude Desktop / Cursor / Continue (MCP Client) │
│ │ │
│ │ JSON-RPC 2.0 over stdio or HTTP/SSE │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ Your MCP Server │ │
│ │ │ │
│ │ tools/list → returns Tool[] │ │
│ │ tools/call → executes handler │ │
│ │ resources/* → returns data │ │
│ └─────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Your Systems: Database / APIs / File System │
└─────────────────────────────────────────────────────────────┘Dari pengalaman saya membangun server MCP untuk integrasi ERP: definisikan skema alat Anda secara ketat menggunakan validasi Zod. Model AI bergantung pada deskripsi JSON Schema Anda untuk memahami parameter apa yang harus dikirim. Deskripsi yang samar menghasilkan tool call yang salah. Tulis deskripsi seolah-olah menjelaskan kepada developer junior cerdas yang belum pernah melihat sistem Anda.
Server MCP lengkap dengan alat nyata yang mengquery database ERP. Contoh ini mengimplementasikan alat untuk mencari status faktur — kasus penggunaan integrasi ERP umum yang mendemonstrasikan autentikasi, query database, dan pemformatan respons terstruktur.
Setiap alat membutuhkan nama, deskripsi, skema input (JSON Schema), dan fungsi handler. Handler menerima input yang divalidasi dan mengembalikan array konten. Kembalikan data terstruktur sebagai string JSON di dalam blok konten teks — ini memberi model AI data yang dapat dibaca mesin sambil mempertahankan kompatibilitas protokol. Selalu sertakan penanganan error.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
import { z } from "zod"
const server = new McpServer({
name: "erp-mcp-server",
version: "1.0.0",
})
// Define a tool with Zod schema validation
server.tool(
"get_invoice_status",
"Look up the status of an invoice by ID or invoice number",
{
invoice_id: z.string().optional().describe("UUID of the invoice"),
invoice_number: z.string().optional().describe("Human-readable invoice number like INV-2025-001"),
include_line_items: z.boolean().default(false).describe("Whether to include line item details"),
},
async ({ invoice_id, invoice_number, include_line_items }) => {
if (!invoice_id && !invoice_number) {
return {
content: [{ type: "text", text: JSON.stringify({ error: "Either invoice_id or invoice_number is required" }) }],
isError: true,
}
}
try {
const invoice = await db.invoice.findFirst({
where: invoice_id ? { id: invoice_id } : { invoiceNumber: invoice_number },
include: { lineItems: include_line_items, client: true },
})
if (!invoice) {
return {
content: [{ type: "text", text: JSON.stringify({ error: "Invoice not found" }) }],
isError: true,
}
}
return {
content: [{ type: "text", text: JSON.stringify(invoice) }],
}
} catch (err) {
return {
content: [{ type: "text", text: JSON.stringify({ error: "Database error", retry_suggested: true }) }],
isError: true,
}
}
}
)
// Start server with stdio transport (for Claude Desktop)
const transport = new StdioServerTransport()
await server.connect(transport)Server MCP jarak jauh harus mengimplementasikan autentikasi. Spesifikasi MCP merekomendasikan OAuth 2.0 dengan PKCE untuk autentikasi klien. Untuk alat internal, pendekatan yang lebih sederhana adalah autentikasi bearer token yang divalidasi per permintaan. Saya mengimplementasikan lapisan middleware yang mengekstrak header Authorization, memvalidasi token terhadap database pengguna kami, dan melampirkan konteks pengguna ke permintaan sebelum handler alat dieksekusi.
Server MCP yang berjalan secara lokal via stdio memiliki akses ke izin akun pengguna penuh Anda. Server MCP berbahaya dapat membaca file, mengeksekusi perintah, dan membuat permintaan jaringan sebagai pengguna Anda. Selalu tinjau kode server MCP sebelum menginstalnya. Untuk server MCP jarak jauh produksi, implementasikan autentikasi (OAuth 2.0 adalah rekomendasi spesifikasi MCP), tegakkan HTTPS, dan terapkan prinsip hak istimewa terkecil.
Untuk integrasi Claude Desktop, server MCP Anda berjalan sebagai proses stdio lokal — konfigurasikan di claude_desktop_config.json. Untuk deployment tim atau multi-klien, jalankan server Anda sebagai endpoint HTTP+SSE di belakang nginx dengan TLS. Gunakan PM2 atau systemd untuk manajemen proses. Implementasikan health check, structured logging dengan request ID, dan rate limiting per pengguna yang terautentikasi.
Di Commsult Indonesia, server MCP produksi kami mengekspos alat untuk: mengquery pesanan penjualan dan faktur, memeriksa level inventaris, menjalankan query status persetujuan, dan menghasilkan ringkasan laporan. Server berjalan di belakang reverse proxy nginx dengan TLS Let's Encrypt, diautentikasi melalui token JWT yang terhubung ke akun karyawan. Latensi untuk alat yang didukung database rata-rata 200-400ms yang dapat diterima.
Sumber & Bacaan Lanjutan