refactor: standardize resource response format

Introduce ReadResourceContents type to properly handle MIME types in resource responses. Breaking change in FastMCP read_resource() return type.

Github-Issue:#152
This commit is contained in:
David Soria Parra
2025-01-27 20:36:10 +00:00
parent f90cf6a2a5
commit 070e8412c0
7 changed files with 155 additions and 35 deletions

View File

@@ -20,6 +20,7 @@ from mcp.server.fastmcp.tools import ToolManager
from mcp.server.fastmcp.utilities.logging import configure_logging, get_logger
from mcp.server.fastmcp.utilities.types import Image
from mcp.server.lowlevel import Server as MCPServer
from mcp.server.lowlevel.helper_types import ReadResourceContents
from mcp.server.sse import SseServerTransport
from mcp.server.stdio import stdio_server
from mcp.shared.context import RequestContext
@@ -197,7 +198,7 @@ class FastMCP:
for template in templates
]
async def read_resource(self, uri: AnyUrl | str) -> tuple[str | bytes, str]:
async def read_resource(self, uri: AnyUrl | str) -> ReadResourceContents:
"""Read a resource by URI."""
resource = await self._resource_manager.get_resource(uri)
@@ -206,7 +207,7 @@ class FastMCP:
try:
content = await resource.read()
return (content, resource.mime_type)
return ReadResourceContents(content=content, mime_type=resource.mime_type)
except Exception as e:
logger.error(f"Error reading resource {uri}: {e}")
raise ResourceError(str(e))
@@ -608,7 +609,7 @@ class Context(BaseModel):
progress_token=progress_token, progress=progress, total=total
)
async def read_resource(self, uri: str | AnyUrl) -> tuple[str | bytes, str]:
async def read_resource(self, uri: str | AnyUrl) -> ReadResourceContents:
"""Read a resource by URI.
Args: