MCP HubMCP Hub
php-llm

mcp-sdk

by: php-llm

Model Context Protocol SDK for Client and Server applications in PHP

15created 07/03/2025
Visit
PHP
SDK

📌Overview

Purpose: The Model Context Protocol SDK aims to facilitate seamless integration of client and server applications using PHP for better handling of model contexts.

Overview: This SDK provides a comprehensive set of tools designed for building server applications in PHP, particularly optimized for Symfony and Laravel environments. It allows developers to utilize the Model Context Protocol for managing data and interactions effectively.

Key Features:

  • Symfony Integration: Offers tailored server integration for Symfony Console and HttpFoundation, enabling easy command line and HTTP server operations.

  • SSE Support: Implements Server-Sent Events (SSE) to maintain a persistent connection with clients, facilitating real-time data streaming through efficient handling of messages.

  • Tool Exposure: Utilizes the LLM Chain’s ToolBox for registering and executing tools, allowing developers to easily create and manage functions that can be utilized within the application.


Model Context Protocol PHP SDK [WIP]

Model Context Protocol SDK for Client and Server applications in PHP.
Currently only supports Tool Calls as Server via Server-Sent Events (SSE) and STDIO.

See the Demo App for a working example and MCP Bundle for Symfony integration.

Installation

composer require php-llm/mcp-sdk

Usage with Symfony

Server integration points are tailored to Symfony Console and HttpFoundation (Laravel compatible).

Console Command for STDIO Server

namespace App\Command;

use PhpLlm\McpSdk\Server;
use PhpLlm\McpSdk\Server\Transport\Stdio\SymfonyConsoleTransport;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand('mcp', 'Starts an MCP server')]
final class McpCommand extends Command
{
    public function __construct(
        private readonly Server $server,
    ) {
        parent::__construct();
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $this->server->connect(
            new SymfonyConsoleTransport($input, $output)
        );

        return Command::SUCCESS;
    }
}

Controller for Server-Sent Events Server

namespace App\Controller;

use PhpLlm\McpSdk\Server;
use PhpLlm\McpSdk\Server\Transport\Sse\Store\CachePoolStore;
use PhpLlm\McpSdk\Server\Transport\Sse\StreamTransport;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpKernel\Attribute\AsController;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Uid\Uuid;

#[AsController]
#[Route('/mcp', name: 'mcp_')]
final readonly class McpController
{
    public function __construct(
        private Server $server,
        private CachePoolStore $store,
        private UrlGeneratorInterface $urlGenerator,
    ) {
    }

    #[Route('/sse', name: 'sse', methods: ['GET'])]
    public function sse(): StreamedResponse
    {
        $id = Uuid::v4();
        $endpoint = $this->urlGenerator->generate('mcp_messages', ['id' => $id], UrlGeneratorInterface::ABSOLUTE_URL);
        $transport = new StreamTransport($endpoint, $this->store, $id);

        return new StreamedResponse(fn() => $this->server->connect($transport), headers: [
            'Content-Type' => 'text/event-stream',
            'Cache-Control' => 'no-cache',
            'X-Accel-Buffering' => 'no',
        ]);
    }

    #[Route('/messages/{id}', name: 'messages', methods: ['POST'])]
    public function messages(Request $request, Uuid $id): Response
    {
        $this->store->push($id, $request->getContent());

        return new Response();
    }
}

Exposing Tools

The SDK uses LLM Chain's ToolBox to register, analyze, and execute tools.
With its Symfony Bundle, you can expose tools using the #[AsTool] attribute.

use PhpLlm\LlmChain\ToolBox\Attribute\AsTool;

#[AsTool('company_name', 'Provides the name of your company')]
final class CompanyName
{
    public function __invoke(): string
    {
        return 'ACME Corp.';
    }
}

See LLM Chain Documentation for more information.