3333use Mcp \Server ;
3434use Mcp \Server \Handler \Notification \NotificationHandlerInterface ;
3535use Mcp \Server \Handler \Request \RequestHandlerInterface ;
36+ use Mcp \Server \Resource \SessionSubscriptionManager ;
37+ use Mcp \Server \Resource \SubscriptionManagerInterface ;
3638use Mcp \Server \Session \InMemorySessionStore ;
3739use Mcp \Server \Session \SessionFactory ;
3840use Mcp \Server \Session \SessionFactoryInterface ;
@@ -54,6 +56,8 @@ final class Builder
5456
5557 private RegistryInterface $ registry ;
5658
59+ private ?SubscriptionManagerInterface $ subscriptionManager = null ;
60+
5761 private ?LoggerInterface $ logger = null ;
5862
5963 private ?CacheInterface $ discoveryCache = null ;
@@ -309,6 +313,13 @@ public function setDiscoverer(DiscovererInterface $discoverer): self
309313 return $ this ;
310314 }
311315
316+ public function setResourceSubscriptionManager (SubscriptionManagerInterface $ subscriptionManager ): self
317+ {
318+ $ this ->subscriptionManager = $ subscriptionManager ;
319+
320+ return $ this ;
321+ }
322+
312323 public function setSession (
313324 SessionStoreInterface $ sessionStore ,
314325 SessionFactoryInterface $ sessionFactory = new SessionFactory (),
@@ -489,12 +500,16 @@ public function build(): Server
489500 $ logger = $ this ->logger ?? new NullLogger ();
490501 $ container = $ this ->container ?? new Container ();
491502 $ registry = $ this ->registry ?? new Registry ($ this ->eventDispatcher , $ logger );
492-
503+ $ subscriptionManager = $ this -> subscriptionManager ?? new SessionSubscriptionManager ( $ logger );
493504 $ loaders = [
494505 ...$ this ->loaders ,
495506 new ArrayLoader ($ this ->tools , $ this ->resources , $ this ->resourceTemplates , $ this ->prompts , $ logger , $ this ->schemaGenerator ),
496507 ];
497508
509+ $ sessionTtl = $ this ->sessionTtl ?? 3600 ;
510+ $ sessionFactory = $ this ->sessionFactory ?? new SessionFactory ();
511+ $ sessionStore = $ this ->sessionStore ?? new InMemorySessionStore ($ sessionTtl );
512+
498513 if (null !== $ this ->discoveryBasePath ) {
499514 $ discoverer = $ this ->discoverer ?? $ this ->createDiscoverer ($ logger );
500515 $ loaders [] = new DiscoveryLoader ($ this ->discoveryBasePath , $ this ->discoveryScanDirs , $ this ->discoveryExcludeDirs , $ discoverer );
@@ -504,16 +519,13 @@ public function build(): Server
504519 $ loader ->load ($ registry );
505520 }
506521
507- $ sessionTtl = $ this ->sessionTtl ?? 3600 ;
508- $ sessionFactory = $ this ->sessionFactory ?? new SessionFactory ();
509- $ sessionStore = $ this ->sessionStore ?? new InMemorySessionStore ($ sessionTtl );
510522 $ messageFactory = MessageFactory::make ();
511523
512524 $ capabilities = $ this ->serverCapabilities ?? new ServerCapabilities (
513525 tools: $ registry ->hasTools (),
514526 toolsListChanged: $ this ->eventDispatcher instanceof EventDispatcherInterface,
515527 resources: $ registry ->hasResources () || $ registry ->hasResourceTemplates (),
516- resourcesSubscribe: false ,
528+ resourcesSubscribe: $ registry -> hasResources () || $ registry -> hasResourceTemplates () ,
517529 resourcesListChanged: $ this ->eventDispatcher instanceof EventDispatcherInterface,
518530 prompts: $ registry ->hasPrompts (),
519531 promptsListChanged: $ this ->eventDispatcher instanceof EventDispatcherInterface,
@@ -536,6 +548,8 @@ public function build(): Server
536548 new Handler \Request \ListToolsHandler ($ registry , $ this ->paginationLimit ),
537549 new Handler \Request \PingHandler (),
538550 new Handler \Request \ReadResourceHandler ($ registry , $ referenceHandler , $ logger ),
551+ new Handler \Request \ResourceSubscribeHandler ($ registry , $ subscriptionManager , $ logger ),
552+ new Handler \Request \ResourceUnsubscribeHandler ($ registry , $ subscriptionManager , $ logger ),
539553 new Handler \Request \SetLogLevelHandler (),
540554 ]);
541555
0 commit comments