Add interface abstractions for SchemaGenerator and Discoverer with DI improvements (#215)

* schema generator injection

* add interface for schema generator

* improve discoverer dependency

* remove some comments

* make some classes final

* simplify condition

* code review

* Extend changelog for covering interfaces

* Adopt SchemaGeneratorInterface after rebase and #153

---------

Co-authored-by: Christopher Hertel <mail@christopher-hertel.de>
This commit is contained in:
Antoine Bluchet 2026-01-11 22:03:43 +01:00 • committed by GitHub
commit 7cb29125bd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -11,6 +11,10 @@
namespace Mcp\Server;
use Mcp\Capability\Discovery\CachedDiscoverer;
use Mcp\Capability\Discovery\Discoverer;
use Mcp\Capability\Discovery\DiscovererInterface;
use Mcp\Capability\Discovery\SchemaGeneratorInterface;
use Mcp\Capability\Registry;
use Mcp\Capability\Registry\Container;
use Mcp\Capability\Registry\ElementReference;
@ -58,6 +62,10 @@ final class Builder
private ?ContainerInterface $container = null;
private ?SchemaGeneratorInterface $schemaGenerator = null;
private ?DiscovererInterface $discoverer = null;
private ?SessionFactoryInterface $sessionFactory = null;
private ?SessionStoreInterface $sessionStore = null;
@ -287,6 +295,20 @@ final class Builder
return $this;
}
public function setSchemaGenerator(SchemaGeneratorInterface $schemaGenerator): self
{
$this->schemaGenerator = $schemaGenerator;
return $this;
}
public function setDiscoverer(DiscovererInterface $discoverer): self
{
$this->discoverer = $discoverer;
return $this;
}
public function setSession(
SessionStoreInterface $sessionStore,
SessionFactoryInterface $sessionFactory = new SessionFactory(),
@ -470,11 +492,12 @@ final class Builder
$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);
$discoverer = $this->discoverer ?? $this->createDiscoverer($logger);
$loaders[] = new DiscoveryLoader($this->discoveryBasePath, $this->discoveryScanDirs, $this->discoveryExcludeDirs, $discoverer);
}
foreach ($loaders as $loader) {
@ -531,4 +554,15 @@ final class Builder
return new Server($protocol, $logger);
}
private function createDiscoverer(LoggerInterface $logger): DiscovererInterface
{
$discoverer = new Discoverer($logger, null, $this->schemaGenerator);
if (null !== $this->discoveryCache) {
return new CachedDiscoverer($discoverer, $this->discoveryCache, $logger);
}
return $discoverer;
}
}