Fix unknown-method error code and add a protocol version registry (#2836)

This commit is contained in:
Max 2026-06-11 16:47:22 +01:00 • committed by GitHub
commit 7267818e44
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 430 additions and 23 deletions

View file

@ -49,6 +49,7 @@ from mcp.shared.auth_utils import (
check_resource_allowed,
resource_url_from_server_url,
)
from mcp.shared.version import is_version_at_least
logger = logging.getLogger(__name__)
@ -172,9 +173,7 @@ class OAuthContext:
if not protocol_version:
return False
# Check if protocol version is 2025-06-18 or later
# Version format is YYYY-MM-DD, so string comparison works
return protocol_version >= "2025-06-18"
return is_version_at_least(protocol_version, "2025-06-18")
def prepare_token_auth(
self, data: dict[str, str], headers: dict[str, str] | None = None

View file

@ -1,10 +1,10 @@
from __future__ import annotations
import logging
from typing import Any, Protocol
from typing import Any, Protocol, cast, get_args
import anyio.lowlevel
from pydantic import TypeAdapter
from pydantic import BaseModel, TypeAdapter
from mcp import types
from mcp.client._transport import ReadStream, WriteStream
@ -95,6 +95,14 @@ async def _default_logging_callback(
ClientResponse: TypeAdapter[types.ClientResult | types.ErrorData] = TypeAdapter(types.ClientResult | types.ErrorData)
_SERVER_REQUEST_METHODS: frozenset[str] = frozenset(
cast(type[BaseModel], arm).model_fields["method"].default for arm in get_args(types.ServerRequest)
)
"""Method names in the SDK's `ServerRequest` union, derived from the
discriminator literal on each arm. Requests for any other method — including
spec methods this SDK deliberately doesn't model, like `tasks/*` — are
answered with METHOD_NOT_FOUND instead of failing union validation."""
class ClientSession(
BaseSession[
@ -134,6 +142,10 @@ class ClientSession(
def _receive_request_adapter(self) -> TypeAdapter[types.ServerRequest]:
return types.server_request_adapter
@property
def _receive_request_methods(self) -> frozenset[str]:
return _SERVER_REQUEST_METHODS
@property
def _receive_notification_adapter(self) -> TypeAdapter[types.ServerNotification]:
return types.server_notification_adapter