@@ -75,7 +75,7 @@ pub struct AnalysisScanTool {
7575}
7676
7777impl AnalysisScanTool {
78- pub fn call_tool ( & self ) -> Result < CallToolResult , CallToolError > {
78+ pub async fn call_tool ( & self ) -> Result < CallToolResult , CallToolError > {
7979 let project_path_str = self . path . as_deref ( ) . unwrap_or ( "." ) ;
8080 let display = self . display . clone ( ) . unwrap_or ( "matrix" . to_string ( ) ) ;
8181
@@ -86,29 +86,50 @@ impl AnalysisScanTool {
8686 _ => None ,
8787 } ;
8888
89- println ! ( "🔍 Analyzing project: {}" , project_path_str) ;
90- println ! ( "🔍 Display: {}" , display) ;
89+ // Log to stderr so we don't interfere with MCP stdout JSON messages
90+ eprintln ! ( "🔍 Analyzing project: {}" , project_path_str) ;
91+ eprintln ! ( "🔍 Display: {}" , display) ;
92+ eprintln ! ( "➡️ Calling syncable_cli::handle_analyze..." ) ;
93+
94+ let analysis_result = tokio:: task:: spawn_blocking ( {
95+ let project_path = Path :: new ( project_path_str) . to_path_buf ( ) ;
96+ move || {
97+ syncable_cli:: handle_analyze (
98+ project_path,
99+ true ,
100+ false ,
101+ display_format,
102+ None ,
103+ None ,
104+ )
105+ }
106+ } ) . await ;
91107
92- let analysis_result = syncable_cli:: handle_analyze (
93- Path :: new ( project_path_str) . to_path_buf ( ) ,
94- false ,
95- false ,
96- display_format,
97- None ,
98- None ,
99- ) ;
108+ let analysis_result = match analysis_result {
109+ Ok ( result) => result,
110+ Err ( e) => return Err ( CallToolError :: new ( AnalyzeToolError ( format ! ( "Task panicked: {}" , e) ) ) ) ,
111+ } ;
100112 match analysis_result {
101- Ok ( analysis) => {
102- let json_output = serde_json:: to_string_pretty ( & analysis) . unwrap_or_else ( |e| {
103- format ! (
104- "{{\" error\" : \" Failed to serialize analysis result: {}\" }}" ,
105- e
106- )
107- } ) ;
108- Ok ( CallToolResult :: text_content ( vec ! [ TextContent :: new( json_output, None , None ) ] ) )
113+ Ok ( analysis_json_str) => {
114+ eprintln ! ( "✅ handle_analyze returned ({} bytes)" , analysis_json_str. len( ) ) ;
115+
116+ // Validate JSON to ensure it's well-formed
117+ match serde_json:: from_str :: < serde_json:: Value > ( & analysis_json_str) {
118+ Ok ( _) => {
119+ eprintln ! ( "✅ JSON validation passed" ) ;
120+ eprintln ! ( "📤 Sending full response ({} bytes)" , analysis_json_str. len( ) ) ;
121+ Ok ( CallToolResult :: text_content ( vec ! [ TextContent :: new( analysis_json_str, None , None ) ] ) )
122+ }
123+ Err ( e) => {
124+ eprintln ! ( "⚠️ JSON validation failed: {}" , e) ;
125+ eprintln ! ( "First 500 chars: {}" , & analysis_json_str[ ..std:: cmp:: min( 500 , analysis_json_str. len( ) ) ] ) ;
126+ return Err ( CallToolError :: new ( AnalyzeToolError ( format ! ( "Invalid JSON response: {}" , e) ) ) ) ;
127+ }
128+ }
109129 }
110130 Err ( e) => {
111131 let error_message = format ! ( "Failed to analyze project: {}" , e) ;
132+ eprintln ! ( "❌ handle_analyze error: {}" , & error_message) ;
112133 Err ( CallToolError :: new ( AnalyzeToolError ( error_message) ) )
113134 }
114135 }
0 commit comments