Skip to main content
Glama

DHIS2 MCP Server

by Dradebo
documentation-integration.ts13.2 kB
/** * Integration layer for documentation access with external MCPs */ import { DocumentationAccessSystem, DocumentationQuery } from './documentation-access.js'; export class DocumentationMCPIntegration { private docSystem: DocumentationAccessSystem; private mcpConnections: Map<string, any> = new Map(); constructor() { this.docSystem = new DocumentationAccessSystem(); } /** * Setup connections to external MCP servers */ async setupMCPConnections(config: { filesystemMcpPath?: string; websearchMcpPath?: string; enableWebSearch?: boolean; enableLocalSearch?: boolean; androidSdkPath?: string; }): Promise<string> { let setupResults: string[] = []; try { // Setup filesystem MCP connection if (config.enableLocalSearch && config.filesystemMcpPath) { const filesystemClient = await this.connectToMCP('filesystem', config.filesystemMcpPath); if (filesystemClient) { this.docSystem.registerMCPClient('filesystem', filesystemClient); setupResults.push('✅ Filesystem MCP connected'); } else { setupResults.push('❌ Failed to connect to filesystem MCP'); } } // Setup web search MCP connection if (config.enableWebSearch && config.websearchMcpPath) { const websearchClient = await this.connectToMCP('websearch', config.websearchMcpPath); if (websearchClient) { this.docSystem.registerMCPClient('websearch', websearchClient); setupResults.push('✅ Web search MCP connected'); } else { setupResults.push('❌ Failed to connect to web search MCP'); } } // Validate Android SDK path if (config.androidSdkPath) { process.env.ANDROID_HOME = config.androidSdkPath; setupResults.push(`✅ Android SDK path set to: ${config.androidSdkPath}`); } else if (process.env.ANDROID_HOME) { setupResults.push(`✅ Using existing Android SDK path: ${process.env.ANDROID_HOME}`); } else { setupResults.push('⚠️ No Android SDK path configured - local Android docs will be unavailable'); } return `📚 **Documentation Access Setup Complete** ${setupResults.join('\n')} **Available Search Types:** - Local: ${config.enableLocalSearch ? '✅ Enabled' : '❌ Disabled'} - Web: ${config.enableWebSearch ? '✅ Enabled' : '❌ Disabled'} **Next Steps:** 1. Use \`dhis2_query_documentation\` to search across all sources 2. Use \`dhis2_search_android_sdk\` for Android-specific searches 3. Use \`dhis2_search_web_docs\` for web-only searches **Example:** \`\`\`json { "topic": "LocationManager", "platform": "android", "searchType": "both", "apiLevel": 34, "language": "kotlin" } \`\`\``; } catch (error) { return `❌ **Setup Failed:** ${error instanceof Error ? error.message : String(error)} **Troubleshooting:** - Ensure MCP server paths are correct and executable - Check that external MCP servers are properly installed - Verify filesystem permissions for local documentation access`; } } /** * Connect to an external MCP server */ private async connectToMCP(type: string, mcpPath: string): Promise<any> { try { // This would be the actual MCP client connection // For now, return a mock client that shows the structure needed return { async callTool(request: { name: string; arguments: any }) { // Mock implementation - in reality this would call the external MCP console.log(`[${type} MCP] Calling tool: ${request.name}`, request.arguments); // Return mock responses for demonstration if (type === 'filesystem' && request.name === 'search_files') { return { files: [ { path: '/mock/android/docs/reference/LocationManager.html' }, { path: '/mock/android/docs/guide/location.html' } ] }; } if (type === 'filesystem' && request.name === 'read_file') { return { text: `Mock documentation content for ${request.arguments.path}` }; } if (type === 'websearch' && request.name === 'web_search') { return { results: [ { url: 'https://developer.android.com/reference/android/location/LocationManager', title: 'LocationManager | Android Developers', snippet: 'This class provides access to the system location services...' } ] }; } return { success: false, error: 'Mock implementation' }; } }; } catch (error) { console.error(`Failed to connect to ${type} MCP:`, error); return null; } } /** * Main documentation query handler */ async queryDocumentation(query: DocumentationQuery): Promise<string> { try { const results = await this.docSystem.queryDocumentation(query); return this.docSystem.generateDocumentationResponse(results, query); } catch (error) { return `❌ **Documentation Query Failed** **Error:** ${error instanceof Error ? error.message : String(error)} **Possible Solutions:** - Check that MCP connections are properly configured - Ensure search parameters are valid - Try a simpler query first - Verify external MCP servers are running **Debug Info:** - Query: ${JSON.stringify(query, null, 2)}`; } } /** * Android SDK specific search */ async searchAndroidSDK(args: { topic: string; apiLevel?: number; docType?: string; includeExamples?: boolean; }): Promise<string> { const query: DocumentationQuery = { topic: args.topic, platform: 'android', searchType: 'local', ...(args.apiLevel && { apiLevel: args.apiLevel }), language: 'kotlin' }; if (!process.env.ANDROID_HOME) { return `❌ **Android SDK Not Configured** **Setup Required:** 1. Set ANDROID_HOME environment variable 2. Or use \`dhis2_setup_documentation_access\` with androidSdkPath **Example Setup:** \`\`\`json { "androidSdkPath": "/Users/yourusername/Library/Android/sdk" } \`\`\``; } return await this.queryDocumentation(query); } /** * Web documentation search */ async searchWebDocs(args: { topic: string; sites?: string[]; language?: string; includeStackOverflow?: boolean; maxResults?: number; }): Promise<string> { const query: DocumentationQuery = { topic: args.topic, platform: 'general', searchType: 'web', language: args.language as any, ...(args.sites && args.sites.length > 0 && { context: `site:${args.sites.join(' OR site:')}` }) }; return await this.queryDocumentation(query); } /** * Generate detailed explanation with examples */ async explainWithExamples(args: { concept: string; platform: 'android' | 'web' | 'dhis2'; level?: string; useCase?: string; preferredLanguage?: string; }): Promise<string> { const query: DocumentationQuery = { topic: args.concept, platform: args.platform, searchType: 'both', ...(args.useCase && { context: args.useCase }), language: args.preferredLanguage as any }; const results = await this.docSystem.queryDocumentation(query); if (results.length === 0) { return `❌ No documentation found for "${args.concept}" on ${args.platform}. **Suggestions:** - Try broader search terms - Check spelling - Use different platform (android, web, dhis2, general)`; } // Generate enhanced explanation let explanation = `# 📖 ${args.concept} Explanation (${args.platform.toUpperCase()})\n\n`; explanation += `**Complexity Level:** ${args.level || 'intermediate'}\n`; if (args.useCase) { explanation += `**Use Case:** ${args.useCase}\n`; } explanation += '\n'; // Add best result with detailed breakdown const bestResult = results[0]; if (!bestResult) { return `❌ No valid documentation found for "${args.concept}".`; } explanation += `## 🎯 Overview\n\n`; explanation += `${this.extractOverview(bestResult.content, args.concept)}\n\n`; if (bestResult.examples && bestResult.examples.length > 0) { explanation += `## 💻 Code Examples\n\n`; bestResult.examples.forEach((example, index) => { explanation += `### Example ${index + 1}\n`; explanation += `\`\`\`${args.preferredLanguage || 'kotlin'}\n${example}\n\`\`\`\n\n`; }); } // Add implementation guide explanation += `## 🛠️ Implementation Steps\n\n`; explanation += this.generateImplementationSteps(args.concept, args.platform); // Add related topics if (bestResult.relatedTopics && bestResult.relatedTopics.length > 0) { explanation += `\n## 🔗 Related Topics\n\n`; bestResult.relatedTopics.forEach(topic => { explanation += `- ${topic}\n`; }); } return explanation; } private extractOverview(content: string, _concept: string): string { // Simple extraction - in practice this would be more sophisticated const sentences = content.split('.').slice(0, 3); return sentences.join('.') + '.'; } private generateImplementationSteps(concept: string, platform: string): string { // Generate basic implementation steps based on concept and platform let steps = ''; if (platform === 'android') { steps += `1. Add necessary dependencies to \`build.gradle\`\n`; steps += `2. Add required permissions to \`AndroidManifest.xml\`\n`; steps += `3. Initialize ${concept} in your Activity or Fragment\n`; steps += `4. Implement necessary callbacks and listeners\n`; steps += `5. Handle lifecycle events appropriately\n`; steps += `6. Add error handling and edge cases\n`; } else if (platform === 'web') { steps += `1. Include necessary libraries or frameworks\n`; steps += `2. Set up HTML structure\n`; steps += `3. Initialize ${concept} in JavaScript\n`; steps += `4. Implement event handlers\n`; steps += `5. Add responsive design considerations\n`; steps += `6. Test across different browsers\n`; } else if (platform === 'dhis2') { steps += `1. Understand DHIS2 API structure\n`; steps += `2. Set up authentication\n`; steps += `3. Make API calls for ${concept}\n`; steps += `4. Handle API responses and errors\n`; steps += `5. Implement data validation\n`; steps += `6. Test with different DHIS2 versions\n`; } return steps; } /** * Generate integration guide */ async generateIntegrationGuide(args: { integration: string; targetPlatform: 'android' | 'web' | 'hybrid'; complexity?: string; includeErrorHandling?: boolean; includeTesting?: boolean; }): Promise<string> { let guide = `# 🔧 ${args.integration} Integration Guide\n\n`; guide += `**Platform:** ${args.targetPlatform.toUpperCase()}\n`; guide += `**Complexity:** ${args.complexity || 'standard'}\n\n`; // Generate platform-specific guide guide += `## 📋 Prerequisites\n\n`; if (args.targetPlatform === 'android') { guide += `- Android Studio installed\n`; guide += `- Android SDK configured\n`; guide += `- Minimum API level 21+\n\n`; } guide += `## 🚀 Step-by-Step Integration\n\n`; guide += this.generateDetailedSteps(args.integration, args.targetPlatform); if (args.includeErrorHandling) { guide += `\n## ⚠️ Error Handling\n\n`; guide += this.generateErrorHandling(args.targetPlatform); } if (args.includeTesting) { guide += `\n## 🧪 Testing Strategy\n\n`; guide += this.generateTestingStrategy(args.targetPlatform); } return guide; } private generateDetailedSteps(_integration: string, _platform: string): string { // This would query documentation for specific integration steps return `1. **Setup Dependencies** - Add required libraries - Configure build files 2. **Initialize Components** - Set up main integration points - Configure settings 3. **Implement Core Functionality** - Add main integration logic - Handle data flow 4. **Test Integration** - Verify functionality - Handle edge cases`; } private generateErrorHandling(_platform: string): string { return `- Implement try-catch blocks - Add logging for debugging - Provide user-friendly error messages - Handle network connectivity issues - Implement retry mechanisms`; } private generateTestingStrategy(platform: string): string { if (platform === 'android') { return `- Unit tests with JUnit - Integration tests with Espresso - Mock external dependencies - Test on different device configurations`; } return `- Unit tests - Integration tests - End-to-end testing - Cross-platform compatibility`; } } // Global instance export const documentationIntegration = new DocumentationMCPIntegration();

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/Dradebo/dhis2-mcp'

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