# klapaudius/symfony-mcp-server architecture

> Architecture diagram of the GitHub repository klapaudius/symfony-mcp-server, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/klapaudius/symfony-mcp-server
- Repository: https://github.com/klapaudius/symfony-mcp-server

## Overview

Symfony MCP Server accepts MCP clients over HTTP/SSE or Streamable HTTP, forwards messages into the server and protocol layer, dispatches JSON-RPC methods, and returns tool, prompt, resource, or initialization results. Tools can make sampling requests and stream progress; prompts and resources provide additional agent context. Tool/resource repositories register application-provided capabilities. The README documents capabilities beyond the sampled handlers; those branches are included, but their internal call paths are not asserted. Relationships for unsampled transport and capability wiring are omitted where evidence is insufficient.

Main entry points: [`src/Server/MCPServer.php`](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Server/MCPServer.php) (MCP server), [`src/Server/Request/ToolsCallHandler.php`](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Server/Request/ToolsCallHandler.php) (Tool execution), [`src/Services/SamplingService/SamplingClient.php`](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/SamplingService/SamplingClient.php) (Sampling client), [`src/Transports/TransportInterface.php`](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/TransportInterface.php) (Transport abstraction)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingress["Client ingress"]
  node_message_http["Message endpoint"]
  node_sse_endpoint["SSE endpoint<br/>[SseController.php]"]
  node_stream_http["Streamable HTTP endpoint"]
end

subgraph group_protocol["Protocol server"]
  node_server["MCP server<br/>[MCPServer.php]"]
  node_protocol_dispatch["Protocol dispatch"]
  node_request_handlers["Request handlers"]
  node_notification_handlers["Notification handlers"]
end

subgraph group_capabilities["Agent capabilities"]
  node_tool_handler["Tool execution"]
  node_tool_registry["Tool registry<br/>[ToolRepository.php]"]
  node_tool_schema["Tool schemas"]
  node_tool_results["Multimodal results"]
  node_prompt_handlers["Prompt operations"]
  node_prompt_registry["Prompt registry"]
  node_resource_handlers["Resource operations"]
  node_resource_registry["Resource registry"]
end

subgraph group_support["Agent support"]
  node_sampling["Sampling client<br/>[SamplingClient.php]"]
  node_sampling_response["Sampling response"]
  node_progress["Progress notifications"]
end

subgraph group_transport["Transports"]
  node_transport_factory["Transport factory"]
  node_transport["Transport abstraction"]
  node_sse_transport["SSE transport<br/>[SseTransport.php]"]
  node_http_transport["Streamable HTTP transport"]
  node_sse_adapter["SSE adapters"]
end

node_client(("MCP client"))

node_client -->|"sends message"| node_message_http
node_client -->|"opens stream"| node_sse_endpoint
node_client -->|"posts request"| node_stream_http
node_message_http -->|"forwards message"| node_server
node_sse_endpoint -->|"connects"| node_server
node_stream_http -->|"forwards message"| node_server
node_server -->|"routes messages"| node_protocol_dispatch
node_protocol_dispatch -->|"dispatches requests"| node_request_handlers
node_protocol_dispatch -->|"dispatches notifications"| node_notification_handlers
node_server -->|"registers tools"| node_tool_registry
node_server -->|"registers prompts"| node_prompt_registry
node_server -->|"registers resources"| node_resource_registry
node_tool_handler -->|"looks up tool"| node_tool_registry
node_tool_handler -->|"injects sampling"| node_sampling
node_tool_handler -->|"registers token"| node_progress
node_tool_handler -->|"serializes result"| node_tool_results
node_tool_registry -->|"builds schemas"| node_tool_schema
node_sampling -->|"gets transport"| node_transport_factory
node_sampling -->|"pushes request"| node_transport
node_sampling_response -->|"handles response"| node_sampling
node_progress -->|"gets transport"| node_transport_factory
node_progress -->|"pushes notification"| node_transport
node_transport_factory -->|"returns transport"| node_transport
node_transport -->|"uses adapter"| node_sse_adapter

click node_message_http "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Controllers/MessageController.php"
click node_sse_endpoint "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Controllers/SseController.php"
click node_stream_http "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Controllers/StreamableHttpController.php"
click node_server "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Server/MCPServer.php"
click node_protocol_dispatch "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Protocol/MCPProtocolInterface.php"
click node_request_handlers "https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Server/Request"
click node_notification_handlers "https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Server/Notification"
click node_tool_handler "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Server/Request/ToolsCallHandler.php"
click node_tool_registry "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/ToolService/ToolRepository.php"
click node_tool_schema "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/ToolService/Schema/StructuredSchema.php"
click node_tool_results "https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Services/ToolService/Result"
click node_prompt_handlers "https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Server/Request"
click node_prompt_registry "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/PromptService/PromptRepository.php"
click node_resource_handlers "https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Server/Request"
click node_resource_registry "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/ResourceService/ResourceRepository.php"
click node_sampling "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/SamplingService/SamplingClient.php"
click node_sampling_response "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/SamplingService/SamplingResponseHandler.php"
click node_progress "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/ProgressService/ProgressNotifierRepository.php"
click node_transport_factory "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/Factory/TransportFactoryInterface.php"
click node_transport "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/TransportInterface.php"
click node_sse_transport "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/SseTransport.php"
click node_http_transport "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/StreamableHttpTransport.php"
click node_sse_adapter "https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/SseAdapters/SseAdapterInterface.php"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_message_http,node_sse_endpoint,node_stream_http,node_client toneBlue
class node_server,node_protocol_dispatch,node_request_handlers,node_notification_handlers toneAmber
class node_tool_handler,node_tool_registry,node_tool_schema,node_tool_results,node_prompt_handlers,node_prompt_registry,node_resource_handlers,node_resource_registry toneMint
class node_sampling,node_sampling_response,node_progress toneRose
class node_transport_factory,node_transport,node_sse_transport,node_http_transport,node_sse_adapter toneIndigo
```

## Components

### Client ingress

- [Message endpoint](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Controllers/MessageController.php): `src/Controllers/MessageController.php`
- [SSE endpoint](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Controllers/SseController.php): `src/Controllers/SseController.php`
- [Streamable HTTP endpoint](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Controllers/StreamableHttpController.php): `src/Controllers/StreamableHttpController.php`

### Protocol server

- [MCP server](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Server/MCPServer.php): `src/Server/MCPServer.php`
- [Protocol dispatch](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Protocol/MCPProtocolInterface.php): `src/Protocol/MCPProtocolInterface.php`
- [Request handlers](https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Server/Request): `src/Server/Request`
- [Notification handlers](https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Server/Notification): `src/Server/Notification`

### Agent capabilities

- [Tool execution](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Server/Request/ToolsCallHandler.php): `src/Server/Request/ToolsCallHandler.php`
- [Tool registry](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/ToolService/ToolRepository.php): `src/Services/ToolService/ToolRepository.php`
- [Tool schemas](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/ToolService/Schema/StructuredSchema.php): `src/Services/ToolService/Schema/StructuredSchema.php`
- [Multimodal results](https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Services/ToolService/Result): `src/Services/ToolService/Result`
- [Prompt operations](https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Server/Request): `src/Server/Request`
- [Prompt registry](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/PromptService/PromptRepository.php): `src/Services/PromptService/PromptRepository.php`
- [Resource operations](https://github.com/klapaudius/symfony-mcp-server/tree/master/src/Server/Request): `src/Server/Request`
- [Resource registry](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/ResourceService/ResourceRepository.php): `src/Services/ResourceService/ResourceRepository.php`

### Agent support

- [Sampling client](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/SamplingService/SamplingClient.php): `src/Services/SamplingService/SamplingClient.php`
- [Sampling response](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/SamplingService/SamplingResponseHandler.php): `src/Services/SamplingService/SamplingResponseHandler.php`
- [Progress notifications](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Services/ProgressService/ProgressNotifierRepository.php): `src/Services/ProgressService/ProgressNotifierRepository.php`

### Transports

- [Transport factory](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/Factory/TransportFactoryInterface.php): `src/Transports/Factory/TransportFactoryInterface.php`
- [Transport abstraction](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/TransportInterface.php): `src/Transports/TransportInterface.php`
- [SSE transport](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/SseTransport.php): `src/Transports/SseTransport.php`
- [Streamable HTTP transport](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/StreamableHttpTransport.php): `src/Transports/StreamableHttpTransport.php`
- [SSE adapters](https://github.com/klapaudius/symfony-mcp-server/blob/master/src/Transports/SseAdapters/SseAdapterInterface.php): `src/Transports/SseAdapters/SseAdapterInterface.php`

### Other components

- **MCP client**

## Connections

- MCP client → Message endpoint: sends message (evidence: `src/Controllers/MessageController.php`)
- MCP client → SSE endpoint: opens stream (evidence: `src/Controllers/SseController.php`)
- MCP client → Streamable HTTP endpoint: posts request (evidence: `src/Controllers/StreamableHttpController.php`)
- Message endpoint → MCP server: forwards message (evidence: `src/Controllers/MessageController.php`)
- SSE endpoint → MCP server: connects (evidence: `src/Controllers/SseController.php`)
- Streamable HTTP endpoint → MCP server: forwards message (evidence: `src/Controllers/StreamableHttpController.php`)
- MCP server → Protocol dispatch: routes messages
- Protocol dispatch → Request handlers: dispatches requests (evidence: `src/Protocol/MCPProtocolInterface.php`)
- Protocol dispatch → Notification handlers: dispatches notifications (evidence: `src/Protocol/MCPProtocolInterface.php`)
- MCP server → Tool registry: registers tools
- MCP server → Prompt registry: registers prompts
- MCP server → Resource registry: registers resources
- Tool execution → Tool registry: looks up tool (evidence: `src/Server/Request/ToolsCallHandler.php`)
- Tool execution → Sampling client: injects sampling (evidence: `src/Server/Request/ToolsCallHandler.php`)
- Tool execution → Progress notifications: registers token (evidence: `src/Server/Request/ToolsCallHandler.php`)
- Tool execution → Multimodal results: serializes result (evidence: `src/Server/Request/ToolsCallHandler.php`)
- Tool registry → Tool schemas: builds schemas (evidence: `src/Services/ToolService/ToolRepository.php`)
- Sampling client → Transport factory: gets transport (evidence: `src/Services/SamplingService/SamplingClient.php`)
- Sampling client → Transport abstraction: pushes request (evidence: `src/Services/SamplingService/SamplingClient.php`)
- Sampling response → Sampling client: handles response (evidence: `src/Services/SamplingService/SamplingResponseHandler.php`)
- Progress notifications → Transport factory: gets transport (evidence: `src/Services/ProgressService/ProgressNotifierRepository.php`)
- Progress notifications → Transport abstraction: pushes notification (evidence: `src/Services/ProgressService/ProgressNotifierRepository.php`)
- Transport factory → Transport abstraction: returns transport (evidence: `src/Transports/Factory/TransportFactoryInterface.php`)
- Transport abstraction → SSE adapters: uses adapter (evidence: `src/Transports/TransportInterface.php`)
