2323use Mcp \Capability \Registry \Loader \LoaderInterface ;
2424use Mcp \Capability \Registry \ReferenceHandler ;
2525use Mcp \Capability \RegistryInterface ;
26+ use Mcp \Event \Dispatcher ;
27+ use Mcp \Event \ListenerProvider ;
28+ use Mcp \Event \PromptListChangedEvent ;
29+ use Mcp \Event \ResourceListChangedEvent ;
30+ use Mcp \Event \ToolListChangedEvent ;
2631use Mcp \JsonRpc \MessageFactory ;
2732use Mcp \Schema \Annotations ;
2833use Mcp \Schema \Enum \ProtocolVersion ;
@@ -60,6 +65,8 @@ final class Builder
6065
6166 private ?EventDispatcherInterface $ eventDispatcher = null ;
6267
68+ private ?ListenerProvider $ eventListenerProvider = null ;
69+
6370 private ?ContainerInterface $ container = null ;
6471
6572 private ?SchemaGeneratorInterface $ schemaGenerator = null ;
@@ -284,6 +291,13 @@ public function setEventDispatcher(EventDispatcherInterface $eventDispatcher): s
284291 return $ this ;
285292 }
286293
294+ public function setEventListenerProvider (ListenerProvider $ listenerProvider ): self
295+ {
296+ $ this ->eventListenerProvider = $ listenerProvider ;
297+
298+ return $ this ;
299+ }
300+
287301 /**
288302 * Provides a PSR-11 DI container, primarily for resolving user-defined handler classes.
289303 * Defaults to a basic internal container.
@@ -488,6 +502,8 @@ public function build(): Server
488502 {
489503 $ logger = $ this ->logger ?? new NullLogger ();
490504 $ container = $ this ->container ?? new Container ();
505+ $ this ->eventListenerProvider ??= new ListenerProvider ();
506+ $ this ->eventDispatcher ??= new Dispatcher ($ this ->eventListenerProvider );
491507 $ registry = $ this ->registry ?? new Registry ($ this ->eventDispatcher , $ logger );
492508
493509 $ loaders = [
@@ -511,12 +527,12 @@ public function build(): Server
511527
512528 $ capabilities = $ this ->serverCapabilities ?? new ServerCapabilities (
513529 tools: $ registry ->hasTools (),
514- toolsListChanged: $ this -> eventDispatcher instanceof EventDispatcherInterface ,
530+ toolsListChanged: true ,
515531 resources: $ registry ->hasResources () || $ registry ->hasResourceTemplates (),
516532 resourcesSubscribe: false ,
517- resourcesListChanged: $ this -> eventDispatcher instanceof EventDispatcherInterface ,
533+ resourcesListChanged: true ,
518534 prompts: $ registry ->hasPrompts (),
519- promptsListChanged: $ this -> eventDispatcher instanceof EventDispatcherInterface ,
535+ promptsListChanged: true ,
520536 logging: true ,
521537 completions: true ,
522538 );
@@ -552,6 +568,11 @@ public function build(): Server
552568 logger: $ logger ,
553569 );
554570
571+ $ changeListener = new ChangeListener ($ protocol );
572+ $ this ->eventListenerProvider ->addListener (PromptListChangedEvent::class, $ changeListener ->onPromptListChange (...));
573+ $ this ->eventListenerProvider ->addListener (ResourceListChangedEvent::class, $ changeListener ->onResourceListChange (...));
574+ $ this ->eventListenerProvider ->addListener (ToolListChangedEvent::class, $ changeListener ->onToolListChange (...));
575+
555576 return new Server ($ protocol , $ logger );
556577 }
557578
0 commit comments