@@ -15,7 +15,7 @@ use super::tools::{
1515 CachedDiagnosticsParams , CallHierarchyCallsParams , CallHierarchyPrepareParams ,
1616 CodeActionsParams , CompletionsParams , DefinitionParams , DiagnosticsParams ,
1717 DocumentSymbolsParams , FormatDocumentParams , HoverParams , ReferencesParams , RenameParams ,
18- ServerLogsParams , ServerMessagesParams , WorkspaceSymbolParams ,
18+ ServerLogsParams , ServerMessagesParams , ServerStatusParams , WorkspaceSymbolParams ,
1919} ;
2020use crate :: bridge:: Translator ;
2121
@@ -422,6 +422,26 @@ impl McplsServer {
422422 Err ( e) => Err ( McpError :: internal_error ( e. to_string ( ) , None ) ) ,
423423 }
424424 }
425+
426+ /// Get the status of all registered LSP servers.
427+ #[ tool(
428+ description = "Status of all registered LSP servers. Returns server state, command, and document counts."
429+ ) ]
430+ async fn get_server_status (
431+ & self ,
432+ Parameters ( ServerStatusParams { } ) : Parameters < ServerStatusParams > ,
433+ ) -> Result < String , McpError > {
434+ let result = {
435+ let translator = self . context . translator . lock ( ) . await ;
436+ translator. handle_server_status ( ) . await
437+ } ;
438+
439+ match result {
440+ Ok ( value) => serde_json:: to_string ( & value)
441+ . map_err ( |e| McpError :: internal_error ( format ! ( "Serialization error: {e}" ) , None ) ) ,
442+ Err ( e) => Err ( McpError :: internal_error ( e. to_string ( ) , None ) ) ,
443+ }
444+ }
425445}
426446
427447#[ tool_handler]
@@ -838,4 +858,49 @@ mod tests {
838858 let result = server. get_server_messages ( params) . await ;
839859 assert ! ( result. is_ok( ) ) ;
840860 }
861+
862+ #[ tokio:: test]
863+ async fn test_server_status_tool_empty_workspace ( ) {
864+ let server = create_test_server ( ) ;
865+ let params = Parameters ( ServerStatusParams { } ) ;
866+
867+ let result = server. get_server_status ( params) . await ;
868+ assert ! ( result. is_ok( ) ) ;
869+
870+ let json_str = result. unwrap ( ) ;
871+ let parsed: serde_json:: Value = serde_json:: from_str ( & json_str) . unwrap ( ) ;
872+ assert ! ( parsed. get( "servers" ) . is_some( ) ) ;
873+
874+ let servers = parsed. get ( "servers" ) . unwrap ( ) . as_array ( ) . unwrap ( ) ;
875+ assert_eq ! ( servers. len( ) , 0 ) ;
876+ }
877+
878+ #[ tokio:: test]
879+ async fn test_server_status_tool_returns_json ( ) {
880+ let server = create_test_server ( ) ;
881+ let params = Parameters ( ServerStatusParams { } ) ;
882+
883+ let result = server. get_server_status ( params) . await ;
884+ assert ! ( result. is_ok( ) ) ;
885+
886+ let json_str = result. unwrap ( ) ;
887+ let parsed: serde_json:: Value = serde_json:: from_str ( & json_str) . unwrap ( ) ;
888+ assert ! ( parsed. is_object( ) ) ;
889+ }
890+
891+ #[ tokio:: test]
892+ async fn test_server_status_tool_document_count ( ) {
893+ let server = create_test_server ( ) ;
894+ let params = Parameters ( ServerStatusParams { } ) ;
895+
896+ let result = server. get_server_status ( params) . await ;
897+ assert ! ( result. is_ok( ) ) ;
898+
899+ let json_str = result. unwrap ( ) ;
900+ let parsed: serde_json:: Value = serde_json:: from_str ( & json_str) . unwrap ( ) ;
901+ assert ! ( parsed. get( "document_count" ) . is_some( ) ) ;
902+
903+ let count = parsed. get ( "document_count" ) . unwrap ( ) . as_u64 ( ) . unwrap ( ) ;
904+ assert_eq ! ( count, 0 ) ;
905+ }
841906}
0 commit comments