Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion litellm/proxy/_experimental/mcp_server/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,11 @@ def _mcp_session_id_from_headers(
return None


def _format_progress_token_for_log(progress_token: object) -> str:
"""Short, log-safe form of an MCP progressToken (str or int per spec)."""
return f"{str(progress_token)[:8]}..."


def _jsonrpc_text_has_top_level_method(text: str) -> bool:
"""Whether a (possibly truncated) JSON-RPC envelope has a ``method`` key at
the root object's top level.
Expand Down Expand Up @@ -732,7 +737,7 @@ async def forward_progress(progress: float, total: Optional[float]):
except Exception as e:
verbose_logger.error(f"Failed to forward progress to Host: {e}")

verbose_logger.debug(f"Host progressToken captured: {host_token[:8]}...")
verbose_logger.debug(f"Host progressToken captured: {_format_progress_token_for_log(host_token)}")
return forward_progress

async def _build_virtual_call_logging_obj(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6592,3 +6592,16 @@ async def test_get_active_submitted_mcp_server_ids_for_user_empty_user_id_skips_

assert await get_active_submitted_mcp_server_ids_for_user(prisma_client, "") == []
prisma_client.db.litellm_mcpservertable.find_many.assert_not_awaited()


@pytest.mark.parametrize(
"token, expected",
[(123456789, "12345678..."), ("abcdefghij", "abcdefgh...")],
)
def test_format_progress_token_for_log_handles_int_and_str(token, expected):
# Regression for #32181: an integer progressToken crashed host_token[:8].
from litellm.proxy._experimental.mcp_server.server import (
_format_progress_token_for_log,
)

assert _format_progress_token_for_log(token) == expected
Loading