-
Notifications
You must be signed in to change notification settings - Fork 308
Description
Bug Description
Hi,
I think langchain-mcp-adapters library is ignoring the structuredContent field from MCP CallToolResult responses, causing loss of
structured data that MCP servers provide. This violates the MCP specification (6/18/2025 MCP spec) and prevents LangChain applications from accessing structured data from MCP tools.
Current Behavior
The _convert_call_tool_result() function in langchain_mcp_adapters/tools.py only processes the content field from CallToolResult and
completely ignores the structuredContent field:
def _convert_call_tool_result(
call_tool_result: CallToolResult,
) -> tuple[str | list[str], list[NonTextContent] | None]:
text_contents: list[str] = []
non_text_contents: list[NonTextContent] = []
# Only iterates through content, never touches structuredContent
for content in call_tool_result.content:
if isinstance(content, TextContent):
text_contents.append(content.text)
# ... rest of processingExpected Behavior
According to the MCP specification, CallToolResult includes both fields:
- content: list[ContentBlock] - Human-readable content
- structuredContent: dict[str, Any] | None - Machine-readable structured data
Reproduction Steps
- Create an MCP server that returns structured content:
from fastmcp import FastMCP
from mcp.types import CallToolResult, TextContent
mcp = FastMCP("TestServer")
@mcp.tool(output_schema={
"type": "object",
"properties": {
"results": {"type": "array"},
"count": {"type": "integer"}
}
})
async def search(query: str) -> dict:
results = [
{"title": "Result 1", "url": "https://example.com/1"},
{"title": "Result 2", "url": "https://example.com/2"}
]
# This returns both content and structuredContent in MCP
return {"results": results, "count": 2}- Use langchain-mcp-adapters to call the tool:
from langchain_mcp_adapters import load_mcp_tools
async def test():
tools = await load_mcp_tools(server_params)
result = await tools[0].ainvoke({"query": "test"})
print(result) # Only contains text content, no structured data!- Observe that the structured content (
{"results": [...], "count": 2}) is completely lost.
Root Cause
The issue is in langchain_mcp_adapters/tools.py, specifically in:
_convert_call_tool_result()function - Only processescontentfieldMCPTool._arun()method - Only returns converted content, not structured data- Return type is
tuple[str | list[str], list[NonTextContent] | None]which has no place for structured content