@@ -82,6 +82,7 @@ async def main():
8282from  typing_extensions  import  TypeVar 
8383
8484import  mcp .types  as  types 
85+ from  mcp .server .lowlevel .func_inspection  import  accepts_cursor 
8586from  mcp .server .lowlevel .helper_types  import  ReadResourceContents 
8687from  mcp .server .models  import  InitializationOptions 
8788from  mcp .server .session  import  ServerSession 
@@ -230,25 +231,29 @@ def request_context(
230231        return  request_ctx .get ()
231232
232233    def  list_prompts (self ):
233-         def  decorator (func : Callable [[], Awaitable [list [types .Prompt ]]]):
234+         def  decorator (
235+             func : Callable [[], Awaitable [list [types .Prompt ]]]
236+             |  Callable [[types .Cursor  |  None ], Awaitable [types .ListPromptsResult ]],
237+         ):
234238            logger .debug ("Registering handler for PromptListRequest" )
239+             pass_cursor  =  accepts_cursor (func )
235240
236-             async  def  handler (_ : Any ):
237-                 prompts  =  await  func ()
238-                 return  types .ServerResult (types .ListPromptsResult (prompts = prompts ))
241+             if  pass_cursor :
242+                 cursor_func  =  cast (Callable [[types .Cursor  |  None ], Awaitable [types .ListPromptsResult ]], func )
239243
240-             self .request_handlers [types .ListPromptsRequest ] =  handler 
241-             return  func 
244+                 async  def  cursor_handler (req : types .ListPromptsRequest ):
245+                     result  =  await  cursor_func (req .params .cursor  if  req .params  is  not None  else  None )
246+                     return  types .ServerResult (result )
242247
243-         return  decorator 
248+                 handler  =  cursor_handler 
249+             else :
250+                 list_func  =  cast (Callable [[], Awaitable [list [types .Prompt ]]], func )
244251
245-     def  list_prompts_paginated ( self ):
246-         def   decorator ( func :  Callable [[ types . Cursor   |   None ],  Awaitable [ types . ListPromptsResult ]]): 
247-             logger . debug ( "Registering handler for PromptListRequest with pagination" )
252+                  async   def  list_handler ( _ :  types . ListPromptsRequest ):
253+                      result   =   await   list_func () 
254+                      return   types . ServerResult ( types . ListPromptsResult ( prompts = result ) )
248255
249-             async  def  handler (req : types .ListPromptsRequest ):
250-                 result  =  await  func (req .params .cursor  if  req .params  else  None )
251-                 return  types .ServerResult (result )
256+                 handler  =  list_handler 
252257
253258            self .request_handlers [types .ListPromptsRequest ] =  handler 
254259            return  func 
@@ -271,25 +276,29 @@ async def handler(req: types.GetPromptRequest):
271276        return  decorator 
272277
273278    def  list_resources (self ):
274-         def  decorator (func : Callable [[], Awaitable [list [types .Resource ]]]):
279+         def  decorator (
280+             func : Callable [[], Awaitable [list [types .Resource ]]]
281+             |  Callable [[types .Cursor  |  None ], Awaitable [types .ListResourcesResult ]],
282+         ):
275283            logger .debug ("Registering handler for ListResourcesRequest" )
284+             pass_cursor  =  accepts_cursor (func )
276285
277-             async  def  handler (_ : Any ):
278-                 resources  =  await  func ()
279-                 return  types .ServerResult (types .ListResourcesResult (resources = resources ))
286+             if  pass_cursor :
287+                 cursor_func  =  cast (Callable [[types .Cursor  |  None ], Awaitable [types .ListResourcesResult ]], func )
280288
281-             self .request_handlers [types .ListResourcesRequest ] =  handler 
282-             return  func 
289+                 async  def  cursor_handler (req : types .ListResourcesRequest ):
290+                     result  =  await  cursor_func (req .params .cursor  if  req .params  is  not None  else  None )
291+                     return  types .ServerResult (result )
283292
284-         return  decorator 
293+                 handler  =  cursor_handler 
294+             else :
295+                 list_func  =  cast (Callable [[], Awaitable [list [types .Resource ]]], func )
285296
286-     def  list_resources_paginated ( self ):
287-         def   decorator ( func :  Callable [[ types . Cursor   |   None ],  Awaitable [ types . ListResourcesResult ]]): 
288-             logger . debug ( "Registering handler for ListResourcesRequest with pagination" )
297+                  async   def  list_handler ( _ :  types . ListResourcesRequest ):
298+                      result   =   await   list_func () 
299+                      return   types . ServerResult ( types . ListResourcesResult ( resources = result ) )
289300
290-             async  def  handler (req : types .ListResourcesRequest ):
291-                 result  =  await  func (req .params .cursor  if  req .params  else  None )
292-                 return  types .ServerResult (result )
301+                 handler  =  list_handler 
293302
294303            self .request_handlers [types .ListResourcesRequest ] =  handler 
295304            return  func 
@@ -407,33 +416,36 @@ async def handler(req: types.UnsubscribeRequest):
407416        return  decorator 
408417
409418    def  list_tools (self ):
410-         def  decorator (func : Callable [[], Awaitable [list [types .Tool ]]]):
419+         def  decorator (
420+             func : Callable [[], Awaitable [list [types .Tool ]]]
421+             |  Callable [[types .Cursor  |  None ], Awaitable [types .ListToolsResult ]],
422+         ):
411423            logger .debug ("Registering handler for ListToolsRequest" )
412- 
413-              async   def   handler ( _ :  Any ): 
414-                  tools   =   await   func () 
415-                 # Refresh the tool cache 
416-                  self . _tool_cache . clear () 
417-                 for   tool   in   tools :
418-                     self . _tool_cache [ tool . name ]  =   tool 
419-                 return   types . ServerResult ( types . ListToolsResult ( tools = tools )) 
420- 
421-             self .request_handlers [ types . ListToolsRequest ] =  handler 
422-             return  func 
423- 
424-         return   decorator 
425- 
426-     def   list_tools_paginated ( self ): 
427-          def   decorator ( func :  Callable [[ types . Cursor   |   None ],  Awaitable [ types . ListToolsResult ]]): 
428-             logger . debug ( "Registering paginated handler for  ListToolsRequest" ) 
429- 
430-             async   def   handler ( request :  types . ListToolsRequest ): 
431-                 cursor   =   request . params . cursor   if   request . params   else   None 
432-                 result   =   await   func ( cursor ) 
433-                 # Refresh the tool cache with returned tools 
434-                 for   tool   in   result . tools : 
435-                      self . _tool_cache [ tool . name ]  =   tool 
436-                 return   types . ServerResult ( result ) 
424+              pass_cursor   =   accepts_cursor ( func ) 
425+ 
426+             if   pass_cursor : 
427+                 cursor_func   =   cast ( Callable [[ types . Cursor   |   None ],  Awaitable [ types . ListToolsResult ]],  func ) 
428+ 
429+                 async   def   cursor_handler ( req :  types . ListToolsRequest ) :
430+                     result   =   await   cursor_func ( req . params . cursor   if   req . params   is   not   None   else   None ) 
431+                      # Refresh the tool cache with returned  tools
432+                      for   tool   in   result . tools : 
433+                          self ._tool_cache [ tool . name ] =  tool 
434+                      return  types . ServerResult ( result ) 
435+ 
436+                  handler   =   cursor_handler 
437+              else : 
438+                  list_func   =   cast ( Callable [[],  Awaitable [ list [ types . Tool ]]],  func ) 
439+ 
440+                  async   def   list_handler ( req :  types . ListToolsRequest ): 
441+                      result   =   await   list_func () 
442+                      # Clear and refresh the entire tool cache 
443+                      self . _tool_cache . clear () 
444+                      for   tool   in   result : 
445+                          self . _tool_cache [ tool . name ]  =   tool 
446+                      return   types . ServerResult ( types . ListToolsResult ( tools = result )) 
447+ 
448+                 handler   =   list_handler 
437449
438450            self .request_handlers [types .ListToolsRequest ] =  handler 
439451            return  func 
0 commit comments