From f98aa6006a1d14ef53cc09b3eec4d2e5a77dfee8 Mon Sep 17 00:00:00 2001 From: soyuka Date: Sun, 28 Dec 2025 22:04:28 +0100 Subject: [PATCH 1/4] schema generator injection --- src/Capability/Registry/Loader/ArrayLoader.php | 3 ++- src/Capability/Registry/Loader/DiscoveryLoader.php | 4 +++- src/Server/Builder.php | 14 ++++++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/Capability/Registry/Loader/ArrayLoader.php b/src/Capability/Registry/Loader/ArrayLoader.php index fef17263..c1642c3a 100644 --- a/src/Capability/Registry/Loader/ArrayLoader.php +++ b/src/Capability/Registry/Loader/ArrayLoader.php @@ -83,13 +83,14 @@ public function __construct( private readonly array $resourceTemplates = [], private readonly array $prompts = [], private LoggerInterface $logger = new NullLogger(), + private ?SchemaGenerator $schemaGenerator = null, ) { } public function load(RegistryInterface $registry): void { $docBlockParser = new DocBlockParser(logger: $this->logger); - $schemaGenerator = new SchemaGenerator($docBlockParser); + $schemaGenerator = $this->schemaGenerator ?? new SchemaGenerator($docBlockParser); // Register Tools foreach ($this->tools as $data) { diff --git a/src/Capability/Registry/Loader/DiscoveryLoader.php b/src/Capability/Registry/Loader/DiscoveryLoader.php index 6129dfaa..5a7a5e36 100644 --- a/src/Capability/Registry/Loader/DiscoveryLoader.php +++ b/src/Capability/Registry/Loader/DiscoveryLoader.php @@ -13,6 +13,7 @@ use Mcp\Capability\Discovery\CachedDiscoverer; use Mcp\Capability\Discovery\Discoverer; +use Mcp\Capability\Discovery\SchemaGenerator; use Mcp\Capability\RegistryInterface; use Psr\Log\LoggerInterface; use Psr\SimpleCache\CacheInterface; @@ -32,13 +33,14 @@ public function __construct( private array $excludeDirs, private LoggerInterface $logger, private ?CacheInterface $cache = null, + private ?SchemaGenerator $schemaGenerator = null, ) { } public function load(RegistryInterface $registry): void { // This now encapsulates the discovery process - $discoverer = new Discoverer($this->logger); + $discoverer = new Discoverer($this->logger, null, $this->schemaGenerator); $cachedDiscoverer = $this->cache ? new CachedDiscoverer($discoverer, $this->cache, $this->logger) diff --git a/src/Server/Builder.php b/src/Server/Builder.php index 363a09c5..51c0f3c2 100644 --- a/src/Server/Builder.php +++ b/src/Server/Builder.php @@ -11,6 +11,7 @@ namespace Mcp\Server; +use Mcp\Capability\Discovery\SchemaGenerator; use Mcp\Capability\Registry; use Mcp\Capability\Registry\Container; use Mcp\Capability\Registry\ElementReference; @@ -58,6 +59,8 @@ final class Builder private ?ContainerInterface $container = null; + private ?SchemaGenerator $schemaGenerator = null; + private ?SessionFactoryInterface $sessionFactory = null; private ?SessionStoreInterface $sessionStore = null; @@ -286,6 +289,13 @@ public function setContainer(ContainerInterface $container): self return $this; } + public function setSchemaGenerator(SchemaGenerator $schemaGenerator): self + { + $this->schemaGenerator = $schemaGenerator; + + return $this; + } + public function setSession( SessionStoreInterface $sessionStore, SessionFactoryInterface $sessionFactory = new SessionFactory(), @@ -466,11 +476,11 @@ public function build(): Server $loaders = [ ...$this->loaders, - new ArrayLoader($this->tools, $this->resources, $this->resourceTemplates, $this->prompts, $logger), + new ArrayLoader($this->tools, $this->resources, $this->resourceTemplates, $this->prompts, $logger, $this->schemaGenerator), ]; if (null !== $this->discoveryBasePath) { - $loaders[] = new DiscoveryLoader($this->discoveryBasePath, $this->discoveryScanDirs, $this->discoveryExcludeDirs, $logger, $this->discoveryCache); + $loaders[] = new DiscoveryLoader($this->discoveryBasePath, $this->discoveryScanDirs, $this->discoveryExcludeDirs, $logger, $this->discoveryCache, $this->schemaGenerator); } foreach ($loaders as $loader) { From 61ed4154a7f55c2cf4240b4e320a8b200a8f6d38 Mon Sep 17 00:00:00 2001 From: soyuka Date: Sun, 28 Dec 2025 23:26:11 +0100 Subject: [PATCH 2/4] add interface for schema generator --- src/Capability/Discovery/Discoverer.php | 2 +- src/Capability/Discovery/SchemaGenerator.php | 22 +++++++--- .../Discovery/SchemaGeneratorInterface.php | 44 +++++++++++++++++++ .../Registry/Loader/ArrayLoader.php | 4 +- .../Registry/Loader/DiscoveryLoader.php | 4 +- src/Server/Builder.php | 6 +-- 6 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 src/Capability/Discovery/SchemaGeneratorInterface.php diff --git a/src/Capability/Discovery/Discoverer.php b/src/Capability/Discovery/Discoverer.php index 95a3fe5a..8ad45f7d 100644 --- a/src/Capability/Discovery/Discoverer.php +++ b/src/Capability/Discovery/Discoverer.php @@ -49,7 +49,7 @@ class Discoverer public function __construct( private readonly LoggerInterface $logger = new NullLogger(), private ?DocBlockParser $docBlockParser = null, - private ?SchemaGenerator $schemaGenerator = null, + private ?SchemaGeneratorInterface $schemaGenerator = null, ) { $this->docBlockParser = $docBlockParser ?? new DocBlockParser(logger: $this->logger); $this->schemaGenerator = $schemaGenerator ?? new SchemaGenerator($this->docBlockParser); diff --git a/src/Capability/Discovery/SchemaGenerator.php b/src/Capability/Discovery/SchemaGenerator.php index 0676e8d9..7ec903f4 100644 --- a/src/Capability/Discovery/SchemaGenerator.php +++ b/src/Capability/Discovery/SchemaGenerator.php @@ -56,7 +56,7 @@ * * @author Kyrian Obikwelu */ -class SchemaGenerator +class SchemaGenerator implements SchemaGeneratorInterface { public function __construct( private readonly DocBlockParser $docBlockParser, @@ -64,12 +64,20 @@ public function __construct( } /** - * Generates a JSON Schema object (as a PHP array) for a method's or function's parameters. + * Generates a JSON Schema object (as a PHP array) for parameters. * * @return array */ - public function generate(\ReflectionMethod|\ReflectionFunction $reflection): array + public function generate(\Reflector $reflection): array { + if ($reflection instanceof \ReflectionClass) { + throw new \BadMethodCallException('Schema generation from ReflectionClass is not implemented yet. Use ReflectionMethod or ReflectionFunction instead.'); + } + + if (!$reflection instanceof \ReflectionFunctionAbstract) { + throw new \BadMethodCallException(\sprintf('Schema generation from %s is not supported.', $reflection::class)); + } + $methodSchema = $this->extractMethodLevelSchema($reflection); if ($methodSchema && isset($methodSchema['definition'])) { @@ -84,9 +92,11 @@ public function generate(\ReflectionMethod|\ReflectionFunction $reflection): arr /** * Extracts method-level or function-level Schema attribute. * + * @param \ReflectionFunctionAbstract $reflection + * * @return SchemaAttributeData */ - private function extractMethodLevelSchema(\ReflectionMethod|\ReflectionFunction $reflection): ?array + private function extractMethodLevelSchema(\ReflectionFunctionAbstract $reflection): ?array { $schemaAttrs = $reflection->getAttributes(Schema::class, \ReflectionAttribute::IS_INSTANCEOF); if (empty($schemaAttrs)) { @@ -401,9 +411,11 @@ private function applyArrayConstraints(array $paramSchema, array $paramInfo): ar /** * Parses detailed information about a method's parameters. * + * @param \ReflectionFunctionAbstract $reflection + * * @return ParameterInfo[] */ - private function parseParametersInfo(\ReflectionMethod|\ReflectionFunction $reflection): array + private function parseParametersInfo(\ReflectionFunctionAbstract $reflection): array { $docComment = $reflection->getDocComment() ?: null; $docBlock = $this->docBlockParser->parseDocBlock($docComment); diff --git a/src/Capability/Discovery/SchemaGeneratorInterface.php b/src/Capability/Discovery/SchemaGeneratorInterface.php new file mode 100644 index 00000000..148bffc0 --- /dev/null +++ b/src/Capability/Discovery/SchemaGeneratorInterface.php @@ -0,0 +1,44 @@ + + */ +interface SchemaGeneratorInterface +{ + /** + * Generates a JSON Schema for input parameters. + * + * The returned schema must be a valid JSON Schema object (type: 'object') + * with properties corresponding to parameters. + * + * - For ReflectionMethod/ReflectionFunction: schema based on method parameters + * - For ReflectionClass: schema based on __construct, __invoke parameters, + * or class properties/metadata + * + * @return array{ + * type: 'object', + * properties: array|object, + * required?: string[] + * } + */ + public function generate(\Reflector $reflection): array; +} diff --git a/src/Capability/Registry/Loader/ArrayLoader.php b/src/Capability/Registry/Loader/ArrayLoader.php index c1642c3a..61e7cbcb 100644 --- a/src/Capability/Registry/Loader/ArrayLoader.php +++ b/src/Capability/Registry/Loader/ArrayLoader.php @@ -17,7 +17,7 @@ use Mcp\Capability\Completion\ProviderInterface; use Mcp\Capability\Discovery\DocBlockParser; use Mcp\Capability\Discovery\HandlerResolver; -use Mcp\Capability\Discovery\SchemaGenerator; +use Mcp\Capability\Discovery\SchemaGeneratorInterface; use Mcp\Capability\Registry\ElementReference; use Mcp\Capability\RegistryInterface; use Mcp\Exception\ConfigurationException; @@ -83,7 +83,7 @@ public function __construct( private readonly array $resourceTemplates = [], private readonly array $prompts = [], private LoggerInterface $logger = new NullLogger(), - private ?SchemaGenerator $schemaGenerator = null, + private ?SchemaGeneratorInterface $schemaGenerator = null, ) { } diff --git a/src/Capability/Registry/Loader/DiscoveryLoader.php b/src/Capability/Registry/Loader/DiscoveryLoader.php index 5a7a5e36..f8c4957e 100644 --- a/src/Capability/Registry/Loader/DiscoveryLoader.php +++ b/src/Capability/Registry/Loader/DiscoveryLoader.php @@ -13,7 +13,7 @@ use Mcp\Capability\Discovery\CachedDiscoverer; use Mcp\Capability\Discovery\Discoverer; -use Mcp\Capability\Discovery\SchemaGenerator; +use Mcp\Capability\Discovery\SchemaGeneratorInterface; use Mcp\Capability\RegistryInterface; use Psr\Log\LoggerInterface; use Psr\SimpleCache\CacheInterface; @@ -33,7 +33,7 @@ public function __construct( private array $excludeDirs, private LoggerInterface $logger, private ?CacheInterface $cache = null, - private ?SchemaGenerator $schemaGenerator = null, + private ?SchemaGeneratorInterface $schemaGenerator = null, ) { } diff --git a/src/Server/Builder.php b/src/Server/Builder.php index 51c0f3c2..f31d0fa5 100644 --- a/src/Server/Builder.php +++ b/src/Server/Builder.php @@ -11,7 +11,7 @@ namespace Mcp\Server; -use Mcp\Capability\Discovery\SchemaGenerator; +use Mcp\Capability\Discovery\SchemaGeneratorInterface; use Mcp\Capability\Registry; use Mcp\Capability\Registry\Container; use Mcp\Capability\Registry\ElementReference; @@ -59,7 +59,7 @@ final class Builder private ?ContainerInterface $container = null; - private ?SchemaGenerator $schemaGenerator = null; + private ?SchemaGeneratorInterface $schemaGenerator = null; private ?SessionFactoryInterface $sessionFactory = null; @@ -289,7 +289,7 @@ public function setContainer(ContainerInterface $container): self return $this; } - public function setSchemaGenerator(SchemaGenerator $schemaGenerator): self + public function setSchemaGenerator(SchemaGeneratorInterface $schemaGenerator): self { $this->schemaGenerator = $schemaGenerator; From 7c5cbcc9d611b0c017c62adfd60a2ede30cf5d48 Mon Sep 17 00:00:00 2001 From: soyuka Date: Sun, 28 Dec 2025 23:50:37 +0100 Subject: [PATCH 3/4] improve discoverer dependency --- src/Capability/Discovery/CachedDiscoverer.php | 7 ++-- src/Capability/Discovery/Discoverer.php | 5 ++- .../Discovery/DiscovererInterface.php | 36 +++++++++++++++++++ .../Registry/Loader/DiscoveryLoader.php | 19 ++-------- src/Server/Builder.php | 24 ++++++++++++- 5 files changed, 71 insertions(+), 20 deletions(-) create mode 100644 src/Capability/Discovery/DiscovererInterface.php diff --git a/src/Capability/Discovery/CachedDiscoverer.php b/src/Capability/Discovery/CachedDiscoverer.php index 75f2d4a1..5f2cdffa 100644 --- a/src/Capability/Discovery/CachedDiscoverer.php +++ b/src/Capability/Discovery/CachedDiscoverer.php @@ -20,14 +20,17 @@ * This decorator caches the results of file system operations and reflection * to improve performance when discovery is called multiple times. * + * @internal + * @final + * * @author Xentixar */ -class CachedDiscoverer +class CachedDiscoverer implements DiscovererInterface { private const CACHE_PREFIX = 'mcp_discovery_'; public function __construct( - private readonly Discoverer $discoverer, + private readonly DiscovererInterface $discoverer, private readonly CacheInterface $cache, private readonly LoggerInterface $logger, ) { diff --git a/src/Capability/Discovery/Discoverer.php b/src/Capability/Discovery/Discoverer.php index 8ad45f7d..55a134d0 100644 --- a/src/Capability/Discovery/Discoverer.php +++ b/src/Capability/Discovery/Discoverer.php @@ -42,9 +42,12 @@ * resourceTemplates: int, * } * + * @internal + * @final + * * @author Kyrian Obikwelu */ -class Discoverer +class Discoverer implements DiscovererInterface { public function __construct( private readonly LoggerInterface $logger = new NullLogger(), diff --git a/src/Capability/Discovery/DiscovererInterface.php b/src/Capability/Discovery/DiscovererInterface.php new file mode 100644 index 00000000..9736542c --- /dev/null +++ b/src/Capability/Discovery/DiscovererInterface.php @@ -0,0 +1,36 @@ + + */ +interface DiscovererInterface +{ + /** + * Discover MCP elements in the specified directories and return the discovery state. + * + * @param string $basePath the base path for resolving directories + * @param array $directories list of directories (relative to base path) to scan + * @param array $excludeDirs list of directories (relative to base path) to exclude from the scan + */ + public function discover(string $basePath, array $directories, array $excludeDirs = []): DiscoveryState; +} diff --git a/src/Capability/Registry/Loader/DiscoveryLoader.php b/src/Capability/Registry/Loader/DiscoveryLoader.php index f8c4957e..8ceae97d 100644 --- a/src/Capability/Registry/Loader/DiscoveryLoader.php +++ b/src/Capability/Registry/Loader/DiscoveryLoader.php @@ -11,12 +11,8 @@ namespace Mcp\Capability\Registry\Loader; -use Mcp\Capability\Discovery\CachedDiscoverer; -use Mcp\Capability\Discovery\Discoverer; -use Mcp\Capability\Discovery\SchemaGeneratorInterface; +use Mcp\Capability\Discovery\DiscovererInterface; use Mcp\Capability\RegistryInterface; -use Psr\Log\LoggerInterface; -use Psr\SimpleCache\CacheInterface; /** * @author Antoine Bluchet @@ -31,22 +27,13 @@ public function __construct( private string $basePath, private array $scanDirs, private array $excludeDirs, - private LoggerInterface $logger, - private ?CacheInterface $cache = null, - private ?SchemaGeneratorInterface $schemaGenerator = null, + private DiscovererInterface $discoverer, ) { } public function load(RegistryInterface $registry): void { - // This now encapsulates the discovery process - $discoverer = new Discoverer($this->logger, null, $this->schemaGenerator); - - $cachedDiscoverer = $this->cache - ? new CachedDiscoverer($discoverer, $this->cache, $this->logger) - : $discoverer; - - $discoveryState = $cachedDiscoverer->discover($this->basePath, $this->scanDirs, $this->excludeDirs); + $discoveryState = $this->discoverer->discover($this->basePath, $this->scanDirs, $this->excludeDirs); $registry->setDiscoveryState($discoveryState); } diff --git a/src/Server/Builder.php b/src/Server/Builder.php index f31d0fa5..daabfcd7 100644 --- a/src/Server/Builder.php +++ b/src/Server/Builder.php @@ -11,6 +11,7 @@ namespace Mcp\Server; +use Mcp\Capability\Discovery\DiscovererInterface; use Mcp\Capability\Discovery\SchemaGeneratorInterface; use Mcp\Capability\Registry; use Mcp\Capability\Registry\Container; @@ -61,6 +62,8 @@ final class Builder private ?SchemaGeneratorInterface $schemaGenerator = null; + private ?DiscovererInterface $discoverer = null; + private ?SessionFactoryInterface $sessionFactory = null; private ?SessionStoreInterface $sessionStore = null; @@ -296,6 +299,13 @@ public function setSchemaGenerator(SchemaGeneratorInterface $schemaGenerator): s return $this; } + public function setDiscoverer(DiscovererInterface $discoverer): self + { + $this->discoverer = $discoverer; + + return $this; + } + public function setSession( SessionStoreInterface $sessionStore, SessionFactoryInterface $sessionFactory = new SessionFactory(), @@ -480,7 +490,8 @@ public function build(): Server ]; if (null !== $this->discoveryBasePath) { - $loaders[] = new DiscoveryLoader($this->discoveryBasePath, $this->discoveryScanDirs, $this->discoveryExcludeDirs, $logger, $this->discoveryCache, $this->schemaGenerator); + $discoverer = $this->discoverer ?? $this->createDiscoverer($logger); + $loaders[] = new DiscoveryLoader($this->discoveryBasePath, $this->discoveryScanDirs, $this->discoveryExcludeDirs, $discoverer); } foreach ($loaders as $loader) { @@ -537,4 +548,15 @@ public function build(): Server return new Server($protocol, $logger); } + + private function createDiscoverer(LoggerInterface $logger): DiscovererInterface + { + $discoverer = new \Mcp\Capability\Discovery\Discoverer($logger, null, $this->schemaGenerator); + + if (null !== $this->discoveryCache) { + return new \Mcp\Capability\Discovery\CachedDiscoverer($discoverer, $this->discoveryCache, $logger); + } + + return $discoverer; + } } From 9c63ce2ee0385df84cd103ac9f4de2d49093cf97 Mon Sep 17 00:00:00 2001 From: soyuka Date: Mon, 29 Dec 2025 09:55:30 +0100 Subject: [PATCH 4/4] remove some comments --- src/Capability/Discovery/CachedDiscoverer.php | 1 + src/Capability/Discovery/Discoverer.php | 1 + src/Capability/Discovery/DiscovererInterface.php | 5 ----- src/Capability/Discovery/SchemaGenerator.php | 10 +++++----- .../Discovery/SchemaGeneratorInterface.php | 12 +----------- src/Capability/Registry/Loader/ArrayLoader.php | 1 + src/Capability/Registry/Loader/DiscoveryLoader.php | 2 ++ 7 files changed, 11 insertions(+), 21 deletions(-) diff --git a/src/Capability/Discovery/CachedDiscoverer.php b/src/Capability/Discovery/CachedDiscoverer.php index 5f2cdffa..15bc1226 100644 --- a/src/Capability/Discovery/CachedDiscoverer.php +++ b/src/Capability/Discovery/CachedDiscoverer.php @@ -21,6 +21,7 @@ * to improve performance when discovery is called multiple times. * * @internal + * * @final * * @author Xentixar diff --git a/src/Capability/Discovery/Discoverer.php b/src/Capability/Discovery/Discoverer.php index 55a134d0..c5367535 100644 --- a/src/Capability/Discovery/Discoverer.php +++ b/src/Capability/Discovery/Discoverer.php @@ -43,6 +43,7 @@ * } * * @internal + * * @final * * @author Kyrian Obikwelu diff --git a/src/Capability/Discovery/DiscovererInterface.php b/src/Capability/Discovery/DiscovererInterface.php index 9736542c..0de02de4 100644 --- a/src/Capability/Discovery/DiscovererInterface.php +++ b/src/Capability/Discovery/DiscovererInterface.php @@ -14,11 +14,6 @@ /** * Discovers MCP elements (tools, resources, prompts, resource templates) in directories. * - * Implementations can use different strategies: - * - File system scanning with reflection - * - Cached discovery - * - Pre-configured discovery - * * @internal * * @author Antoine Bluchet diff --git a/src/Capability/Discovery/SchemaGenerator.php b/src/Capability/Discovery/SchemaGenerator.php index 7ec903f4..0d52f877 100644 --- a/src/Capability/Discovery/SchemaGenerator.php +++ b/src/Capability/Discovery/SchemaGenerator.php @@ -78,6 +78,10 @@ public function generate(\Reflector $reflection): array throw new \BadMethodCallException(\sprintf('Schema generation from %s is not supported.', $reflection::class)); } + if (!$reflection instanceof \ReflectionMethod && !$reflection instanceof \ReflectionFunction) { + throw new \BadMethodCallException(\sprintf('Schema generation from %s is not supported.', $reflection::class)); + } + $methodSchema = $this->extractMethodLevelSchema($reflection); if ($methodSchema && isset($methodSchema['definition'])) { @@ -92,8 +96,6 @@ public function generate(\Reflector $reflection): array /** * Extracts method-level or function-level Schema attribute. * - * @param \ReflectionFunctionAbstract $reflection - * * @return SchemaAttributeData */ private function extractMethodLevelSchema(\ReflectionFunctionAbstract $reflection): ?array @@ -411,11 +413,9 @@ private function applyArrayConstraints(array $paramSchema, array $paramInfo): ar /** * Parses detailed information about a method's parameters. * - * @param \ReflectionFunctionAbstract $reflection - * * @return ParameterInfo[] */ - private function parseParametersInfo(\ReflectionFunctionAbstract $reflection): array + private function parseParametersInfo(\ReflectionMethod|\ReflectionFunction $reflection): array { $docComment = $reflection->getDocComment() ?: null; $docBlock = $this->docBlockParser->parseDocBlock($docComment); diff --git a/src/Capability/Discovery/SchemaGeneratorInterface.php b/src/Capability/Discovery/SchemaGeneratorInterface.php index 148bffc0..6bc2cb6f 100644 --- a/src/Capability/Discovery/SchemaGeneratorInterface.php +++ b/src/Capability/Discovery/SchemaGeneratorInterface.php @@ -14,12 +14,6 @@ /** * Provides JSON Schema generation for reflected elements. * - * Implementations can use different strategies to generate schemas: - * - Reflection-based (types and docblocks) - * - Attribute-based (Schema attributes) - * - External libraries (API Platform, etc.) - * - Class-based metadata - * * @author Antoine Bluchet */ interface SchemaGeneratorInterface @@ -28,11 +22,7 @@ interface SchemaGeneratorInterface * Generates a JSON Schema for input parameters. * * The returned schema must be a valid JSON Schema object (type: 'object') - * with properties corresponding to parameters. - * - * - For ReflectionMethod/ReflectionFunction: schema based on method parameters - * - For ReflectionClass: schema based on __construct, __invoke parameters, - * or class properties/metadata + * with properties corresponding to a tool's parameters. * * @return array{ * type: 'object', diff --git a/src/Capability/Registry/Loader/ArrayLoader.php b/src/Capability/Registry/Loader/ArrayLoader.php index 61e7cbcb..b2f67e9a 100644 --- a/src/Capability/Registry/Loader/ArrayLoader.php +++ b/src/Capability/Registry/Loader/ArrayLoader.php @@ -17,6 +17,7 @@ use Mcp\Capability\Completion\ProviderInterface; use Mcp\Capability\Discovery\DocBlockParser; use Mcp\Capability\Discovery\HandlerResolver; +use Mcp\Capability\Discovery\SchemaGenerator; use Mcp\Capability\Discovery\SchemaGeneratorInterface; use Mcp\Capability\Registry\ElementReference; use Mcp\Capability\RegistryInterface; diff --git a/src/Capability/Registry/Loader/DiscoveryLoader.php b/src/Capability/Registry/Loader/DiscoveryLoader.php index 8ceae97d..25261ff5 100644 --- a/src/Capability/Registry/Loader/DiscoveryLoader.php +++ b/src/Capability/Registry/Loader/DiscoveryLoader.php @@ -15,6 +15,8 @@ use Mcp\Capability\RegistryInterface; /** + * @internal + * * @author Antoine Bluchet */ final class DiscoveryLoader implements LoaderInterface