Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
9 changes: 7 additions & 2 deletions src/mcp/server/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,8 +388,13 @@ def check_capability(self, capability: ClientCapabilities) -> bool:
return False
if capability.sampling.tools is not None and have.sampling.tools is None:
return False
if capability.elicitation is not None and have.elicitation is None:
return False
if capability.elicitation is not None:
if have.elicitation is None:
return False
if capability.elicitation.form is not None and have.elicitation.form is None:
return False
if capability.elicitation.url is not None and have.elicitation.url is None:
return False
if capability.experimental is not None:
if have.experimental is None:
return False
Expand Down
31 changes: 31 additions & 0 deletions tests/server/test_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
CreateMessageRequestParams,
ElicitationCapability,
EmptyResult,
FormElicitationCapability,
Implementation,
ListRootsRequest,
ListRootsResult,
Expand All @@ -31,6 +32,7 @@
SamplingCapability,
SamplingContextCapability,
SamplingToolsCapability,
UrlElicitationCapability,
)
from mcp_types.version import LATEST_HANDSHAKE_VERSION, LATEST_MODERN_VERSION
from pydantic import BaseModel, ValidationError
Expand Down Expand Up @@ -364,6 +366,35 @@ def test_connection_check_capability_false_when_no_client_params_recorded():
(ClientCapabilities(experimental={"a": {}}), ClientCapabilities(experimental={"b": {}}), False),
(ClientCapabilities(experimental={"a": {"x": 1}}), ClientCapabilities(experimental={"a": {"x": 2}}), False),
(ClientCapabilities(experimental={"a": {}}), ClientCapabilities(experimental={"a": {}}), True),
(ClientCapabilities(elicitation=None), ClientCapabilities(elicitation=ElicitationCapability()), False),
# The client offers only URL-mode elicitation, but form mode is requested.
(
ClientCapabilities(elicitation=ElicitationCapability(url=UrlElicitationCapability())),
ClientCapabilities(elicitation=ElicitationCapability(form=FormElicitationCapability())),
False,
),
# The client offers only form-mode elicitation, but URL mode is requested.
(
ClientCapabilities(elicitation=ElicitationCapability(form=FormElicitationCapability())),
ClientCapabilities(elicitation=ElicitationCapability(url=UrlElicitationCapability())),
False,
),
(
ClientCapabilities(elicitation=ElicitationCapability(form=FormElicitationCapability())),
ClientCapabilities(elicitation=ElicitationCapability(form=FormElicitationCapability())),
True,
),
(
ClientCapabilities(elicitation=ElicitationCapability(url=UrlElicitationCapability())),
ClientCapabilities(elicitation=ElicitationCapability(url=UrlElicitationCapability())),
True,
),
# A bare elicitation request (no sub-capability) is satisfied by any elicitation support.
(
ClientCapabilities(elicitation=ElicitationCapability(url=UrlElicitationCapability())),
ClientCapabilities(elicitation=ElicitationCapability()),
True,
),
],
)
def test_check_capability_per_field_branches(have: ClientCapabilities, want: ClientCapabilities, expected: bool):
Expand Down
Loading