← semua materi
15:00 Teknis Β· 27 Oct 2026 Β· 15:19

πŸ“š Topik

Model Context Protocol (MCP): standar integrasi tools untuk AI agent

Fokus: MCP 2026-07-28, stateless protocol, tool calling, MRTR, caching, auth, dan deployment produksi.

🎯 Tujuan Belajar

Besok bisa:


πŸ“Œ Ringkasan Singkat

MCP adalah protokol standar agar LLM host dapat menemukan dan menjalankan tools, membaca resources, serta memakai prompt dari sistem eksternal. Nilai utamanya bukan β€œAPI baru”, melainkan kontrak interoperabilitas: client, server, gateway, authorization, observability, dan tool metadata memakai bentuk yang sama.

Versi terbaru terverifikasi: MCP 2026-07-28, dirilis 28 Juli 2026. Perubahan terbesar: protocol core menjadi stateless. initialize, notifications/initialized, dan Mcp-Session-Id tidak lagi menjadi bagian core request path. Setiap request membawa metadata sendiri, sehingga request bisa masuk ke instance mana pun.


πŸ“Š Temuan Utama

Aspek MCP lama MCP 2026-07-28
Handshake initialize wajib Dihapus dari modern request path
Session Mcp-Session-Id Dihapus dari protocol core
Load balancer Sticky session atau shared session store Round-robin biasa
Server-to-client request Open stream MRTR dengan retry
Tool catalog Sering fetch ulang Mendukung ttlMs dan cacheScope
Routing gateway Parse JSON body Baca Mcp-Method, Mcp-Name
Long-running operation Connection/session bergantung Tasks extension dengan polling
Legacy HTTP+SSE Dipakai versi lama Deprecated
SDK TypeScript @modelcontextprotocol/sdk v1.x @modelcontextprotocol/server v2.x
State aplikasi Tersembunyi di session Handle eksplisit atau requestState

MCP bukan pengganti seluruh API internal. MCP menjadi adapter standar untuk agent-facing API.


πŸ—οΈ Arsitektur & Alur Teknis

LLM Host
  β”‚
  β”‚ MCP Client
  β”‚  - discover tools
  β”‚  - pilih tool
  β”‚  - kirim arguments
  β”‚  - tampilkan approval UI
  β”‚
  β–Ό
MCP Gateway / HTTP Load Balancer
  β”‚
  β”‚ Mcp-Method: tools/call
  β”‚ Mcp-Name: deploy
  β”‚
  β–Ό
MCP Server Instance A/B/C
  β”‚
  β”œβ”€β”€ Tool handler
  β”œβ”€β”€ Auth validation
  β”œβ”€β”€ Input validation
  β”œβ”€β”€ Business API / DB
  └── Audit log / tracing

Alur tools/call

1. Client mengirim tools/call
2. Gateway membaca Mcp-Method dan Mcp-Name
3. Load balancer memilih instance apa pun
4. Server memvalidasi:
   - protocol version
   - auth
   - input schema
   - authorization user
5. Tool menjalankan aksi
6. Server mengembalikan resultType: complete

Alur MRTR

Dipakai ketika tool perlu konfirmasi atau input tambahan.

Client ── tools/call ───────────────► Server
Client ◄─ resultType: input_required ─ Server
Client ── tampilkan form/approval ───► User
Client ── tools/call + inputResponses ─► Server
Client ◄─ resultType: complete ──────── Server

requestState harus:


πŸ’» Kode Nyata / Konfigurasi

Versi terverifikasi

Hasil registry pada 27 Oktober 2026:

Node.js: v22.23.1
@modelcontextprotocol/server: 2.4.0
@modelcontextprotocol/node: 2.1.2
@modelcontextprotocol/sdk: 1.32.2
Python package mcp: 2.3.0

Untuk MCP 2026-07-28, gunakan package v2. Package lama @modelcontextprotocol/sdk adalah maintenance line v1.

Instalasi

mkdir mcp-demo
cd mcp-demo
npm init -y
npm install @modelcontextprotocol/server@2.4.0 \
  @modelcontextprotocol/node@2.1.2 \
  zod@4

Tambahkan "type": "module" pada package.json.

MCP server TypeScript-compatible JavaScript

Simpan sebagai server.mjs:

import http from "node:http";
import { z } from "zod";
import {
  McpServer,
  createMcpHandler,
  createRequestStateCodec,
} from "@modelcontextprotocol/server";
import { toNodeHandler } from "@modelcontextprotocol/node";

const stateCodec = createRequestStateCodec({
  key: process.env.STATE_KEY ?? "replace-this-with-32-byte-secret-key",
  ttlSeconds: 300,
});

function createServer() {
  const server = new McpServer(
    { name: "deployment-mcp", version: "1.0.0" },
    {
      cacheHints: {
        "tools/list": {
          ttlMs: 60_000,
          cacheScope: "public",
        },
      },
      requestState: {
        verify: stateCodec.verify,
      },
    },
  );

  server.registerTool(
    "deploy",
    {
      description: "Deploy service after explicit user confirmation.",
      inputSchema: z.object({
        service: z.string().min(1).max(100),
      }),
    },
    async ({ service }, context) => {
      const state = context.mcpReq.requestState?.();

      if (!state) {
        return {
          resultType: "input_required",
          inputRequests: {
            confirm_deploy: {
              method: "elicitation/create",
              params: {
                mode: "form",
                message: `Deploy ${service} to production?`,
                requestedSchema: {
                  type: "object",
                  properties: {
                    ok: { type: "boolean" },
                  },
                  required: ["ok"],
                },
              },
            },
          },
          requestState: await stateCodec.mint({ service }, context),
        };
      }

      const confirmation = context.mcpReq.inputResponses?.confirm_deploy;

      if (confirmation?.action !== "accept") {
        return {
          content: [{ type: "text", text: "Deployment cancelled." }],
        };
      }

      // Replace with real deployment API call.
      return {
        content: [{
          type: "text",
          text: `Deployment started for ${state.service}.`,
        }],
      };
    },
  );

  return server;
}

const handler = createMcpHandler(
  () => createServer(),
  { legacy: "reject" },
);

http
  .createServer(toNodeHandler(handler))
  .listen(3000, "127.0.0.1", () => {
    console.log("MCP server listening on http://127.0.0.1:3000/mcp");
  });

Jalankan:

STATE_KEY="$(openssl rand -hex 32)" node server.mjs

Request modern

Modern request wajib membawa:

Contoh:

curl -s http://127.0.0.1:3000/mcp \
  -X POST \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: tools/list' \
  --data '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list",
    "params": {
      "_meta": {
        "io.modelcontextprotocol/protocolVersion": "2026-07-28",
        "io.modelcontextprotocol/clientInfo": {
          "name": "demo-client",
          "version": "1.0.0"
        },
        "io.modelcontextprotocol/clientCapabilities": {}
      }
    }
  }'

Hasil penting:

{
  "result": {
    "tools": [
      {
        "name": "deploy",
        "description": "Deploy service after explicit user confirmation.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "service": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          "required": ["service"]
        }
      }
    ],
    "resultType": "complete",
    "ttlMs": 60000,
    "cacheScope": "public"
  }
}

Header tool call

POST /mcp HTTP/1.1
Content-Type: application/json
Accept: application/json, text/event-stream
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: deploy

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "deploy",
    "arguments": {
      "service": "billing-api"
    },
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientInfo": {
        "name": "demo-client",
        "version": "1.0.0"
      },
      "io.modelcontextprotocol/clientCapabilities": {
        "elicitation": {}
      }
    }
  }
}

Server mengembalikan:

{
  "result": {
    "resultType": "input_required",
    "inputRequests": {
      "confirm_deploy": {
        "method": "elicitation/create",
        "params": {
          "mode": "form",
          "message": "Deploy billing-api to production?"
        }
      }
    },
    "requestState": "v1.opaque-hmac-protected-value"
  }
}

Client mengirim ulang request dengan:

{
  "requestState": "v1.opaque-hmac-protected-value",
  "inputResponses": {
    "confirm_deploy": {
      "action": "accept",
      "content": {
        "ok": true
      }
    }
  }
}

Jangan menganggap requestState aman hanya karena namanya opaque. Tanpa HMAC/AEAD, model atau client berbahaya dapat memodifikasi state.


πŸ“Š Angka & Benchmark

Benchmark lokal

Benchmark dilakukan pada:

Node.js v22.23.1
MCP server lokal
localhost HTTP
Tool ping tanpa database/API eksternal
Concurrency: 64
Total request: 2.000

Hasil:

712 req/s
p50: 70.93 ms
p95: 185.97 ms
p99: 327.11 ms

Ini bukan benchmark MCP umum. Hasil hanya mengukur server lokal, HTTP, JSON parsing, schema handling, dan per-request server construction. Tidak mewakili production latency.

Angka ekosistem

Blog resmi MCP menyatakan bahwa pada Juli 2026:

Angka ini adalah klaim dari project maintainers, bukan audit independen.


βš–οΈ Trade-off & Alternatif

MCP vs REST API

Aspek MCP REST
Target utama LLM agent Aplikasi dan service
Tool discovery Built-in tools/list Perlu OpenAPI/docs
Schema input Built-in OpenAPI/JSON Schema opsional
Human approval MRTR/elicitation Buat sendiri
Client interoperability Tinggi bila host mendukung MCP Client harus dibuat per API
Observability Metadata protocol standar Bergantung implementasi
Cocok untuk Agent-facing capability Public/internal business API

Rekomendasi:

Stateless protocol

Kelebihan:

Kekurangan:

MRTR vs open stream

MRTR:

Open stream lama:


🏭 Use Case Produksi & Failure Mode Umum

Use case

Failure mode

Failure Penyebab Perbaikan
400 Bad Request Header dan body method berbeda Generate header dari RPC method
-32022 Unsupported protocol version Client/server tidak sepakat versi Version negotiation atau legacy lane
Tool tidak muncul Schema invalid atau registration gagal Test tools/list, validasi Zod
State diterima instance berbeda State hanya tersimpan memory lokal Gunakan signed state atau shared DB
Deployment ganda Retry setelah timeout Idempotency key dan deduplication
Credential bocor Credential dimasukkan form biasa Gunakan URL mode/OAuth, jangan form mode
DNS rebinding Server bind 0.0.0.0 tanpa Origin validation Validasi Origin, bind localhost untuk local server
Cache data sensitif cacheScope: public Gunakan private untuk user-specific response
Tool abuse Tool punya permission terlalu besar Least privilege, authorization per call
Session lama rusak setelah migrasi Masih melayani client pre-2026 Simpan legacy lane sampai traffic nol
State tampering requestState dipercaya mentah HMAC/AEAD, expiry, binding ke principal

MCP 2026-07-28 masih mempertahankan backward compatibility lane untuk client lama. Jangan menghapus sticky session dan session store sebelum traffic versi lama mencapai nol.


πŸ” Security Checklist


πŸ› οΈ Latihan Praktis Kecil

  1. Jalankan server contoh.
  2. Panggil tools/list.
  3. Panggil deploy.
  4. Ambil requestState.
  5. Kirim retry dengan inputResponses.
  6. Ubah satu karakter dalam requestState.
  7. Amati error:
{
  "code": -32602,
  "message": "Invalid or expired requestState",
  "data": {
    "reason": "invalid_request_state"
  }
}
  1. Jalankan dua instance server di port berbeda.
  2. Letakkan reverse proxy round-robin di depan keduanya.
  3. Pastikan retry MRTR dapat diproses instance berbeda.

Tes tambahan:

curl -i http://127.0.0.1:3000/mcp \
  -X POST \
  -H 'Origin: https://evil.example' \
  -H 'Content-Type: application/json' \
  --data '{}'

Expected: 403 Forbidden setelah Origin validation diaktifkan pada deployment server.


βœ… Cek Pemahaman

  1. Mengapa MCP 2026-07-28 tidak membutuhkan sticky session untuk protocol state?
  2. Mengapa requestState harus memiliki HMAC atau AEAD?
  3. Kapan MCP sebaiknya menjadi adapter di depan REST API, bukan menggantikan REST API?

πŸ”‘ Poin Kunci


πŸ” Status Pengetahuan

DIKETAHUI

DIINFERENSI

BELUM PASTI


πŸ”— Sumber

  1. Model Context Protocol. β€œThe 2026-07-28 Specification.” 28 Juli 2026.
    https://blog.modelcontextprotocol.io/posts/2026-07-28/

  2. Model Context Protocol. β€œStreamable HTTP β€” Specification 2026-07-28.”
    https://modelcontextprotocol.io/specification/2026-07-28/basic/transports/streamable-http

  3. Model Context Protocol. β€œMulti Round-Trip Requests β€” Specification 2026-07-28.”
    https://modelcontextprotocol.io/specification/2026-07-28/basic/patterns/mrtr

  4. Model Context Protocol. β€œChangelog β€” Specification 2026-07-28.”
    https://modelcontextprotocol.io/specification/2026-07-28/changelog

  5. Model Context Protocol TypeScript SDK. v2, main branch. Diakses 27 Oktober 2026.
    https://github.com/modelcontextprotocol/typescript-sdk

  6. Cloudflare. β€œThe next generation of MCP.” 2026.
    https://blog.cloudflare.com/mcp-v2

  7. AWS Architecture Blog. β€œMCP went stateless: Is your AWS MCP server deployment well-architected?” 27 Agustus 2026.
    https://aws.amazon.com/blogs/architecture/mcp-went-stateless-is-your-aws-mcp-server-deployment-well-architected/


➑️ Eksplorasi Lanjut