สร้าง MCP Server ของคุณเองด้วย Laravel

โดย CyberMAN

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
initializeAI ทักทาย ขอข้อมูล serverชื่อ server, version, capabilities
tools/listส่งรายการ tool ทั้งหมดArray of tool schemas (JSON Schema)
tools/callรัน tool ที่ AI เลือกผลลัพธ์จาก tool นั้น
resources/listประกาศ data sourceURI, description ของ resource
prompts/listเสนอ prompt templateTemplate สำเร็จรูปสำหรับ AI

⚙️ ติดตั้ง Laravel และสร้างโปรเจกต์ใหม่

เริ่มต้นด้วยการสร้างโปรเจกต์ Laravel ใหม่ผ่าน Composer หรือ Laravel Installer ได้เลย:

terminal
# วิธีที่ 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 ไฟล์ที่ต้องสร้าง:

terminal
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 แล้วเพิ่ม:

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 ที่ถูกต้อง:

app/Http/Controllers/McpController.php
<?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 ค้นหาสินค้าจากฐานข้อมูล:

app/Services/McpToolService.php
<?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 APIMCP Server
เป้าหมายหลักFrontend / Mobile / Third-partyAI Agent โดยเฉพาะ
ProtocolHTTP + JSON (custom schema)JSON-RPC 2.0 ตาม MCP Spec
AI รู้จักต้อง describe ใน system promptAI อ่าน tool schema ได้เอง
Documentationต้องเขียน Swagger / OpenAPISchema คือ doc ในตัว
ความซับซ้อนยืดหยุ่นกว่า มาก endpointSimple — endpoint เดียว
ใช้กับ Laravel✅ ทำได้สะดวก✅ ทำได้เช่นกัน (บทความนี้!)

🔒 เพิ่ม Middleware รักษาความปลอดภัย

MCP Server ที่ Production-ready ต้องมี authentication ด้วย วิธีง่ายที่สุดคือใช้ Bearer Token ผ่าน Laravel Middleware:

app/Http/Middleware/McpAuthMiddleware.php
<?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 ดูก่อน:

terminal — ทดสอบ 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 จริง:

terminal — ทดสอบ tools/call
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 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
ราคาสุดคุ้ม  
http://www.phpcodemania.com