@@ -141,7 +141,7 @@ async def call_tool(
141
141
except McpError as e :
142
142
raise exceptions .ModelRetry (e .error .message )
143
143
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 ]
145
145
146
146
if result .isError :
147
147
text = '\n ' .join (str (part ) for part in content )
@@ -207,7 +207,7 @@ async def _sampling_callback(
207
207
model = self .sampling_model .model_name ,
208
208
)
209
209
210
- def _map_tool_result_part (
210
+ async def _map_tool_result_part (
211
211
self , part : mcp_types .ContentBlock
212
212
) -> str | messages .BinaryContent | dict [str , Any ] | list [Any ]:
213
213
# See https://github.com/jlowin/fastmcp/blob/main/docs/servers/tools.mdx#return-values
@@ -230,30 +230,26 @@ def _map_tool_result_part(
230
230
) # pragma: no cover
231
231
elif isinstance (part , mcp_types .EmbeddedResource ):
232
232
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 )
242
234
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 ]
253
237
254
238
else :
255
239
assert_never (part )
256
240
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
+
257
253
258
254
@dataclass
259
255
class MCPServerStdio (MCPServer ):
0 commit comments