If you have spent years maintaining business logic inside PHP applications, watching Model Context Protocol tutorials can feel like standing outside a locked door. Nearly every guide assumes TypeScript or Python. They walk through official SDKs, npm installs, and pip packages. That leaves an enormous amount of business data—customer records, order histories, inventory systems—sitting in PHP codebases that look invisible to the current wave of AI tooling.

The good news is that nothing about MCP requires those SDKs. MCP is not a library. It is a wire protocol. If your runtime can read a line of text from standard input, parse JSON, and write JSON back out, it can speak the protocol. PHP has been doing exactly that since long before LLMs existed.

What MCP Actually Is

MCP stands for Model Context Protocol. At its core, it is an open standard for connecting AI assistants to data, tools, and external APIs. Instead of building a custom integration for every assistant or model, you build one compliant interface. Any client that understands MCP can then talk to your server without knowing anything about PHP, Laravel, or your specific database schema.

Underneath, MCP uses JSON-RPC 2.0. That means every request is a simple JSON object containing a method name, parameters, and an ID. The server responds with another JSON object carrying either a result or an error.

A server exposes three primitives:

  • Tools: Actions the model can invoke. A tool might query a database, update a status, or call a third-party API.
  • Resources: Static or semi-static data the model can reference through a URI. Think of files, configuration documents, or reference datasets.
  • Prompts: Predefined templates that help the user interact with the system.

There is an important control distinction to remember. Tools are model-controlled. The assistant decides when to call one. Resources are application-controlled. The server decides what data is available and the model simply reads what is offered. Getting this right keeps your architecture predictable. You do not want a model hunting for resources that should have been tools, or vice versa.

How the Transport Works

MCP defines two transport methods, and your choice shapes how you write the PHP side.

stdio is the simplest. The MCP client launches your PHP script as a subprocess. The client writes JSON-RPC messages to your script’s standard input, and your script writes responses to standard output. There are no sockets to manage, no ports to open, and no authentication headers to parse. If your tool and your client live on the same machine, this is usually the right place to start.

Running over stdio imposes two strict rules on your PHP process. First, your application must never write non-protocol data to stdout. If you echo a debug statement or let a PHP notice leak through, you will break the client’s parser. Route all logging and diagnostics to stderr. Second, disable output buffering entirely. PHP likes to buffer stdout, especially in CGI or web contexts, but even CLI scripts can hold data. Flush every response immediately. If you are using streams, set stream_set_write_buffer(STDOUT, 0) or turn off implicit buffering so the client receives the newline the instant you send it.

Streamable HTTP works differently. Your PHP application runs as a persistent HTTP endpoint, usually reached via POST requests. This is useful when the server lives on a different host, or when you want a long-running daemon that multiple clients can reach. In PHP, this typically means running under RoadRunner, FrankenPHP, or a similar process manager rather than the traditional request-response cycle that dies after every call.

Building It in PHP

You do not need a framework to start. A minimal MCP server in PHP is a loop reading from STDIN, decoding JSON, dispatching to a handler, and encoding the result.

while ($line = fgets(STDIN)) {
    $request = json_decode($line, true);
    // route to tool or resource handler
    // write JSON-RPC response to STDOUT
}

Inside that loop, the real work is building interfaces that make sense to a model.

Hasilkan skema tool dari kode. Salah satu cara tercepat untuk menimbulkan masalah adalah menulis JSON Schema secara manual untuk parameter tool Anda dan membiarkannya tidak sinkron dengan logika validasi yang sebenarnya. PHP memiliki kemampuan refleksi yang kaya. Periksa tanda tangan metode (method signatures) Anda, baca aturan validasi yang ada dari form atau objek command Anda, dan hasilkan skema dari batasan-batasan tersebut. Jika kode internal Anda memerlukan format email yang valid, skema MCP Anda harus menyatakan hal yang sama. Saat aturan validasi berubah, skema akan diperbarui secara otomatis. Tidak ada ketidaksinkronan, tidak ada kegagalan diam-diam (silent failures).

Pisahkan error protokol dari error tool. JSON-RPC memiliki ruang error sendiri. Gunakan untuk protokol yang rusak: JSON yang tidak valid (malformed), metode yang tidak dikenal, atau ID permintaan yang hilang. Ketika sebuah tool dieksekusi dengan benar tetapi menemui masalah bisnis, kembalikan hasil normal dengan flag error di dalam payload. Jika tool pencarian pelanggan tidak menemukan catatan yang cocok, itu bukan crash protokol. Mengembalikan hasil terstruktur seperti {"found": false} memungkinkan model memahami apa yang terjadi dan memilih langkah selanjutnya. Model mungkin akan mencoba pencarian yang lebih luas, atau meminta klarifikasi kepada pengguna. Jika Anda justru melemparkan error JSON-RPC, model sering kali kehilangan konteks.

Rencanakan pekerjaan yang berjalan lama. PHP dibangun untuk permintaan singkat. Permintaan web mungkin mengalami timeout dalam tiga puluh detik, dan bahkan skrip CLI dapat menghabiskan memori atau kesabaran. Jika sebuah tool membutuhkan waktu beberapa menit untuk selesai—mungkin karena menyusun laporan besar atau menyinkronkan data antar sistem—jangan biarkan model menunggu. Segera kembalikan pengenal pekerjaan (job identifier). Kemudian sediakan tool kedua untuk memeriksa status berdasarkan ID tersebut. Anda dapat menyimpan progres di Redis, tabel database, atau bahkan file teks biasa (flat file) jika volumenya rendah. Model menerima ID tersebut, memeriksa kembali nanti, dan akhirnya mengambil hasil yang telah selesai.

Keamanan Saat Model Memiliki Kunci

Memberikan akses tool kepada model AI tidak sama dengan memberikannya kepada pengguna manusia. Sebuah model bertindak cepat, secara harfiah, dan dapat salah menafsirkan deskripsi. Perlakukan setiap tool yang diekspos sebagai risiko eskalasi hak istimewa (privilege escalation).

Batasi cakupan secara agresif. Jangan pernah mengekspos tool run_sql yang generik. Bangun tool yang spesifik dan sempit seperti find_customer_by_email atau update_order_status. Model hanya boleh melakukan tepat seperti yang Anda beri nama, dengan parameter yang telah Anda tentukan.

Pisahkan jalur baca (read) dan tulis (write). Tool read-only membawa risiko yang lebih rendah. Letakkan tindakan destruktif apa pun di balik mekanisme konfirmasi eksplisit, atau batasi sepenuhnya ke server kedua. Jika klien Anda mendukungnya, wajibkan langkah persetujuan manusia sebelum tool tulis dieksekusi.

Tulis deskripsi tool seolah-olah itu adalah instruksi tambahan, karena memang demikian adanya. Bersikaplah presisi tentang kapan model harus memanggil sebuah tool. Jika sebuah tool mencari harga, katakan demikian. Jika tool tersebut hanya boleh digunakan setelah memverifikasi ID pelanggan, nyatakan dengan jelas. Deskripsi yang samar menyebabkan perilaku yang samar.

Filter output Anda. Jangan menserialisasi seluruh model Eloquent atau entitas Doctrine dan membuangnya ke dalam hasil. Kembalikan hanya field yang benar-benar dibutuhkan model. Field internal—harga pokok, catatan karyawan, ID database yang harus tetap internal—tidak seharusnya dikirim melalui jaringan. Bersikaplah eksplisit mengenai bentuk (shape) pengembalian Anda.

Terakhir, catat (log) semuanya. Rekam nama tool, argumen yang dilewatkan, dan hasilnya. Jika model mulai melakukan looping pada query yang mahal atau mencoba-coba tool dalam urutan yang tidak terduga, log Anda adalah satu-satunya cara untuk mengetahuinya.

Di Mana Harus Memulai

Anda tidak memerlukan izin dari pemelihara SDK untuk menghubungkan aplikasi PHP Anda ke asisten AI. Anda hanya butuh JSON-RPC, sebuah loop, dan sedikit disiplin terkait stdout.

Tahan keinginan untuk membangun kembali seluruh API Anda sebagai tool MCP pada hari pertama. Pilih tiga operasi read-only yang benar-benar sering ditanyakan oleh seseorang di organisasi Anda. Mungkin memeriksa status pesanan, menarik ringkasan pelanggan, atau menampilkan daftar faktur terbaru. Bungkus operasi tersebut sebagai tool, sajikan melalui stdio, dan biarkan satu rekan kerja menggunakannya. Perhatikan apa yang dilakukan model dengan baik dan di mana ia tersandung. Anda akan belajar lebih banyak dari tiga tool tersebut daripada merencanakan tiga puluh tool.

MCP adalah jembatan, bukan pengganti aplikasi Anda. Kode PHP Anda sudah memahami bisnis Anda. Protokol ini hanya memungkinkan model untuk menyeberang dan mengajukan pertanyaan kepadanya.