From db001e1511b212c4da821b4f138ac59714f889e2 Mon Sep 17 00:00:00 2001 From: Novice Date: Fri, 20 Jun 2025 14:48:22 +0800 Subject: [PATCH] feat: handle none value in mcp tool node --- api/core/plugin/entities/parameters.py | 20 ++++++++++++++++++++ api/core/tools/mcp_tool/tool.py | 11 +++++++++++ 2 files changed, 31 insertions(+) diff --git a/api/core/plugin/entities/parameters.py b/api/core/plugin/entities/parameters.py index b663f66f5b..8cfd9cd2d7 100644 --- a/api/core/plugin/entities/parameters.py +++ b/api/core/plugin/entities/parameters.py @@ -149,10 +149,30 @@ def cast_parameter_value(typ: enum.StrEnum, value: Any, /): return value case PluginParameterType.ARRAY: if not isinstance(value, list): + # Try to parse JSON string for arrays + if isinstance(value, str): + try: + import json + + parsed_value = json.loads(value) + if isinstance(parsed_value, list): + return parsed_value + except (json.JSONDecodeError, ValueError): + pass return [value] return value case PluginParameterType.OBJECT: if not isinstance(value, dict): + # Try to parse JSON string for objects + if isinstance(value, str): + try: + import json + + parsed_value = json.loads(value) + if isinstance(parsed_value, dict): + return parsed_value + except (json.JSONDecodeError, ValueError): + pass return {} return value case _: diff --git a/api/core/tools/mcp_tool/tool.py b/api/core/tools/mcp_tool/tool.py index 247abb7db2..c7e627a998 100644 --- a/api/core/tools/mcp_tool/tool.py +++ b/api/core/tools/mcp_tool/tool.py @@ -40,6 +40,7 @@ class MCPTool(Tool): ) -> Generator[ToolInvokeMessage, None, None]: try: with MCPClient(self.server_url, self.provider_id, self.tenant_id, authed=True) as mcp_client: + tool_parameters = self._handle_none_parameter(tool_parameters) result = mcp_client.invoke_tool(tool_name=self.entity.identity.name, tool_args=tool_parameters) except MCPAuthError as e: raise ValueError("Please auth the tool first") @@ -62,3 +63,13 @@ class MCPTool(Tool): server_url=self.server_url, provider_id=self.provider_id, ) + + def _handle_none_parameter(self, parameter: dict[str, Any]) -> dict[str, Any]: + """ + in mcp tool invoke, if the parameter is empty, it will be set to None + """ + return { + key: value + for key, value in parameter.items() + if value is not None and not (isinstance(value, str) and value.strip() == "") + }