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:
parent
1de4ea933f
commit
7cb29125bd
1 changed files with 167 additions and 27 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue