Sebelum memulai praktik, pastikan Anda telah memahami konsep dasar pada materi kelas AI Agent & PHP di infokoding.

BAB 10

Integrasi MCP (Model Context Protocol) pada AI Agent PHP

Mengintegrasikan MCP (Model Context Protocol) ke dalam AI Agent PHP: setup MCP Client, registrasi dan testing tool, serta menjalankan tools melalui protokol MCP standar.

Terakhir diperbarui:

TL;DR — Ringkasan Integrasi MCP (Model Context Protocol) di PHP

  • Model Context Protocol (MCP): Standar terbuka dari Anthropic yang memisahkan aplikasi agen (MCP Client) dari penyedia kapabilitas (MCP Server).
  • Format Protokol: Berjalan di atas spesifikasi JSON-RPC 2.0 yang stateless dan sangat ringan.
  • Transport Layer: Mendukung loop stream php://stdin / php://stdout untuk CLI lokal berkecepatan tinggi atau endpoint Server-Sent Events (SSE) untuk jaringan terdistribusi.
  • Reusability: Satu MCP Server dapat digunakan secara universal oleh Claude Desktop, OpenAI, Cursor IDE, hingga custom PHP worker.

Konsep Dasar Model Context Protocol (MCP) di PHP

Dalam roadmap belajar ai-agent-php tingkat lanjut, salah satu tantangan terbesar adalah menghubungkan logika agen dengan ekosistem tools eksternal secara modular tanpa mengikat (*hardcoding*) logika database atau API pihak ketiga langsung ke dalam satu file aplikasi.

Model Context Protocol (MCP) diperkenalkan oleh Anthropic sebagai standar industri terbuka (*open standard*) yang memecahkan masalah fragmentasi ini. MCP bertindak layaknya arsitektur Client-Server universal bagi ekosistem AI: MCP Server mengekspos kapabilitas (*tools, resources, prompts*), sedangkan MCP Client (aplikasi PHP Anda) bertindak sebagai jembatan yang menghubungkan instruksi LLM dengan server tersebut.

Diagram Arsitektur Model Context Protocol (MCP) PHP: Dual Transport stdio & SSE
WebP Lossless • 82 KB
Diagram arsitektur komunikasi Model Context Protocol MCP PHP yang menghubungkan MCP Clients seperti Claude Desktop dan AI Agent PHP ke PHP MCP Server melalui transport stdio dan SSE dengan protokol JSON-RPC 2.0
Gambar 10.1: Diagram Arsitektur Model Context Protocol (MCP) pada PHP — Menampilkan integrasi dual-transport: Standard I/O (php://stdin & php://stdout) untuk CLI lokal dan Server-Sent Events (SSE) untuk remote microservices yang mengekspos 3 modul primitif (Tools, Resources, Prompts).
Komparasi Arsitektur: Function Calling Tradisional vs Model Context Protocol (MCP)
Dimensi PerbandinganFunction Calling Tradisional Model Context Protocol (MCP)
Tingkat Keterikatan (Coupling)Tightly coupled (Fungsi terikat pada codebase satu agent)Loosely coupled (MCP Server terpisah independen via RPC)
Interoperabilitas Lintas AITerkunci pada format vendor spesifik (OpenAI / Gemini)Standar terbuka universal (Claude, OpenAI, Cursor, IDEs)
Mekanisme ProtokolCustom vendor request/response array payloadSpesifikasi standar JSON-RPC 2.0 (Methods & Notifications)
Lapisan TransportTerbatas pada HTTP REST Request aplikasi lokalMendukung Standard I/O (stdio) dan Server-Sent Events (SSE)
Primitif KonteksHanya Tools (Fungsi Eksekusi)Tools (Aksi), Resources (Data Pasif), & Prompts (Template)
Skalabilitas & ReusabilityRendah (Duplikasi kode di setiap service baru)Sangat Tinggi (1 MCP Server melayani puluhan AI Client)

One-line Takeaway: MCP memisahkan domain logika bisnis alat dari aplikasi agen AI, menjadikannya arsitektur microservices masa depan.

Standardisasi Anthropic MCP & Mekanisme Protokol JSON-RPC 2.0

Di balik kesederhanaan antarmukanya, standardisasi Anthropic MCP beroperasi di atas spesifikasi protokol JSON-RPC 2.0 yang teruji, stateless, dan sangat efisien. Dalam spesifikasi MCP resmi, komunikasi pertukaran konteks terbagi ke dalam 3 primitif utama:

  • Tools: Fungsi yang dapat dipanggil AI untuk melakukan aksi nyata (contoh: tools/list dan tools/call).
  • Resources: Data kontekstual pasif yang dapat dibaca AI (file lokal, schema database, log sistem).
  • Prompts: Template instruksi siap pakai yang diekspos oleh server untuk mengarahkan perilaku agent.

Referensi Resmi Anthropic MCP Specification

Spesifikasi arsitektur protokol, schema JSON-RPC 2.0, dan implementasi SDK multi-bahasa dapat Anda pelajari secara langsung pada repositori resmi Anthropic Model Context Protocol (GitHub) dan dokumentasi arsitektur di Model Context Protocol Specification Portal.

Diagram Sekuens: Lifecycle Transport Protokol MCP pada PHP
WebP Lossless • 49 KB • Interactive Sequence
Diagram sekuens arsitektur transport Model Context Protocol MCP PHP yang mengilustrasikan 5 tahapan: Handshake and Initialize, Discovery tools list, Tool Invocation tools call, PHP Function Execution, dan Result Payload Return
Gambar 10.2: Diagram Sekuens Siklus Hidup Transport MCP pada PHP — Menguraikan interaksi waktu-nyata antara Host/Client, Transport Layer (stdio/SSE), Proses PHP MCP Server, hingga eksekusi fungsi database/API lokal.

Implementasi Transport MCP PHP: Loop Stream php://stdin & Endpoint SSE Murni

Dua mode transport utama yang digunakan dalam produksi adalah Standard I/O (stdio) untuk eksekusi CLI lokal super cepat dan Server-Sent Events (SSE) untuk integrasi microservices jarak jauh:

1. Loop Stream Transport Standard I/O (php://stdin & php://stdout)

Mode transport ini digunakan ketika aplikasi induk (seperti Claude Desktop atau runner CLI) mengeksekusi skrip PHP sebagai sub-proses. Skrip membaca payload JSON-RPC baris demi baris secara non-blocking:

<?php
// mcp-stdio-server.php

require_once __DIR__ . '/vendor/autoload.php';

use App\MCP\McpServer;
use App\Tools\WeatherTool;

$server = new McpServer();
$server->register('get_weather', new WeatherTool());

// Loop stream stdin: baca input JSON-RPC baris demi baris
$stdin = fopen('php://stdin', 'r');
while (($line = fgets($stdin)) !== false) {
    $line = trim($line);
    if (empty($line)) continue;

    $request = json_decode($line, true);
    $id      = $request['id'] ?? null;
    $method  = $request['method'] ?? '';
    $params  = $request['params'] ?? [];

    $response = ['jsonrpc' => '2.0', 'id' => $id];

    try {
        if ($method === 'tools/list') {
            $response['result'] = ['tools' => $server->listTools()];
        } elseif ($method === 'tools/call') {
            $name   = $params['name'] ?? '';
            $args   = $params['arguments'] ?? [];
            $result = $server->callTool($name, $args);
            $response['result'] = ['content' => [['type' => 'text', 'text' => json_encode($result)]]];
        } else {
            $response['error'] = ['code' => -32601, 'message' => "Method '{$method}' tidak ditemukan."];
        }
    } catch (\Throwable $e) {
        $response['error'] = ['code' => -32000, 'message' => $e->getMessage()];
    }

    // Tulis balasan ke stdout diakhiri newline
    fwrite(STDOUT, json_encode($response, JSON_UNESCAPED_UNICODE) . "\n");
    fflush(STDOUT);
}
fclose($stdin);

One-line Takeaway: php://stdin memungkinkan proses eksekusi langsung dalam milidetik tanpa overhead soket TCP.

2. Endpoint Server-Sent Events (SSE) Murni untuk Remote MCP Server

Jika MCP Server berada di VPS terpisah dan diakses via HTTP, gunakan streaming header text/event-stream native PHP:

<?php
// mcp-sse-endpoint.php (Dijalankan di Nginx / FrankenPHP)

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no'); // Nonaktifkan buffer proxy Nginx

// Kirim event endpoint URI untuk inisialisasi sesi MCP
$sessionId = bin2hex(random_bytes(16));
$postUri   = "https://panel.infokoding.com/mcp/messages?session={$sessionId}";

echo "event: endpoint\n";
echo "data: {$postUri}\n\n";
flush();

// Keep-alive heartbeat ping loop
while (true) {
    if (connection_aborted()) break;

    echo ": ping\n\n";
    flush();
    sleep(15);
}

One-line Takeaway: X-Accel-Buffering: no wajib dipasang di Nginx agar event stream tidak tertahan di buffer web server.

Membuat Class McpServer & McpClient di PHP

Berikut adalah implementasi class McpServer dan McpClient terstruktur:

<?php

namespace App\MCP;

use App\Tools\ToolInterface;

class McpServer
{
    private array $tools = [];

    public function register(string $name, ToolInterface $tool): self
    {
        $this->tools[$name] = $tool;
        return $this;
    }

    public function listTools(): array
    {
        $definitions = [];
        foreach ($this->tools as $name => $tool) {
            $def = $tool->getDefinition();
            $definitions[] = $def['function'] ?? $def;
        }
        return $definitions;
    }

    public function callTool(string $name, array $args): mixed
    {
        if (!isset($this->tools[$name])) {
            throw new \InvalidArgumentException("Tool '{$name}' tidak terdaftar.");
        }
        return $this->tools[$name]->execute($args);
    }
}

class McpClient
{
    private McpServer $server;

    public function __construct(McpServer $server)
    {
        $this->server = $server;
    }

    public function getToolDefinitions(): array
    {
        return array_map(fn($tool) => [
            'type'     => 'function',
            'function' => $tool,
        ], $this->server->listTools());
    }

    public function executeToolCall(array $toolCall): array
    {
        $name   = $toolCall['function']['name'];
        $args   = json_decode($toolCall['function']['arguments'], true) ?? [];
        $callId = $toolCall['id'];

        try {
            $result = $this->server->callTool($name, $args);
            return [
                'role'         => 'tool',
                'tool_call_id' => $callId,
                'content'      => json_encode($result, JSON_UNESCAPED_UNICODE),
            ];
        } catch (\Throwable $e) {
            return [
                'role'         => 'tool',
                'tool_call_id' => $callId,
                'content'      => json_encode(['error' => $e->getMessage()], JSON_UNESCAPED_UNICODE),
            ];
        }
    }
}
Konfigurasi Integrasi: Claude Desktop & Cursor IDE (claude_desktop_config.json)
Ready to Copy

Untuk menghubungkan skrip MCP Server PHP Anda secara langsung ke antarmuka Claude Desktop atau Cursor IDE, salin dan tempelkan konfigurasi JSON berikut ke dalam file claude_desktop_config.json:

{
  "mcpServers": {
    "php-weather-server": {
      "command": "php",
      "args": [
        "/home/infokoding/projects/mcp-stdio-server.php"
      ],
      "env": {
        "OPENAI_API_KEY": "sk-proj-your-api-key-here",
        "APP_ENV": "production"
      }
    },
    "php-remote-sse-server": {
      "url": "https://panel.infokoding.com/mcp-sse-endpoint.php",
      "transport": "sse"
    }
  }
}

Lokasi File Konfigurasi Claude Desktop:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

Configuration Takeaway: Setelah menyimpan file konfigurasi, restart aplikasi Claude Desktop. Claude akan secara otomatis mengeksekusi sub-proses PHP dan mendeteksi seluruh tool terdaftar via stdio.

FAQ: Pertanyaan Seputar Integrasi Model Context Protocol (MCP) di PHP

1. Apa perbedaan utama antara Function Calling biasa dengan Model Context Protocol (MCP)?

Ringkasan Jawaban:Function Calling adalah fitur spesifik milik satu vendor LLM, sedangkan MCP adalah protokol standar terbuka lintas platform yang memisahkan server penyedia alat dari aplikasi agen.

Dengan MCP, satu server tool yang ditulis di PHP dapat diakses oleh berbagai agent berbasis Claude Desktop, OpenAI, cursor IDE, maupun framework kustom lainnya tanpa perlu membuat ulang adaptor fungsi.

2. Mengapa MCP menggunakan spesifikasi protokol JSON-RPC 2.0?

Ringkasan Jawaban:JSON-RPC 2.0 menyediakan format pertukaran pesan yang ringan, deterministik, dan agnostik terhadap transport layer (baik stdio proses lokal maupun HTTP/SSE jaringan).

Setiap request memiliki parameter id unik, sehingga proses asinkron dan pelacakan hasil panggilan alat menjadi sangat handal.

3. Kapan harus menggunakan transport stdio vs transport Server-Sent Events (SSE)?

Ringkasan Jawaban:Gunakan stdio saat MCP Server dijalankan secara lokal di mesin yang sama dengan aplikasi AI untuk latensi nol, dan gunakan SSE/HTTP saat server tool berada di infrastruktur VPS jarak jauh.

Transport stdio tidak membutuhkan port terbuka di firewall, sedangkan transport SSE memungkinkan integrasi microservices multi-server.

4. Apakah MCP Server aman digunakan untuk mengakses data sensitif seperti database produksi?

Ringkasan Jawaban:Sangat aman jika diterapkan dengan prinsip least privilege, prepared statement PDO, validasi JSON Schema ketat, dan pembatasan hak akses berbasis token pada layer server.

Model AI tidak pernah memegang kredensial database secara langsung; AI hanya mengirimkan parameter query yang telah tervalidasi ke MCP Server Anda.

RA

Rusmawan Abdullah Sani

Lead Software Engineer & System Architect

Praktisi pengembangan backend PHP modern, arsitektur AI Agent, microservices, dan otomasi server Linux. Terhubung melalui profil LinkedIn.