Skip to content

Commit e5b3317

Browse files
committed
feat: add ClientRequestContext type alias for client-side handlers
Introduce a dedicated `ClientRequestContext` type alias in `mcp.client.context` to provide a cleaner API for client-side callback handlers (sampling, elicitation, list_roots). This improves the developer experience by: - Providing a concrete type instead of requiring `RequestContext[ClientSession]` - Making the internal `RequestContext` private by moving it to `_context.py` - Exporting `ClientRequestContext` from `mcp.client` for easy access The migration guide has been updated to reflect these changes.
1 parent b1f7eec commit e5b3317

File tree

25 files changed

+47
-31
lines changed

25 files changed

+47
-31
lines changed

.github/actions/conformance/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
SignedJWTParameters,
4040
)
4141
from mcp.client.streamable_http import streamable_http_client
42+
from mcp.shared._context import RequestContext
4243
from mcp.shared.auth import OAuthClientInformationFull, OAuthClientMetadata, OAuthToken
43-
from mcp.shared.context import RequestContext
4444

4545
# Set up logging to stderr (stdout is for conformance test output)
4646
logging.basicConfig(

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2120,8 +2120,8 @@ import asyncio
21202120
import os
21212121

21222122
from mcp import ClientSession, StdioServerParameters, types
2123+
from mcp.client.context import ClientRequestContext
21232124
from mcp.client.stdio import stdio_client
2124-
from mcp.shared.context import RequestContext
21252125

21262126
# Create server parameters for stdio connection
21272127
server_params = StdioServerParameters(
@@ -2133,7 +2133,7 @@ server_params = StdioServerParameters(
21332133

21342134
# Optional: create a sampling callback
21352135
async def handle_sampling_message(
2136-
context: RequestContext[ClientSession, None], params: types.CreateMessageRequestParams
2136+
context: ClientRequestContext, params: types.CreateMessageRequestParams
21372137
) -> types.CreateMessageResult:
21382138
print(f"Sampling request: {params.messages}")
21392139
return types.CreateMessageResult(

README.v2.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2122,7 +2122,7 @@ import os
21222122

21232123
from mcp import ClientSession, StdioServerParameters, types
21242124
from mcp.client.stdio import stdio_client
2125-
from mcp.shared.context import RequestContext
2125+
from mcp.shared._context import RequestContext
21262126

21272127
# Create server parameters for stdio connection
21282128
server_params = StdioServerParameters(

docs/migration.md

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -400,19 +400,18 @@ progress_ctx: ProgressContext[SendRequestT, SendNotificationT, SendResultT, Rece
400400
**After (v2):**
401401

402402
```python
403-
from mcp.shared.context import RequestContext
403+
from mcp.client.context import ClientRequestContext
404+
from mcp.server.context import ServerRequestContext, LifespanContextT, RequestT
404405
from mcp.shared.progress import ProgressContext
405406

406-
# RequestContext with 1 type parameter
407-
ctx: RequestContext[ClientSession]
408-
409-
# ProgressContext with 1 type parameter
410-
progress_ctx: ProgressContext[ClientSession]
407+
# For client-side context (sampling, elicitation, list_roots callbacks)
408+
ctx: ClientRequestContext
411409

412410
# For server-specific context with lifespan and request types
413-
from mcp.server.context import ServerRequestContext, LifespanContextT, RequestT
414-
415411
server_ctx: ServerRequestContext[LifespanContextT, RequestT]
412+
413+
# ProgressContext with 1 type parameter
414+
progress_ctx: ProgressContext[ClientSession]
416415
```
417416

418417
### Resource URI type changed from `AnyUrl` to `str`

examples/clients/simple-task-interactive-client/mcp_simple_task_interactive_client/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import click
1212
from mcp import ClientSession
1313
from mcp.client.streamable_http import streamable_http_client
14-
from mcp.shared.context import RequestContext
14+
from mcp.shared._context import RequestContext
1515
from mcp.types import (
1616
CallToolResult,
1717
CreateMessageRequestParams,

examples/snippets/clients/stdio_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from mcp import ClientSession, StdioServerParameters, types
99
from mcp.client.stdio import stdio_client
10-
from mcp.shared.context import RequestContext
10+
from mcp.shared._context import RequestContext
1111

1212
# Create server parameters for stdio connection
1313
server_params = StdioServerParameters(

examples/snippets/clients/url_elicitation_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
from mcp import ClientSession, types
3434
from mcp.client.sse import sse_client
35-
from mcp.shared.context import RequestContext
35+
from mcp.shared._context import RequestContext
3636
from mcp.shared.exceptions import MCPError, UrlElicitationRequiredError
3737
from mcp.types import URL_ELICITATION_REQUIRED
3838

src/mcp/client/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from mcp.client._transport import Transport
44
from mcp.client.client import Client
5+
from mcp.client.context import ClientRequestContext
56
from mcp.client.session import ClientSession
67

7-
__all__ = ["Client", "ClientSession", "Transport"]
8+
__all__ = ["Client", "ClientRequestContext", "ClientSession", "Transport"]

src/mcp/client/context.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""Request context for MCP client handlers."""
2+
3+
from mcp.client.session import ClientSession
4+
from mcp.shared._context import RequestContext
5+
6+
ClientRequestContext = RequestContext[ClientSession]
7+
"""Context for handling incoming requests in a client session.
8+
9+
This context is passed to client-side callbacks (sampling, elicitation, list_roots) when the server sends requests
10+
to the client.
11+
12+
Attributes:
13+
request_id: The unique identifier for this request.
14+
meta: Optional metadata associated with the request.
15+
session: The client session handling this request.
16+
"""

src/mcp/client/experimental/task_handlers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from pydantic import TypeAdapter
2020

2121
import mcp.types as types
22-
from mcp.shared.context import RequestContext
22+
from mcp.shared._context import RequestContext
2323
from mcp.shared.session import RequestResponder
2424

2525
if TYPE_CHECKING:

0 commit comments

Comments
 (0)