Skip to content

Commit 4fa9f38

Browse files
committed
fix: Include extra field for context log
1 parent 202af49 commit 4fa9f38

File tree

2 files changed

+51
-3
lines changed

2 files changed

+51
-3
lines changed

src/mcp/server/fastmcp/server.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,7 @@ async def log(
12061206
message: str,
12071207
*,
12081208
logger_name: str | None = None,
1209+
**extra: Any,
12091210
) -> None:
12101211
"""Send a log message to the client.
12111212
@@ -1215,9 +1216,18 @@ async def log(
12151216
logger_name: Optional logger name
12161217
**extra: Additional structured data to include
12171218
"""
1219+
1220+
if extra:
1221+
log_data = {
1222+
"message": message,
1223+
**extra,
1224+
}
1225+
else:
1226+
log_data = message
1227+
12181228
await self.request_context.session.send_log_message(
12191229
level=level,
1220-
data=message,
1230+
data=log_data,
12211231
logger=logger_name,
12221232
related_request_id=self.request_id,
12231233
)

tests/client/test_logging_callback.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Literal
1+
from typing import Any, Literal
22

33
import pytest
44

@@ -47,6 +47,24 @@ async def test_tool_with_log(
4747
)
4848
return True
4949

50+
@server.tool("test_tool_with_log_extra")
51+
async def test_tool_with_log_extra(
52+
message: str,
53+
level: Literal["debug", "info", "warning", "error"],
54+
logger: str,
55+
extra_string: str,
56+
extra_dict: dict[str, Any],
57+
) -> bool:
58+
"""Send a log notification to the client with extra fields."""
59+
await server.get_context().log(
60+
level=level,
61+
message=message,
62+
logger_name=logger,
63+
extra_string=extra_string,
64+
extra_dict=extra_dict,
65+
)
66+
return True
67+
5068
# Create a message handler to catch exceptions
5169
async def message_handler(
5270
message: RequestResponder[types.ServerRequest, types.ClientResult] | types.ServerNotification | Exception,
@@ -74,10 +92,30 @@ async def message_handler(
7492
"logger": "test_logger",
7593
},
7694
)
95+
log_result_with_extra = await client_session.call_tool(
96+
"test_tool_with_log_extra",
97+
{
98+
"message": "Test log message",
99+
"level": "info",
100+
"logger": "test_logger",
101+
"extra_string": "example",
102+
"extra_dict": {"a": 1, "b": 2, "c": 3},
103+
},
104+
)
77105
assert log_result.isError is False
78-
assert len(logging_collector.log_messages) == 1
106+
assert log_result_with_extra.isError is False
107+
assert len(logging_collector.log_messages) == 2
79108
# Create meta object with related_request_id added dynamically
80109
log = logging_collector.log_messages[0]
81110
assert log.level == "info"
82111
assert log.logger == "test_logger"
83112
assert log.data == "Test log message"
113+
114+
log_with_extra = logging_collector.log_messages[1]
115+
assert log_with_extra.level == "info"
116+
assert log_with_extra.logger == "test_logger"
117+
assert log_with_extra.data == {
118+
"message": "Test log message",
119+
"extra_string": "example",
120+
"extra_dict": {"a": 1, "b": 2, "c": 3},
121+
}

0 commit comments

Comments
 (0)