# Apa Itu MCP Server? Begini Perjalanan Satu Tool Call

> Apa itu MCP server, dari nol: perjalanan satu tool call agen AI dari client ke server lalu kembali, dan kapan memakai transport stdio atau Streamable HTTP.

URL: https://www.matthewswong.com/id/learn/ai-agents-mcp/what-is-mcp-how-a-tool-call-travels/

Agen AI dan MCP · Pelajaran 1 dari 4 · Ditinjau pada 17 Oktober 2026 · Dicek dengan MCP specification 2026-07-28 · Oleh Matthews Wong (https://www.matthewswong.com/id/about/)

> MCP server adalah program atau layanan web yang menyediakan tool dan data untuk aplikasi AI lewat Model Context Protocol. Model meminta sebuah tool, host memeriksa permintaan itu, MCP client-nya mengirim tools/call berformat JSON-RPC, lalu hasilnya kembali sebagai teks di konteks model. stdio membawa server lokal; Streamable HTTP membawa server jarak jauh.

## Setelah pelajaran ini, Anda bisa

- Menyebut host, client, dan server dalam setup MCP, serta tahu siapa yang memutuskan apakah sebuah tool boleh berjalan.
- Mengikuti satu tool call dari permintaan model sampai hasilnya masuk ke konteks, pesan demi pesan.
- Memilih stdio atau Streamable HTTP untuk sebuah server, dan tahu apa yang terbuka pada masing-masing.

## Satu tool call MCP, dari permintaan sampai hasil

Client mendaftar tool milik server, model meminta satu call, host memeriksanya, client mengirim tools/call, lalu hasilnya kembali ke konteks model sebagai teks.

1. **Kenali bagiannya.** Host adalah aplikasi AI-nya, misalnya Claude Code. Host menjalankan satu MCP client untuk setiap server. Server menyediakan tool; model hanya melihat nama, skema, dan hasilnya.
2. **Kenali tool-nya.** Pertama, client meminta tools/list ke server. Setiap tool kembali dengan nama, deskripsi, dan input schema, yang lalu ditunjukkan host kepada model.

   ```
   tools/list → name · description · inputSchema
   ```
3. **Model meminta.** Dari permintaan pengguna dan deskripsi tadi, model meminta satu call: nama tool beserta argumennya. Model tidak bisa menjalankan apa pun sendiri; ia hanya bisa meminta.

   ```
   tool: search_issues · arguments: query=crash
   ```

   *Tebak:* Model sudah meminta sebuah call. Apa yang terjadi sebelum permintaan itu sampai ke server? (Server langsung menjalankannya / Host memeriksa aturannya atau bertanya ke Anda)
4. **Host yang memutuskan.** Host mencocokkan call itu dengan aturan izinnya, atau bertanya kepada Anda. Spesifikasi MCP menyatakan manusia harus selalu bisa menolak pemanggilan tool.

   ```
   Claude Code checks deny, then ask, then allow
   ```
5. **Satu request JSON-RPC.** Client mengirim tools/call berformat JSON-RPC. Sejak spesifikasi 2026-07-28 tidak ada handshake di awal: setiap request membawa versi protokolnya sendiri di _meta.

   ```
   method: tools/call · _meta: protocolVersion 2026-07-28
   ```

   *Tebak:* Server menjawab. Dalam bentuk apa model menerima teks di hasil itu? (Sebagai fakta yang sudah dicek / Sebagai teks tambahan di konteksnya / Sebagai perintah yang wajib dijalankan host)
6. **Kembali ke konteks.** Server mengembalikan content, biasanya teks, ditambah isError jika tool gagal. Client menyerahkannya ke model sebagai konteks tambahan; tidak ada yang mengecek kebenarannya.

   ```
   resultType: complete · content: text · isError: false
   ```

## Apa itu MCP server, dalam bahasa sederhana?

Model Context Protocol (MCP) adalah standar terbuka untuk menghubungkan aplikasi AI dengan tool dan data di luar dirinya. MCP server adalah sisi yang menyediakannya: program kecil di komputer Anda, atau layanan web, yang mendaftar tool yang dimilikinya dan menjalankan salah satunya bila diminta. Contoh umumnya membungkus issue tracker, database, API cloud, atau sebuah folder berisi file.

Spesifikasinya menyebut tiga peran. Host adalah aplikasi AI-nya, misalnya Claude Code atau aplikasi chat desktop. Host membuat satu client untuk setiap server, dan setiap client hanya berbicara dengan satu server. Host menyimpan seluruh percakapan dan menegakkan persetujuan pengguna; secara desain, server hanya menerima yang dibutuhkannya dan seharusnya tidak bisa mengintip server lain.

Server bisa menyediakan tiga jenis hal. Tool adalah fungsi yang boleh diminta model untuk dijalankan. Resource adalah konteks dan data, masing-masing dialamatkan dengan URI. Prompt adalah templat pesan yang dipilih pengguna. Pelajaran ini mengikuti sebuah tool call, karena di tool-lah agen berhenti sekadar membaca dan mulai bertindak.

## Bagaimana satu tool call berjalan dari model ke server lalu kembali?

Model tidak pernah berbicara langsung dengan server. Model meminta call kepada host dengan menyebut nama tool dan argumennya; host memutuskan apakah call itu boleh berjalan, dan baru setelah itu MCP client-nya mengirim request JSON-RPC ke server. Hasilnya kembali lewat jalur yang sama dan masuk ke konteks model sebagai teks.

Penemuan tool datang lebih dulu. Client mengirim tools/list dan menerima nama, deskripsi, serta input schema setiap tool. Deskripsi itulah yang dibaca model untuk memutuskan kapan sebuah tool cocok dipakai, sehingga deskripsi yang kabur atau berniat jahat bisa mengubah perilaku agen. Spesifikasi juga menyatakan client wajib menganggap anotasi tool, misalnya petunjuk read-only, tidak tepercaya kecuali berasal dari server yang dipercaya.

Call-nya sendiri berupa request tools/call yang berisi nama tool dan argumennya. Sejak revisi 2026-07-28, MCP bersifat stateless: tidak ada handshake initialize dan tidak ada session protokol, dan setiap request membawa versi protokol serta kemampuan client di field _meta. Server yang dibuat untuk revisi 2025 masih mengharapkan handshake, dan client mendeteksi jenis server yang sedang diajaknya bicara.

Balasannya berupa result dengan array content, biasanya teks, dan isError bernilai true bila tool berjalan tetapi gagal, misalnya karena format tanggal salah. Tool yang tidak dikenal atau request yang rusak adalah protocol error, bukan isError. Dalam kedua kasus, client meneruskan hasilnya ke model, yang membacanya sebagai input; tidak ada yang mengecek kebenarannya di sepanjang jalan.

## stdio atau Streamable HTTP: transport mana yang membawa call?

Transport adalah cara pesan berpindah; isi pesannya sama saja. Dengan stdio, host menjalankan server sebagai child process di komputer Anda, lalu keduanya bertukar satu pesan JSON-RPC per baris lewat standard input dan output. Dengan Streamable HTTP, server adalah layanan yang berdiri sendiri, dan setiap pesan dikirim sebagai HTTP POST ke satu endpoint.

stdio cocok untuk tool lokal: tidak ada port dan tidak ada listener jaringan. Server berjalan dengan hak akses user Anda, jadi memercayai perintah yang Anda jalankan itu penting. Spesifikasi menyatakan server stdio tidak boleh menulis apa pun selain pesan MCP ke stdout, dan boleh menulis log ke stderr.

Streamable HTTP cocok untuk server bersama atau jarak jauh. Balasannya berupa satu objek JSON atau aliran event khusus untuk request tersebut. Karena server bisa dijangkau lewat jaringan, spesifikasi mewajibkannya memvalidasi header Origin, menyarankan server lokal hanya bind ke 127.0.0.1, dan menyarankan setiap koneksi diautentikasi. Transport HTTP+SSE yang lama sudah deprecated.

## Konfigurasi nyata di balik pelajaran ini

`app/components/blogs/KubernetesMcpServerReadOnlyToolsets.tsx:327-332`

```javascript
const config = process.argv[2];
const server = spawn(
  "npx",
  ["-y", "kubernetes-mcp-server@0.0.67", "--config", config],
  { stdio: ["pipe", "pipe", "inherit"] },
);
```

Skrip audit di artikel Kubernetes MCP situs ini adalah MCP client yang sangat kecil, dan inilah transport stdio dalam enam baris: client menjalankan server sebagai child process dan memegang stdin serta stdout-nya. stderr diwariskan, jadi log server muncul di terminal tanpa tercampur ke aliran pesan. Versinya dikunci, karena server yang Anda jalankan adalah kode yang Anda eksekusi.

`app/components/blogs/KubernetesMcpServerReadOnlyToolsets.tsx:351-356`

```javascript
send({ jsonrpc: "2.0", id: 1, method: "initialize",
  params: { protocolVersion: "2025-06-18", capabilities: {}, clientInfo: { name: "audit", version: "1" } } });
setTimeout(() => {
  send({ jsonrpc: "2.0", method: "notifications/initialized" });
  send({ jsonrpc: "2.0", id: 2, method: "tools/list" });
}, 3000);
```

Pesan-pesan di skrip yang sama memakai protokol era 2025: request initialize, notifikasi initialized, lalu tools/list, yang cocok untuk versi server yang diuji di artikel itu. Di revisi 2026-07-28 handshake tersebut sudah tidak ada. Client bisa langsung mengirim tools/list dengan versinya di _meta, dan client yang juga mendukung server lama sebaiknya mencoba server/discover lebih dulu.

## Yang sering rusak

- **Server stdio yang mencetak ke stdout.** Satu console.log yang nyasar di server stdio ikut masuk ke aliran pesan, dan client gagal mem-parse-nya sebagai JSON-RPC. Spesifikasi menyatakan server stdio hanya boleh menulis pesan MCP yang valid ke stdout. Kirim semua log ke stderr.
- **Memercayai deskripsi tool yang tidak pernah Anda baca.** Model memilih tool berdasarkan deskripsinya. Deskripsi yang mengklaim lebih dari kemampuan tool, atau menyuruh model melakukan sesuatu berikutnya, akan mengarahkan agen. Baca output tools/list sebuah server sebelum Anda menghubungkannya ke sistem sungguhan.
- **Mencampur era protokol.** Tutorial tahun 2025 membuka setiap koneksi dengan initialize dan menyimpan header Mcp-Session-Id. Revisi 2026-07-28 menghapus keduanya, jadi potongan kode lama di SDK baru, atau sebaliknya, gagal dengan cara yang membingungkan. Cek dulu revisi apa yang dipakai client dan server Anda.
- **Server HTTP lokal yang terbuka ke jaringan.** Server Streamable HTTP yang bind ke 0.0.0.0 tanpa autentikasi juga menjawab mesin lain, dan tanpa pengecekan Origin sebuah halaman web bisa menjangkaunya lewat DNS rebinding. Bind ke 127.0.0.1 dan wajibkan token.

### Dua transport standar MCP

| Transport | Tempat server berjalan | Cara pesan berpindah | Yang perlu dijaga |
| --- | --- | --- | --- |
| stdio | Child process yang dijalankan host di komputer Anda | Satu pesan JSON-RPC per baris di stdin dan stdout | Perintah yang dijalankan memakai hak akses Anda |
| Streamable HTTP | Layanan mandiri, lokal atau jarak jauh | Satu HTTP POST per pesan; balasannya JSON atau aliran event | Siapa pun yang bisa menjangkau endpoint: cek Origin, wajibkan auth |

## Coba sendiri

Anda butuh terminal dan Node.js 22.19 atau lebih baru, yang dibutuhkan MCP Inspector. Tanpa akun dan tanpa API key. Inspector adalah client debugging rujukan protokol ini, jadi Anda bisa melihat pesan asli tanpa model AI di tengahnya.

1. Buat folder latihan kecil untuk dilayani oleh server rujukan filesystem.

   ```bash
   mkdir -p ~/mcp-practice && echo hello > ~/mcp-practice/note.txt
   ```
2. Minta daftar tool server itu lewat stdio. Inspector menjalankan server sebagai child process, persis seperti yang dilakukan host.

   ```bash
   npx -y @modelcontextprotocol/inspector --cli npx @modelcontextprotocol/server-filesystem ~/mcp-practice --method tools/list
   ```
3. Cari list_directory di output-nya, lalu baca deskripsi dan input schema-nya. Teks itulah satu-satunya yang diketahui model tentang tool tersebut.
4. Panggil tool-nya. Content di dalam result adalah teks yang akan dibaca agen kembali ke konteksnya.

   ```bash
   npx -y @modelcontextprotocol/inspector --cli npx @modelcontextprotocol/server-filesystem ~/mcp-practice --method tools/call --tool-name list_directory --tool-arg path=$HOME/mcp-practice
   ```
5. Buka Inspector versi web untuk server yang sama agar pertukarannya terlihat sebagai pesan JSON-RPC, satu request dan satu response setiap kali.

   ```bash
   npx -y @modelcontextprotocol/inspector npx @modelcontextprotocol/server-filesystem ~/mcp-practice
   ```

## Kuis singkat

1. **Dalam setup MCP, bagian mana yang memutuskan apakah sebuah tool call boleh berjalan?**
   A. MCP server
   B. Aplikasi host, misalnya Claude Code
   C. Model
   Jawaban: B. Host yang menegakkan kebijakan keamanan dan persetujuan, dan spesifikasi menyatakan manusia harus bisa menolak setiap pemanggilan tool. Model hanya meminta; server hanya menjalankan yang sampai kepadanya.

2. **Transport mana yang menjalankan server sebagai child process di komputer Anda?**
   A. stdio
   B. Streamable HTTP
   C. HTTP+SSE
   Jawaban: A. Dengan stdio, host menjalankan server lalu bertukar satu pesan JSON-RPC per baris lewat standard stream-nya. Streamable HTTP berbicara dengan layanan mandiri, dan HTTP+SSE sudah deprecated.

3. **Menurut spesifikasi 2026-07-28, apa yang wajib dikirim client sebelum tools/call pertamanya?**
   A. Request initialize
   B. Session ID yang didapat dari server
   C. Tidak ada: setiap request membawa versinya di _meta
   Jawaban: C. Handshake dan session protokol dihapus di 2026-07-28. Client boleh memanggil server/discover lebih dulu, dan sebaiknya begitu bila juga mendukung server lama, tetapi tidak ada yang wajib.

## Pikirkan dulu

- **Mengapa deskripsi tool yang buruk bisa membuat agen berperilaku salah meski kode tool-nya benar?** Model memilih tool dan argumen hanya dari nama, deskripsi, dan skemanya. Deskripsi yang melebih-lebihkan kemampuan tool, atau membawa instruksi, mengarahkan pilihan itu sebelum kode apa pun berjalan.
- **Sebuah tool berjalan, tetapi format argumen tanggalnya salah. Apakah client menerima error JSON-RPC?** Tidak. Itu tool execution error: result biasa dengan isError bernilai true dan pesan di content, yang bisa dibaca dan diperbaiki model. Error JSON-RPC dipakai untuk masalah protokol, seperti tool yang tidak dikenal atau request yang rusak.
- **Mengapa server stdio menulis log ke stderr, bukan ke stdout?** stdout membawa pesan JSON-RPC, satu per baris, dan spesifikasi menyatakan server stdio tidak boleh menulis hal lain di sana. Apa pun tambahannya akan merusak aliran pesan; stderr bebas dipakai untuk log.

## Pelajari lebih dalam

- [MCP Dijelaskan: Apa yang Sebenarnya Diselesaikan Model Context Protocol](https://www.matthewswong.com/id/blog/mcp-model-context-protocol-explained/)
- [Transport MCP: stdio vs Streamable HTTP](https://www.matthewswong.com/id/blog/mcp-transports-stdio-vs-http/)
- [Primitif MCP: Tools, Resources, dan Prompts](https://www.matthewswong.com/id/blog/mcp-tools-resources-prompts-primitives/)
- [Migrasi Spec MCP 2026-07-28: Panduan Stateless untuk Server](https://www.matthewswong.com/id/blog/mcp-2026-07-28-stateless-spec-migration/)

## Sumber

- [Spesifikasi MCP 2026-07-28: arsitektur (host, client, server)](https://modelcontextprotocol.io/specification/2026-07-28/architecture)
- [Spesifikasi MCP 2026-07-28: tool, tools/list, dan tools/call](https://modelcontextprotocol.io/specification/2026-07-28/server/tools)
- [Spesifikasi MCP 2026-07-28: transport (stdio, Streamable HTTP)](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports)
- [Spesifikasi MCP 2026-07-28: perubahan utama sejak 2025-11-25](https://modelcontextprotocol.io/specification/2026-07-28/changelog)
- [Dokumentasi MCP: MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector)
- [Server rujukan filesystem: daftar tool dan allowed directories](https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem)

---

- HTML version: https://www.matthewswong.com/id/learn/ai-agents-mcp/what-is-mcp-how-a-tool-call-travels/
- English: https://www.matthewswong.com/en/learn/ai-agents-mcp/what-is-mcp-how-a-tool-call-travels/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
