@@ -137,8 +137,8 @@ def exec_code(self, code_str, keywords, function_name=None):
137137 return result .get ('data' )
138138 raise Exception (result .get ('msg' ) + (f'\n { subprocess_result .stderr } ' if subprocess_result .stderr else '' ))
139139
140- def _generate_mcp_server_code (self , _code , params , name = None , description = None ):
141- # 解析代码, 提取导入语句和函数定义
140+ def _generate_mcp_server_code (self , _code , params , name = None , description = None , tool_id = None ):
141+ # 解析代码, 提取导入语句和函数定义
142142 try :
143143 tree = ast .parse (_code )
144144 except SyntaxError :
@@ -155,7 +155,7 @@ def _generate_mcp_server_code(self, _code, params, name=None, description=None):
155155 continue
156156 # 修改函数参数以包含 params 中的默认值
157157 arg_names = [arg .arg for arg in node .args .args ]
158- # 为参数添加默认值, 确保参数顺序正确
158+ # 为参数添加默认值, 确保参数顺序正确
159159 defaults = []
160160 num_defaults = 0
161161 # 从后往前检查哪些参数有默认值
@@ -178,26 +178,72 @@ def _generate_mcp_server_code(self, _code, params, name=None, description=None):
178178 else :
179179 defaults .append (ast .Constant (value = str (default_value )))
180180 else :
181- # 如果某个参数没有默认值, 需要添加 None 占位
181+ # 如果某个参数没有默认值, 需要添加 None 占位
182182 defaults .append (ast .Constant (value = None ))
183183 node .args .defaults = defaults
184+
185+ # 修改返回类型注解为 Result
186+ node .returns = ast .Name (id = 'Result' , ctx = ast .Load ())
187+
188+ # 修改 return 语句为 return Result(result=..., tool_id=...)
189+ class ReturnTransformer (ast .NodeTransformer ):
190+ def __init__ (self , func_name ):
191+ self .func_name = func_name
192+
193+ def visit_Return (self , node ):
194+ if node .value is None :
195+ # return 语句没有返回值
196+ new_return = ast .Return (
197+ value = ast .Call (
198+ func = ast .Name (id = 'Result' , ctx = ast .Load ()),
199+ args = [],
200+ keywords = [
201+ ast .keyword (arg = 'result' , value = ast .Constant (value = None )),
202+ ast .keyword (arg = 'tool_id' , value = ast .Constant (value = tool_id ))
203+ ]
204+ )
205+ )
206+ else :
207+ # return 语句有返回值
208+ new_return = ast .Return (
209+ value = ast .Call (
210+ func = ast .Name (id = 'Result' , ctx = ast .Load ()),
211+ args = [],
212+ keywords = [
213+ ast .keyword (arg = 'result' , value = node .value ),
214+ ast .keyword (arg = 'tool_id' , value = ast .Constant (value = tool_id ))
215+ ]
216+ )
217+ )
218+ return ast .copy_location (new_return , node )
219+
220+ transformer = ReturnTransformer (node .name )
221+ node = transformer .visit (node )
222+ ast .fix_missing_locations (node )
223+
184224 func_code = ast .unparse (node )
185- # 有些模型不支持name是中文, 例如: deepseek, 其他模型未知
225+ # 有些模型不支持name是中文, 例如: deepseek, 其他模型未知
186226 escaped_desc = (name + ' ' + description ).replace ('\n ' , ' ' ).replace ("'" , " " )
187227 functions .append (f"@mcp.tool(description='{ escaped_desc } ')\n { func_code } \n " )
188228 else :
189229 other_code .append (ast .unparse (node ))
230+
190231 # 构建完整的 MCP 服务器代码
191232 code_parts = ["from mcp.server.fastmcp import FastMCP" ]
192233 code_parts .extend (imports )
234+ code_parts .append (f"\n from pydantic import BaseModel" )
235+ code_parts .append (f"\n from typing import Any" )
236+ code_parts .append (f"\n class Result(BaseModel):" )
237+ code_parts .append (f"\n \t result: Any" )
238+ code_parts .append (f"\n \t tool_id: str\n " )
193239 code_parts .append (f"\n mcp = FastMCP(\" { uuid .uuid7 ()} \" )\n " )
194240 code_parts .extend (other_code )
195241 code_parts .extend (functions )
196242 code_parts .append ("\n mcp.run(transport=\" stdio\" )\n " )
197243 return "\n " .join (code_parts )
198244
199- def generate_mcp_server_code (self , code_str , params , name , description ):
200- code = self ._generate_mcp_server_code (code_str , params , name , description )
245+ def generate_mcp_server_code (self , code_str , params , name , description , tool_id ):
246+ code = self ._generate_mcp_server_code (code_str , params , name , description , tool_id )
201247 set_run_user = f'os.setgid({ pwd .getpwnam (_run_user ).pw_gid } );os.setuid({ pwd .getpwnam (_run_user ).pw_uid } );' if _enable_sandbox else ''
202248 return f"""
203249import os, sys, logging
@@ -212,8 +258,8 @@ def generate_mcp_server_code(self, code_str, params, name, description):
212258exec({ dedent (code )!a} )
213259"""
214260
215- def get_tool_mcp_config (self , code , params , name , description ):
216- _code = self .generate_mcp_server_code (code , params , name , description )
261+ def get_tool_mcp_config (self , tool , params ):
262+ _code = self .generate_mcp_server_code (tool . code , params , tool . name , tool . desc , str ( tool . id ) )
217263 maxkb_logger .debug (f"Python code of mcp tool: { _code } " )
218264 compressed_and_base64_encoded_code_str = base64 .b64encode (gzip .compress (_code .encode ())).decode ()
219265 tool_config = {
0 commit comments