--- title: Server Logging sidebarTitle: Logging description: Receive and handle log messages from MCP servers. icon: receipt --- import { VersionBadge } from '/snippets/version-badge.mdx' MCP servers can emit log messages to clients. The client can handle these logs through a log handler callback. ## Log Handler Provide a `log_handler` function when creating the client: ```python from fastmcp import Client from fastmcp.client.logging import LogMessage async def log_handler(message: LogMessage): level = message.level.upper() logger = message.logger or 'server' data = message.data print(f"[{level}] {logger}: {data}") client = Client( "my_mcp_server.py", log_handler=log_handler, ) ``` ### Handler Parameters The `log_handler` is called every time a log message is received. It receives a `LogMessage` object: The log level The logger name (optional, may be None) The actual log message content ```python async def detailed_log_handler(message: LogMessage): if message.level == "error": print(f"ERROR: {message.data}") elif message.level == "warning": print(f"WARNING: {message.data}") else: print(f"{message.level.upper()}: {message.data}") ``` ## Default Log Handling If you don't provide a custom `log_handler`, FastMCP uses a default handler that emits a DEBUG-level FastMCP log for every log message received from the server, which is useful for visibility without polluting your own logs. ```python client = Client("my_mcp_server.py") async with client: # Server logs will be emitted at DEBUG level automatically await client.call_tool("some_tool") ```