From 37f6a3229cb0c47f09af29e3b1396bca52395184 Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Sat, 21 Dec 2024 00:26:59 +0000 Subject: [PATCH 1/2] fix: use pydantic Field with alias for _meta fields Pydantic treats fields starting with underscore as private/hidden. To fix this, we need to use Field with alias='_meta' to properly handle these fields while keeping the external API unchanged. This fixes #103 where meta fields were not being properly assigned in request contexts. --- src/mcp/shared/session.py | 2 +- src/mcp/types.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mcp/shared/session.py b/src/mcp/shared/session.py index 0d0905ee3..5e114ecf5 100644 --- a/src/mcp/shared/session.py +++ b/src/mcp/shared/session.py @@ -221,7 +221,7 @@ async def _receive_loop(self) -> None: ) responder = RequestResponder( request_id=message.root.id, - request_meta=validated_request.root.params._meta + request_meta=validated_request.root.params.meta if validated_request.root.params else None, request=validated_request, diff --git a/src/mcp/types.py b/src/mcp/types.py index a2b897403..2c27f8308 100644 --- a/src/mcp/types.py +++ b/src/mcp/types.py @@ -1,6 +1,6 @@ from typing import Any, Generic, Literal, TypeVar -from pydantic import BaseModel, ConfigDict, FileUrl, RootModel +from pydantic import BaseModel, ConfigDict, Field, FileUrl, RootModel from pydantic.networks import AnyUrl """ @@ -39,14 +39,14 @@ class Meta(BaseModel): model_config = ConfigDict(extra="allow") - _meta: Meta | None = None + meta: Meta | None = Field(alias="_meta", default=None) class NotificationParams(BaseModel): class Meta(BaseModel): model_config = ConfigDict(extra="allow") - _meta: Meta | None = None + meta: Meta | None = Field(alias="_meta", default=None) """ This parameter name is reserved by MCP to allow clients and servers to attach additional metadata to their notifications. @@ -86,7 +86,7 @@ class Result(BaseModel): model_config = ConfigDict(extra="allow") - _meta: dict[str, Any] | None = None + meta: dict[str, Any] | None = Field(alias="_meta", default=None) """ This result property is reserved by the protocol to allow clients and servers to attach additional metadata to their responses. From 52e69efa6f7990ea594172df283d11448f714711 Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Thu, 12 Dec 2024 23:17:59 +0000 Subject: [PATCH 2/2] Fix deprecation warning --- src/mcp/server/sse.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mcp/server/sse.py b/src/mcp/server/sse.py index 65369a785..3062b3244 100644 --- a/src/mcp/server/sse.py +++ b/src/mcp/server/sse.py @@ -102,9 +102,9 @@ async def connect_sse(self, scope: Scope, receive: Receive, send: Send): self._read_stream_writers[session_id] = read_stream_writer logger.debug(f"Created new session with ID: {session_id}") - sse_stream_writer, sse_stream_reader = anyio.create_memory_object_stream( - 0, dict[str, Any] - ) + sse_stream_writer, sse_stream_reader = anyio.create_memory_object_stream[ + dict[str, Any] + ](0) async def sse_writer(): logger.debug("Starting SSE writer")