(self, _code, params, name=None, description=None, tool_id=None)
| 155 | raise Exception(result.get("msg") + (f"\n{subprocess_result.stderr}" if subprocess_result.stderr else "")) |
| 156 | |
| 157 | def _generate_mcp_server_code(self, _code, params, name=None, description=None, tool_id=None): |
| 158 | # 解析代码,提取导入语句和函数定义 |
| 159 | try: |
| 160 | tree = ast.parse(_code) |
| 161 | except SyntaxError: |
| 162 | return _code |
| 163 | imports = [] |
| 164 | functions = [] |
| 165 | other_code = [] |
| 166 | for node in tree.body: |
| 167 | if isinstance(node, ast.Import) or isinstance(node, ast.ImportFrom): |
| 168 | imports.append(ast.unparse(node)) |
| 169 | elif isinstance(node, ast.FunctionDef): |
| 170 | if node.name.startswith("_"): |
| 171 | other_code.append(ast.unparse(node)) |
| 172 | continue |
| 173 | # 修改函数参数以包含 params 中的默认值 |
| 174 | arg_names = [arg.arg for arg in node.args.args] |
| 175 | # 为参数添加默认值,确保参数顺序正确 |
| 176 | defaults = [] |
| 177 | num_defaults = 0 |
| 178 | # 从后往前检查哪些参数有默认值 |
| 179 | for i, arg_name in enumerate(arg_names): |
| 180 | if arg_name in params: |
| 181 | num_defaults = len(arg_names) - i |
| 182 | break |
| 183 | # 为有默认值的参数创建默认值列表 |
| 184 | if num_defaults > 0: |
| 185 | for i in range(len(arg_names) - num_defaults, len(arg_names)): |
| 186 | arg_name = arg_names[i] |
| 187 | if arg_name in params: |
| 188 | default_value = params[arg_name] |
| 189 | if isinstance(default_value, str): |
| 190 | defaults.append(ast.Constant(value=default_value)) |
| 191 | elif isinstance(default_value, (int, float, bool)): |
| 192 | defaults.append(ast.Constant(value=default_value)) |
| 193 | elif default_value is None: |
| 194 | defaults.append(ast.Constant(value=None)) |
| 195 | else: |
| 196 | defaults.append(ast.Constant(value=str(default_value))) |
| 197 | else: |
| 198 | # 如果某个参数没有默认值,需要添加 None 占位 |
| 199 | defaults.append(ast.Constant(value=None)) |
| 200 | node.args.defaults = defaults |
| 201 | # 将不支持 JSON Schema 的参数类型注解替换为 Any, |
| 202 | # 避免 FastMCP/Pydantic 生成 schema 时崩溃(如 requests.Response) |
| 203 | _safe_annotation_names = { |
| 204 | "str", |
| 205 | "int", |
| 206 | "float", |
| 207 | "bool", |
| 208 | "dict", |
| 209 | "list", |
| 210 | "tuple", |
| 211 | "set", |
| 212 | "bytes", |
| 213 | "Any", |
| 214 | "Optional", |
no test coverage detected