22
33from __future__ import annotations
44
5- from collections .abc import Awaitable , Callable , Mapping
5+ from collections .abc import AsyncIterator , Awaitable , Callable , Mapping
66from contextlib import AsyncExitStack
77from dataclasses import KW_ONLY , dataclass , field
88from typing import Any , Literal , TypeVar
2626 ListToolsResult ,
2727 LoggingLevel ,
2828 PaginatedRequestParams ,
29+ Prompt ,
2930 PromptReference ,
3031 ReadResourceResult ,
3132 RequestParamsMeta ,
33+ Resource ,
34+ ResourceTemplate ,
3235 ResourceTemplateReference ,
3336 ServerCapabilities ,
37+ Tool ,
3438)
3539from mcp_types .version import HANDSHAKE_PROTOCOL_VERSIONS , MODERN_PROTOCOL_VERSIONS
3640from typing_extensions import deprecated
@@ -367,7 +371,11 @@ async def list_resources(
367371 cursor : str | None = None ,
368372 meta : RequestParamsMeta | None = None ,
369373 ) -> ListResourcesResult :
370- """List available resources from the server."""
374+ """List a single page of available resources from the server.
375+
376+ Returns one page only. The result may include a `next_cursor` if more
377+ pages are available. Use `list_all_resources` to drain every page.
378+ """
371379 return await self .session .list_resources (params = PaginatedRequestParams (cursor = cursor , _meta = meta ))
372380
373381 async def list_resource_templates (
@@ -376,7 +384,12 @@ async def list_resource_templates(
376384 cursor : str | None = None ,
377385 meta : RequestParamsMeta | None = None ,
378386 ) -> ListResourceTemplatesResult :
379- """List available resource templates from the server."""
387+ """List a single page of available resource templates from the server.
388+
389+ Returns one page only. The result may include a `next_cursor` if more
390+ pages are available. Use `list_all_resource_templates` to drain every
391+ page.
392+ """
380393 return await self .session .list_resource_templates (params = PaginatedRequestParams (cursor = cursor , _meta = meta ))
381394
382395 async def read_resource (
@@ -482,7 +495,11 @@ async def list_prompts(
482495 cursor : str | None = None ,
483496 meta : RequestParamsMeta | None = None ,
484497 ) -> ListPromptsResult :
485- """List available prompts from the server."""
498+ """List a single page of available prompts from the server.
499+
500+ Returns one page only. The result may include a `next_cursor` if more
501+ pages are available. Use `list_all_prompts` to drain every page.
502+ """
486503 return await self .session .list_prompts (params = PaginatedRequestParams (cursor = cursor , _meta = meta ))
487504
488505 async def get_prompt (
@@ -566,9 +583,84 @@ async def complete(
566583 return await self .session .complete (ref = ref , argument = argument , context_arguments = context_arguments )
567584
568585 async def list_tools (self , * , cursor : str | None = None , meta : RequestParamsMeta | None = None ) -> ListToolsResult :
569- """List available tools from the server."""
586+ """List a single page of available tools from the server.
587+
588+ Returns one page only. The result may include a `next_cursor` if more
589+ pages are available. Use `list_all_tools` to drain every page.
590+ """
570591 return await self .session .list_tools (params = PaginatedRequestParams (cursor = cursor , _meta = meta ))
571592
593+ async def iter_all_tools (self , * , meta : RequestParamsMeta | None = None ) -> AsyncIterator [Tool ]:
594+ """Yield every tool from the server, paging through `next_cursor`.
595+
596+ Useful for streaming consumers that want to process tools without
597+ materializing the full list in memory.
598+ """
599+ cursor : str | None = None
600+ while True :
601+ result = await self .list_tools (cursor = cursor , meta = meta )
602+ for tool in result .tools :
603+ yield tool
604+ if result .next_cursor is None :
605+ return
606+ cursor = result .next_cursor
607+
608+ async def list_all_tools (self , * , meta : RequestParamsMeta | None = None ) -> list [Tool ]:
609+ """List every tool from the server, draining `next_cursor` across pages.
610+
611+ Unlike `list_tools`, which returns one page, this walks pagination
612+ until the server reports no further pages and returns the combined
613+ list.
614+ """
615+ return [tool async for tool in self .iter_all_tools (meta = meta )]
616+
617+ async def iter_all_prompts (self , * , meta : RequestParamsMeta | None = None ) -> AsyncIterator [Prompt ]:
618+ """Yield every prompt from the server, paging through `next_cursor`."""
619+ cursor : str | None = None
620+ while True :
621+ result = await self .list_prompts (cursor = cursor , meta = meta )
622+ for prompt in result .prompts :
623+ yield prompt
624+ if result .next_cursor is None :
625+ return
626+ cursor = result .next_cursor
627+
628+ async def list_all_prompts (self , * , meta : RequestParamsMeta | None = None ) -> list [Prompt ]:
629+ """List every prompt from the server, draining `next_cursor` across pages."""
630+ return [prompt async for prompt in self .iter_all_prompts (meta = meta )]
631+
632+ async def iter_all_resources (self , * , meta : RequestParamsMeta | None = None ) -> AsyncIterator [Resource ]:
633+ """Yield every resource from the server, paging through `next_cursor`."""
634+ cursor : str | None = None
635+ while True :
636+ result = await self .list_resources (cursor = cursor , meta = meta )
637+ for resource in result .resources :
638+ yield resource
639+ if result .next_cursor is None :
640+ return
641+ cursor = result .next_cursor
642+
643+ async def list_all_resources (self , * , meta : RequestParamsMeta | None = None ) -> list [Resource ]:
644+ """List every resource from the server, draining `next_cursor` across pages."""
645+ return [resource async for resource in self .iter_all_resources (meta = meta )]
646+
647+ async def iter_all_resource_templates (
648+ self , * , meta : RequestParamsMeta | None = None
649+ ) -> AsyncIterator [ResourceTemplate ]:
650+ """Yield every resource template from the server, paging through `next_cursor`."""
651+ cursor : str | None = None
652+ while True :
653+ result = await self .list_resource_templates (cursor = cursor , meta = meta )
654+ for template in result .resource_templates :
655+ yield template
656+ if result .next_cursor is None :
657+ return
658+ cursor = result .next_cursor
659+
660+ async def list_all_resource_templates (self , * , meta : RequestParamsMeta | None = None ) -> list [ResourceTemplate ]:
661+ """List every resource template from the server, draining `next_cursor` across pages."""
662+ return [template async for template in self .iter_all_resource_templates (meta = meta )]
663+
572664 @deprecated ("The roots capability is deprecated as of 2026-07-28 (SEP-2577)." , category = MCPDeprecationWarning )
573665 async def send_roots_list_changed (self ) -> None :
574666 """Send a notification that the roots list has changed."""
0 commit comments