Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1746ea1

Browse files
committed
use schema to decide what to do about content conversion
1 parent 9109577 commit 1746ea1

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

src/mcp/server/fastmcp/server.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,8 @@ async def call_tool(
276276
"""Call a tool by name with arguments."""
277277
context = self.get_context()
278278
result = await self._tool_manager.call_tool(name, arguments, context=context)
279-
converted_result = _convert_to_content(result)
279+
schema = self._tool_manager.get_schema(name)
280+
converted_result = _convert_to_content(result, schema)
280281
return converted_result
281282

282283
async def list_resources(self) -> list[MCPResource]:
@@ -879,24 +880,28 @@ async def get_prompt(
879880

880881
def _convert_to_content(
881882
result: Any,
883+
schema: dict[str, Any] | None
882884
) -> Sequence[TextContent | ImageContent | EmbeddedResource]:
883-
"""Convert a result to a sequence of content objects."""
884-
if result is None:
885-
return []
885+
if schema is None:
886+
"""Convert a result to a sequence of content objects."""
887+
if result is None:
888+
return []
886889

887-
if isinstance(result, TextContent | ImageContent | EmbeddedResource):
888-
return [result]
890+
if isinstance(result, TextContent | ImageContent | EmbeddedResource):
891+
return [result]
889892

890-
if isinstance(result, Image):
891-
return [result.to_image_content()]
893+
if isinstance(result, Image):
894+
return [result.to_image_content()]
892895

893-
if isinstance(result, list | tuple):
894-
return list(chain.from_iterable(_convert_to_content(item) for item in result)) # type: ignore[reportUnknownVariableType]
896+
if isinstance(result, list | tuple):
897+
return list(chain.from_iterable(_convert_to_content(item, schema) for item in result)) # type: ignore[reportUnknownVariableType]
895898

896-
if not isinstance(result, str):
897-
result = pydantic_core.to_json(result, fallback=str, indent=2).decode()
899+
if not isinstance(result, str):
900+
result = pydantic_core.to_json(result, fallback=str, indent=2).decode()
898901

899-
return [TextContent(type="text", text=result)]
902+
return [TextContent(type="text", text=result)]
903+
else:
904+
return result
900905

901906

902907
class Context(BaseModel, Generic[ServerSessionT, LifespanContextT]):

0 commit comments

Comments
 (0)