3232use Mcp \Schema \Tool ;
3333use Mcp \Schema \ToolAnnotations ;
3434use Mcp \Server ;
35+ use Mcp \Server \Session \SessionFactory ;
36+ use Mcp \Server \Session \InMemorySessionStore ;
37+ use Mcp \Server \Session \SessionFactoryInterface ;
38+ use Mcp \Server \Session \SessionStoreInterface ;
3539use Psr \Container \ContainerInterface ;
3640use Psr \EventDispatcher \EventDispatcherInterface ;
3741use Psr \Log \LoggerInterface ;
3842use Psr \Log \NullLogger ;
39- use Psr \SimpleCache \CacheInterface ;
4043
4144/**
4245 * @author Kyrian Obikwelu <[email protected] > @@ -47,12 +50,15 @@ final class ServerBuilder
4750
4851 private ?LoggerInterface $ logger = null ;
4952
50- private ?CacheInterface $ cache = null ;
5153
5254 private ?EventDispatcherInterface $ eventDispatcher = null ;
5355
5456 private ?ContainerInterface $ container = null ;
5557
58+ private ?SessionFactoryInterface $ sessionFactory = null ;
59+ private ?SessionStoreInterface $ sessionStore = null ;
60+ private ?int $ sessionTtl = 3600 ;
61+
5662 private ?int $ paginationLimit = 50 ;
5763
5864 private ?string $ instructions = null ;
@@ -160,6 +166,18 @@ public function withContainer(ContainerInterface $container): self
160166 return $ this ;
161167 }
162168
169+ public function withSession (
170+ SessionFactoryInterface $ sessionFactory ,
171+ SessionStoreInterface $ sessionStore ,
172+ int $ ttl = 3600
173+ ): self {
174+ $ this ->sessionFactory = $ sessionFactory ;
175+ $ this ->sessionStore = $ sessionStore ;
176+ $ this ->sessionTtl = $ ttl ;
177+
178+ return $ this ;
179+ }
180+
163181 public function withDiscovery (
164182 string $ basePath ,
165183 array $ scanDirs = ['. ' , 'src ' ],
@@ -222,6 +240,9 @@ public function build(): Server
222240 $ container = $ this ->container ?? new Container ();
223241 $ registry = new Registry (new ReferenceHandler ($ container ), $ this ->eventDispatcher , $ logger );
224242
243+ $ sessionFactory = $ this ->sessionFactory ?? new SessionFactory ();
244+ $ sessionStore = $ this ->sessionStore ?? new InMemorySessionStore ($ this ->sessionTtl );
245+
225246 $ this ->registerManualElements ($ registry , $ logger );
226247
227248 if (null !== $ this ->discoveryBasePath ) {
@@ -231,6 +252,9 @@ public function build(): Server
231252
232253 return new Server (
233254 Handler::make ($ registry , $ this ->serverInfo , $ logger ),
255+ $ sessionFactory ,
256+ $ sessionStore ,
257+ $ this ->sessionTtl ,
234258 $ logger ,
235259 );
236260 }
@@ -254,7 +278,7 @@ private function registerManualElements(Registry $registry, LoggerInterface $log
254278 $ reflection = HandlerResolver::resolve ($ data ['handler ' ]);
255279
256280 if ($ reflection instanceof \ReflectionFunction) {
257- $ name = $ data ['name ' ] ?? 'closure_tool_ ' . spl_object_id ($ data ['handler ' ]);
281+ $ name = $ data ['name ' ] ?? 'closure_tool_ ' . spl_object_id ($ data ['handler ' ]);
258282 $ description = $ data ['description ' ] ?? null ;
259283 } else {
260284 $ classShortName = $ reflection ->getDeclaringClass ()->getShortName ();
@@ -284,7 +308,7 @@ private function registerManualElements(Registry $registry, LoggerInterface $log
284308 $ reflection = HandlerResolver::resolve ($ data ['handler ' ]);
285309
286310 if ($ reflection instanceof \ReflectionFunction) {
287- $ name = $ data ['name ' ] ?? 'closure_resource_ ' . spl_object_id ($ data ['handler ' ]);
311+ $ name = $ data ['name ' ] ?? 'closure_resource_ ' . spl_object_id ($ data ['handler ' ]);
288312 $ description = $ data ['description ' ] ?? null ;
289313 } else {
290314 $ classShortName = $ reflection ->getDeclaringClass ()->getShortName ();
@@ -317,7 +341,7 @@ private function registerManualElements(Registry $registry, LoggerInterface $log
317341 $ reflection = HandlerResolver::resolve ($ data ['handler ' ]);
318342
319343 if ($ reflection instanceof \ReflectionFunction) {
320- $ name = $ data ['name ' ] ?? 'closure_template_ ' . spl_object_id ($ data ['handler ' ]);
344+ $ name = $ data ['name ' ] ?? 'closure_template_ ' . spl_object_id ($ data ['handler ' ]);
321345 $ description = $ data ['description ' ] ?? null ;
322346 } else {
323347 $ classShortName = $ reflection ->getDeclaringClass ()->getShortName ();
@@ -350,7 +374,7 @@ private function registerManualElements(Registry $registry, LoggerInterface $log
350374 $ reflection = HandlerResolver::resolve ($ data ['handler ' ]);
351375
352376 if ($ reflection instanceof \ReflectionFunction) {
353- $ name = $ data ['name ' ] ?? 'closure_prompt_ ' . spl_object_id ($ data ['handler ' ]);
377+ $ name = $ data ['name ' ] ?? 'closure_prompt_ ' . spl_object_id ($ data ['handler ' ]);
354378 $ description = $ data ['description ' ] ?? null ;
355379 } else {
356380 $ classShortName = $ reflection ->getDeclaringClass ()->getShortName ();
@@ -371,7 +395,7 @@ private function registerManualElements(Registry $registry, LoggerInterface $log
371395 continue ;
372396 }
373397
374- $ paramTag = $ paramTags ['$ ' . $ param ->getName ()] ?? null ;
398+ $ paramTag = $ paramTags ['$ ' . $ param ->getName ()] ?? null ;
375399 $ arguments [] = new PromptArgument (
376400 $ param ->getName (),
377401 $ paramTag ? trim ((string ) $ paramTag ->getDescription ()) : null ,
0 commit comments