mirror of
https://github.com/aljazceru/mcp-python-sdk.git
synced 2025-12-19 14:54:24 +01:00
Set 2025-03-26 as the latest protocol version (#719)
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
from mcp.types import LATEST_PROTOCOL_VERSION
|
from mcp.types import LATEST_PROTOCOL_VERSION
|
||||||
|
|
||||||
SUPPORTED_PROTOCOL_VERSIONS: tuple[int, str] = (1, LATEST_PROTOCOL_VERSION)
|
SUPPORTED_PROTOCOL_VERSIONS: list[str] = ["2024-11-05", LATEST_PROTOCOL_VERSION]
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ for reference.
|
|||||||
not separate types in the schema.
|
not separate types in the schema.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
LATEST_PROTOCOL_VERSION = "2024-11-05"
|
LATEST_PROTOCOL_VERSION = "2025-03-26"
|
||||||
|
|
||||||
ProgressToken = str | int
|
ProgressToken = str | int
|
||||||
Cursor = str
|
Cursor = str
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import mcp.types as types
|
|||||||
from mcp.client.session import DEFAULT_CLIENT_INFO, ClientSession
|
from mcp.client.session import DEFAULT_CLIENT_INFO, ClientSession
|
||||||
from mcp.shared.message import SessionMessage
|
from mcp.shared.message import SessionMessage
|
||||||
from mcp.shared.session import RequestResponder
|
from mcp.shared.session import RequestResponder
|
||||||
|
from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS
|
||||||
from mcp.types import (
|
from mcp.types import (
|
||||||
LATEST_PROTOCOL_VERSION,
|
LATEST_PROTOCOL_VERSION,
|
||||||
ClientNotification,
|
ClientNotification,
|
||||||
@@ -250,3 +251,132 @@ async def test_client_session_default_client_info():
|
|||||||
|
|
||||||
# Assert that the default client info was sent
|
# Assert that the default client info was sent
|
||||||
assert received_client_info == DEFAULT_CLIENT_INFO
|
assert received_client_info == DEFAULT_CLIENT_INFO
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.anyio
|
||||||
|
async def test_client_session_version_negotiation_success():
|
||||||
|
"""Test successful version negotiation with supported version"""
|
||||||
|
client_to_server_send, client_to_server_receive = anyio.create_memory_object_stream[
|
||||||
|
SessionMessage
|
||||||
|
](1)
|
||||||
|
server_to_client_send, server_to_client_receive = anyio.create_memory_object_stream[
|
||||||
|
SessionMessage
|
||||||
|
](1)
|
||||||
|
|
||||||
|
async def mock_server():
|
||||||
|
session_message = await client_to_server_receive.receive()
|
||||||
|
jsonrpc_request = session_message.message
|
||||||
|
assert isinstance(jsonrpc_request.root, JSONRPCRequest)
|
||||||
|
request = ClientRequest.model_validate(
|
||||||
|
jsonrpc_request.model_dump(by_alias=True, mode="json", exclude_none=True)
|
||||||
|
)
|
||||||
|
assert isinstance(request.root, InitializeRequest)
|
||||||
|
|
||||||
|
# Verify client sent the latest protocol version
|
||||||
|
assert request.root.params.protocolVersion == LATEST_PROTOCOL_VERSION
|
||||||
|
|
||||||
|
# Server responds with a supported older version
|
||||||
|
result = ServerResult(
|
||||||
|
InitializeResult(
|
||||||
|
protocolVersion="2024-11-05",
|
||||||
|
capabilities=ServerCapabilities(),
|
||||||
|
serverInfo=Implementation(name="mock-server", version="0.1.0"),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
async with server_to_client_send:
|
||||||
|
await server_to_client_send.send(
|
||||||
|
SessionMessage(
|
||||||
|
JSONRPCMessage(
|
||||||
|
JSONRPCResponse(
|
||||||
|
jsonrpc="2.0",
|
||||||
|
id=jsonrpc_request.root.id,
|
||||||
|
result=result.model_dump(
|
||||||
|
by_alias=True, mode="json", exclude_none=True
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# Receive initialized notification
|
||||||
|
await client_to_server_receive.receive()
|
||||||
|
|
||||||
|
async with (
|
||||||
|
ClientSession(
|
||||||
|
server_to_client_receive,
|
||||||
|
client_to_server_send,
|
||||||
|
) as session,
|
||||||
|
anyio.create_task_group() as tg,
|
||||||
|
client_to_server_send,
|
||||||
|
client_to_server_receive,
|
||||||
|
server_to_client_send,
|
||||||
|
server_to_client_receive,
|
||||||
|
):
|
||||||
|
tg.start_soon(mock_server)
|
||||||
|
result = await session.initialize()
|
||||||
|
|
||||||
|
# Assert the result with negotiated version
|
||||||
|
assert isinstance(result, InitializeResult)
|
||||||
|
assert result.protocolVersion == "2024-11-05"
|
||||||
|
assert result.protocolVersion in SUPPORTED_PROTOCOL_VERSIONS
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.anyio
|
||||||
|
async def test_client_session_version_negotiation_failure():
|
||||||
|
"""Test version negotiation failure with unsupported version"""
|
||||||
|
client_to_server_send, client_to_server_receive = anyio.create_memory_object_stream[
|
||||||
|
SessionMessage
|
||||||
|
](1)
|
||||||
|
server_to_client_send, server_to_client_receive = anyio.create_memory_object_stream[
|
||||||
|
SessionMessage
|
||||||
|
](1)
|
||||||
|
|
||||||
|
async def mock_server():
|
||||||
|
session_message = await client_to_server_receive.receive()
|
||||||
|
jsonrpc_request = session_message.message
|
||||||
|
assert isinstance(jsonrpc_request.root, JSONRPCRequest)
|
||||||
|
request = ClientRequest.model_validate(
|
||||||
|
jsonrpc_request.model_dump(by_alias=True, mode="json", exclude_none=True)
|
||||||
|
)
|
||||||
|
assert isinstance(request.root, InitializeRequest)
|
||||||
|
|
||||||
|
# Server responds with an unsupported version
|
||||||
|
result = ServerResult(
|
||||||
|
InitializeResult(
|
||||||
|
protocolVersion="2020-01-01", # Unsupported old version
|
||||||
|
capabilities=ServerCapabilities(),
|
||||||
|
serverInfo=Implementation(name="mock-server", version="0.1.0"),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
async with server_to_client_send:
|
||||||
|
await server_to_client_send.send(
|
||||||
|
SessionMessage(
|
||||||
|
JSONRPCMessage(
|
||||||
|
JSONRPCResponse(
|
||||||
|
jsonrpc="2.0",
|
||||||
|
id=jsonrpc_request.root.id,
|
||||||
|
result=result.model_dump(
|
||||||
|
by_alias=True, mode="json", exclude_none=True
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
async with (
|
||||||
|
ClientSession(
|
||||||
|
server_to_client_receive,
|
||||||
|
client_to_server_send,
|
||||||
|
) as session,
|
||||||
|
anyio.create_task_group() as tg,
|
||||||
|
client_to_server_send,
|
||||||
|
client_to_server_receive,
|
||||||
|
server_to_client_send,
|
||||||
|
server_to_client_receive,
|
||||||
|
):
|
||||||
|
tg.start_soon(mock_server)
|
||||||
|
|
||||||
|
# Should raise RuntimeError for unsupported version
|
||||||
|
with pytest.raises(RuntimeError, match="Unsupported protocol version"):
|
||||||
|
await session.initialize()
|
||||||
|
|||||||
Reference in New Issue
Block a user