mcp-sdk
by: php-llm
Model Context Protocol SDK for Client and Server applications in PHP
📌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.