From 1df088845d30af627759b7c2488dd93ed81cdd50 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Mon, 2 Mar 2026 10:15:32 -0500 Subject: [PATCH] fix(mcp): mcp_client refactor, claude_mma_exec update --- mcp_client.py | 46 ++++++++++++++++++++------------------ scripts/claude_mma_exec.py | 3 ++- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/mcp_client.py b/mcp_client.py index 47bc19a..3dc5a45 100644 --- a/mcp_client.py +++ b/mcp_client.py @@ -807,39 +807,41 @@ def dispatch(tool_name: str, tool_input: dict[str, Any]) -> str: """ Dispatch an MCP tool call by name. Returns the result as a string. """ + # Handle aliases + path = tool_input.get("path", tool_input.get("file_path", tool_input.get("dir_path", ""))) if tool_name == "read_file": - return read_file(tool_input.get("path", "")) + return read_file(path) if tool_name == "list_directory": - return list_directory(tool_input.get("path", "")) + return list_directory(path) if tool_name == "search_files": - return search_files(tool_input.get("path", ""), tool_input.get("pattern", "*")) + return search_files(path, tool_input.get("pattern", "*")) if tool_name == "get_file_summary": - return get_file_summary(tool_input.get("path", "")) + return get_file_summary(path) if tool_name == "py_get_skeleton": - return py_get_skeleton(tool_input.get("path", "")) + return py_get_skeleton(path) if tool_name == "py_get_code_outline": - return py_get_code_outline(tool_input.get("path", "")) + return py_get_code_outline(path) if tool_name == "py_get_definition": - return py_get_definition(tool_input.get("path", ""), tool_input.get("name", "")) + return py_get_definition(path, tool_input.get("name", "")) if tool_name == "py_update_definition": - return py_update_definition(tool_input.get("path", ""), tool_input.get("name", ""), tool_input.get("new_content", "")) + return py_update_definition(path, tool_input.get("name", ""), tool_input.get("new_content", "")) if tool_name == "py_get_signature": - return py_get_signature(tool_input.get("path", ""), tool_input.get("name", "")) + return py_get_signature(path, tool_input.get("name", "")) if tool_name == "py_set_signature": - return py_set_signature(tool_input.get("path", ""), tool_input.get("name", ""), tool_input.get("new_signature", "")) + return py_set_signature(path, tool_input.get("name", ""), tool_input.get("new_signature", "")) if tool_name == "py_get_class_summary": - return py_get_class_summary(tool_input.get("path", ""), tool_input.get("name", "")) + return py_get_class_summary(path, tool_input.get("name", "")) if tool_name == "py_get_var_declaration": - return py_get_var_declaration(tool_input.get("path", ""), tool_input.get("name", "")) + return py_get_var_declaration(path, tool_input.get("name", "")) if tool_name == "py_set_var_declaration": - return py_set_var_declaration(tool_input.get("path", ""), tool_input.get("name", ""), tool_input.get("new_declaration", "")) + return py_set_var_declaration(path, tool_input.get("name", ""), tool_input.get("new_declaration", "")) if tool_name == "get_file_slice": - return get_file_slice(tool_input.get("path", ""), tool_input.get("start_line", 1), tool_input.get("end_line", 1)) + return get_file_slice(path, tool_input.get("start_line", 1), tool_input.get("end_line", 1)) if tool_name == "set_file_slice": - return set_file_slice(tool_input.get("path", ""), tool_input.get("start_line", 1), tool_input.get("end_line", 1), tool_input.get("new_content", "")) + return set_file_slice(path, tool_input.get("start_line", 1), tool_input.get("end_line", 1), tool_input.get("new_content", "")) if tool_name == "get_git_diff": return get_git_diff( - tool_input.get("path", ""), + path, tool_input.get("base_rev", "HEAD"), tool_input.get("head_rev", "") ) @@ -850,17 +852,17 @@ def dispatch(tool_name: str, tool_input: dict[str, Any]) -> str: if tool_name == "get_ui_performance": return get_ui_performance() if tool_name == "py_find_usages": - return py_find_usages(tool_input.get("path", ""), tool_input.get("name", "")) + return py_find_usages(path, tool_input.get("name", "")) if tool_name == "py_get_imports": - return py_get_imports(tool_input.get("path", "")) + return py_get_imports(path) if tool_name == "py_check_syntax": - return py_check_syntax(tool_input.get("path", "")) + return py_check_syntax(path) if tool_name == "py_get_hierarchy": - return py_get_hierarchy(tool_input.get("path", ""), tool_input.get("class_name", "")) + return py_get_hierarchy(path, tool_input.get("class_name", "")) if tool_name == "py_get_docstring": - return py_get_docstring(tool_input.get("path", ""), tool_input.get("name", "")) + return py_get_docstring(path, tool_input.get("name", "")) if tool_name == "get_tree": - return get_tree(tool_input.get("path", ""), tool_input.get("max_depth", 2)) + return get_tree(path, tool_input.get("max_depth", 2)) return f"ERROR: unknown MCP tool '{tool_name}'" # ------------------------------------------------------------------ tool schema helpers # These are imported by ai_client.py to build provider-specific declarations. diff --git a/scripts/claude_mma_exec.py b/scripts/claude_mma_exec.py index 9a786ed..0a9b912 100644 --- a/scripts/claude_mma_exec.py +++ b/scripts/claude_mma_exec.py @@ -204,7 +204,8 @@ def execute_agent(role: str, prompt: str, docs: list[str]) -> str: capture_output=True, text=True, encoding='utf-8', - env=env + env=env, + creationflags=subprocess.CREATE_NO_WINDOW if hasattr(subprocess, 'CREATE_NO_WINDOW') else 0, ) # claude --print outputs plain text — no JSON parsing needed result = process.stdout if process.stdout else f"Error: {process.stderr}"