|
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