Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/actions/conformance/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@
PrivateKeyJWTOAuthProvider,
SignedJWTParameters,
)
from mcp.client.context import ClientRequestContext
from mcp.client.streamable_http import streamable_http_client
from mcp.shared.auth import OAuthClientInformationFull, OAuthClientMetadata, OAuthToken
from mcp.shared.context import RequestContext

# Set up logging to stderr (stdout is for conformance test output)
logging.basicConfig(
Expand Down Expand Up @@ -187,7 +187,7 @@ async def run_sse_retry(server_url: str) -> None:


async def default_elicitation_callback(
context: RequestContext[ClientSession],
context: ClientRequestContext,
params: types.ElicitRequestParams,
) -> types.ElicitResult | types.ErrorData:
"""Accept elicitation and apply defaults from the schema (SEP-1034)."""
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2120,8 +2120,8 @@ import asyncio
import os

from mcp import ClientSession, StdioServerParameters, types
from mcp.client.context import ClientRequestContext
from mcp.client.stdio import stdio_client
from mcp.shared.context import RequestContext

# Create server parameters for stdio connection
server_params = StdioServerParameters(
Expand All @@ -2133,7 +2133,7 @@ server_params = StdioServerParameters(

# Optional: create a sampling callback
async def handle_sampling_message(
context: RequestContext[ClientSession, None], params: types.CreateMessageRequestParams
context: ClientRequestContext, params: types.CreateMessageRequestParams
) -> types.CreateMessageResult:
print(f"Sampling request: {params.messages}")
return types.CreateMessageResult(
Expand Down
4 changes: 2 additions & 2 deletions README.v2.md
Original file line number Diff line number Diff line change
Expand Up @@ -2121,8 +2121,8 @@ import asyncio
import os

from mcp import ClientSession, StdioServerParameters, types
from mcp.client.context import ClientRequestContext
from mcp.client.stdio import stdio_client
from mcp.shared.context import RequestContext

# Create server parameters for stdio connection
server_params = StdioServerParameters(
Expand All @@ -2134,7 +2134,7 @@ server_params = StdioServerParameters(

# Optional: create a sampling callback
async def handle_sampling_message(
context: RequestContext[ClientSession], params: types.CreateMessageRequestParams
context: ClientRequestContext, params: types.CreateMessageRequestParams
) -> types.CreateMessageResult:
print(f"Sampling request: {params.messages}")
return types.CreateMessageResult(
Expand Down
17 changes: 9 additions & 8 deletions docs/migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ The `RequestContext` class has been split to separate shared fields from server-
**Before (v1):**

```python
from mcp.client.session import ClientSession
from mcp.shared.context import RequestContext, LifespanContextT, RequestT
from mcp.shared.progress import ProgressContext

Expand All @@ -400,19 +401,19 @@ progress_ctx: ProgressContext[SendRequestT, SendNotificationT, SendResultT, Rece
**After (v2):**

```python
from mcp.shared.context import RequestContext
from mcp.client.context import ClientRequestContext
from mcp.client.session import ClientSession
from mcp.server.context import ServerRequestContext, LifespanContextT, RequestT
from mcp.shared.progress import ProgressContext

# RequestContext with 1 type parameter
ctx: RequestContext[ClientSession]

# ProgressContext with 1 type parameter
progress_ctx: ProgressContext[ClientSession]
# For client-side context (sampling, elicitation, list_roots callbacks)
ctx: ClientRequestContext

# For server-specific context with lifespan and request types
from mcp.server.context import ServerRequestContext, LifespanContextT, RequestT

server_ctx: ServerRequestContext[LifespanContextT, RequestT]

# ProgressContext with 1 type parameter
progress_ctx: ProgressContext[ClientSession]
```

### Resource URI type changed from `AnyUrl` to `str`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

import click
from mcp import ClientSession
from mcp.client.context import ClientRequestContext
from mcp.client.streamable_http import streamable_http_client
from mcp.shared.context import RequestContext
from mcp.types import (
CallToolResult,
CreateMessageRequestParams,
Expand All @@ -23,7 +23,7 @@


async def elicitation_callback(
context: RequestContext[ClientSession],
context: ClientRequestContext,
params: ElicitRequestParams,
) -> ElicitResult:
"""Handle elicitation requests from the server."""
Expand All @@ -38,7 +38,7 @@ async def elicitation_callback(


async def sampling_callback(
context: RequestContext[ClientSession],
context: ClientRequestContext,
params: CreateMessageRequestParams,
) -> CreateMessageResult:
"""Handle sampling requests from the server."""
Expand Down
4 changes: 2 additions & 2 deletions examples/snippets/clients/stdio_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import os

from mcp import ClientSession, StdioServerParameters, types
from mcp.client.context import ClientRequestContext
from mcp.client.stdio import stdio_client
from mcp.shared.context import RequestContext

# Create server parameters for stdio connection
server_params = StdioServerParameters(
Expand All @@ -19,7 +19,7 @@

# Optional: create a sampling callback
async def handle_sampling_message(
context: RequestContext[ClientSession], params: types.CreateMessageRequestParams
context: ClientRequestContext, params: types.CreateMessageRequestParams
) -> types.CreateMessageResult:
print(f"Sampling request: {params.messages}")
return types.CreateMessageResult(
Expand Down
4 changes: 2 additions & 2 deletions examples/snippets/clients/url_elicitation_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@
from urllib.parse import urlparse

from mcp import ClientSession, types
from mcp.client.context import ClientRequestContext
from mcp.client.sse import sse_client
from mcp.shared.context import RequestContext
from mcp.shared.exceptions import MCPError, UrlElicitationRequiredError
from mcp.types import URL_ELICITATION_REQUIRED


async def handle_elicitation(
context: RequestContext[ClientSession],
context: ClientRequestContext,
params: types.ElicitRequestParams,
) -> types.ElicitResult | types.ErrorData:
"""Handle elicitation requests from the server.
Expand Down
3 changes: 2 additions & 1 deletion src/mcp/client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from mcp.client._transport import Transport
from mcp.client.client import Client
from mcp.client.context import ClientRequestContext
from mcp.client.session import ClientSession

__all__ = ["Client", "ClientSession", "Transport"]
__all__ = ["Client", "ClientRequestContext", "ClientSession", "Transport"]
16 changes: 16 additions & 0 deletions src/mcp/client/context.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""Request context for MCP client handlers."""

from mcp.client.session import ClientSession
from mcp.shared._context import RequestContext

ClientRequestContext = RequestContext[ClientSession]
"""Context for handling incoming requests in a client session.
This context is passed to client-side callbacks (sampling, elicitation, list_roots) when the server sends requests
to the client.
Attributes:
request_id: The unique identifier for this request.
meta: Optional metadata associated with the request.
session: The client session handling this request.
"""
2 changes: 1 addition & 1 deletion src/mcp/client/experimental/task_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from pydantic import TypeAdapter

import mcp.types as types
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.shared.session import RequestResponder

if TYPE_CHECKING:
Expand Down
2 changes: 1 addition & 1 deletion src/mcp/client/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import mcp.types as types
from mcp.client.experimental import ExperimentalClientFeatures
from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.shared.message import SessionMessage
from mcp.shared.session import BaseSession, ProgressFnT, RequestResponder
from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS
Expand Down
2 changes: 1 addition & 1 deletion src/mcp/server/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from mcp.server.experimental.request_context import Experimental
from mcp.server.session import ServerSession
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.shared.message import CloseSSEStreamCallback

LifespanContextT = TypeVar("LifespanContextT")
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion src/mcp/shared/progress.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from pydantic import BaseModel

from mcp.shared.context import RequestContext, SessionT
from mcp.shared._context import RequestContext, SessionT
from mcp.types import ProgressToken


Expand Down
2 changes: 1 addition & 1 deletion tests/client/test_list_roots_callback.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from mcp.client.session import ClientSession
from mcp.server.mcpserver import MCPServer
from mcp.server.mcpserver.server import Context
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.types import ListRootsResult, Root, TextContent


Expand Down
2 changes: 1 addition & 1 deletion tests/client/test_sampling_callback.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from mcp import Client
from mcp.client.session import ClientSession
from mcp.server.mcpserver import MCPServer
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.types import (
CreateMessageRequestParams,
CreateMessageResult,
Expand Down
2 changes: 1 addition & 1 deletion tests/client/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import mcp.types as types
from mcp.client.session import DEFAULT_CLIENT_INFO, ClientSession
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.shared.message import SessionMessage
from mcp.shared.session import RequestResponder
from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS
Expand Down
2 changes: 1 addition & 1 deletion tests/experimental/tasks/client/test_capabilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from mcp import ClientCapabilities
from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers
from mcp.client.session import ClientSession
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.shared.message import SessionMessage
from mcp.types import (
LATEST_PROTOCOL_VERSION,
Expand Down
2 changes: 1 addition & 1 deletion tests/experimental/tasks/client/test_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import mcp.types as types
from mcp.client.experimental.task_handlers import ExperimentalTaskHandlers
from mcp.client.session import ClientSession
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore
from mcp.shared.message import SessionMessage
from mcp.shared.session import RequestResponder
Expand Down
2 changes: 1 addition & 1 deletion tests/experimental/tasks/test_elicitation_scenarios.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from mcp.server import Server
from mcp.server.experimental.task_context import ServerTaskContext
from mcp.server.lowlevel import NotificationOptions
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.shared.experimental.tasks.helpers import is_terminal
from mcp.shared.experimental.tasks.in_memory_task_store import InMemoryTaskStore
from mcp.shared.message import SessionMessage
Expand Down
2 changes: 1 addition & 1 deletion tests/server/mcpserver/test_elicitation.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from mcp.client.session import ClientSession, ElicitationFnT
from mcp.server.mcpserver import Context, MCPServer
from mcp.server.session import ServerSession
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.types import ElicitRequestParams, ElicitResult, TextContent


Expand Down
2 changes: 1 addition & 1 deletion tests/server/mcpserver/test_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
from mcp.client.session import ClientSession
from mcp.client.sse import sse_client
from mcp.client.streamable_http import streamable_http_client
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.shared.session import RequestResponder
from mcp.types import (
ClientResult,
Expand Down
2 changes: 1 addition & 1 deletion tests/server/mcpserver/test_url_elicitation.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from mcp.server.elicitation import CancelledElicitation, DeclinedElicitation, elicit_url
from mcp.server.mcpserver import Context, MCPServer
from mcp.server.session import ServerSession
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.types import ElicitRequestParams, ElicitResult, TextContent


Expand Down
2 changes: 1 addition & 1 deletion tests/shared/test_progress_notifications.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from mcp.server.lowlevel import NotificationOptions
from mcp.server.models import InitializationOptions
from mcp.server.session import ServerSession
from mcp.shared.context import RequestContext
from mcp.shared._context import RequestContext
from mcp.shared.message import SessionMessage
from mcp.shared.progress import progress
from mcp.shared.session import RequestResponder
Expand Down
2 changes: 1 addition & 1 deletion tests/shared/test_streamable_http.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@
)
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
from mcp.server.transport_security import TransportSecuritySettings
from mcp.shared._context import RequestContext
from mcp.shared._httpx_utils import (
MCP_DEFAULT_SSE_READ_TIMEOUT,
MCP_DEFAULT_TIMEOUT,
create_mcp_http_client,
)
from mcp.shared.context import RequestContext
from mcp.shared.message import ClientMessageMetadata, ServerMessageMetadata, SessionMessage
from mcp.shared.session import RequestResponder
from mcp.types import InitializeResult, JSONRPCRequest, TextContent, TextResourceContents, Tool
Expand Down