@@ -103,31 +103,35 @@ def _generate_mcp_server_code(self, _code, params):
103103 # 修改函数参数以包含 params 中的默认值
104104 arg_names = [arg .arg for arg in node .args .args ]
105105
106- # 为有默认值的参数添加默认值
106+ # 为参数添加默认值,确保参数顺序正确
107107 defaults = []
108- for arg_name in arg_names :
108+ num_defaults = 0
109+
110+ # 从后往前检查哪些参数有默认值
111+ for i , arg_name in enumerate (arg_names ):
109112 if arg_name in params :
110- # 将参数值转换为 AST 节点
111- default_value = params [arg_name ]
112- if isinstance (default_value , str ):
113- defaults .append (ast .Constant (value = default_value ))
114- elif isinstance (default_value , (int , float , bool )):
115- defaults .append (ast .Constant (value = default_value ))
116- elif default_value is None :
117- defaults .append (ast .Constant (value = None ))
113+ num_defaults = len (arg_names ) - i
114+ break
115+
116+ # 为有默认值的参数创建默认值列表
117+ if num_defaults > 0 :
118+ for i in range (len (arg_names ) - num_defaults , len (arg_names )):
119+ arg_name = arg_names [i ]
120+ if arg_name in params :
121+ default_value = params [arg_name ]
122+ if isinstance (default_value , str ):
123+ defaults .append (ast .Constant (value = default_value ))
124+ elif isinstance (default_value , (int , float , bool )):
125+ defaults .append (ast .Constant (value = default_value ))
126+ elif default_value is None :
127+ defaults .append (ast .Constant (value = None ))
128+ else :
129+ defaults .append (ast .Constant (value = str (default_value )))
118130 else :
119- # 对于复杂类型,使用字符串表示
120- defaults .append (ast .Constant (value = str (default_value )))
121- else :
122- defaults .append (None )
123-
124- # 只保留非 None 的默认值(从右到左)
125- while defaults and defaults [- 1 ] is None :
126- defaults .pop ()
127-
128- # 更新函数的默认参数
129- if defaults :
130- node .args .defaults = [d for d in defaults if d is not None ]
131+ # 如果某个参数没有默认值,需要添加 None 占位
132+ defaults .append (ast .Constant (value = None ))
133+
134+ node .args .defaults = defaults
131135
132136 func_code = ast .unparse (node )
133137 functions .append (f"@mcp.tool()\n { func_code } \n " )
0 commit comments