Cara Membuat Server MCP Sendiri untuk Data Internal
Panduan membuat server MCP dengan Python SDK agar asisten AI bisa membaca data internal seperti status pesanan, lengkap dengan batas akses yang aman.
Jawaban singkat
Server MCP sendiri dibuat dengan SDK resmi, misalnya Python SDK, dengan mendefinisikan tool berupa fungsi biasa lalu menjalankannya lewat transport stdio atau Streamable HTTP. Untuk data internal, buat tool sempit dan baca saja, pakai akun database terbatas, dan uji dengan MCP Inspector.
Daftar isi
- Apa yang bisa disediakan server MCP?
- Langkah membuat server MCP pertama
- Langkah 1: Siapkan lingkungan Python
- Langkah 2: Rancang tool yang sempit
- Langkah 3: Tulis kode server
- Langkah 4: Uji dengan MCP Inspector
- Langkah 5: Hubungkan ke klien AI
- Langkah 6: Pilih transport untuk pemakaian tim
- Batas akses yang perlu dipasang
- Pertanyaan yang sering diajukan
Ingin asisten AI bisa menjawab "pesanan INV-0012 sudah dikirim belum?" langsung dari database tokomu, tanpa menyalin-tempel data ke kolom chat? Caranya adalah membuat server MCP sendiri.
MCP (Model Context Protocol) adalah protokol terbuka yang menghubungkan aplikasi AI dengan sumber data dan alat. Server MCP menyediakan kemampuan, aplikasi AI seperti Claude Desktop, Claude Code, atau klien lain yang mendukung MCP memanggilnya. Kalau konsep dasarnya belum familiar, baca dulu apa itu MCP dan gunanya. Panduan ini fokus ke praktik: membuat server kecil dengan Python SDK resmi untuk membaca data internal secara aman.
Apa yang bisa disediakan server MCP?
Menurut dokumentasi resmi, server MCP bisa menyediakan tiga jenis kemampuan:
- Tools: fungsi yang bisa dipanggil model AI, dengan persetujuan pengguna. Contohnya
cek_status_pesanan. - Resources: data mirip file yang bisa dibaca klien, misalnya isi dokumen kebijakan.
- Prompts: templat siap pakai untuk tugas tertentu.
Untuk data internal, tools paling sering dipakai karena kamu bisa mengontrol persis pertanyaan apa yang boleh diajukan ke database.
Langkah membuat server MCP pertama
Langkah 1: Siapkan lingkungan Python
Panduan resmi per 11 November 2026 mensyaratkan Python 3.10 atau lebih baru dan Python MCP SDK versi 2.0.0 ke atas, dengan uv sebagai pengelola proyek:
uv init data-toko
cd data-toko
uv venv
source .venv/bin/activate
uv add "mcp[cli]"
SDK ini berkembang cepat. Cara import dan nama kelasnya pernah berubah antarversi, jadi selalu cocokkan contoh kode dengan dokumentasi versi yang kamu pasang.
Langkah 2: Rancang tool yang sempit
Sebelum menulis kode, putuskan tool apa saja yang dibutuhkan. Prinsipnya: satu tool untuk satu pertanyaan bisnis yang jelas, bukan satu tool "jalankan SQL apa saja". Tool yang terlalu umum membuka peluang model menjalankan kueri yang tidak kamu duga, termasuk akibat prompt injection dari teks yang dibacanya.
Contoh rancangan untuk toko online:
cek_status_pesanan(nomor_pesanan): status dan tanggal kirim satu pesanan.stok_produk(kode_produk): sisa stok satu produk.ringkasan_penjualan(tanggal): total pesanan dan omzet pada satu tanggal.
Langkah 3: Tulis kode server
Contoh berikut memakai database SQLite yang dibuka dalam mode baca saja. Simpan sebagai server.py:
import logging
import sqlite3
from mcp.server import MCPServer
logger = logging.getLogger(__name__)
mcp = MCPServer("data-toko")
DB_PATH = "/srv/data/toko.db"
def query(sql: str, params: tuple) -> list[dict]:
conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
conn.row_factory = sqlite3.Row
try:
return [dict(r) for r in conn.execute(sql, params).fetchall()]
finally:
conn.close()
@mcp.tool()
def cek_status_pesanan(nomor_pesanan: str) -> str:
"""Cari status pengiriman satu pesanan.
Args:
nomor_pesanan: Nomor pesanan, contoh INV-0012
"""
logger.info("cek pesanan %s", nomor_pesanan)
rows = query(
"SELECT nomor, status, tanggal_kirim FROM pesanan WHERE nomor = ?",
(nomor_pesanan,),
)
if not rows:
return "Pesanan tidak ditemukan."
r = rows[0]
return f"Pesanan {r['nomor']}: {r['status']}, dikirim {r['tanggal_kirim'] or '-'}"
if __name__ == "__main__":
mcp.run(transport="stdio")
Beberapa hal penting dari kode ini. Docstring dan type hint dipakai SDK untuk membuat deskripsi tool otomatis, jadi tulis dengan jelas karena model membacanya untuk memutuskan kapan memanggil tool. Kueri memakai parameter ?, bukan string yang disambung, sehingga aman dari SQL injection. Lalu, untuk server dengan transport stdio, dokumentasi resmi melarang menulis ke stdout karena akan merusak pesan JSON-RPC. Pakai modul logging yang menulis ke stderr, jangan print().
Langkah 4: Uji dengan MCP Inspector
Sebelum dihubungkan ke asisten AI, uji tool secara langsung dengan MCP Inspector, alat uji resmi berbasis browser:
npx @modelcontextprotocol/inspector uv run server.py
Coba panggil cek_status_pesanan dengan nomor yang ada dan yang tidak ada. Pastikan pesan kesalahan rapi dan tidak membocorkan detail teknis seperti struktur tabel.
Langkah 5: Hubungkan ke klien AI
Untuk Claude Desktop, tambahkan server ke file claude_desktop_config.json di bagian mcpServers. Di Linux file ini ada di ~/.config/Claude/, di macOS di ~/Library/Application Support/Claude/:
{
"mcpServers": {
"data-toko": {
"command": "uv",
"args": ["--directory", "/path/absolut/ke/data-toko", "run", "server.py"]
}
}
}
Pakai path absolut, dan bila perlu tulis path lengkap ke uv (cek dengan which uv). Simpan, lalu jalankan ulang Claude Desktop. Klien lain seperti Claude Code punya cara pendaftaran sendiri, lihat dokumentasinya masing-masing.
Langkah 6: Pilih transport untuk pemakaian tim
Spesifikasi MCP mendefinisikan dua transport standar. Stdio menjalankan server sebagai proses di komputer yang sama dengan klien, cocok untuk pemakaian pribadi. Streamable HTTP menerima pesan lewat HTTP POST ke satu endpoint, cocok bila satu server dipakai banyak orang, misalnya dipasang di VPS internal.
Kalau memakai HTTP, server menjadi layanan jaringan biasa: wajib HTTPS, autentikasi, dan sebaiknya hanya bisa diakses dari jaringan internal atau VPN. Jangan membuka server MCP yang membaca data pelanggan ke internet tanpa pengaman.
Batas akses yang perlu dipasang
| Lapisan | Pengaturan yang disarankan |
|---|---|
| Database | Akun khusus dengan hak baca saja ke tabel yang diperlukan |
| Tool | Fungsi sempit dengan parameter jelas, tanpa SQL bebas |
| Data keluaran | Hanya kolom yang perlu, sensor data pribadi seperti nomor HP lengkap |
| Kredensial | Simpan di variabel lingkungan, bukan di kode |
| Jaringan (HTTP) | HTTPS, autentikasi, akses dari jaringan internal atau VPN |
| Log | Catat siapa memanggil tool apa, simpan di stderr atau file log |
Prinsip menyimpan kredensial dibahas di mencegah bocornya file .env dan API key. Risiko instruksi tersembunyi di data yang dibaca model dijelaskan di prompt injection pada aplikasi AI.
Pertanyaan yang sering diajukan
Apakah harus memakai Python?
Tidak. Ada SDK resmi untuk beberapa bahasa, termasuk TypeScript. Pilih yang paling dikuasai timmu, karena logika tool-nya tetap kode biasa.
Bolehkah tool MCP menulis atau mengubah data?
Boleh secara teknis, tetapi mulailah dari tool baca saja. Kalau perlu tool yang mengubah data, batasi cakupannya, minta konfirmasi pengguna, dan catat setiap perubahan.
Apakah data dari server MCP dikirim ke penyedia model AI?
Ya, hasil yang dikembalikan tool masuk ke konteks percakapan dan diproses model. Karena itu kembalikan hanya data yang memang perlu, dan pertimbangkan kebijakan data akun AI yang dipakai.
Kenapa server saya error tanpa pesan jelas di Claude Desktop?
Penyebab yang sering muncul adalah path yang bukan absolut, uv tidak ditemukan, atau ada print() yang menulis ke stdout. Uji dulu dengan MCP Inspector, lalu periksa log klien.
Bedanya server MCP dengan API biasa?
Server MCP memakai format standar yang dikenali banyak aplikasi AI, sehingga satu server bisa dipakai beberapa klien tanpa integrasi ulang. Di baliknya, server MCP sering memanggil API atau database yang sudah ada.
Checklist sebelum server dipakai tim:
- Tool sempit dan baca saja, tanpa SQL bebas.
- Akun database terbatas, kredensial di variabel lingkungan.
- Tidak ada
print()di server stdio. - Sudah diuji dengan MCP Inspector, termasuk input yang salah.
- Transport HTTP hanya lewat HTTPS dengan autentikasi dan jaringan terbatas.
- Konsep agen yang memanggil tool seperti ini dibahas di apa itu AI agent.


