Skip to content

Commit c8e8afa

Browse files
committed
feat: enhance execute method to support mcp_tool_id and mcp_source parameters
--bug=1060726 --user=刘瑞斌 【工具】应用中引用的MCP没删除后,在应用对话界面依然可以调用MCP的工具 https://www.tapd.cn/62980211/s/1759963
1 parent c3001ff commit c8e8afa

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

apps/application/flow/step_node/mcp_node/i_mcp_node.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,12 @@
99

1010

1111
class McpNodeSerializer(serializers.Serializer):
12-
mcp_servers = serializers.JSONField(required=True,
13-
label=_("Mcp servers"))
14-
15-
mcp_server = serializers.CharField(required=True,
16-
label=_("Mcp server"))
17-
12+
mcp_servers = serializers.JSONField(required=True, label=_("Mcp servers"))
13+
mcp_server = serializers.CharField(required=True, label=_("Mcp server"))
1814
mcp_tool = serializers.CharField(required=True, label=_("Mcp tool"))
19-
20-
tool_params = serializers.DictField(required=True,
21-
label=_("Tool parameters"))
15+
mcp_tool_id = serializers.UUIDField(required=False, label=_("Mcp tool"), allow_null=True)
16+
mcp_source = serializers.CharField(required=False, label=_("Mcp source"), allow_blank=True, allow_null=True)
17+
tool_params = serializers.DictField(required=True, label=_("Tool parameters"))
2218

2319

2420
class IMcpNode(INode):
@@ -30,5 +26,5 @@ def get_node_params_serializer_class(self) -> Type[serializers.Serializer]:
3026
def _run(self):
3127
return self.execute(**self.node_params_serializer.data, **self.flow_params_serializer.data)
3228

33-
def execute(self, mcp_servers, mcp_server, mcp_tool, tool_params, **kwargs) -> NodeResult:
29+
def execute(self, mcp_servers, mcp_server, mcp_tool, mcp_tool_id, mcp_source, tool_params, **kwargs) -> NodeResult:
3430
pass

apps/application/flow/step_node/mcp_node/impl/base_mcp_node.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import json
44
from typing import List
55

6+
from django.db.models import QuerySet
67
from langchain_mcp_adapters.client import MultiServerMCPClient
78

89
from application.flow.i_step_node import NodeResult
910
from application.flow.step_node.mcp_node.i_mcp_node import IMcpNode
11+
from tools.models import Tool
1012

1113

1214
class BaseMcpNode(IMcpNode):
@@ -15,10 +17,20 @@ def save_context(self, details, workflow_manage):
1517
self.context['tool_params'] = details.get('tool_params')
1618
self.context['mcp_tool'] = details.get('mcp_tool')
1719

18-
def execute(self, mcp_servers, mcp_server, mcp_tool, tool_params, **kwargs) -> NodeResult:
19-
servers = json.loads(mcp_servers)
20-
params = json.loads(json.dumps(tool_params))
21-
params = self.handle_variables(params)
20+
def execute(self, mcp_servers, mcp_server, mcp_tool, mcp_tool_id, mcp_source, tool_params,**kwargs) -> NodeResult:
21+
if mcp_source == 'referencing':
22+
if not mcp_tool_id:
23+
raise ValueError("MCP tool ID is required when mcp_source is 'referencing'.")
24+
tool = QuerySet(Tool).filter(id=mcp_tool_id).first()
25+
if not tool:
26+
raise ValueError(f"Tool with ID {mcp_tool_id} not found.")
27+
servers = json.loads(tool.code)
28+
params = json.loads(json.dumps(tool_params))
29+
params = self.handle_variables(params)
30+
else:
31+
servers = json.loads(mcp_servers)
32+
params = json.loads(json.dumps(tool_params))
33+
params = self.handle_variables(params)
2234

2335
async def call_tool(t, a):
2436
client = MultiServerMCPClient(servers)

0 commit comments

Comments
 (0)