TOPIC #7 · Laravel × MCPสร้าง MCP Server ของคุณเองด้วย Laravel
เปิดประตูสู่ยุค AI-first Development — ให้ Laravel เป็น backend ที่ AI Agent พูดคุยได้โดยตรง
ในช่วงปี 2025–2026 คำว่า MCP (Model Context Protocol) กลายเป็นหัวข้อร้อนแรงในวงการ AI Development เพราะมันเป็นมาตรฐานกลางที่ทำให้ AI Agent เช่น Claude, Cursor หรือ VS Code Copilot สามารถ "เรียกใช้" เครื่องมือของเราได้โดยตรง เหมือน REST API แต่ออกแบบมาเพื่อ LLM โดยเฉพาะ
แล้ว Laravel เกี่ยวอะไรด้วย? คำตอบคือ Laravel มีทุกอย่างที่ต้องการสำหรับสร้าง MCP Server ตั้งแต่ Routing ที่ clean, Middleware, Eloquent ORM ไปจนถึง JSON response ที่สวยงาม — บทความนี้จะพาทุกคนสร้าง MCP Server ตั้งแต่ศูนย์ แบบที่เข้าใจได้แม้ยังเป็นมือใหม่
💡 MCP คืออะไรในสองประโยค?
MCP (Model Context Protocol) คือโปรโตคอลเปิดที่กำหนดวิธีที่ AI Model จะ "เรียกฟังก์ชัน" บน server ของเรา — แทนที่จะต้องตั้ง REST API เอง MCP มี spec กลางที่ AI รู้จักอยู่แล้ว เราแค่ implement ตาม spec นั้น
🚀 ทำความรู้จัก MCP ก่อนลงมือ
MCP ทำงานด้วยโมเดลง่าย ๆ — AI Agent จะส่ง JSON-RPC request มาถามว่า "มี tool อะไรบ้าง?" แล้วเราตอบกลับด้วยรายการ tools พร้อม schema ของ parameter ต่าง ๆ จากนั้นเมื่อ AI ต้องการใช้ tool ก็จะส่ง request อีกครั้งพร้อม arguments เราก็ประมวลผลแล้วตอบกลับด้วยผลลัพธ์
โครงสร้างหลักของ MCP Server มี 3 endpoint ที่ต้องรู้จัก:
| Endpoint / Method | หน้าที่ | ตัวอย่าง Response |
|---|
| initialize | AI ทักทาย ขอข้อมูล server | ชื่อ server, version, capabilities |
| tools/list | ส่งรายการ tool ทั้งหมด | Array of tool schemas (JSON Schema) |
| tools/call | รัน tool ที่ AI เลือก | ผลลัพธ์จาก tool นั้น |
| resources/list | ประกาศ data source | URI, description ของ resource |
| prompts/list | เสนอ prompt template | Template สำเร็จรูปสำหรับ AI |
⚙️ ติดตั้ง Laravel และสร้างโปรเจกต์ใหม่
เริ่มต้นด้วยการสร้างโปรเจกต์ Laravel ใหม่ผ่าน Composer หรือ Laravel Installer ได้เลย:
# วิธีที่ 1: ใช้ Laravel Installer
laravel new my-mcp-server
# วิธีที่ 2: ใช้ Composer โดยตรง
composer create-project laravel/laravel my-mcp-server
# เข้าไปในโฟลเดอร์แล้วรัน server
cd my-mcp-server
php artisan serve
เมื่อ server ขึ้นแล้ว เราจะสร้างโครงสร้างไฟล์สำหรับ MCP Server ของเรา โดยมีไฟล์หลัก 3 ไฟล์ที่ต้องสร้าง:
php artisan make:controller McpController
php artisan make:service McpToolService # สร้างเอง หรือวาง class ใน app/Services/
🛣️ กำหนด Routes สำหรับ MCP
MCP ใช้ JSON-RPC 2.0 ผ่าน HTTP POST ที่ endpoint เดียว ซึ่ง Laravel จัดการได้ง่ายมาก เปิดไฟล์ routes/api.php แล้วเพิ่ม:
use App\Http\Controllers\McpController;
use Illuminate\Support\Facades\Route;
// MCP Server endpoint — รับ JSON-RPC ทุก method ที่นี่
Route::post('/mcp', [McpController::class, 'handle']);
// SSE endpoint สำหรับ streaming (optional)
Route::get('/mcp/sse', [McpController::class, 'sse']);🧩 สร้าง McpController — หัวใจของ Server
Controller นี้คือตัวกลางที่รับ JSON-RPC request จาก AI แล้ว dispatch ไปยัง handler ที่ถูกต้อง:
<?php
namespace App\Http\Controllers;
use App\Services\McpToolService;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class McpController extends Controller
{
public function __construct(
private McpToolService $toolService
) {}
public function handle(Request $request): JsonResponse
{
$method = $request->input('method');
$params = $request->input('params', []);
$id = $request->input('id');
$result = match ($method) {
'initialize' => $this->initialize(),
'tools/list' => $this->$this->listTools(),
'tools/call' => $this->callTool($params),
default => ['error' => 'Method not found'],
};
return response()->json([
'jsonrpc' => '2.0',
'id' => $id,
'result' => $result,
]);
}
private function initialize(): array
{
return [
'protocolVersion' => '2024-11-05',
'serverInfo' => [
'name' => 'my-laravel-mcp',
'version' => '1.0.0',
],
'capabilities' => ['tools' => (object) []],
];
}
private function listTools(): array
{
return ['tools' => $this->toolService->getToolSchemas()];
}
private function callTool(array $params): array
{
$name = $params['name'] ?? '';
$args = $params['arguments'] ?? [];
$output = $this->toolService->execute($name, $args);
return [
'content' => [['type' => 'text', 'text' => $output]],
];
}
}🔧 สร้าง Tool จริง — ตัวอย่าง: ค้นหาสินค้าจาก Database
ถึงเวลาสร้าง Tool ที่ AI จะเรียกใช้ได้จริง ตัวอย่างนี้เราสร้าง tool ชื่อ search_products ที่ให้ AI ค้นหาสินค้าจากฐานข้อมูล:
<?php
namespace App\Services;
use App\Models\Product;
class McpToolService
{
/**
* ประกาศ schema ของ tools ทั้งหมดที่ server นี้มี
* AI จะนำไปเข้าใจว่าแต่ละ tool รับ argument อะไร
*/
public function getToolSchemas(): array
{
return [
[
'name' => 'search_products',
'description' => 'ค้นหาสินค้าจากชื่อหรือหมวดหมู่',
'inputSchema' => [
'type' => 'object',
'properties' => [
'keyword' => [
'type' => 'string',
'description' => 'คำค้นหา',
],
'limit' => [
'type' => 'integer',
'description' => 'จำนวนผลลัพธ์สูงสุด',
'default' => 10,
],
],
'required' => ['keyword'],
],
],
[
'name' => 'get_order_status',
'description' => 'ตรวจสถานะ order จาก order ID',
'inputSchema' => [
'type' => 'object',
'properties' => [
'order_id' => [
'type' => 'integer',
],
],
'required' => ['order_id'],
],
],
];
}
/**
* Execute tool ตาม name ที่ AI ส่งมา
*/
public function execute(string $name, array $args): string
{
return match ($name) {
'search_products' => $this->searchProducts($args),
'get_order_status' => $this->getOrderStatus($args),
default => 'ไม่พบ tool ที่ระบุ',
};
}
private function searchProducts(array $args): string
{
$keyword = $args['keyword'];
$limit = $args['limit'] ?? 10;
// ใช้ Eloquent ค้นหาสินค้า
$products = Product::where('name', 'like', "%{$keyword}%")
->orWhere('category', 'like', "%{$keyword}%")
->limit($limit)
->get(['id', 'name', 'price', 'category']);
if ($products->isEmpty()) {
return "ไม่พบสินค้าที่ตรงกับ: {$keyword}";
}
// ส่งกลับเป็น JSON string ให้ AI อ่านได้
return json_encode($products->toArray(), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
private function getOrderStatus(array $args): string
{
$orderId = (int) ($args['order_id'] ?? 0);
// ... query จาก orders table ...
return "Order #{$orderId}: กำลังจัดส่ง";
}
}📋 เปรียบเทียบ: MCP Server vs REST API
หลายคนอาจสงสัยว่า MCP Server กับ REST API ต่างกันยังไง ตารางนี้สรุปให้ชัด:
| ประเด็น | REST API | MCP Server |
|---|
| เป้าหมายหลัก | Frontend / Mobile / Third-party | AI Agent โดยเฉพาะ |
| Protocol | HTTP + JSON (custom schema) | JSON-RPC 2.0 ตาม MCP Spec |
| AI รู้จัก | ต้อง describe ใน system prompt | AI อ่าน tool schema ได้เอง |
| Documentation | ต้องเขียน Swagger / OpenAPI | Schema คือ doc ในตัว |
| ความซับซ้อน | ยืดหยุ่นกว่า มาก endpoint | Simple — endpoint เดียว |
| ใช้กับ Laravel | ✅ ทำได้สะดวก | ✅ ทำได้เช่นกัน (บทความนี้!) |
🔒 เพิ่ม Middleware รักษาความปลอดภัย
MCP Server ที่ Production-ready ต้องมี authentication ด้วย วิธีง่ายที่สุดคือใช้ Bearer Token ผ่าน Laravel Middleware:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class McpAuthMiddleware
{
public function handle(Request $request, Closure $next)
{
$token = $request->bearerToken();
if ($token !== config('mcp.secret_token')) {
return response()->json([
'jsonrpc' => '2.0',
'error' => [
'code' => -32001,
'message' => 'Unauthorized',
],
], 401);
}
return $next($request);
}
}
// ใน routes/api.php — ครอบ middleware
Route::middleware('mcp.auth')->post('/mcp', [McpController::class, 'handle']);🧪 ทดสอบ MCP Server ด้วย curl
ก่อนต่อกับ AI จริง ทดสอบด้วย curl ได้เลย — ลอง call tools/list ดูก่อน:
curl -X POST http://localhost:8000/api/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-secret-token" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'ถ้า response ส่ง array ของ tools กลับมา แสดงว่า MCP Server ทำงานถูกต้องแล้ว จากนั้นลอง call tool จริง:
curl -X POST http://localhost:8000/api/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-secret-token" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "search_products",
"arguments": { "keyword": "กาแฟ", "limit": 5 }
}
}'🔗 ต่อกับ Claude Desktop
เมื่อ server พร้อมแล้ว เพิ่มใน claude_desktop_config.json ได้เลย:
"url": "http://localhost:8000/api/mcp" พร้อม header Authorization — Claude จะเห็น tools ของเราทันที!
🎯 สรุป
การสร้าง MCP Server ด้วย Laravel ไม่ได้ซับซ้อนอย่างที่คิด เพราะ Laravel มี building block ครบครัน — Routing, Controller, Service class, Middleware และ Eloquent — ทำให้เราโฟกัสที่ logic ของ tool ได้เลย โดยไม่ต้องเสียเวลาสร้าง infrastructure ใหม่
สิ่งที่เราได้เรียนรู้ในบทความนี้:
✅ MCP คืออะไรและทำงานอย่างไรในแบบ JSON-RPC 2.0
✅ โครงสร้าง Laravel สำหรับ MCP Server (Controller + Service)
✅ การประกาศ Tool Schema ให้ AI เข้าใจ
✅ การรักษาความปลอดภัยด้วย Bearer Token Middleware
✅ วิธีทดสอบก่อน deploy จริง
ก้าวต่อไปคือเพิ่ม tools ที่จำเป็นสำหรับธุรกิจของคุณ เช่น ค้นหาข้อมูล, อัปเดตสถานะ, หรือดึงรายงาน — แล้ว AI Agent จะกลายเป็น "พนักงาน" ที่ใช้งาน Laravel app ของคุณได้จริง
🚀 พร้อมต่อยอดเพิ่มเติมไหม?
ติดตาม PHP Code Mania เพื่อรับบทความ Laravel, CodeIgniter และ AI Development ในภาษาไทย — อัปเดตสม่ำเสมอสำหรับนักพัฒนา PHP ทุกระดับ
📖 ติดตาม PHP Code Mania
PHP CI MANIA - PHP Code Generator
โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"