From f256b5b9b1e4795137b184f406cee6c07287e323 Mon Sep 17 00:00:00 2001 From: jupiter <1404785625@qq.com> Date: Wed, 8 Jul 2026 01:51:58 +0800 Subject: [PATCH] fix(mcp): preserve blob resource contents --- .../proxy/_experimental/mcp_server/server.py | 3 ++- .../mcp_server/test_mcp_server.py | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/_experimental/mcp_server/server.py b/litellm/proxy/_experimental/mcp_server/server.py index e3812522ded..f42a506fc12 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 @@ -385,7 +386,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 1f44160aef4..99331976b88 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 @@ -756,11 +756,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: