@@ -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