klapaudius/symfony-mcp-server

Build your own LLM tools inside your symfony project by adding to it a Model Context Protocol Server

1.1.1 2025-06-05 14:34 UTC

This package is auto-updated.

Last update: 2025-06-07 19:08:20 UTC


README

A powerful Symfony package to build a Model Context Protocol Server seamlessly

Build Status Coverage License

Overview

Symfony MCP Server is a powerful package designed to streamline the implementation of Model Context Protocol (MCP) servers in Symfony applications. This package utilizes Server-Sent Events (SSE) transport, providing a secure and controlled integration method.

Why SSE instead of STDIO?

While stdio is straightforward and widely used in MCP implementations, it has significant security implications for enterprise environments:

  • Security Risk: STDIO transport potentially exposes internal system details and API specifications
  • Data Protection: Organizations need to protect proprietary API endpoints and internal system architecture
  • Control: SSE offers better control over the communication channel between LLM clients and your application

By implementing the MCP server with SSE transport, enterprises can:

  • Expose only the necessary tools and resources while keeping proprietary API details private
  • Maintain control over authentication and authorization processes

Key benefits:

  • Seamless and rapid implementation of SSE in existing Symfony projects
  • Support for the latest Symfony and PHP versions
  • Efficient server communication and real-time data processing
  • Enhanced security for enterprise environments

Key Features

  • Real-time communication support through Server-Sent Events (SSE) integration specified in the MCP 2024-11-05 version (Streamable HTTP from 2025-03-26 version is planned)
  • Implementation of tools and resources compliant with Model Context Protocol specifications
  • Adapter-based design architecture with Pub/Sub messaging pattern

Requirements

  • PHP >=8.2
  • Symfony >=7

Installation

  1. Create the configuration file config/packages/klp_mcp_server.yaml and paste into it:

    klp_mcp_server:
        enabled: true
        server:
            name: 'My MCP Server'
            version: '1.0.0'
        default_path: 'mcp'
        ping:
            enabled: true  # Read the warning section in the default configuration file before disable it
            interval: 30
        server_provider: 'sse'
        sse_adapter: 'cache'
        adapters:
            cache:
                prefix: 'mcp_sse_'
                ttl: 100
        tools:
            - KLP\KlpMcpServer\Services\ToolService\Examples\HelloWorldTool
            - KLP\KlpMcpServer\Services\ToolService\Examples\VersionCheckTool
        resources:
            - KLP\KlpMcpServer\Services\ResourceService\Examples\HelloWorldResource
        resources_templates:
            - KLP\KlpMcpServer\Services\ResourceService\Examples\McpDocumentationResource

    For more detailed explanations, you can open the default configuration file from that link.

  2. Install the package via Composer:

    composer require klapaudius/symfony-mcp-server
  3. Add routes in your config/routes.yaml

klp_mcp_server:
    resource: '@KlpMcpServerBundle/Resources/config/routes.php'
    type: php

You're all done! Upon completing this setup, your project will include two new API endpoints:

  • Streaming Endpoint for MCP Clients: GET /{default_path}/sse
  • Request Submission Endpoint: POST /{default_path}/messages

Docker Setup (Optional)

The project includes a Docker setup that can be used for development. The Docker setup includes Nginx, PHP-FPM with Redis extension, and Redis server.

For detailed instructions on how to set up and use the Docker containers, please refer to the Development Guidelines.

Strongly Recommended

Enhance your application's security by implementing OAuth2 Authentication. You can use the klapaudius/oauth-server-bundle or any other compatible OAuth2 solution.

Basic Usage

Creating and Adding Custom Tools

The package provides convenient Artisan commands to generate new tools:

php bin/console make:mcp-tool MyCustomTool

This command:

  • Handles various input formats (spaces, hyphens, mixed case)
  • Automatically converts the name to the proper case format
  • Creates a properly structured tool class in src/MCP/Tools
  • Offers to automatically register the tool in your configuration

You can also manually create and register tools in config/packages/klp_mcp_server.yaml:

use KLP\KlpMcpServer\Services\ToolService\ToolInterface;

class MyCustomTool implements ToolInterface
{
    // Tool implementation
}

Testing MCP Tools

The package includes a special command for testing your MCP tools without needing a real MCP client:

# Test a specific tool interactively
php bin/console mcp:test-tool MyCustomTool

# List all available tools
php bin/console mcp:test-tool --list

# Test with specific JSON input
php bin/console mcp:test-tool MyCustomTool --input='{"param1":"value"}'

This helps you rapidly develop and debug tools by:

  • Showing the tool's input schema and validating inputs
  • Executing the tool with your provided input
  • Displaying formatted results or detailed error information
  • Supporting complex input types including objects and arrays

For deep diving into tools creation please take a look at dedicated documentation Here

Visualizing MCP Tools with Inspector

You can also use the Model Context Protocol Inspector to visualize and test your MCP tools:

# Run the MCP Inspector without installation
npx @modelcontextprotocol/inspector node build/index.js

This will typically open a web interface at localhost:6274. To test your MCP server:

  1. Warning: symfony server:start CANNOT be used with this package because it cannot handle multiple PHP connections simultaneously. Since MCP SSE requires processing multiple connections concurrently, you must use one of these alternatives:

    • Nginx + PHP-FPM
    • Apache + PHP-FPM
    • Custom Docker setup
    • Any web server that properly supports SSE streaming
  2. In the Inspector interface, enter your Symfony server's MCP SSE URL (e.g., http://localhost:8000/mcp/sse)

  3. Connect and explore available tools visually

The SSE URL follows the pattern: http(s)://[your-web-server]/[default_path]/sse where default_path is defined in your config/packages/klp_mcp_server.yaml file.

Advanced Features

Pub/Sub Architecture with SSE Adapters

The package implements a publish/subscribe (pub/sub) messaging pattern through its adapter system:

  1. Publisher (Server): When clients send requests to the /messages endpoint, the server processes these requests and publishes responses through the configured adapter.

  2. Message Broker (Adapter): The adapter maintains message queues for each client, identified by unique client IDs. This provides a reliable asynchronous communication layer.

  3. Subscriber (SSE Connection): Long-lived SSE connections subscribe to messages for their respective clients and deliver them in real-time.

This architecture enables:

  • Scalable real-time communication
  • Reliable message delivery even during temporary disconnections
  • Efficient handling of multiple concurrent client connections
  • Potential for distributed server deployments

Redis Adapter Configuration (Optional)

A Redis adapter can be configured as follows:

klp_mcp_server:
    # ...
    sse_adapter: 'redis'
    adapters:
        redis:
            prefix: 'mcp_sse_'  # Prefix for Redis keys
            host: 'localhost'   # Change it as needed
            ttl: 100            # Message TTL in seconds

Resources

The package provides a flexible resource management system that allows you to store and retrieve resources from different providers (file system, database, etc.).

Configuration

Configure resources in your config/packages/klp_mcp_server.yaml file:

klp_mcp_server:
    # ...
    resources:
        - App\MCP\Resources\MyCustomResource
    resources_templates:
        - App\MCP\Resources\MyCustomResourceTemplate

Usage

Creating Custom Resource

use KLP\KlpMcpServer\Services\ResourceService\ResourceInterface;

class MyCustomResource implements ResourceInterface
{
    // Resource implementation
}

Then register your resource in the configuration:

klp_mcp_server:
    # ...
    resources:
      - App\MCP\Resources\MyCustomResource

Creating Custom Resource Template

You can create custom resource templates by implementing the ResourceTemplateInterface:

use KLP\KlpMcpServer\Services\ResourceService\ResourceTemplateInterface;

class MyCustomResourceTemplate implements ResourceTemplateInterface
{
    // Implement the required methods
}

Then register your resource template in the configuration:

klp_mcp_server:
    # ...
    resources_templates:
      - App\MCP\Resources\MyCustomResourceTemplate

For deep diving into resources' management, please take a look at dedicated documentation Here

Roadmap

We are committed to actively pursuing the following key initiatives to enhance the package's functionality and ensure compliance with evolving standards.

  • Core Features:
    • ✅ Resources implementation compliant with MCP specification.
    • Support for Streamable HTTP (as specified in MCP 2025-03-26 version).
    • Prompts implementation compliant with MCP specification.
  • Additional Adaptaters:
    • Support for more Pub/Sub adapters (e.g., RabbitMQ).

Credits

License

This project is distributed under the MIT license.