From ea3bfb6772713075c520e90976cb161c5f2d12fd Mon Sep 17 00:00:00 2001 From: "marvin-context-protocol[bot]" <225465937+marvin-context-protocol[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 01:12:08 +0000 Subject: [PATCH] feat: Use dynamic terminal width detection for Rich console output Use shutil.get_terminal_size() with fallback to 100 characters instead of auto-detecting narrow widths. This provides better traceback readability while being more adaptive than fixed width settings. Co-authored-by: William Easton --- src/fastmcp/cli/cli.py | 4 ++-- src/fastmcp/utilities/cli.py | 4 +++- src/fastmcp/utilities/logging.py | 15 ++++++++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/fastmcp/cli/cli.py b/src/fastmcp/cli/cli.py index d5f373db0..c861884bc 100644 --- a/src/fastmcp/cli/cli.py +++ b/src/fastmcp/cli/cli.py @@ -26,12 +26,12 @@ from fastmcp.utilities.inspect import ( format_info, inspect_fastmcp, ) -from fastmcp.utilities.logging import get_logger +from fastmcp.utilities.logging import get_logger, get_terminal_width from fastmcp.utilities.mcp_server_config import MCPServerConfig from fastmcp.utilities.mcp_server_config.v1.environments.uv import UVEnvironment logger = get_logger("cli") -console = Console() +console = Console(width=get_terminal_width()) app = cyclopts.App( name="fastmcp", diff --git a/src/fastmcp/utilities/cli.py b/src/fastmcp/utilities/cli.py index 2ae540d89..f7693b192 100644 --- a/src/fastmcp/utilities/cli.py +++ b/src/fastmcp/utilities/cli.py @@ -231,5 +231,7 @@ def log_server_banner( expand=False, ) - console = Console(stderr=True) + from fastmcp.utilities.logging import get_terminal_width + + console = Console(stderr=True, width=get_terminal_width()) console.print(Group("\n", panel, "\n")) diff --git a/src/fastmcp/utilities/logging.py b/src/fastmcp/utilities/logging.py index e27aa4600..46c315585 100644 --- a/src/fastmcp/utilities/logging.py +++ b/src/fastmcp/utilities/logging.py @@ -1,12 +1,25 @@ """Logging utilities for FastMCP.""" import logging +import shutil from typing import Any, Literal from rich.console import Console from rich.logging import RichHandler +def get_terminal_width() -> int: + """Get terminal width using shutil.get_terminal_size() with fallback to 100. + + Returns: + Terminal width in characters, defaulting to 100 if detection fails. + """ + try: + return shutil.get_terminal_size().columns + except (OSError, ValueError): + return 100 + + def get_logger(name: str) -> logging.Logger: """Get a logger nested under FastMCP namespace. @@ -39,7 +52,7 @@ def configure_logging( # Only configure the FastMCP logger namespace handler = RichHandler( - console=Console(stderr=True), + console=Console(stderr=True, width=get_terminal_width()), rich_tracebacks=enable_rich_tracebacks, **rich_kwargs, )