|  | 
| 1 | 1 | import logging | 
| 2 | 2 | from datetime import timedelta | 
| 3 |  | -from typing import Any, Protocol | 
|  | 3 | +from typing import Any, Protocol, overload | 
| 4 | 4 | 
 | 
| 5 | 5 | import anyio.lowlevel | 
| 6 | 6 | from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream | 
| 7 | 7 | from jsonschema import SchemaError, ValidationError, validate | 
| 8 | 8 | from pydantic import AnyUrl, TypeAdapter | 
|  | 9 | +from typing_extensions import deprecated | 
| 9 | 10 | 
 | 
| 10 | 11 | import mcp.types as types | 
| 11 | 12 | from mcp.shared.context import RequestContext | 
| @@ -212,25 +213,79 @@ async def set_logging_level(self, level: types.LoggingLevel) -> types.EmptyResul | 
| 212 | 213 |             types.EmptyResult, | 
| 213 | 214 |         ) | 
| 214 | 215 | 
 | 
| 215 |  | -    async def list_resources(self, cursor: str | None = None) -> types.ListResourcesResult: | 
| 216 |  | -        """Send a resources/list request.""" | 
|  | 216 | +    @overload | 
|  | 217 | +    @deprecated("Use list_resources(params=PaginatedRequestParams(...)) instead") | 
|  | 218 | +    async def list_resources(self, cursor: str | None) -> types.ListResourcesResult: ... | 
|  | 219 | + | 
|  | 220 | +    @overload | 
|  | 221 | +    async def list_resources(self, *, params: types.PaginatedRequestParams | None) -> types.ListResourcesResult: ... | 
|  | 222 | + | 
|  | 223 | +    @overload | 
|  | 224 | +    async def list_resources(self) -> types.ListResourcesResult: ... | 
|  | 225 | + | 
|  | 226 | +    async def list_resources( | 
|  | 227 | +        self, | 
|  | 228 | +        cursor: str | None = None, | 
|  | 229 | +        *, | 
|  | 230 | +        params: types.PaginatedRequestParams | None = None, | 
|  | 231 | +    ) -> types.ListResourcesResult: | 
|  | 232 | +        """Send a resources/list request. | 
|  | 233 | +
 | 
|  | 234 | +        Args: | 
|  | 235 | +            cursor: Simple cursor string for pagination (deprecated, use params instead) | 
|  | 236 | +            params: Full pagination parameters including cursor and any future fields | 
|  | 237 | +        """ | 
|  | 238 | +        if params is not None and cursor is not None: | 
|  | 239 | +            raise ValueError("Cannot specify both cursor and params") | 
|  | 240 | + | 
|  | 241 | +        if params is not None: | 
|  | 242 | +            request_params = params | 
|  | 243 | +        elif cursor is not None: | 
|  | 244 | +            request_params = types.PaginatedRequestParams(cursor=cursor) | 
|  | 245 | +        else: | 
|  | 246 | +            request_params = None | 
|  | 247 | + | 
| 217 | 248 |         return await self.send_request( | 
| 218 |  | -            types.ClientRequest( | 
| 219 |  | -                types.ListResourcesRequest( | 
| 220 |  | -                    params=types.PaginatedRequestParams(cursor=cursor) if cursor is not None else None, | 
| 221 |  | -                ) | 
| 222 |  | -            ), | 
|  | 249 | +            types.ClientRequest(types.ListResourcesRequest(params=request_params)), | 
| 223 | 250 |             types.ListResourcesResult, | 
| 224 | 251 |         ) | 
| 225 | 252 | 
 | 
| 226 |  | -    async def list_resource_templates(self, cursor: str | None = None) -> types.ListResourceTemplatesResult: | 
| 227 |  | -        """Send a resources/templates/list request.""" | 
|  | 253 | +    @overload | 
|  | 254 | +    @deprecated("Use list_resource_templates(params=PaginatedRequestParams(...)) instead") | 
|  | 255 | +    async def list_resource_templates(self, cursor: str | None) -> types.ListResourceTemplatesResult: ... | 
|  | 256 | + | 
|  | 257 | +    @overload | 
|  | 258 | +    async def list_resource_templates( | 
|  | 259 | +        self, *, params: types.PaginatedRequestParams | None | 
|  | 260 | +    ) -> types.ListResourceTemplatesResult: ... | 
|  | 261 | + | 
|  | 262 | +    @overload | 
|  | 263 | +    async def list_resource_templates(self) -> types.ListResourceTemplatesResult: ... | 
|  | 264 | + | 
|  | 265 | +    async def list_resource_templates( | 
|  | 266 | +        self, | 
|  | 267 | +        cursor: str | None = None, | 
|  | 268 | +        *, | 
|  | 269 | +        params: types.PaginatedRequestParams | None = None, | 
|  | 270 | +    ) -> types.ListResourceTemplatesResult: | 
|  | 271 | +        """Send a resources/templates/list request. | 
|  | 272 | +
 | 
|  | 273 | +        Args: | 
|  | 274 | +            cursor: Simple cursor string for pagination (deprecated, use params instead) | 
|  | 275 | +            params: Full pagination parameters including cursor and any future fields | 
|  | 276 | +        """ | 
|  | 277 | +        if params is not None and cursor is not None: | 
|  | 278 | +            raise ValueError("Cannot specify both cursor and params") | 
|  | 279 | + | 
|  | 280 | +        if params is not None: | 
|  | 281 | +            request_params = params | 
|  | 282 | +        elif cursor is not None: | 
|  | 283 | +            request_params = types.PaginatedRequestParams(cursor=cursor) | 
|  | 284 | +        else: | 
|  | 285 | +            request_params = None | 
|  | 286 | + | 
| 228 | 287 |         return await self.send_request( | 
| 229 |  | -            types.ClientRequest( | 
| 230 |  | -                types.ListResourceTemplatesRequest( | 
| 231 |  | -                    params=types.PaginatedRequestParams(cursor=cursor) if cursor is not None else None, | 
| 232 |  | -                ) | 
| 233 |  | -            ), | 
|  | 288 | +            types.ClientRequest(types.ListResourceTemplatesRequest(params=request_params)), | 
| 234 | 289 |             types.ListResourceTemplatesResult, | 
| 235 | 290 |         ) | 
| 236 | 291 | 
 | 
| @@ -317,14 +372,40 @@ async def _validate_tool_result(self, name: str, result: types.CallToolResult) - | 
| 317 | 372 |             except SchemaError as e: | 
| 318 | 373 |                 raise RuntimeError(f"Invalid schema for tool {name}: {e}") | 
| 319 | 374 | 
 | 
| 320 |  | -    async def list_prompts(self, cursor: str | None = None) -> types.ListPromptsResult: | 
| 321 |  | -        """Send a prompts/list request.""" | 
|  | 375 | +    @overload | 
|  | 376 | +    @deprecated("Use list_prompts(params=PaginatedRequestParams(...)) instead") | 
|  | 377 | +    async def list_prompts(self, cursor: str | None) -> types.ListPromptsResult: ... | 
|  | 378 | + | 
|  | 379 | +    @overload | 
|  | 380 | +    async def list_prompts(self, *, params: types.PaginatedRequestParams | None) -> types.ListPromptsResult: ... | 
|  | 381 | + | 
|  | 382 | +    @overload | 
|  | 383 | +    async def list_prompts(self) -> types.ListPromptsResult: ... | 
|  | 384 | + | 
|  | 385 | +    async def list_prompts( | 
|  | 386 | +        self, | 
|  | 387 | +        cursor: str | None = None, | 
|  | 388 | +        *, | 
|  | 389 | +        params: types.PaginatedRequestParams | None = None, | 
|  | 390 | +    ) -> types.ListPromptsResult: | 
|  | 391 | +        """Send a prompts/list request. | 
|  | 392 | +
 | 
|  | 393 | +        Args: | 
|  | 394 | +            cursor: Simple cursor string for pagination (deprecated, use params instead) | 
|  | 395 | +            params: Full pagination parameters including cursor and any future fields | 
|  | 396 | +        """ | 
|  | 397 | +        if params is not None and cursor is not None: | 
|  | 398 | +            raise ValueError("Cannot specify both cursor and params") | 
|  | 399 | + | 
|  | 400 | +        if params is not None: | 
|  | 401 | +            request_params = params | 
|  | 402 | +        elif cursor is not None: | 
|  | 403 | +            request_params = types.PaginatedRequestParams(cursor=cursor) | 
|  | 404 | +        else: | 
|  | 405 | +            request_params = None | 
|  | 406 | + | 
| 322 | 407 |         return await self.send_request( | 
| 323 |  | -            types.ClientRequest( | 
| 324 |  | -                types.ListPromptsRequest( | 
| 325 |  | -                    params=types.PaginatedRequestParams(cursor=cursor) if cursor is not None else None, | 
| 326 |  | -                ) | 
| 327 |  | -            ), | 
|  | 408 | +            types.ClientRequest(types.ListPromptsRequest(params=request_params)), | 
| 328 | 409 |             types.ListPromptsResult, | 
| 329 | 410 |         ) | 
| 330 | 411 | 
 | 
| @@ -363,14 +444,40 @@ async def complete( | 
| 363 | 444 |             types.CompleteResult, | 
| 364 | 445 |         ) | 
| 365 | 446 | 
 | 
| 366 |  | -    async def list_tools(self, cursor: str | None = None) -> types.ListToolsResult: | 
| 367 |  | -        """Send a tools/list request.""" | 
|  | 447 | +    @overload | 
|  | 448 | +    @deprecated("Use list_tools(params=PaginatedRequestParams(...)) instead") | 
|  | 449 | +    async def list_tools(self, cursor: str | None) -> types.ListToolsResult: ... | 
|  | 450 | + | 
|  | 451 | +    @overload | 
|  | 452 | +    async def list_tools(self, *, params: types.PaginatedRequestParams | None) -> types.ListToolsResult: ... | 
|  | 453 | + | 
|  | 454 | +    @overload | 
|  | 455 | +    async def list_tools(self) -> types.ListToolsResult: ... | 
|  | 456 | + | 
|  | 457 | +    async def list_tools( | 
|  | 458 | +        self, | 
|  | 459 | +        cursor: str | None = None, | 
|  | 460 | +        *, | 
|  | 461 | +        params: types.PaginatedRequestParams | None = None, | 
|  | 462 | +    ) -> types.ListToolsResult: | 
|  | 463 | +        """Send a tools/list request. | 
|  | 464 | +
 | 
|  | 465 | +        Args: | 
|  | 466 | +            cursor: Simple cursor string for pagination (deprecated, use params instead) | 
|  | 467 | +            params: Full pagination parameters including cursor and any future fields | 
|  | 468 | +        """ | 
|  | 469 | +        if params is not None and cursor is not None: | 
|  | 470 | +            raise ValueError("Cannot specify both cursor and params") | 
|  | 471 | + | 
|  | 472 | +        if params is not None: | 
|  | 473 | +            request_params = params | 
|  | 474 | +        elif cursor is not None: | 
|  | 475 | +            request_params = types.PaginatedRequestParams(cursor=cursor) | 
|  | 476 | +        else: | 
|  | 477 | +            request_params = None | 
|  | 478 | + | 
| 368 | 479 |         result = await self.send_request( | 
| 369 |  | -            types.ClientRequest( | 
| 370 |  | -                types.ListToolsRequest( | 
| 371 |  | -                    params=types.PaginatedRequestParams(cursor=cursor) if cursor is not None else None, | 
| 372 |  | -                ) | 
| 373 |  | -            ), | 
|  | 480 | +            types.ClientRequest(types.ListToolsRequest(params=request_params)), | 
| 374 | 481 |             types.ListToolsResult, | 
| 375 | 482 |         ) | 
| 376 | 483 | 
 | 
|  | 
0 commit comments