Skip to content

Commit 9a1fee3

Browse files
refactor: use explicit extensions field instead of spreading kwargs
Address PR review feedback: Instead of using **capability_extensions to spread arbitrary keys into ClientCapabilities, explicitly use the 'extensions' field. This prevents potential conflicts if new fields are added to ClientCapabilities in the future. Changes: - Add 'extensions' field to ClientCapabilities type definition - Update ClientSession to pass capability_extensions as 'extensions' kwarg - Update test to pass extensions dict directly (without 'extensions' key wrapper)
1 parent 9830794 commit 9a1fee3

File tree

3 files changed

+8
-5
lines changed

3 files changed

+8
-5
lines changed

src/mcp/client/session.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ def __init__(
145145
self._task_handlers = experimental_task_handlers or ExperimentalTaskHandlers()
146146

147147
# Capability extensions to include in initialize request
148-
# These are merged into ClientCapabilities using Pydantic's extra fields
149-
self._capability_extensions = capability_extensions or {}
148+
# These are passed as the 'extensions' field of ClientCapabilities
149+
self._capability_extensions = capability_extensions
150150

151151
async def initialize(self) -> types.InitializeResult:
152152
sampling = (
@@ -182,7 +182,7 @@ async def initialize(self) -> types.InitializeResult:
182182
experimental=None,
183183
roots=roots,
184184
tasks=self._task_handlers.build_capability(),
185-
**self._capability_extensions,
185+
extensions=self._capability_extensions or None,
186186
),
187187
client_info=self._client_info,
188188
),

src/mcp/types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ class ClientCapabilities(MCPModel):
377377
"""Present if the client supports listing roots."""
378378
tasks: ClientTasksCapability | None = None
379379
"""Present if the client supports task-augmented requests."""
380+
extensions: dict[str, Any] | None = None
381+
"""Protocol extensions advertised by the client."""
380382

381383

382384
class PromptsCapability(MCPModel):

tests/client/test_session.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,8 @@ async def test_client_session_capability_extensions():
779779
received_capabilities = None
780780

781781
# Define capability extensions (e.g., UI extension)
782-
capability_extensions = {"extensions": {"io.modelcontextprotocol/ui": {"mimeTypes": ["text/html;profile=mcp-app"]}}}
782+
# These will be placed under the 'extensions' key of ClientCapabilities
783+
capability_extensions = {"io.modelcontextprotocol/ui": {"mimeTypes": ["text/html;profile=mcp-app"]}}
783784

784785
async def mock_server():
785786
nonlocal received_capabilities
@@ -833,7 +834,7 @@ async def mock_server():
833834

834835
# Assert that the capability extensions were included in the request
835836
assert received_capabilities is not None
836-
# The extensions should be present via Pydantic's extra fields
837+
# The extensions should be present under the 'extensions' key
837838
caps_dict = received_capabilities.model_dump()
838839
assert "extensions" in caps_dict
839840
assert "io.modelcontextprotocol/ui" in caps_dict["extensions"]

0 commit comments

Comments
 (0)