Membongkar arsitektur tiga lapis MCP — Host, Client, dan Server — beserta primitives utamanya seperti Tools, Resources, dan Prompts, serta transport yang menghubungkan semuanya: Streamable HTTP, SSE, dan stdio.

Setelah memahami sejarah dan motivasi MCP di episode 1, sekarang saatnya membedah bagaimana protokol ini sebenarnya bekerja. Episode ini adalah fondasi paling penting di seluruh series: arsitektur tiga lapis dan primitives yang akan kita pakai terus sampai episode terakhir.
Kalian akan belajar siapa berperan sebagai apa (Host, Client, Server), apa saja yang bisa di-expose oleh server (tools, resources, prompts), dan lewat media apa mereka berkomunikasi (transport). Paham episode ini, dan semua episode berikutnya — dari SDK sampai deployment — tinggal soal detail implementasi.
MCP dibangun di atas tiga peran yang tegas:
| Peran | Deskripsi | Contoh |
|---|---|---|
| Host | Aplikasi user-facing tempat pengguna berinteraksi dengan model | Claude Desktop, IDE, aplikasi chat |
| Client | Komponen yang menjaga koneksi 1:1 dengan satu server, di dalam host | SDK client di dalam aplikasi |
| Server | Program yang men-expose capabilities (tools, resources, prompts) | Server cuaca, server database, server GitHub |
Aturan emasnya: satu client terhubung ke satu server. Jika host ingin berbicara dengan banyak server, host punya banyak client — masing-masing dengan koneksinya sendiri. Tidak ada satu client yang terhubung ke banyak server sekaligus.
Alur komunikasi dari sudut pandang model: model hidup di dalam host, host memakai client untuk memanggil server, dan server menjawab lewat client kembali ke host. Kalian bisa membayangkan client sebagai "kabel" dan server sebagai "colokan" — setiap kabel menancap ke satu colokan.
Server MCP men-expose tiga primitives utama:
| Primitive | Fungsi | Analogi |
|---|---|---|
| Tools | Fungsi yang bisa dipanggil model untuk melakukan aksi | Tangan server untuk bertindak |
| Resources | Data berformat yang bisa dibaca model sebagai konteks | Perpustakaan server |
| Prompts | Template reusable yang membantu pengguna menyelesaikan tugas | Panduan/resep siap pakai |
Tools adalah fungsi yang bisa dipanggil model untuk melakukan aksi: menulis file, mengirim email, menjalankan query, memanggil API eksternal. Tools digambarkan dengan JSON Schema sehingga model tahu parameter apa yang harus diisi. Kita akan membedah tools secara mendalam di episode 4.
Resources adalah data konteks yang bisa dibaca model — seperti isi file, hasil query, atau dokumentasi. Berbeda dengan tools yang melakukan aksi, resources bersifat pasif: model membaca, bukan mengeksekusi. Contoh method-nya: resources/read. Episode 5 akan membahasnya.
Prompts adalah template reusable yang dirancang untuk menyelesaikan tugas tertentu — misalnya template "rangkum meeting" atau "generate commit message". Host menampilkan daftar prompt kepada pengguna, lalu template dengan argumen tertentu dikirim ke model. Detailnya di episode 5.
Info
Di era legacy (spesifikasi 2025-11-25 ke bawah), ada tiga primitives tambahan: Roots (mengumumkan lokasi file ke server), Sampling (server meminta model membuat completion), dan Logging (pengiriman log). Ketiganya kini resmi didepresiasi dan punya "removal clock" sekitar satu tahun. Episode 3 dan 17 akan membahas masa transisinya.
Primitives hanya masuk akal kalau ada media yang menghubungkannya. MCP punya tiga pilihan transport:
Streamable HTTP adalah transport standar untuk server remote di era modern. Ia memakai request/response JSON-RPC biasa di atas HTTP, ditambah SSE stream untuk notifikasi dan streaming hasil yang panjang. Server bisa stateless, mudah di-scale, dan menjadi fondasi era 2026-07-28.
Server-Sent Events (SSE) adalah transport asli MCP saat pertama dirilis 2024-11-05. Ia mengandalkan koneksi SSE yang panjang dan dianggap legacy sejak 2025-03-26 — masih didukung untuk kompatibilitas, tapi bukan pilihan untuk server baru. Tiap SSE endpoint hanya melayani satu client, yang membatasi skalabilitas.
stdio menjalankan server sebagai subprocess lokal dan berkomunikasi lewat stdin/stdout. Ini transport paling sederhana dan cocok untuk integrasi lokal — misalnya CLI agents, editor, dan tooling developer. Data hanya dikirim sebagai JSON per baris, tanpa perlu jaringan.
| Transport | Lokasi | Stateless? | Contoh Penggunaan |
|---|---|---|---|
| Streamable HTTP | Remote | Ya (era modern) | Server production, integrasi web |
| SSE | Remote | Tidak | Server legacy, kompatibilitas |
| stdio | Lokal | Ya | CLI agent, editor, tooling lokal |
Mari kita ikuti satu percakapan MCP sederhana dari awal sampai akhir. Bayangkan model (di dalam host) ingin tahu cuaca hari ini:
tools/list lewat client untuk melihat tool apa yang tersedia di server cuaca.get_weather yang membutuhkan parameter city.tools/call dengan argumen kota pengguna.{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": "get_weather",
"description": "Ambil cuaca terkini untuk sebuah kota",
"inputSchema": {
"type": "object",
"properties": {
"city": { "type": "string" }
},
"required": ["city"]
}
}
]
}
}Semua langkah itu tidak lain adalah request/response JSON-RPC — seperti yang sudah kalian kenal di episode 0. Transport hanya menentukan di mana JSON-RPC ini dikirim: lewat HTTP, SSE, atau stdin. Nanti di episode 7 kita akan mengamati alur ini secara langsung lewat npx @modelcontextprotocol/inspector.
Pada episode 2 ini kalian sudah memahami arsitektur tiga lapis MCP (Host, Client, Server), tiga primitives utama (tools, resources, prompts), primitives yang didepresiasi (roots, sampling, logging), dan tiga pilihan transport (Streamable HTTP, SSE, stdio) beserta kapan memakainya.
Inti yang harus dibawa pulang:
Di episode 3 berikutnya kita akan membahas lifecycle koneksi MCP — bagaimana koneksi dimulai, apa itu session state pada era legacy, dan bagaimana era stateless 2026-07-28 mengubah segalanya lewat server/discover. Sampai jumpa di episode 3!