@@ -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
@@ -229,25 +230,29 @@ def request_context(
229230 return request_ctx .get ()
230231
231232 def list_prompts (self ):
232- def decorator (func : Callable [[], Awaitable [list [types .Prompt ]]]):
233+ def decorator (
234+ func : Callable [[], Awaitable [list [types .Prompt ]]]
235+ | Callable [[types .Cursor | None ], Awaitable [types .ListPromptsResult ]],
236+ ):
233237 logger .debug ("Registering handler for PromptListRequest" )
238+ pass_cursor = accepts_cursor (func )
234239
235- async def handler (_ : Any ):
236- prompts = await func ()
237- return types .ServerResult (types .ListPromptsResult (prompts = prompts ))
240+ if pass_cursor :
241+ cursor_func = cast (Callable [[types .Cursor | None ], Awaitable [types .ListPromptsResult ]], func )
238242
239- self .request_handlers [types .ListPromptsRequest ] = handler
240- return func
243+ async def cursor_handler (req : types .ListPromptsRequest ):
244+ result = await cursor_func (req .params .cursor if req .params is not None else None )
245+ return types .ServerResult (result )
241246
242- return decorator
247+ handler = cursor_handler
248+ else :
249+ list_func = cast (Callable [[], Awaitable [list [types .Prompt ]]], func )
243250
244- def list_prompts_paginated ( self ):
245- def decorator ( func : Callable [[ types . Cursor | None ], Awaitable [ types . ListPromptsResult ]]):
246- logger . debug ( "Registering handler for PromptListRequest with pagination" )
251+ async def list_handler ( _ : types . ListPromptsRequest ):
252+ result = await list_func ()
253+ return types . ServerResult ( types . ListPromptsResult ( prompts = result ) )
247254
248- async def handler (req : types .ListPromptsRequest ):
249- result = await func (req .params .cursor if req .params else None )
250- return types .ServerResult (result )
255+ handler = list_handler
251256
252257 self .request_handlers [types .ListPromptsRequest ] = handler
253258 return func
@@ -270,25 +275,29 @@ async def handler(req: types.GetPromptRequest):
270275 return decorator
271276
272277 def list_resources (self ):
273- def decorator (func : Callable [[], Awaitable [list [types .Resource ]]]):
278+ def decorator (
279+ func : Callable [[], Awaitable [list [types .Resource ]]]
280+ | Callable [[types .Cursor | None ], Awaitable [types .ListResourcesResult ]],
281+ ):
274282 logger .debug ("Registering handler for ListResourcesRequest" )
283+ pass_cursor = accepts_cursor (func )
275284
276- async def handler (_ : Any ):
277- resources = await func ()
278- return types .ServerResult (types .ListResourcesResult (resources = resources ))
285+ if pass_cursor :
286+ cursor_func = cast (Callable [[types .Cursor | None ], Awaitable [types .ListResourcesResult ]], func )
279287
280- self .request_handlers [types .ListResourcesRequest ] = handler
281- return func
288+ async def cursor_handler (req : types .ListResourcesRequest ):
289+ result = await cursor_func (req .params .cursor if req .params is not None else None )
290+ return types .ServerResult (result )
282291
283- return decorator
292+ handler = cursor_handler
293+ else :
294+ list_func = cast (Callable [[], Awaitable [list [types .Resource ]]], func )
284295
285- def list_resources_paginated ( self ):
286- def decorator ( func : Callable [[ types . Cursor | None ], Awaitable [ types . ListResourcesResult ]]):
287- logger . debug ( "Registering handler for ListResourcesRequest with pagination" )
296+ async def list_handler ( _ : types . ListResourcesRequest ):
297+ result = await list_func ()
298+ return types . ServerResult ( types . ListResourcesResult ( resources = result ) )
288299
289- async def handler (req : types .ListResourcesRequest ):
290- result = await func (req .params .cursor if req .params else None )
291- return types .ServerResult (result )
300+ handler = list_handler
292301
293302 self .request_handlers [types .ListResourcesRequest ] = handler
294303 return func
@@ -406,33 +415,36 @@ async def handler(req: types.UnsubscribeRequest):
406415 return decorator
407416
408417 def list_tools (self ):
409- def decorator (func : Callable [[], Awaitable [list [types .Tool ]]]):
418+ def decorator (
419+ func : Callable [[], Awaitable [list [types .Tool ]]]
420+ | Callable [[types .Cursor | None ], Awaitable [types .ListToolsResult ]],
421+ ):
410422 logger .debug ("Registering handler for ListToolsRequest" )
411-
412- async def handler ( _ : Any ):
413- tools = await func ()
414- # Refresh the tool cache
415- self . _tool_cache . clear ()
416- for tool in tools :
417- self . _tool_cache [ tool . name ] = tool
418- return types . ServerResult ( types . ListToolsResult ( tools = tools ))
419-
420- self .request_handlers [ types . ListToolsRequest ] = handler
421- return func
422-
423- return decorator
424-
425- def list_tools_paginated ( self ):
426- def decorator ( func : Callable [[ types . Cursor | None ], Awaitable [ types . ListToolsResult ]]):
427- logger . debug ( "Registering paginated handler for ListToolsRequest" )
428-
429- async def handler ( request : types . ListToolsRequest ):
430- cursor = request . params . cursor if request . params else None
431- result = await func ( cursor )
432- # Refresh the tool cache with returned tools
433- for tool in result . tools :
434- self . _tool_cache [ tool . name ] = tool
435- return types . ServerResult ( result )
423+ pass_cursor = accepts_cursor ( func )
424+
425+ if pass_cursor :
426+ cursor_func = cast ( Callable [[ types . Cursor | None ], Awaitable [ types . ListToolsResult ]], func )
427+
428+ async def cursor_handler ( req : types . ListToolsRequest ) :
429+ result = await cursor_func ( req . params . cursor if req . params is not None else None )
430+ # Refresh the tool cache with returned tools
431+ for tool in result . tools :
432+ self ._tool_cache [ tool . name ] = tool
433+ return types . ServerResult ( result )
434+
435+ handler = cursor_handler
436+ else :
437+ list_func = cast ( Callable [[], Awaitable [ list [ types . Tool ]]], func )
438+
439+ async def list_handler ( req : types . ListToolsRequest ):
440+ result = await list_func ()
441+ # Clear and refresh the entire tool cache
442+ self . _tool_cache . clear ()
443+ for tool in result :
444+ self . _tool_cache [ tool . name ] = tool
445+ return types . ServerResult ( types . ListToolsResult ( tools = result ))
446+
447+ handler = list_handler
436448
437449 self .request_handlers [types .ListToolsRequest ] = handler
438450 return func
0 commit comments