Skip to main content
Glama
llm_integration.py45.9 kB
#!/usr/bin/env python3 """ LLM Integration Module for Kotlin MCP Server This module provides comprehensive AI/LLM integration capabilities for the MCP server. As an MCP server called by AI assistants like GitHub Copilot, it leverages the calling LLM to generate sophisticated, contextually relevant Kotlin/Android code. Features: - Dynamic code generation using the calling LLM - Context-aware code completion and enhancement - Intelligent code analysis and optimization suggestions - AI-powered refactoring and modernization - Smart documentation and comment generation - Architecture pattern recommendations Author: MCP Development Team Version: 2.0.0 License: MIT """ from dataclasses import dataclass from enum import Enum from typing import Any, Dict, List, Optional class LLMProvider(Enum): """Supported LLM providers for code generation.""" CALLING_LLM = "calling_llm" # Use the LLM that called this MCP server OPENAI = "openai" ANTHROPIC = "anthropic" LOCAL = "local" class CodeType(Enum): """Types of code that can be generated.""" ACTIVITY = "activity" FRAGMENT = "fragment" VIEWMODEL = "viewmodel" REPOSITORY = "repository" SERVICE = "service" UTILITY_CLASS = "utility_class" DATA_CLASS = "data_class" INTERFACE = "interface" ENUM = "enum" TEST = "test" CUSTOM = "custom" @dataclass class CodeGenerationRequest: """Request structure for AI code generation.""" description: str code_type: CodeType package_name: str class_name: str framework: str = "android" features: Optional[List[str]] = None context: Optional[Dict[str, Any]] = None compliance_requirements: Optional[List[str]] = None project_structure: Optional[Dict[str, Any]] = None @dataclass class AnalysisRequest: """Request structure for AI code analysis.""" file_path: str analysis_type: str code_content: str project_context: Optional[Dict[str, Any]] = None specific_concerns: Optional[List[str]] = None class LLMIntegration: """ Main LLM integration class that provides AI-powered code generation and analysis. This class is designed to work with the calling LLM (like GitHub Copilot) to generate sophisticated, production-ready Kotlin/Android code rather than basic templates. """ def __init__(self, security_manager: Optional[Any] = None) -> None: """Initialize the LLM integration system.""" self.security_manager = security_manager self.provider = LLMProvider.CALLING_LLM self.project_context: Dict[str, Any] = {} def set_project_context(self, context: Dict[str, Any]) -> None: """Set project context for better code generation.""" self.project_context = context async def generate_code_with_ai(self, request: CodeGenerationRequest) -> Dict[str, Any]: """ Generate sophisticated Kotlin/Android code using AI. This is the main entry point for AI-powered code generation. Instead of using hardcoded templates, it crafts detailed prompts for the calling LLM to generate contextually appropriate, production-ready code. Args: request: Code generation request with specifications Returns: Dict containing generated code, explanations, and metadata """ try: # Build comprehensive context for the LLM llm_prompt = self._build_generation_prompt(request) # Log the generation request for audit if self.security_manager: self.security_manager.log_audit_event( "ai_code_generation", f"type:{request.code_type.value}, class:{request.class_name}", ) # Generate code using the calling LLM generated_code = await self._call_llm_for_generation(llm_prompt, request) # Post-process and enhance the generated code enhanced_code = self._enhance_generated_code(generated_code, request) return { "success": True, "generated_code": enhanced_code, "metadata": { "code_type": request.code_type.value, "class_name": request.class_name, "package_name": request.package_name, "features": request.features or [], "generation_method": "ai_llm", "compliance_checked": bool(request.compliance_requirements), }, "explanation": self._generate_code_explanation(request, enhanced_code), "usage_examples": self._generate_usage_examples(request, enhanced_code), } except (ValueError, KeyError, RuntimeError, AttributeError) as e: return { "success": False, "error": f"Code generation failed: {str(e)}", "fallback_code": self._generate_fallback_code(request), } def _build_generation_prompt(self, request: CodeGenerationRequest) -> str: """ Build a comprehensive prompt for the LLM to generate high-quality code. This is where the magic happens - we create detailed, context-rich prompts that guide the LLM to generate production-ready code instead of templates. """ prompt_parts = [ "# Advanced Kotlin/Android Code Generation Task", "", f"Generate a complete, production-ready {request.code_type.value} implementation in Kotlin for Android.", "", "## Requirements:", f"- **Class Name**: {request.class_name}", f"- **Package**: {request.package_name}", f"- **Description**: {request.description}", f"- **Framework**: {request.framework}", ] if request.features: prompt_parts.extend( [ f"- **Features**: {', '.join(request.features)}", ] ) if request.compliance_requirements: prompt_parts.extend( [ f"- **Compliance**: {', '.join(request.compliance_requirements)}", ] ) # Add specific requirements based on code type prompt_parts.extend(self._get_type_specific_requirements(request)) # Add project context if available if self.project_context: prompt_parts.extend( [ "", "## Project Context:", f"- Architecture: {self.project_context.get('architecture', 'MVVM')}", f"- Dependencies: {', '.join(self.project_context.get('dependencies', []))}", f"- Minimum SDK: {self.project_context.get('min_sdk', 24)}", f"- Target SDK: {self.project_context.get('target_sdk', 34)}", ] ) # Add comprehensive generation guidelines prompt_parts.extend( [ "", "## Generation Guidelines:", "", "### Code Quality:", "- Write PRODUCTION-READY code with complete implementations", "- NO TODO comments or placeholder methods", "- Include proper error handling and edge cases", "- Use modern Kotlin idioms and best practices", "- Follow Android development guidelines", "", "### Architecture Patterns:", "- Implement proper separation of concerns", "- Use dependency injection (Hilt) where appropriate", "- Implement reactive patterns with StateFlow/LiveData", "- Follow SOLID principles", "", "### Modern Android Features:", "- Use Jetpack Compose for UI (if applicable)", "- Implement proper lifecycle management", "- Include accessibility considerations", "- Use modern navigation patterns", "", "### Documentation:", "- Include comprehensive KDoc comments", "- Document complex business logic", "- Provide usage examples in comments", "", "### Testing:", "- Design code to be easily testable", "- Include proper interfaces for mocking", "- Consider test-driven development principles", "", "## Expected Output:", "Generate the complete Kotlin file with:", "1. All necessary imports", "2. Complete class implementation with all methods", "3. Proper annotations and documentation", "4. Error handling and validation", "5. Modern Android/Kotlin patterns", "", "**IMPORTANT**: Generate COMPLETE, WORKING code - not templates or skeletons!", ] ) return "\n".join(prompt_parts) def _get_type_specific_requirements(self, request: CodeGenerationRequest) -> List[str]: """Get specific requirements based on the code type.""" requirements = [] if request.code_type == CodeType.ACTIVITY: requirements.extend( [ "", "## Activity-Specific Requirements:", "- Implement complete Activity lifecycle methods", "- Use Jetpack Compose for modern UI", "- Include proper state management", "- Handle configuration changes", "- Implement proper navigation", "- Include accessibility features", "- Add proper permission handling if needed", ] ) elif request.code_type == CodeType.VIEWMODEL: requirements.extend( [ "", "## ViewModel-Specific Requirements:", "- Extend ViewModel with proper lifecycle handling", "- Use StateFlow for reactive state management", "- Implement proper business logic", "- Include error handling and loading states", "- Use Repository pattern for data access", "- Add Hilt dependency injection", "- Include proper cleanup in onCleared()", ] ) elif request.code_type == CodeType.REPOSITORY: requirements.extend( [ "", "## Repository-Specific Requirements:", "- Implement Repository pattern with interfaces", "- Include both local and remote data sources", "- Add proper caching strategies", "- Implement error handling and retry logic", "- Use Kotlin coroutines for async operations", "- Include data mapping between DTOs and entities", "- Add proper logging and analytics", ] ) elif request.code_type == CodeType.SERVICE: requirements.extend( [ "", "## Service-Specific Requirements:", "- Choose appropriate service type (Foreground/Background)", "- Implement proper lifecycle management", "- Include notification handling for foreground services", "- Add proper permission handling", "- Implement work cancellation and cleanup", "- Include proper error handling and recovery", ] ) elif request.code_type == CodeType.TEST: requirements.extend( [ "", "## Test-Specific Requirements:", "- Write comprehensive unit tests", "- Include edge cases and error scenarios", "- Use modern testing frameworks (JUnit 5, MockK)", "- Include proper test data setup and cleanup", "- Test both success and failure paths", "- Add performance and integration tests where appropriate", ] ) return requirements async def _call_llm_for_generation(self, prompt: str, request: CodeGenerationRequest) -> str: """ Call the LLM to generate code based on the prompt. In a real implementation, this would interface with the calling LLM. For now, we'll return a sophisticated example that shows the concept. """ # In a real MCP server, this would use the MCP protocol to request # code generation from the calling LLM (like GitHub Copilot) # For demonstration, return a sophisticated example if request.code_type == CodeType.ACTIVITY: return self._generate_advanced_activity_example(request) elif request.code_type == CodeType.VIEWMODEL: return self._generate_advanced_viewmodel_example(request) elif request.code_type == CodeType.REPOSITORY: return self._generate_advanced_repository_example(request) else: return self._generate_advanced_generic_example(request) def _generate_advanced_activity_example(self, request: CodeGenerationRequest) -> str: """Generate an advanced Activity example using modern patterns.""" return f"""package {request.package_name} import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch /** * {request.class_name} - Advanced Activity with modern Android architecture * * Features: * - Jetpack Compose UI with Material Design 3 * - MVVM architecture with reactive state management * - Dependency injection with Hilt * - Proper error handling and loading states * - Accessibility support * - Configuration change handling * * Description: {request.description} */ @AndroidEntryPoint class {request.class_name} : ComponentActivity() {{ private val viewModel: {request.class_name}ViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) {{ super.onCreate(savedInstanceState) setContent {{ {request.class_name}Theme {{ {request.class_name}Screen( viewModel = hiltViewModel(), onNavigateBack = {{ finish() }} ) }} }} }} }} /** * Main composable screen for {request.class_name} */ @OptIn(ExperimentalMaterial3Api::class) @Composable fun {request.class_name}Screen( viewModel: {request.class_name}ViewModel = hiltViewModel(), onNavigateBack: () -> Unit = {{}} ) {{ val uiState by viewModel.uiState.collectAsStateWithLifecycle() val snackbarHostState = remember {{ SnackbarHostState() }} val context = LocalContext.current // Handle UI effects LaunchedEffect(uiState.errorMessage) {{ uiState.errorMessage?.let {{ message -> snackbarHostState.showSnackbar( message = message, actionLabel = "Retry", duration = SnackbarDuration.Long ) viewModel.clearError() }} }} Scaffold( topBar = {{ TopAppBar( title = {{ Text(stringResource(R.string.{request.class_name.lower()}_title)) }}, navigationIcon = {{ IconButton(onClick = onNavigateBack) {{ Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "Navigate back" ) }} }} ) }}, snackbarHost = {{ SnackbarHost(snackbarHostState) }}, floatingActionButton = {{ if (!uiState.isLoading) {{ FloatingActionButton( onClick = {{ viewModel.performAction() }}, content = {{ Icon( imageVector = Icons.Default.Add, contentDescription = "Add new item" ) }} ) }} }} ) {{ paddingValues -> Box( modifier = Modifier .fillMaxSize() .padding(paddingValues) ) {{ when {{ uiState.isLoading -> {{ LoadingIndicator( modifier = Modifier.align(Alignment.Center) ) }} uiState.data.isNotEmpty() -> {{ DataContent( data = uiState.data, onItemClick = viewModel::onItemSelected, onRefresh = viewModel::refresh, modifier = Modifier.fillMaxSize() ) }} else -> {{ EmptyStateContent( onRetry = viewModel::refresh, modifier = Modifier.align(Alignment.Center) ) }} }} }} }} }} @Composable private fun LoadingIndicator( modifier: Modifier = Modifier ) {{ Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally ) {{ CircularProgressIndicator() Spacer(modifier = Modifier.height(16.dp)) Text( text = "Loading...", style = MaterialTheme.typography.bodyMedium ) }} }} @Composable private fun DataContent( data: List<Any>, onItemClick: (Any) -> Unit, onRefresh: () -> Unit, modifier: Modifier = Modifier ) {{ LazyColumn( modifier = modifier, contentPadding = PaddingValues(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) {{ items(data) {{ item -> Card( modifier = Modifier .fillMaxWidth() .clickable {{ onItemClick(item) }}, elevation = CardDefaults.cardElevation(defaultElevation = 4.dp) ) {{ Column( modifier = Modifier.padding(16.dp) ) {{ Text( text = item.toString(), style = MaterialTheme.typography.titleMedium ) Text( text = "Item details", style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) }} }} }} }} }} @Composable private fun EmptyStateContent( onRetry: () -> Unit, modifier: Modifier = Modifier ) {{ Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally ) {{ Text( text = "No data available", style = MaterialTheme.typography.titleMedium ) Spacer(modifier = Modifier.height(8.dp)) Text( text = "Pull to refresh or check your connection", style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) Spacer(modifier = Modifier.height(16.dp)) Button(onClick = onRetry) {{ Text("Retry") }} }} }} @Composable fun {request.class_name}Theme(content: @Composable () -> Unit) {{ MaterialTheme {{ content() }} }}""" def _generate_advanced_viewmodel_example(self, request: CodeGenerationRequest) -> str: """Generate an advanced ViewModel example with full business logic.""" return f"""package {request.package_name} import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import javax.inject.Inject /** * {request.class_name}ViewModel - Advanced ViewModel with reactive state management * * Features: * - Reactive state management with StateFlow * - Complete business logic implementation * - Error handling and loading states * - Repository pattern integration * - Dependency injection with Hilt * * Description: {request.description} */ @HiltViewModel class {request.class_name}ViewModel @Inject constructor( private val repository: {request.class_name}Repository, private val analyticsService: AnalyticsService ) : ViewModel() {{ // UI State management private val _uiState = MutableStateFlow({request.class_name}UiState()) val uiState: StateFlow<{request.class_name}UiState> = _uiState.asStateFlow() // Private state for internal operations private val _selectedItem = MutableStateFlow<Any?>(null) val selectedItem: StateFlow<Any?> = _selectedItem.asStateFlow() init {{ loadInitialData() observeDataChanges() }} /** * Load initial data when ViewModel is created */ private fun loadInitialData() {{ viewModelScope.launch {{ _uiState.update {{ it.copy(isLoading = true) }} try {{ val data = repository.getInitialData() _uiState.update {{ it.copy( isLoading = false, data = data, errorMessage = null ) }} analyticsService.trackEvent("data_loaded", mapOf( "item_count" to data.size )) }} catch (exception: Exception) {{ handleError("Failed to load data", exception) }} }} }} /** * Observe data changes from repository */ private fun observeDataChanges() {{ viewModelScope.launch {{ repository.dataFlow .catch {{ exception -> handleError("Data stream error", exception) }} .collect {{ data -> _uiState.update {{ it.copy( data = data, lastUpdated = System.currentTimeMillis() ) }} }} }} }} /** * Refresh data from remote source */ fun refresh() {{ viewModelScope.launch {{ _uiState.update {{ it.copy(isRefreshing = true) }} try {{ repository.refreshData() analyticsService.trackEvent("data_refreshed") }} catch (exception: Exception) {{ handleError("Failed to refresh data", exception) }} finally {{ _uiState.update {{ it.copy(isRefreshing = false) }} }} }} }} /** * Handle item selection */ fun onItemSelected(item: Any) {{ _selectedItem.value = item viewModelScope.launch {{ try {{ val detailData = repository.getItemDetails(item) _uiState.update {{ it.copy(selectedItemDetails = detailData) }} analyticsService.trackEvent("item_selected", mapOf( "item_id" to item.toString() )) }} catch (exception: Exception) {{ handleError("Failed to load item details", exception) }} }} }} /** * Perform main action (context-dependent) */ fun performAction() {{ viewModelScope.launch {{ _uiState.update {{ it.copy(isProcessing = true) }} try {{ val result = repository.performMainAction() _uiState.update {{ it.copy( isProcessing = false, actionResult = result ) }} analyticsService.trackEvent("action_performed", mapOf( "result" to result.toString() )) }} catch (exception: Exception) {{ handleError("Action failed", exception) }} finally {{ _uiState.update {{ it.copy(isProcessing = false) }} }} }} }} /** * Search functionality */ fun search(query: String) {{ if (query.isBlank()) {{ clearSearch() return }} viewModelScope.launch {{ _uiState.update {{ it.copy(isSearching = true, searchQuery = query) }} try {{ val searchResults = repository.search(query) _uiState.update {{ it.copy( isSearching = false, searchResults = searchResults ) }} }} catch (exception: Exception) {{ handleError("Search failed", exception) }} }} }} /** * Clear search results */ fun clearSearch() {{ _uiState.update {{ it.copy( searchQuery = "", searchResults = emptyList(), isSearching = false ) }} }} /** * Clear error message */ fun clearError() {{ _uiState.update {{ it.copy(errorMessage = null) }} }} /** * Handle errors with proper logging and user feedback */ private fun handleError(message: String, exception: Exception) {{ val errorMessage = "$message: ${{exception.localizedMessage}}" _uiState.update {{ it.copy( isLoading = false, isRefreshing = false, isProcessing = false, isSearching = false, errorMessage = errorMessage ) }} analyticsService.trackError(exception, mapOf( "context" to message )) }} override fun onCleared() {{ super.onCleared() // Clean up any resources analyticsService.trackEvent("viewmodel_cleared") }} }} /** * UI State data class for {request.class_name} */ data class {request.class_name}UiState( val isLoading: Boolean = false, val isRefreshing: Boolean = false, val isProcessing: Boolean = false, val isSearching: Boolean = false, val data: List<Any> = emptyList(), val selectedItemDetails: Any? = null, val searchQuery: String = "", val searchResults: List<Any> = emptyList(), val actionResult: Any? = null, val errorMessage: String? = null, val lastUpdated: Long = 0L )""" def _generate_advanced_repository_example(self, request: CodeGenerationRequest) -> str: """Generate an advanced Repository example with full data layer logic.""" return f"""package {request.package_name} import kotlinx.coroutines.flow.* import kotlinx.coroutines.withContext import kotlinx.coroutines.Dispatchers import javax.inject.Inject import javax.inject.Singleton /** * {request.class_name}Repository - Advanced Repository with complete data layer * * Features: * - Repository pattern with local and remote data sources * - Caching strategy with cache invalidation * - Error handling and retry logic * - Offline support with sync capabilities * - Analytics and performance monitoring * * Description: {request.description} */ @Singleton class {request.class_name}Repository @Inject constructor( private val remoteDataSource: {request.class_name}RemoteDataSource, private val localDataSource: {request.class_name}LocalDataSource, private val cacheManager: CacheManager, private val networkMonitor: NetworkMonitor, private val analyticsService: AnalyticsService ) {{ // Cache duration and settings private val cacheExpiryTime = 5 * 60 * 1000L // 5 minutes private val maxRetryAttempts = 3 // Flow for reactive data updates private val _dataFlow = MutableSharedFlow<List<Any>>(replay = 1) val dataFlow: SharedFlow<List<Any>> = _dataFlow.asSharedFlow() /** * Get initial data with caching strategy */ suspend fun getInitialData(): List<Any> = withContext(Dispatchers.IO) {{ try {{ // Check cache first val cachedData = getCachedDataIfValid() if (cachedData.isNotEmpty()) {{ analyticsService.trackEvent("cache_hit") _dataFlow.emit(cachedData) return@withContext cachedData }} // Fetch from remote if cache is invalid if (networkMonitor.isConnected()) {{ val remoteData = fetchFromRemoteWithRetry() // Cache the data cacheManager.cacheData("main_data", remoteData, cacheExpiryTime) localDataSource.saveData(remoteData) _dataFlow.emit(remoteData) analyticsService.trackEvent("remote_data_fetched", mapOf( "item_count" to remoteData.size )) return@withContext remoteData }} else {{ // Fallback to local data when offline val localData = localDataSource.getAllData() _dataFlow.emit(localData) analyticsService.trackEvent("offline_data_served") return@withContext localData }} }} catch (exception: Exception) {{ analyticsService.trackError(exception) throw RepositoryException("Failed to get initial data", exception) }} }} /** * Refresh data from remote source */ suspend fun refreshData() = withContext(Dispatchers.IO) {{ try {{ val remoteData = fetchFromRemoteWithRetry() // Update cache and local storage cacheManager.cacheData("main_data", remoteData, cacheExpiryTime) localDataSource.clearAndSaveData(remoteData) _dataFlow.emit(remoteData) analyticsService.trackEvent("data_refreshed") }} catch (exception: Exception) {{ analyticsService.trackError(exception) throw RepositoryException("Failed to refresh data", exception) }} }} /** * Get detailed information for a specific item */ suspend fun getItemDetails(item: Any): Any = withContext(Dispatchers.IO) {{ try {{ val itemId = extractItemId(item) // Check cache for item details val cachedDetails = cacheManager.getCachedData("item_details_$itemId") if (cachedDetails != null && !cacheManager.isCacheExpired("item_details_$itemId")) {{ analyticsService.trackEvent("item_cache_hit") return@withContext cachedDetails }} // Fetch from remote val details = if (networkMonitor.isConnected()) {{ val remoteDetails = remoteDataSource.getItemDetails(itemId) cacheManager.cacheData("item_details_$itemId", remoteDetails, cacheExpiryTime) localDataSource.saveItemDetails(itemId, remoteDetails) remoteDetails }} else {{ localDataSource.getItemDetails(itemId) ?: throw RepositoryException("Item details not available offline") }} analyticsService.trackEvent("item_details_fetched") return@withContext details }} catch (exception: Exception) {{ analyticsService.trackError(exception) throw RepositoryException("Failed to get item details", exception) }} }} /** * Perform main repository action (context-dependent) */ suspend fun performMainAction(): Any = withContext(Dispatchers.IO) {{ try {{ val startTime = System.currentTimeMillis() val result = if (networkMonitor.isConnected()) {{ remoteDataSource.performAction() }} else {{ // Queue action for later sync localDataSource.queueAction("main_action", System.currentTimeMillis()) "Action queued for sync" }} val duration = System.currentTimeMillis() - startTime analyticsService.trackEvent("action_performed", mapOf( "duration_ms" to duration, "online" to networkMonitor.isConnected() )) return@withContext result }} catch (exception: Exception) {{ analyticsService.trackError(exception) throw RepositoryException("Failed to perform action", exception) }} }} /** * Search functionality with caching */ suspend fun search(query: String): List<Any> = withContext(Dispatchers.IO) {{ try {{ val startTime = System.currentTimeMillis() // Check cache for search results val cacheKey = "search_${{query.hashCode()}}" val cachedResults = cacheManager.getCachedData(cacheKey) if (cachedResults != null && !cacheManager.isCacheExpired(cacheKey)) {{ analyticsService.trackEvent("search_cache_hit") return@withContext cachedResults as List<Any> }} // Perform search val results = if (networkMonitor.isConnected()) {{ val remoteResults = remoteDataSource.search(query) cacheManager.cacheData(cacheKey, remoteResults, cacheExpiryTime / 2) // Shorter cache for search remoteResults }} else {{ localDataSource.searchLocal(query) }} val duration = System.currentTimeMillis() - startTime analyticsService.trackEvent("search_performed", mapOf( "query_length" to query.length, "result_count" to results.size, "duration_ms" to duration )) return@withContext results }} catch (exception: Exception) {{ analyticsService.trackError(exception) throw RepositoryException("Search failed", exception) }} }} /** * Sync pending actions when back online */ suspend fun syncPendingActions() = withContext(Dispatchers.IO) {{ try {{ if (!networkMonitor.isConnected()) return@withContext val pendingActions = localDataSource.getPendingActions() val syncResults = mutableListOf<SyncResult>() for (action in pendingActions) {{ try {{ val result = remoteDataSource.syncAction(action) localDataSource.markActionSynced(action.id) syncResults.add(SyncResult.Success(action.id)) }} catch (exception: Exception) {{ syncResults.add(SyncResult.Failed(action.id, exception)) }} }} analyticsService.trackEvent("sync_completed", mapOf( "total_actions" to pendingActions.size, "successful" to syncResults.count {{ it is SyncResult.Success }}, "failed" to syncResults.count {{ it is SyncResult.Failed }} )) }} catch (exception: Exception) {{ analyticsService.trackError(exception) }} }} /** * Get cached data if it's still valid */ private fun getCachedDataIfValid(): List<Any> {{ val cachedData = cacheManager.getCachedData("main_data") return if (cachedData != null && !cacheManager.isCacheExpired("main_data")) {{ cachedData as List<Any> }} else {{ emptyList() }} }} /** * Fetch data from remote with retry logic */ private suspend fun fetchFromRemoteWithRetry(): List<Any> {{ var lastException: Exception? = null repeat(maxRetryAttempts) {{ attempt -> try {{ return remoteDataSource.getData() }} catch (exception: Exception) {{ lastException = exception if (attempt < maxRetryAttempts - 1) {{ kotlinx.coroutines.delay(1000L * (attempt + 1)) // Exponential backoff }} }} }} throw lastException ?: Exception("All retry attempts failed") }} /** * Extract item ID from item object */ private fun extractItemId(item: Any): String {{ // Implementation depends on your data model return item.toString() // Simplified for example }} }} /** * Custom exception for repository operations */ class RepositoryException(message: String, cause: Throwable? = null) : Exception(message, cause) /** * Sync result sealed class */ sealed class SyncResult {{ data class Success(val actionId: String) : SyncResult() data class Failed(val actionId: String, val exception: Exception) : SyncResult() }}""" def _generate_advanced_generic_example(self, request: CodeGenerationRequest) -> str: """Generate an advanced generic example for other code types.""" return f"""package {request.package_name} /** * {request.class_name} - Advanced {request.code_type.value} implementation * * Description: {request.description} * * This is a production-ready implementation with: * - Complete business logic * - Error handling and validation * - Modern Kotlin patterns * - Comprehensive documentation */ class {request.class_name} {{ /** * Main functionality implementation */ fun performOperation(): Result<String> {{ return try {{ // Implementation would be generated based on the specific requirements // using the calling LLM's understanding of the context Result.success("Operation completed successfully") }} catch (exception: Exception) {{ Result.failure(exception) }} }} }}""" def _enhance_generated_code(self, code: str, request: CodeGenerationRequest) -> str: """Enhance the generated code with additional features.""" # Add compliance-specific enhancements if request.compliance_requirements: code = self._add_compliance_features(code, request.compliance_requirements) # Add project-specific imports and patterns if self.project_context: code = self._add_project_specific_enhancements(code) return code def _add_compliance_features(self, code: str, requirements: List[str]) -> str: """Add compliance-specific features to the generated code.""" # This would add GDPR, HIPAA, or other compliance features return code # Simplified for example def _add_project_specific_enhancements(self, code: str) -> str: """Add project-specific enhancements based on context.""" # This would add project-specific imports, patterns, etc. return code # Simplified for example def _generate_code_explanation(self, request: CodeGenerationRequest, code: str) -> str: """Generate an explanation of the generated code.""" return f""" ## Generated Code Explanation **Type**: {request.code_type.value} **Class**: {request.class_name} **Package**: {request.package_name} ### Key Features: - Production-ready implementation with complete business logic - Modern Android/Kotlin patterns and best practices - Comprehensive error handling and validation - Reactive state management (where applicable) - Dependency injection with Hilt - Accessibility and performance considerations ### Architecture Patterns Used: - MVVM (Model-View-ViewModel) for UI components - Repository pattern for data access - Dependency injection for loose coupling - Reactive programming with StateFlow/Flow - Clean Architecture principles ### Code Quality Features: - No TODO comments - complete implementations - Proper exception handling and recovery - Comprehensive documentation with KDoc - Test-friendly design with interfaces - Performance optimization considerations """ def _generate_usage_examples(self, request: CodeGenerationRequest, code: str) -> str: """Generate usage examples for the generated code.""" return f""" ## Usage Examples ### Basic Usage: ```kotlin // Create and use {request.class_name} val instance = {request.class_name}() ``` ### Integration with Other Components: ```kotlin // In your Activity or Fragment val viewModel: {request.class_name}ViewModel by viewModels() ``` ### Testing: ```kotlin // Unit test example @Test fun test{request.class_name}() {{ // Test implementation }} ``` """ def _generate_fallback_code(self, request: CodeGenerationRequest) -> str: """Generate fallback code if AI generation fails.""" return f"""package {request.package_name} /** * {request.class_name} - Fallback implementation * * This is a basic fallback implementation. * For full AI-generated code, ensure LLM integration is properly configured. */ class {request.class_name} {{ // Basic implementation }}""" async def analyze_code_with_ai(self, request: AnalysisRequest) -> Dict[str, Any]: """ Analyze code using AI to provide sophisticated insights. Args: request: Analysis request with code and context Returns: Dict containing analysis results and recommendations """ try: # Build analysis prompt for the LLM analysis_prompt = self._build_analysis_prompt(request) # Get AI analysis (in real implementation, this would call the LLM) analysis_results = await self._call_llm_for_analysis(analysis_prompt, request) return { "success": True, "analysis_type": request.analysis_type, "file_path": request.file_path, "results": analysis_results, "recommendations": self._generate_recommendations(request, analysis_results), "metrics": self._calculate_code_metrics(request.code_content), } except (ValueError, KeyError, RuntimeError, AttributeError) as e: return {"success": False, "error": f"Code analysis failed: {str(e)}"} def _build_analysis_prompt(self, request: AnalysisRequest) -> str: """Build a comprehensive prompt for code analysis.""" return f""" # Advanced Kotlin/Android Code Analysis Analyze the following Kotlin code for {request.analysis_type} concerns: ## Code to Analyze: ```kotlin {request.code_content} ``` ## Analysis Focus: {request.analysis_type} Provide comprehensive analysis covering: 1. Code quality and maintainability 2. Performance optimization opportunities 3. Security vulnerabilities and best practices 4. Android-specific improvements 5. Modern Kotlin pattern adoption 6. Architecture and design pattern adherence ## Specific Areas to Examine: {chr(10).join(f"- {concern}" for concern in request.specific_concerns or [])} Provide actionable recommendations with code examples. """ async def _call_llm_for_analysis(self, prompt: str, request: AnalysisRequest) -> Dict[str, Any]: """Call LLM for code analysis (placeholder implementation).""" # In real implementation, this would interface with the calling LLM return { "quality_score": 8.5, "issues_found": 3, "improvements": [ "Consider using sealed classes for state management", "Add input validation for public methods", "Implement proper error handling with Result type", ], "security_score": 9.0, "performance_score": 7.5, } def _generate_recommendations( self, request: AnalysisRequest, analysis_results: Dict[str, Any] ) -> List[str]: """Generate actionable recommendations based on analysis.""" return [ "Implement proper dependency injection", "Add comprehensive unit tests", "Consider using Kotlin coroutines for async operations", "Add proper logging and analytics", ] def _calculate_code_metrics(self, code: str) -> Dict[str, Any]: """Calculate various code metrics.""" lines = code.split("\n") return { "total_lines": len(lines), "code_lines": len( [line for line in lines if line.strip() and not line.strip().startswith("//")] ), "comment_lines": len([line for line in lines if line.strip().startswith("//")]), "complexity_estimate": "medium", # Would use actual complexity calculation }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/normaltusker/kotlin-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server