From 7438ab18b5ba79d6a1afd99365a00b1936c69f19 Mon Sep 17 00:00:00 2001 From: bigdevlarry Date: Sun, 15 Mar 2026 02:24:23 +0000 Subject: [PATCH] Fix to make Symfony Finder component optional --- composer.json | 5 ++++- src/Capability/Discovery/Discoverer.php | 5 +++++ src/Server/Builder.php | 9 +++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 5d1c5297..46ea2d77 100644 --- a/composer.json +++ b/composer.json @@ -32,9 +32,11 @@ "psr/http-server-handler": "^1.0", "psr/http-server-middleware": "^1.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/finder": "^5.4 || ^6.4 || ^7.3 || ^8.0", "symfony/uid": "^5.4 || ^6.4 || ^7.3 || ^8.0" }, + "suggest": { + "symfony/finder": "Required for file-based discovery." + }, "require-dev": { "ext-openssl": "*", "composer/semver": "^3.0", @@ -50,6 +52,7 @@ "psr/simple-cache": "^2.0 || ^3.0", "symfony/cache": "^5.4 || ^6.4 || ^7.3 || ^8.0", "symfony/console": "^5.4 || ^6.4 || ^7.3 || ^8.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.3 || ^8.0", "symfony/http-client": "^5.4 || ^6.4 || ^7.3 || ^8.0", "symfony/process": "^5.4 || ^6.4 || ^7.3 || ^8.0" }, diff --git a/src/Capability/Discovery/Discoverer.php b/src/Capability/Discovery/Discoverer.php index 3b9ed3a9..c682027a 100644 --- a/src/Capability/Discovery/Discoverer.php +++ b/src/Capability/Discovery/Discoverer.php @@ -24,6 +24,7 @@ use Mcp\Capability\Registry\ResourceTemplateReference; use Mcp\Capability\Registry\ToolReference; use Mcp\Exception\ExceptionInterface; +use Mcp\Exception\RuntimeException; use Mcp\Schema\Prompt; use Mcp\Schema\PromptArgument; use Mcp\Schema\Resource; @@ -53,6 +54,10 @@ public function __construct( private ?DocBlockParser $docBlockParser = null, private ?SchemaGeneratorInterface $schemaGenerator = null, ) { + if (!class_exists(Finder::class)) { + throw new RuntimeException('File-based discovery requires symfony/finder. Run: composer require symfony/finder'); + } + $this->docBlockParser = $docBlockParser ?? new DocBlockParser(logger: $this->logger); $this->schemaGenerator = $schemaGenerator ?? new SchemaGenerator($this->docBlockParser); } diff --git a/src/Server/Builder.php b/src/Server/Builder.php index be0866cd..d2c6c3a9 100644 --- a/src/Server/Builder.php +++ b/src/Server/Builder.php @@ -46,6 +46,7 @@ use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use Psr\SimpleCache\CacheInterface; +use Symfony\Component\Finder\Finder; /** * @phpstan-import-type Handler from ElementReference @@ -523,8 +524,12 @@ public function build(): Server ); if (null !== $this->discoveryBasePath) { - $discoverer = $this->discoverer ?? $this->createDiscoverer($logger); - $loaders[] = new DiscoveryLoader($this->discoveryBasePath, $this->discoveryScanDirs, $this->discoveryExcludeDirs, $discoverer); + if (null !== $this->discoverer || class_exists(Finder::class)) { + $discoverer = $this->discoverer ?? $this->createDiscoverer($logger); + $loaders[] = new DiscoveryLoader($this->discoveryBasePath, $this->discoveryScanDirs, $this->discoveryExcludeDirs, $discoverer); + } else { + $logger->warning('File-based discovery requires symfony/finder. Skipping automatic discovery. Run: composer require symfony/finder'); + } } foreach ($loaders as $loader) {