@@ -83,7 +83,7 @@ def exec_code(self, code_str, keywords):
8383 return result .get ('data' )
8484 raise Exception (result .get ('msg' ))
8585
86- def _generate_mcp_server_code (self , _code ):
86+ def _generate_mcp_server_code (self , _code , params ):
8787 self .validate_banned_keywords (_code )
8888
8989 # 解析代码,提取导入语句和函数定义
@@ -100,7 +100,31 @@ def _generate_mcp_server_code(self, _code):
100100 if isinstance (node , ast .Import ) or isinstance (node , ast .ImportFrom ):
101101 imports .append (ast .unparse (node ))
102102 elif isinstance (node , ast .FunctionDef ):
103- # 为函数添加 @mcp.tool() 装饰器
103+ # 修改函数参数以包含 params 中的默认值
104+ func_name = node .name
105+ if func_name in params :
106+ func_params = params [func_name ]
107+ # 为函数参数设置默认值
108+ for i , arg in enumerate (node .args .args ):
109+ arg_name = arg .arg
110+ if arg_name in func_params :
111+ # 创建默认值节点
112+ default_value = func_params [arg_name ]
113+ if isinstance (default_value , str ):
114+ default_node = ast .Constant (value = default_value )
115+ elif isinstance (default_value , (int , float , bool )):
116+ default_node = ast .Constant (value = default_value )
117+ else :
118+ default_node = ast .Constant (value = str (default_value ))
119+
120+ # 添加到defaults列表
121+ if not hasattr (node .args , 'defaults' ) or node .args .defaults is None :
122+ node .args .defaults = []
123+ # 确保defaults列表长度正确
124+ while len (node .args .defaults ) < len (node .args .args ):
125+ node .args .defaults .insert (0 , None )
126+ node .args .defaults [i ] = default_node
127+
104128 func_code = ast .unparse (node )
105129 functions .append (f"@mcp.tool()\n { func_code } \n " )
106130 else :
@@ -116,9 +140,9 @@ def _generate_mcp_server_code(self, _code):
116140
117141 return "\n " .join (code_parts )
118142
119- def generate_mcp_server_code (self , code_str ):
143+ def generate_mcp_server_code (self , code_str , params ):
120144 python_paths = CONFIG .get_sandbox_python_package_paths ().split (',' )
121- code = self ._generate_mcp_server_code (code_str )
145+ code = self ._generate_mcp_server_code (code_str , params )
122146 return f"""
123147import os
124148import sys
@@ -132,6 +156,34 @@ def generate_mcp_server_code(self, code_str):
132156exec({ dedent (code )!a} )
133157"""
134158
159+ def get_tool_mcp_config (self , code , params ):
160+ code = self .generate_mcp_server_code (code , params )
161+
162+ _id = uuid .uuid7 ()
163+ code_path = f'{ self .sandbox_path } /execute/{ _id } .py'
164+ with open (code_path , 'w' ) as f :
165+ f .write (code )
166+ if self .sandbox :
167+ os .system (f"chown { self .user } :root { code_path } " )
168+
169+ tool_config = {
170+ 'command' : 'su' ,
171+ 'args' : [
172+ '-s' , sys .executable ,
173+ '-c' , f"exec(open('{ code_path } ', 'r').read())" ,
174+ self .user ,
175+ ],
176+ 'cwd' : self .sandbox_path ,
177+ 'transport' : 'stdio' ,
178+ }
179+ else :
180+ tool_config = {
181+ 'command' : sys .executable ,
182+ 'args' : [code_path ],
183+ 'transport' : 'stdio' ,
184+ }
185+ return _id , tool_config
186+
135187 def _exec_sandbox (self , _code , _id ):
136188 exec_python_file = f'{ self .sandbox_path } /execute/{ _id } .py'
137189 with open (exec_python_file , 'w' ) as file :
0 commit comments