diff --git a/litellm/proxy/_experimental/mcp_server/server.py b/litellm/proxy/_experimental/mcp_server/server.py index c6b2ac489bb..b64bbbcea05 100644 --- a/litellm/proxy/_experimental/mcp_server/server.py +++ b/litellm/proxy/_experimental/mcp_server/server.py @@ -5,6 +5,7 @@ LiteLLM MCP Server Routes # pyright: reportInvalidTypeForm=false, reportArgumentType=false, reportOptionalCall=false import asyncio +import base64 import contextlib import contextvars import hashlib @@ -487,7 +488,7 @@ if MCP_AVAILABLE: elif isinstance(content, BlobResourceContents): normalized.append( ReadResourceContents( - content=content.blob, + content=base64.b64decode(content.blob), mime_type=content.mimeType, meta=meta, ) diff --git a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py index 82f74cda835..ae529fa19fb 100644 --- a/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py +++ b/tests/test_litellm/proxy/_experimental/mcp_server/test_mcp_server.py @@ -1033,11 +1033,34 @@ def test_normalize_resource_contents_blob_with_metadata(): result = _normalize_resource_contents(contents) assert len(result) == 1 - assert result[0].content == "aGVsbG8=" + assert result[0].content == b"hello" assert result[0].mime_type == "image/png" assert result[0].meta == meta +def test_normalize_resource_contents_decodes_blob_content_to_bytes(): + try: + from litellm.proxy._experimental.mcp_server.server import ( + _normalize_resource_contents, + ) + except ImportError: + pytest.skip("MCP server not available") + + contents = [ + BlobResourceContents( + uri="https://example.com/archive.tar.gz", + blob="H4sIAAAAAAACAw==", + mimeType="application/gzip", + ) + ] + + result = _normalize_resource_contents(contents) + + assert len(result) == 1 + assert result[0].content == b"\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\x03" + assert result[0].mime_type == "application/gzip" + + def test_normalize_resource_contents_preserves_empty_metadata(): """Test that empty dict meta is preserved (truthiness bug fix).""" try: