Skip to content

Commit 9fa7795

Browse files
author
qianchongyang
committed
fix: allow any JSON-serializable type for log message data
According to the MCP spec, the data that may be logged can be of any type, not just str. This change updates the logging context methods to accept Any instead of str for the data parameter. Changes: - Change 'message' parameter to 'data' with type Any in log() - Update all convenience methods (debug, info, warning, error) to accept Any for the data parameter - Update docstring to reflect the spec-compliant behavior Fixes #397
1 parent 92c693b commit 9fa7795

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

src/mcp/server/mcpserver/context.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ async def elicit_url(
187187
async def log(
188188
self,
189189
level: Literal["debug", "info", "warning", "error"],
190-
message: str,
190+
data: Any,
191191
*,
192192
logger_name: str | None = None,
193193
extra: dict[str, Any] | None = None,
@@ -196,15 +196,16 @@ async def log(
196196
197197
Args:
198198
level: Log level (debug, info, warning, error)
199-
message: Log message
199+
data: The data to be logged, such as a string message or an object.
200+
Any JSON serializable type is allowed here.
200201
logger_name: Optional logger name
201202
extra: Optional dictionary with additional structured data to include
202203
"""
203204

204205
if extra:
205-
log_data = {"message": message, **extra}
206+
log_data: Any = {"data": data, **extra}
206207
else:
207-
log_data = message
208+
log_data = data
208209

209210
await self.request_context.session.send_log_message(
210211
level=level,
@@ -261,20 +262,20 @@ async def close_standalone_sse_stream(self) -> None:
261262
await self._request_context.close_standalone_sse_stream()
262263

263264
# Convenience methods for common log levels
264-
async def debug(self, message: str, *, logger_name: str | None = None, extra: dict[str, Any] | None = None) -> None:
265+
async def debug(self, data: Any, *, logger_name: str | None = None, extra: dict[str, Any] | None = None) -> None:
265266
"""Send a debug log message."""
266-
await self.log("debug", message, logger_name=logger_name, extra=extra)
267+
await self.log("debug", data, logger_name=logger_name, extra=extra)
267268

268-
async def info(self, message: str, *, logger_name: str | None = None, extra: dict[str, Any] | None = None) -> None:
269+
async def info(self, data: Any, *, logger_name: str | None = None, extra: dict[str, Any] | None = None) -> None:
269270
"""Send an info log message."""
270-
await self.log("info", message, logger_name=logger_name, extra=extra)
271+
await self.log("info", data, logger_name=logger_name, extra=extra)
271272

272273
async def warning(
273-
self, message: str, *, logger_name: str | None = None, extra: dict[str, Any] | None = None
274+
self, data: Any, *, logger_name: str | None = None, extra: dict[str, Any] | None = None
274275
) -> None:
275276
"""Send a warning log message."""
276-
await self.log("warning", message, logger_name=logger_name, extra=extra)
277+
await self.log("warning", data, logger_name=logger_name, extra=extra)
277278

278-
async def error(self, message: str, *, logger_name: str | None = None, extra: dict[str, Any] | None = None) -> None:
279+
async def error(self, data: Any, *, logger_name: str | None = None, extra: dict[str, Any] | None = None) -> None:
279280
"""Send an error log message."""
280-
await self.log("error", message, logger_name=logger_name, extra=extra)
281+
await self.log("error", data, logger_name=logger_name, extra=extra)

0 commit comments

Comments
 (0)