@@ -1249,31 +1249,28 @@ async def elicit_url(
12491249 async def log (
12501250 self ,
12511251 level : Literal ["debug" , "info" , "warning" , "error" ],
1252- message : str ,
1252+ data : Any ,
12531253 * ,
12541254 logger_name : str | None = None ,
1255- extra : dict [str , Any ] | None = None ,
12561255 ) -> None :
12571256 """Send a log message to the client.
12581257
1258+ Per MCP spec, data can be any JSON-serializable type (str, dict, list, int, etc.).
1259+
12591260 Args:
12601261 level: Log level (debug, info, warning, error)
1261- message: Log message
1262+ data: Data to log - can be string, dict, list, number, boolean, etc.
12621263 logger_name: Optional logger name
1263- extra: Optional dictionary with additional structured data to include
1264- """
1265-
1266- if extra :
1267- log_data = {
1268- "message" : message ,
1269- ** extra ,
1270- }
1271- else :
1272- log_data = message
12731264
1265+ Examples:
1266+ await ctx.info("Simple message")
1267+ await ctx.debug({"status": "processing", "progress": 50})
1268+ await ctx.warning(["item1", "item2"])
1269+ await ctx.error(42)
1270+ """
12741271 await self .request_context .session .send_log_message (
12751272 level = level ,
1276- data = log_data ,
1273+ data = data ,
12771274 logger = logger_name ,
12781275 related_request_id = self .request_id ,
12791276 )
@@ -1328,20 +1325,40 @@ async def close_standalone_sse_stream(self) -> None:
13281325 await self ._request_context .close_standalone_sse_stream ()
13291326
13301327 # Convenience methods for common log levels
1331- async def debug (self , message : str , * , logger_name : str | None = None , extra : dict [str , Any ] | None = None ) -> None :
1332- """Send a debug log message."""
1333- await self .log ("debug" , message , logger_name = logger_name , extra = extra )
1328+ async def debug (self , data : Any , * , logger_name : str | None = None ) -> None :
1329+ """Send a debug log message.
1330+
1331+ Args:
1332+ data: Data to log (any JSON-serializable type)
1333+ logger_name: Optional logger name
1334+ """
1335+ await self .log ("debug" , data , logger_name = logger_name )
13341336
1335- async def info (self , message : str , * , logger_name : str | None = None , extra : dict [str , Any ] | None = None ) -> None :
1336- """Send an info log message."""
1337- await self .log ("info" , message , logger_name = logger_name , extra = extra )
1337+ async def info (self , data : Any , * , logger_name : str | None = None ) -> None :
1338+ """Send an info log message.
1339+
1340+ Args:
1341+ data: Data to log (any JSON-serializable type)
1342+ logger_name: Optional logger name
1343+ """
1344+ await self .log ("info" , data , logger_name = logger_name )
13381345
13391346 async def warning (
1340- self , message : str , * , logger_name : str | None = None , extra : dict [ str , Any ] | None = None
1347+ self , data : Any , * , logger_name : str | None = None
13411348 ) -> None :
1342- """Send a warning log message."""
1343- await self .log ("warning" , message , logger_name = logger_name , extra = extra )
1349+ """Send a warning log message.
1350+
1351+ Args:
1352+ data: Data to log (any JSON-serializable type)
1353+ logger_name: Optional logger name
1354+ """
1355+ await self .log ("warning" , data , logger_name = logger_name )
13441356
1345- async def error (self , message : str , * , logger_name : str | None = None , extra : dict [str , Any ] | None = None ) -> None :
1346- """Send an error log message."""
1347- await self .log ("error" , message , logger_name = logger_name , extra = extra )
1357+ async def error (self , data : Any , * , logger_name : str | None = None ) -> None :
1358+ """Send an error log message.
1359+
1360+ Args:
1361+ data: Data to log (any JSON-serializable type)
1362+ logger_name: Optional logger name
1363+ """
1364+ await self .log ("error" , data , logger_name = logger_name )
0 commit comments