Skip to main content

do_memory_mcp/server/tools/external_signals/
status.rs

1//! External signal provider status tool handler for MCP server
2//!
3//! This module provides the tool for checking the status of configured
4//! external signal providers.
5
6use crate::server::MemoryMCPServer;
7use anyhow::Result;
8use serde_json::json;
9use tracing::debug;
10
11impl MemoryMCPServer {
12    /// Execute the external_signal_status tool
13    ///
14    /// # Arguments
15    ///
16    /// * `input` - Parameters for status check (provider filter)
17    ///
18    /// # Returns
19    ///
20    /// Returns detailed status information about configured external signal providers
21    pub async fn execute_external_signal_status(
22        &self,
23        input: crate::mcp::tools::external_signals::ExternalSignalStatusInput,
24    ) -> Result<serde_json::Value> {
25        self.track_tool_usage("external_signal_status").await;
26
27        debug!(
28            "Getting external signal provider status for: {:?}",
29            input.provider
30        );
31
32        // Build provider status list
33        let mut providers = vec![];
34
35        // Check AgentFS provider status
36        // NOTE: SDK is not currently integrated - stub implementation
37        let agentfs_status = crate::mcp::tools::external_signals::ProviderStatus {
38            name: "agentfs".to_string(),
39            configured: false,
40            enabled: false,
41            connected: false,
42            last_error: Some(
43                "SDK not integrated - stub implementation, no real signal data available"
44                    .to_string(),
45            ),
46            signal_count: 0,
47            weight: 0.3,
48            metadata: json!({
49                "db_path": null,
50                "sanitize": true,
51                "sdk_integrated": false,
52                "stub_implementation": true,
53                "sdk_version_available": "0.6.4",
54            }),
55        };
56
57        // Filter by provider if specified
58        if let Some(ref provider_filter) = input.provider {
59            if provider_filter == "agentfs" {
60                providers.push(agentfs_status);
61            }
62        } else {
63            // Return all providers
64            providers.push(agentfs_status);
65        }
66
67        let result = crate::mcp::tools::external_signals::ExternalSignalStatusOutput {
68            total_providers: providers.len(),
69            active_providers: providers
70                .iter()
71                .filter(|p| p.enabled && p.connected)
72                .count(),
73            providers,
74        };
75
76        // Convert result to JSON
77        Ok(json!(result))
78    }
79}
80
81#[cfg(test)]
82mod tests {
83    use super::*;
84
85    #[test]
86    #[allow(clippy::manual_async_fn)]
87    fn test_external_signal_status_signature_compile() {
88        // This test ensures the method signature compiles correctly
89        use crate::mcp::tools::external_signals::ExternalSignalStatusInput;
90        fn method_signature(
91            _server: &MemoryMCPServer,
92            _input: ExternalSignalStatusInput,
93        ) -> impl std::future::Future<Output = Result<serde_json::Value>> {
94            async { Ok(json!({})) }
95        }
96        let _ = method_signature; // Use the function to avoid unused warnings
97    }
98
99    #[test]
100    fn test_agentfs_status_has_sdk_unavailable_info() {
101        // Verify status output includes SDK unavailability information
102        let status = crate::mcp::tools::external_signals::ProviderStatus {
103            name: "agentfs".to_string(),
104            configured: false,
105            enabled: false,
106            connected: false,
107            last_error: Some("SDK not integrated".to_string()),
108            signal_count: 0,
109            weight: 0.3,
110            metadata: json!({"sdk_integrated": false}),
111        };
112
113        // Should have error message
114        assert!(status.last_error.is_some());
115        // Should indicate SDK not integrated
116        if let serde_json::Value::Object(map) = status.metadata {
117            assert!(map.contains_key("sdk_integrated"));
118            assert_eq!(map.get("sdk_integrated"), Some(&json!(false)));
119        }
120    }
121}