diff --git a/python/packages/autogen-ext/src/autogen_ext/tools/mcp/_base.py b/python/packages/autogen-ext/src/autogen_ext/tools/mcp/_base.py index 314dbe15e7ba..7b69eb9403b8 100644 --- a/python/packages/autogen-ext/src/autogen_ext/tools/mcp/_base.py +++ b/python/packages/autogen-ext/src/autogen_ext/tools/mcp/_base.py @@ -194,4 +194,4 @@ def serialize_item(item: Any) -> dict[str, Any]: else: return {} - return json.dumps([serialize_item(item) for item in value]) + return json.dumps([serialize_item(item) for item in value], ensure_ascii=False) diff --git a/python/packages/autogen-ext/tests/tools/test_mcp_tools.py b/python/packages/autogen-ext/tests/tools/test_mcp_tools.py index fbcbccc3e6bb..bd9d5f88de56 100644 --- a/python/packages/autogen-ext/tests/tools/test_mcp_tools.py +++ b/python/packages/autogen-ext/tests/tools/test_mcp_tools.py @@ -928,3 +928,26 @@ def test_return_value_as_string_with_resource_link(sample_tool: Tool, sample_ser assert '"type": "resource_link"' in result assert '"name": "test_link"' in result assert '"uri": "http://example.com/"' in result # AnyUrl normalizes with trailing slash + + +def test_return_value_as_string_preserves_non_ascii_text( + sample_tool: Tool, sample_server_params: StdioServerParams +) -> None: + """Non-ASCII characters (e.g. Japanese/Chinese) should not be escaped to \\uXXXX.""" + adapter = StdioMcpToolAdapter(server_params=sample_server_params, tool=sample_tool) + + japanese_text = "日本語のテキスト" + chinese_text = "中文文本" + + result = adapter.return_value_as_string( + [ + TextContent(text=japanese_text, type="text"), + TextContent(text=chinese_text, type="text"), + ] + ) + + # Original characters must survive serialization. + assert japanese_text in result + assert chinese_text in result + # And they must not appear as escaped unicode codepoints. + assert "\\u" not in result