Skip to content

Commit 1741b1d

Browse files
draft
1 parent 23109b8 commit 1741b1d

File tree

5 files changed

+23
-2
lines changed

5 files changed

+23
-2
lines changed

src/mcp/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
CompleteRequest,
1414
CreateMessageRequest,
1515
CreateMessageResult,
16-
CreateMessageResultWithTools,
16+
#CreateMessageResultWithTools,
1717
ErrorData,
1818
GetPromptRequest,
1919
GetPromptResult,
@@ -43,7 +43,7 @@
4343
ResourceUpdatedNotification,
4444
RootsCapability,
4545
SamplingCapability,
46-
SamplingContent,
46+
#SamplingContent,
4747
SamplingContextCapability,
4848
SamplingMessage,
4949
SamplingMessageContentBlock,

src/mcp/server/fastmcp/server.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
from mcp.server.streamable_http import EventStore
6565
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
6666
from mcp.server.transport_security import TransportSecuritySettings
67+
from mcp.server.checkpoint import CheckpointBackend
6768
from mcp.shared.context import LifespanContextT, RequestContext, RequestT
6869
from mcp.types import Annotations, AnyFunction, ContentBlock, GetPromptResult, Icon, ToolAnnotations
6970
from mcp.types import Prompt as MCPPrompt
@@ -173,6 +174,7 @@ def __init__( # noqa: PLR0913
173174
lifespan: (Callable[[FastMCP[LifespanResultT]], AbstractAsyncContextManager[LifespanResultT]] | None) = None,
174175
auth: AuthSettings | None = None,
175176
transport_security: TransportSecuritySettings | None = None,
177+
checkpoint_backend: CheckpointBackend | None = None,
176178
):
177179
# Auto-enable DNS rebinding protection for localhost (IPv4 and IPv6)
178180
if transport_security is None and host in ("127.0.0.1", "localhost", "::1"):
@@ -230,6 +232,7 @@ def __init__( # noqa: PLR0913
230232
if auth_server_provider and not token_verifier: # pragma: no cover
231233
self._token_verifier = ProviderTokenVerifier(auth_server_provider)
232234
self._event_store = event_store
235+
self._checkpoint_backend = checkpoint_backend
233236
self._retry_interval = retry_interval
234237
self._custom_starlette_routes: list[Route] = []
235238
self.dependencies = self.settings.dependencies
@@ -275,6 +278,11 @@ def session_manager(self) -> StreamableHTTPSessionManager:
275278
"to avoid unnecessary initialization."
276279
)
277280
return self._session_manager # pragma: no cover
281+
282+
@property
283+
def checkpoint_backend(self) -> CheckpointBackend | None:
284+
"""Return the checkpoint backend (if any) attached to this server."""
285+
return self._checkpoint_backend
278286

279287
def run(
280288
self,

src/mcp/server/lowlevel/server.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ async def main():
9494
from mcp.shared.message import ServerMessageMetadata, SessionMessage
9595
from mcp.shared.session import RequestResponder
9696
from mcp.shared.tool_name_validation import validate_and_warn_tool_name
97+
from mcp.server.checkpoint import CheckpointBackend
9798

9899
logger = logging.getLogger(__name__)
99100

@@ -146,6 +147,9 @@ def __init__(
146147
[Server[LifespanResultT, RequestT]],
147148
AbstractAsyncContextManager[LifespanResultT],
148149
] = lifespan,
150+
*,
151+
stateless: bool = False,
152+
checkpoint_backend: CheckpointBackend | None = None,
149153
):
150154
self.name = name
151155
self.version = version
@@ -159,6 +163,8 @@ def __init__(
159163
self.notification_handlers: dict[type, Callable[..., Awaitable[None]]] = {}
160164
self._tool_cache: dict[str, types.Tool] = {}
161165
self._experimental_handlers: ExperimentalHandlers | None = None
166+
self._stateless = stateless
167+
self._checkpoint_backend = checkpoint_backend
162168
logger.debug("Initializing server %r", name)
163169

164170
def create_initialization_options(
@@ -650,6 +656,7 @@ async def run(
650656
write_stream,
651657
initialization_options,
652658
stateless=stateless,
659+
checkpoint_backend=self._checkpoint_backend,
653660
)
654661
)
655662

src/mcp/server/session.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ def __init__(
9090
# NEW: optional checkpoint backend for servers that support
9191
# checkpoint/create, checkpoint/validate, checkpoint/resume,
9292
# checkpoint/delete at a higher level (e.g., FastMCP).
93+
*,
94+
stateless: bool = False,
9395
checkpoint_backend: "CheckpointBackend | None" = None,
9496
) -> None:
9597
super().__init__(
@@ -110,6 +112,9 @@ def __init__(
110112
lambda: self._incoming_message_stream_writer.aclose()
111113
)
112114

115+
# Preserve original stateless behaviour (if anything uses it)
116+
self._stateless = stateless
117+
113118
# Store optional checkpoint backend. This does not itself handle any
114119
# checkpoint RPCs; it just makes the backend available to higher-level
115120
# server code via ctx.session.checkpoint_backend.

src/mcp/types.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pydantic import BaseModel, ConfigDict, Field, FileUrl, RootModel
66
from pydantic.networks import AnyUrl, UrlConstraints
77
from typing_extensions import deprecated
8+
from typing import Any
89

910
"""
1011
Model Context Protocol bindings for Python

0 commit comments

Comments
 (0)