Deprecate roots, sampling, and logging methods per SEP-2577 (#2926)
This commit is contained in:
parent
5734acf18e
commit
4573e4ac33
4 changed files with 206 additions and 123 deletions
|
|
@ -20,9 +20,10 @@ from typing import Any, TypeVar, overload
|
|||
|
||||
import anyio
|
||||
from pydantic import BaseModel
|
||||
from typing_extensions import deprecated
|
||||
|
||||
from mcp.shared.dispatcher import CallOptions, Outbound
|
||||
from mcp.shared.exceptions import NoBackChannelError
|
||||
from mcp.shared.exceptions import MCPDeprecationWarning, NoBackChannelError
|
||||
from mcp.shared.peer import Meta, dump_params
|
||||
from mcp.types import (
|
||||
ClientCapabilities,
|
||||
|
|
@ -209,6 +210,7 @@ class Connection:
|
|||
"""
|
||||
await self.send_raw_request("ping", dump_params(None, meta), opts)
|
||||
|
||||
@deprecated("The logging capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def log(self, level: LoggingLevel, data: Any, logger: str | None = None, *, meta: Meta | None = None) -> None:
|
||||
"""Send a `notifications/message` log entry on the standalone stream. Best-effort."""
|
||||
params: dict[str, Any] = {"level": level, "data": data}
|
||||
|
|
|
|||
|
|
@ -3,12 +3,13 @@ from dataclasses import dataclass
|
|||
from typing import Any, Generic, Protocol
|
||||
|
||||
from pydantic import BaseModel
|
||||
from typing_extensions import TypeVar
|
||||
from typing_extensions import TypeVar, deprecated
|
||||
|
||||
from mcp.server.connection import Connection
|
||||
from mcp.server.session import ServerSession
|
||||
from mcp.shared.context import BaseContext
|
||||
from mcp.shared.dispatcher import DispatchContext
|
||||
from mcp.shared.exceptions import MCPDeprecationWarning
|
||||
from mcp.shared.message import CloseSSEStreamCallback
|
||||
from mcp.shared.peer import Meta
|
||||
from mcp.shared.transport_context import TransportContext
|
||||
|
|
@ -92,6 +93,7 @@ class Context(BaseContext[TransportContext], Generic[LifespanT_co]):
|
|||
"""
|
||||
return self.transport.headers
|
||||
|
||||
@deprecated("The logging capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def log(self, level: LoggingLevel, data: Any, logger: str | None = None, *, meta: Meta | None = None) -> None:
|
||||
"""Send a request-scoped `notifications/message` log entry.
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ from collections.abc import Iterable
|
|||
from typing import TYPE_CHECKING, Any, Generic
|
||||
|
||||
from pydantic import AnyUrl, BaseModel
|
||||
from typing_extensions import deprecated
|
||||
|
||||
from mcp.server.context import LifespanContextT, RequestT, ServerRequestContext
|
||||
from mcp.server.elicitation import (
|
||||
|
|
@ -14,6 +15,7 @@ from mcp.server.elicitation import (
|
|||
elicit_with_validation,
|
||||
)
|
||||
from mcp.server.lowlevel.helper_types import ReadResourceContents
|
||||
from mcp.shared.exceptions import MCPDeprecationWarning
|
||||
from mcp.types import LoggingLevel
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
|
@ -189,6 +191,7 @@ class Context(BaseModel, Generic[LifespanContextT, RequestT]):
|
|||
related_request_id=self.request_id,
|
||||
)
|
||||
|
||||
@deprecated("The logging capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def log(
|
||||
self,
|
||||
level: LoggingLevel,
|
||||
|
|
@ -205,7 +208,7 @@ class Context(BaseModel, Generic[LifespanContextT, RequestT]):
|
|||
(string, dict, list, number, bool, etc.) per the MCP specification.
|
||||
logger_name: Optional logger name
|
||||
"""
|
||||
await self.request_context.session.send_log_message(
|
||||
await self.request_context.session.send_log_message( # pyright: ignore[reportDeprecated]
|
||||
level=level,
|
||||
data=data,
|
||||
logger=logger_name,
|
||||
|
|
@ -265,18 +268,22 @@ class Context(BaseModel, Generic[LifespanContextT, RequestT]):
|
|||
await self._request_context.close_standalone_sse_stream()
|
||||
|
||||
# Convenience methods for common log levels
|
||||
@deprecated("The logging capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def debug(self, data: Any, *, logger_name: str | None = None) -> None:
|
||||
"""Send a debug log message."""
|
||||
await self.log("debug", data, logger_name=logger_name)
|
||||
await self.log("debug", data, logger_name=logger_name) # pyright: ignore[reportDeprecated]
|
||||
|
||||
@deprecated("The logging capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def info(self, data: Any, *, logger_name: str | None = None) -> None:
|
||||
"""Send an info log message."""
|
||||
await self.log("info", data, logger_name=logger_name)
|
||||
await self.log("info", data, logger_name=logger_name) # pyright: ignore[reportDeprecated]
|
||||
|
||||
@deprecated("The logging capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def warning(self, data: Any, *, logger_name: str | None = None) -> None:
|
||||
"""Send a warning log message."""
|
||||
await self.log("warning", data, logger_name=logger_name)
|
||||
await self.log("warning", data, logger_name=logger_name) # pyright: ignore[reportDeprecated]
|
||||
|
||||
@deprecated("The logging capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def error(self, data: Any, *, logger_name: str | None = None) -> None:
|
||||
"""Send an error log message."""
|
||||
await self.log("error", data, logger_name=logger_name)
|
||||
await self.log("error", data, logger_name=logger_name) # pyright: ignore[reportDeprecated]
|
||||
|
|
|
|||
|
|
@ -12,12 +12,13 @@ used to live here are now owned by `JSONRPCDispatcher` and `ServerRunner`.
|
|||
from typing import Any, TypeVar, cast, overload
|
||||
|
||||
from pydantic import AnyUrl, BaseModel
|
||||
from typing_extensions import deprecated
|
||||
|
||||
from mcp import types
|
||||
from mcp.server.connection import Connection
|
||||
from mcp.server.validation import validate_sampling_tools, validate_tool_use_result_messages
|
||||
from mcp.shared.dispatcher import CallOptions, Dispatcher, ProgressFnT
|
||||
from mcp.shared.exceptions import NoBackChannelError, StatelessModeNotSupported
|
||||
from mcp.shared.exceptions import MCPDeprecationWarning, NoBackChannelError, StatelessModeNotSupported
|
||||
from mcp.shared.message import ServerMessageMetadata
|
||||
from mcp.types import methods as _methods
|
||||
|
||||
|
|
@ -126,6 +127,7 @@ class ServerSession:
|
|||
"""Check if the client supports a specific capability."""
|
||||
return self._connection.check_capability(capability)
|
||||
|
||||
@deprecated("The logging capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def send_log_message(
|
||||
self,
|
||||
level: types.LoggingLevel,
|
||||
|
|
@ -154,6 +156,7 @@ class ServerSession:
|
|||
)
|
||||
|
||||
@overload
|
||||
@deprecated("The sampling capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def create_message(
|
||||
self,
|
||||
messages: list[types.SamplingMessage],
|
||||
|
|
@ -173,6 +176,7 @@ class ServerSession:
|
|||
...
|
||||
|
||||
@overload
|
||||
@deprecated("The sampling capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def create_message(
|
||||
self,
|
||||
messages: list[types.SamplingMessage],
|
||||
|
|
@ -191,6 +195,7 @@ class ServerSession:
|
|||
"""Overload: With tools, returns array-capable content."""
|
||||
...
|
||||
|
||||
@deprecated("The sampling capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def create_message(
|
||||
self,
|
||||
messages: list[types.SamplingMessage],
|
||||
|
|
@ -267,6 +272,7 @@ class ServerSession:
|
|||
metadata=metadata_obj,
|
||||
)
|
||||
|
||||
@deprecated("The roots capability is deprecated as of 2026-07-28 (SEP-2577).", category=MCPDeprecationWarning)
|
||||
async def list_roots(self) -> types.ListRootsResult:
|
||||
"""Send a roots/list request."""
|
||||
if self._stateless:
|
||||
|
|
|
|||
Loading…
Reference in a new issue