@@ -141,7 +141,7 @@ async def call_tool(
141141 except McpError as e :
142142 raise exceptions .ModelRetry (e .error .message )
143143
144- content = [self ._map_tool_result_part (part ) for part in result .content ]
144+ content = [await self ._map_tool_result_part (part ) for part in result .content ]
145145
146146 if result .isError :
147147 text = '\n ' .join (str (part ) for part in content )
@@ -207,7 +207,7 @@ async def _sampling_callback(
207207 model = self .sampling_model .model_name ,
208208 )
209209
210- def _map_tool_result_part (
210+ async def _map_tool_result_part (
211211 self , part : mcp_types .ContentBlock
212212 ) -> str | messages .BinaryContent | dict [str , Any ] | list [Any ]:
213213 # See https://github.com/jlowin/fastmcp/blob/main/docs/servers/tools.mdx#return-values
@@ -230,30 +230,26 @@ def _map_tool_result_part(
230230 ) # pragma: no cover
231231 elif isinstance (part , mcp_types .EmbeddedResource ):
232232 resource = part .resource
233- if isinstance (resource , mcp_types .TextResourceContents ):
234- return resource .text
235- elif isinstance (resource , mcp_types .BlobResourceContents ):
236- return messages .BinaryContent (
237- data = base64 .b64decode (resource .blob ),
238- media_type = resource .mimeType or 'application/octet-stream' ,
239- )
240- else :
241- assert_never (resource )
233+ return self ._get_content (resource )
242234 elif isinstance (part , mcp_types .ResourceLink ):
243- resource_result : mcp_types .ReadResourceResult = anyio .run (lambda : self ._client .read_resource (part .uri ))
244- content = resource_result .contents [0 ]
245- if isinstance (content , mcp_types .TextResourceContents ):
246- return content .text
247- elif isinstance (content , mcp_types .BlobResourceContents ):
248- return messages .BinaryContent (
249- data = base64 .b64decode (content .blob ), media_type = content .mimeType or 'application/octet-stream'
250- )
251- else :
252- assert_never (content )
235+ resource_result : mcp_types .ReadResourceResult = await self ._client .read_resource (part .uri )
236+ return [self ._get_content (resource ) for resource in resource_result .contents ]
253237
254238 else :
255239 assert_never (part )
256240
241+ def _get_content (
242+ self , resource : mcp_types .TextResourceContents | mcp_types .BlobResourceContents
243+ ) -> str | messages .BinaryContent :
244+ if isinstance (resource , mcp_types .TextResourceContents ):
245+ return resource .text
246+ elif isinstance (resource , mcp_types .BlobResourceContents ):
247+ return messages .BinaryContent (
248+ data = base64 .b64decode (resource .blob ), media_type = resource .mimeType or 'application/octet-stream'
249+ )
250+ else :
251+ assert_never (resource )
252+
257253
258254@dataclass
259255class MCPServerStdio (MCPServer ):
0 commit comments