Skip to content

Commit 9804e6f

Browse files
committed
Fix: Change context logging methods to accept Any type per MCP spec
The MCP spec defines the logging data field as 'unknown' (any JSON serializable type), but the context logging methods (debug, info, warning, error, log) only accepted str. This prevented sending structured log data like dicts or lists. Changed message parameter type from str to Any in all logging methods. Removed the extra parameter since callers can now pass structured data directly as the message. Fixes #397
1 parent d5b9155 commit 9804e6f

File tree

1 file changed

+11
-18
lines changed

1 file changed

+11
-18
lines changed

src/mcp/server/mcpserver/context.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -187,28 +187,21 @@ async def elicit_url(
187187
async def log(
188188
self,
189189
level: Literal["debug", "info", "warning", "error"],
190-
message: str,
190+
message: Any,
191191
*,
192192
logger_name: str | None = None,
193-
extra: dict[str, Any] | None = None,
194193
) -> None:
195194
"""Send a log message to the client.
196195
197196
Args:
198197
level: Log level (debug, info, warning, error)
199-
message: Log message
198+
message: Log data (any JSON-serializable type)
200199
logger_name: Optional logger name
201-
extra: Optional dictionary with additional structured data to include
202200
"""
203201

204-
if extra:
205-
log_data = {"message": message, **extra}
206-
else:
207-
log_data = message
208-
209202
await self.request_context.session.send_log_message(
210203
level=level,
211-
data=log_data,
204+
data=message,
212205
logger=logger_name,
213206
related_request_id=self.request_id,
214207
)
@@ -261,20 +254,20 @@ async def close_standalone_sse_stream(self) -> None:
261254
await self._request_context.close_standalone_sse_stream()
262255

263256
# 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:
257+
async def debug(self, message: Any, *, logger_name: str | None = None) -> None:
265258
"""Send a debug log message."""
266-
await self.log("debug", message, logger_name=logger_name, extra=extra)
259+
await self.log("debug", message, logger_name=logger_name)
267260

268-
async def info(self, message: str, *, logger_name: str | None = None, extra: dict[str, Any] | None = None) -> None:
261+
async def info(self, message: Any, *, logger_name: str | None = None) -> None:
269262
"""Send an info log message."""
270-
await self.log("info", message, logger_name=logger_name, extra=extra)
263+
await self.log("info", message, logger_name=logger_name)
271264

272265
async def warning(
273-
self, message: str, *, logger_name: str | None = None, extra: dict[str, Any] | None = None
266+
self, message: Any, *, logger_name: str | None = None
274267
) -> None:
275268
"""Send a warning log message."""
276-
await self.log("warning", message, logger_name=logger_name, extra=extra)
269+
await self.log("warning", message, logger_name=logger_name)
277270

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

0 commit comments

Comments
 (0)