66 @date:2026/3/6 13:59
77 @desc:
88"""
9+ import asyncio
10+ import json
911# coding=utf-8
1012import pickle
1113from functools import reduce
2426from application .flow .i_step_node import ToolWorkflowPostHandler
2527from application .flow .tool_workflow_manage import ToolWorkflowManage
2628from application .models import ChatRecord
29+ from application .serializers .application import McpServersSerializer , get_mcp_tools
2730from application .serializers .common import ToolExecute
2831from common .exception .app_exception import AppApiException
2932from common .field .common import UploadedFileField
@@ -169,6 +172,9 @@ def edit(self, instance: Dict):
169172 'work_flow' : instance .get ('work_flow' ,
170173 {}), },
171174 defaults = {
175+ 'tool_id' : self .data .get ("tool_id" ),
176+ 'workspace_id' : self .data .get (
177+ 'workspace_id' ),
172178 'work_flow' : instance .get ('work_flow' )
173179 })
174180 return self .one ()
@@ -192,5 +198,40 @@ def edit(self, instance: Dict):
192198
193199 def one (self ):
194200 self .is_valid (raise_exception = True )
195- workflow = QuerySet (KnowledgeWorkflow ).filter (knowledge_id = self .data .get ('knowledge_id ' )).first ()
201+ workflow = QuerySet (ToolWorkflow ).filter (tool_id = self .data .get ('tool_id ' )).first ()
196202 return {** ToolWorkflowModelSerializer (workflow ).data }
203+
204+
205+ class ToolWorkflowMcpSerializer (serializers .Serializer ):
206+ tool_id = serializers .UUIDField (required = True , label = _ ('Tool id' ))
207+ user_id = serializers .UUIDField (required = True , label = _ ("User ID" ))
208+ workspace_id = serializers .CharField (required = False , allow_null = True , allow_blank = True , label = _ ("Workspace ID" ))
209+
210+ def is_valid (self , * , raise_exception = False ):
211+ super ().is_valid (raise_exception = True )
212+ workspace_id = self .data .get ('workspace_id' )
213+ query_set = QuerySet (Tool ).filter (id = self .data .get ('tool_id' ))
214+ if workspace_id :
215+ query_set = query_set .filter (workspace_id = workspace_id )
216+ if not query_set .exists ():
217+ raise AppApiException (500 , _ ('Tool id does not exist' ))
218+
219+ def get_mcp_servers (self , instance , with_valid = True ):
220+ if with_valid :
221+ self .is_valid (raise_exception = True )
222+ McpServersSerializer (data = instance ).is_valid (raise_exception = True )
223+ servers = json .loads (instance .get ('mcp_servers' ))
224+ for server , config in servers .items ():
225+ if config .get ('transport' ) not in ['sse' , 'streamable_http' ]:
226+ raise AppApiException (500 , _ ('Only support transport=sse or transport=streamable_http' ))
227+ tools = []
228+ for server in servers :
229+ tools += [
230+ {
231+ 'server' : server ,
232+ 'name' : tool .name ,
233+ 'description' : tool .description ,
234+ 'args_schema' : tool .args_schema ,
235+ }
236+ for tool in asyncio .run (get_mcp_tools ({server : servers [server ]}))]
237+ return tools
0 commit comments