Skip to content

Commit cf8b66b

Browse files
authored
use metadata from SessionMessage to propagate related_request_id (#591)
1 parent da0cf22 commit cf8b66b

File tree

3 files changed

+18
-24
lines changed

3 files changed

+18
-24
lines changed

src/mcp/server/streamable_http.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from starlette.responses import Response
2525
from starlette.types import Receive, Scope, Send
2626

27-
from mcp.shared.message import SessionMessage
27+
from mcp.shared.message import ServerMessageMetadata, SessionMessage
2828
from mcp.types import (
2929
INTERNAL_ERROR,
3030
INVALID_PARAMS,
@@ -520,7 +520,7 @@ async def sse_writer():
520520
)
521521
await response(scope, receive, send)
522522
if writer:
523-
await writer.send(err)
523+
await writer.send(Exception(err))
524524
return
525525

526526
async def _handle_get_request(self, request: Request, send: Send) -> None:
@@ -834,12 +834,17 @@ async def message_router():
834834
):
835835
# Extract related_request_id from meta if it exists
836836
if (
837-
(params := getattr(message.root, "params", None))
838-
and (meta := params.get("_meta"))
839-
and (related_id := meta.get("related_request_id"))
837+
session_message.metadata is not None
838+
and isinstance(
839+
session_message.metadata,
840+
ServerMessageMetadata,
841+
)
842+
and session_message.metadata.related_request_id
840843
is not None
841844
):
842-
target_request_id = str(related_id)
845+
target_request_id = str(
846+
session_message.metadata.related_request_id
847+
)
843848
else:
844849
target_request_id = str(message.root.id)
845850

src/mcp/shared/session.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from typing_extensions import Self
1313

1414
from mcp.shared.exceptions import McpError
15-
from mcp.shared.message import SessionMessage
15+
from mcp.shared.message import ServerMessageMetadata, SessionMessage
1616
from mcp.types import (
1717
CancelledNotification,
1818
ClientNotification,
@@ -24,7 +24,6 @@
2424
JSONRPCNotification,
2525
JSONRPCRequest,
2626
JSONRPCResponse,
27-
NotificationParams,
2827
RequestParams,
2928
ServerNotification,
3029
ServerRequest,
@@ -288,22 +287,16 @@ async def send_notification(
288287
"""
289288
# Some transport implementations may need to set the related_request_id
290289
# to attribute to the notifications to the request that triggered them.
291-
if related_request_id is not None and notification.root.params is not None:
292-
# Create meta if it doesn't exist
293-
if notification.root.params.meta is None:
294-
meta_dict = {"related_request_id": related_request_id}
295-
296-
else:
297-
meta_dict = notification.root.params.meta.model_dump(
298-
by_alias=True, mode="json", exclude_none=True
299-
)
300-
meta_dict["related_request_id"] = related_request_id
301-
notification.root.params.meta = NotificationParams.Meta(**meta_dict)
302290
jsonrpc_notification = JSONRPCNotification(
303291
jsonrpc="2.0",
304292
**notification.model_dump(by_alias=True, mode="json", exclude_none=True),
305293
)
306-
session_message = SessionMessage(message=JSONRPCMessage(jsonrpc_notification))
294+
session_message = SessionMessage(
295+
message=JSONRPCMessage(jsonrpc_notification),
296+
metadata=ServerMessageMetadata(related_request_id=related_request_id)
297+
if related_request_id
298+
else None,
299+
)
307300
await self._write_stream.send(session_message)
308301

309302
async def _send_response(

tests/client/test_logging_callback.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from mcp.shared.session import RequestResponder
1010
from mcp.types import (
1111
LoggingMessageNotificationParams,
12-
NotificationParams,
1312
TextContent,
1413
)
1514

@@ -80,10 +79,7 @@ async def message_handler(
8079
assert log_result.isError is False
8180
assert len(logging_collector.log_messages) == 1
8281
# Create meta object with related_request_id added dynamically
83-
meta = NotificationParams.Meta()
84-
setattr(meta, "related_request_id", "2")
8582
log = logging_collector.log_messages[0]
8683
assert log.level == "info"
8784
assert log.logger == "test_logger"
8885
assert log.data == "Test log message"
89-
assert log.meta == meta

0 commit comments

Comments
 (0)