use crate::{
ResourceProvider,
mcp_integration::core::{ScimMcpServer, ScimToolResult},
operation_handler::ScimOperationRequest,
};
use serde_json::{Value, json};
pub async fn handle_get_schemas<P: ResourceProvider + Send + Sync + 'static>(
server: &ScimMcpServer<P>,
_arguments: Value,
) -> ScimToolResult {
let request = ScimOperationRequest::get_schemas();
let response = server.operation_handler.handle_operation(request).await;
if response.success {
ScimToolResult {
success: true,
content: response.data.unwrap_or_else(|| json!({"schemas": []})),
metadata: Some(json!({
"operation": "get_schemas"
})),
}
} else {
ScimToolResult {
success: false,
content: json!({
"error": response.error.unwrap_or_else(|| "Get schemas failed".to_string()),
"error_code": "GET_SCHEMAS_FAILED"
}),
metadata: None,
}
}
}
pub async fn handle_server_info<P: ResourceProvider + Send + Sync + 'static>(
server: &ScimMcpServer<P>,
_arguments: Value,
) -> ScimToolResult {
let info = json!({
"name": server.server_info.name,
"version": server.server_info.version,
"description": server.server_info.description,
"supported_resource_types": server.server_info.supported_resource_types,
"capabilities": {
"user_management": true,
"multi_tenant": true,
"schema_introspection": true,
"search": true,
"pagination": true,
"filtering": true
},
"mcp_integration": {
"version": env!("CARGO_PKG_VERSION"),
"available_tools": server.get_tools().len()
}
});
ScimToolResult {
success: true,
content: info.clone(),
metadata: Some(json!({
"operation": "server_info"
})),
}
}