← Kembali ke Blog

Bikin MCP Server Pertama dalam 10 Menit pakai Python SDK

Pas ngerakit aplikasi LLM, kamu bakal nabrak dinding yang sama. Kamu hardcode satu function call ke dalam prompt, terus nambah lagi, dan lama-lama kamu udah bangun lapisan integrasi yang nggak didokumentasi dan cuma bisa dipahami prompt kamu sendiri. Ganti model, langsung berantakan semua. Model Context Protocol (MCP) ada buat ngilangin kekacauan itu: satu standar buat host app nyerahin tool, resource, dan prompt reusable ke LLM.

MCP lahir sebagai spesifikasi open dari Anthropic di akhir 2024 dan stabil di revisi protokol pertengahan 2025. Anggap aja MCP server kayak web API, tapi dibentuk khusus buat LLM. Resource bawa data yang bisa dimuat model, kurang-lebih kayak endpoint GET. Tool buat ngelakuin aksi, mirip POST. Prompt adalah template yang bisa dipake ulang. Begitu kamu expose tiga hal ini lewat MCP, host mana pun yang kompatibel (Claude Desktop, Claude Code, Cursor, atau agent runtime kayak Hermes) bisa ngobrol sama server kamu tanpa lem glue custom.

Tutorial ini ngajak kamu bikin server beneran pakai Python SDK resmi, ngetes di MCP Inspector, terus nyambungin ke host. Semua kode bisa langsung dicopy, tanpa basa-basi.

Prerequisites

  • Python 3.10 atau lebih baru
  • uv atau pip buat install SDK-nya
  • Node.js ada di PATH (Inspector jalan di atas npx, wajib kalau mau ngetes interaktif)

Langkah 1: Install SDK

Versi stabil sekarang adalah garis v2 dari SDK. Install dengan salah satu cara ini:

pip install "mcp[cli]"

atau, kalo kamu prefer uv:

uv add "mcp[cli]"

Extra [cli] nambahin command mcp yang bakal kamu pake buat development.

Langkah 2: Tulis server-nya

Bikin file server.py. Ini server yang lengkap, bukan stub:

from mcp.server import MCPServer

mcp = MCPServer("Demo")

@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b

@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"

Segitu aja. Dua fungsi dengan type hint dan docstring. SDK yang ngubah @mcp.tool() jadi tool berbasis JSON Schema yang bisa dipanggil host, dan @mcp.resource() jadi endpoint data. Kamu nggak nulis schema, parsing request, atau logika protokol sendiri.

Dua hal yang wajib dipahami:

  • Type hint adalah kontraknya. Signature a: int, b: int -> int ngasih tahu host kalo tool-nya butuh dua angka dan bakal ngasih satu angka hasilnya. Inspector dan semua host bikin form pemanggilannya dari type hint ini.
  • Docstring adalah instruksi manual buat model. Dia jadi deskripsi tool yang dibaca LLM buat mutusin kapan mau manggil. Tulis dalam bentuk intent, bukan detail implementasi.

Langkah 3: Tes langsung

Jalankan dev loop buat kebuka Inspector-nya:

uv run mcp dev server.py

Inspector adalah UI browser buat ngoprek server kamu. Dia butuh npx di PATH, jadi pastikan itu ada dulu sebelum jalan. Buka URL yang dicetak, trus panggil add dengan a=1, b=2. Hasilnya 3. Baca resource greeting://World dan kamu dapet "Hello, World!".

Kamu nggak nulis semua proses itu. SDK yang nangani framing JSON-RPC, validasi, dan serialisasi buat kamu.

Langkah 4: Sambungkan ke host

Install server ke host. Dengan extra CLI kamu bisa jalanin mcp install server.py buat daftarin server ke config client default, atau tambah manual lewat bagian mcpServers di config host kamu:

{
  "mcpServers": {
    "demo": {
      "command": "/path/to/.venv/bin/python",
      "args": ["-m", "mcp.server", "/path/to/server.py"]
    }
  }
}

Nama file dan lokasi config persisnya tergantung host-nya, jadi cek dokumentasi masing-masing. Dari sini, LLM bisa nambah angka dan baca resource kamu sama kayak dia baca context sendiri.

Cara server ngobrol sama client

MCP server ngomong dalam dua transport standar: stdio dan Streamable HTTP (per revisi protokol 2025-06-18). stdio adalah default yang paling umum: host ngejalanin server kamu sebagai subprocess, nulis JSON-RPC ke stdin, dan baca respons dari stdout. Satu aturan yang wajib kamu pegang dari awal: server nggak boleh nulis apa pun ke stdout selain pesan MCP. Pakai stderr buat logging. Kalo nggak, kamu bakal ngerusak aliran protokol secara diam-diam.

Kapan pake MCP

MCP paling pas waktu kamu mau satu backend tool melayani banyak aplikasi LLM tanpa nulis ulang glue tiap ganti app, atau lagi bikin ekstensi bergaya plugin buat host kayak Claude Desktop.

MCP overkill kalo hari ini kamu cuma punya satu app, satu model, dan beberapa function call. Function-calling loop polos di kode kamu sendiri lebih simpel. Tunda pakai protokol ini sampai consumer kedua muncul.

Lanjutan yang umum

  • Serve lewat HTTP dengan nge-mount server ke aplikasi FastAPI atau Starlette yang udah ada, dan SDK dukung ini buat akses remote.
  • Pakai objek Context di dalam tool buat lapor progress dan baca resource, berguna buat operasi yang lama.
  • Tambah Prompt (template reusable) kalo host harus bisa nampilin workflow yang kurasi, bukan cuma tool doang.

Langkah selanjutnya

Pilih satu kemampuan nyata yang selama ini sering kamu glue-in ke prompt, expose sebagai tool, lalu sambungkan ke client yang beneran kamu pake. Panggilan host pertamamu yang sukses itu momen pembuka: begitu satu tool terbang end to end, sisa backlog kamu nggak lagi keliatan kayak tumpukan wrapper custom.

Referensi

Butuh Bantuan Implementasi?

Saya membantu tim mendesain dan membangun infrastruktur cloud scalable, pipeline DevOps, dan sistem production-grade.

Konsultasi Gratis