|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
3 | 3 | from collections.abc import Iterable |
4 | | -from typing import TYPE_CHECKING, Any, Generic, Literal |
| 4 | +from typing import TYPE_CHECKING, Any, Generic |
5 | 5 |
|
6 | 6 | from pydantic import AnyUrl, BaseModel |
7 | 7 |
|
|
14 | 14 | elicit_with_validation, |
15 | 15 | ) |
16 | 16 | from mcp.server.lowlevel.helper_types import ReadResourceContents |
| 17 | +from mcp.types import LoggingLevel |
17 | 18 |
|
18 | 19 | if TYPE_CHECKING: |
19 | 20 | from mcp.server.mcpserver.server import MCPServer |
@@ -186,29 +187,23 @@ async def elicit_url( |
186 | 187 |
|
187 | 188 | async def log( |
188 | 189 | self, |
189 | | - level: Literal["debug", "info", "warning", "error"], |
190 | | - message: str, |
| 190 | + level: LoggingLevel, |
| 191 | + data: Any, |
191 | 192 | *, |
192 | 193 | logger_name: str | None = None, |
193 | | - extra: dict[str, Any] | None = None, |
194 | 194 | ) -> None: |
195 | 195 | """Send a log message to the client. |
196 | 196 |
|
197 | 197 | Args: |
198 | | - level: Log level (debug, info, warning, error) |
199 | | - message: Log message |
| 198 | + level: Log level (debug, info, notice, warning, error, critical, |
| 199 | + alert, emergency) |
| 200 | + data: The data to be logged. Any JSON serializable type is allowed |
| 201 | + (string, dict, list, number, bool, etc.) per the MCP specification. |
200 | 202 | logger_name: Optional logger name |
201 | | - extra: Optional dictionary with additional structured data to include |
202 | 203 | """ |
203 | | - |
204 | | - if extra: |
205 | | - log_data = {"message": message, **extra} |
206 | | - else: |
207 | | - log_data = message |
208 | | - |
209 | 204 | await self.request_context.session.send_log_message( |
210 | 205 | level=level, |
211 | | - data=log_data, |
| 206 | + data=data, |
212 | 207 | logger=logger_name, |
213 | 208 | related_request_id=self.request_id, |
214 | 209 | ) |
@@ -261,20 +256,18 @@ async def close_standalone_sse_stream(self) -> None: |
261 | 256 | await self._request_context.close_standalone_sse_stream() |
262 | 257 |
|
263 | 258 | # 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: |
| 259 | + async def debug(self, data: Any, *, logger_name: str | None = None) -> None: |
265 | 260 | """Send a debug log message.""" |
266 | | - await self.log("debug", message, logger_name=logger_name, extra=extra) |
| 261 | + await self.log("debug", data, logger_name=logger_name) |
267 | 262 |
|
268 | | - async def info(self, message: str, *, logger_name: str | None = None, extra: dict[str, Any] | None = None) -> None: |
| 263 | + async def info(self, data: Any, *, logger_name: str | None = None) -> None: |
269 | 264 | """Send an info log message.""" |
270 | | - await self.log("info", message, logger_name=logger_name, extra=extra) |
| 265 | + await self.log("info", data, logger_name=logger_name) |
271 | 266 |
|
272 | | - async def warning( |
273 | | - self, message: str, *, logger_name: str | None = None, extra: dict[str, Any] | None = None |
274 | | - ) -> None: |
| 267 | + async def warning(self, data: Any, *, logger_name: str | None = None) -> None: |
275 | 268 | """Send a warning log message.""" |
276 | | - await self.log("warning", message, logger_name=logger_name, extra=extra) |
| 269 | + await self.log("warning", data, logger_name=logger_name) |
277 | 270 |
|
278 | | - async def error(self, message: str, *, logger_name: str | None = None, extra: dict[str, Any] | None = None) -> None: |
| 271 | + async def error(self, data: Any, *, logger_name: str | None = None) -> None: |
279 | 272 | """Send an error log message.""" |
280 | | - await self.log("error", message, logger_name=logger_name, extra=extra) |
| 273 | + await self.log("error", data, logger_name=logger_name) |
0 commit comments