@@ -82,6 +82,7 @@ async def main():
82
82
from typing_extensions import TypeVar
83
83
84
84
import mcp .types as types
85
+ from mcp .server .lowlevel .func_inspection import accepts_cursor
85
86
from mcp .server .lowlevel .helper_types import ReadResourceContents
86
87
from mcp .server .models import InitializationOptions
87
88
from mcp .server .session import ServerSession
@@ -230,25 +231,29 @@ def request_context(
230
231
return request_ctx .get ()
231
232
232
233
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
+ ):
234
238
logger .debug ("Registering handler for PromptListRequest" )
239
+ pass_cursor = accepts_cursor (func )
235
240
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 )
239
243
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 )
242
247
243
- return decorator
248
+ handler = cursor_handler
249
+ else :
250
+ list_func = cast (Callable [[], Awaitable [list [types .Prompt ]]], func )
244
251
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 ) )
248
255
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
252
257
253
258
self .request_handlers [types .ListPromptsRequest ] = handler
254
259
return func
@@ -271,25 +276,29 @@ async def handler(req: types.GetPromptRequest):
271
276
return decorator
272
277
273
278
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
+ ):
275
283
logger .debug ("Registering handler for ListResourcesRequest" )
284
+ pass_cursor = accepts_cursor (func )
276
285
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 )
280
288
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 )
283
292
284
- return decorator
293
+ handler = cursor_handler
294
+ else :
295
+ list_func = cast (Callable [[], Awaitable [list [types .Resource ]]], func )
285
296
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 ) )
289
300
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
293
302
294
303
self .request_handlers [types .ListResourcesRequest ] = handler
295
304
return func
@@ -407,33 +416,36 @@ async def handler(req: types.UnsubscribeRequest):
407
416
return decorator
408
417
409
418
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
+ ):
411
423
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
437
449
438
450
self .request_handlers [types .ListToolsRequest ] = handler
439
451
return func
0 commit comments