Skip to main content
Glama

documcp

by tosin2013
006-mcp-tools-api-design.md22.9 kB
--- id: 006-mcp-tools-api-design title: 'ADR-006: MCP Tools API Design and Interface Specification' sidebar_label: 'ADR-006: MCP Tools API Design' sidebar_position: 6 --- # ADR-006: MCP Tools API Design and Interface Specification ## Status Accepted ## Context DocuMCP must expose its functionality through a carefully designed set of MCP tools that provide comprehensive coverage of the documentation deployment workflow while maintaining clear separation of concerns, appropriate granularity, and excellent developer experience for MCP-enabled clients. The MCP Tools API serves as the primary interface between DocuMCP's intelligence and client applications like GitHub Copilot, Claude Desktop, and other MCP-enabled development environments. This API must balance several competing concerns: **Functional Requirements:** - Comprehensive repository analysis capabilities - Intelligent SSG recommendation with detailed justifications - Automated configuration generation for multiple SSGs - Diataxis-compliant documentation structure creation - GitHub Pages deployment workflow generation - Git integration for seamless deployment **Usability Requirements:** - Intuitive tool names and parameter structures - Comprehensive input validation with clear error messages - Consistent response formats across all tools - Rich metadata for client presentation and user guidance - Progressive disclosure of complexity (simple to advanced use cases) **Technical Requirements:** - Full MCP specification compliance - Robust error handling and recovery - Efficient parameter validation and sanitization - Scalable architecture supporting complex multi-step workflows - Extensible design for future functionality additions ## Decision We will implement a comprehensive MCP Tools API consisting of six core tools that cover the complete documentation deployment workflow, with additional utility tools for advanced scenarios and troubleshooting. ### Core MCP Tools Architecture: #### 1. Repository Analysis Tool (`analyzeRepository`) **Purpose**: Comprehensive repository analysis and project characterization **Scope**: Deep analysis of project structure, language ecosystems, existing documentation, and complexity assessment #### 2. SSG Recommendation Tool (`recommendSSG`) **Purpose**: Intelligent static site generator recommendation with detailed justifications **Scope**: Multi-criteria decision analysis with confidence scoring and alternative options #### 3. Configuration Generation Tool (`generateConfiguration`) **Purpose**: Create customized SSG configuration files and directory structures **Scope**: Template-based generation with project-specific customizations and validation #### 4. Diataxis Structure Tool (`createDiataxisStructure`) **Purpose**: Generate comprehensive Diataxis-compliant documentation frameworks **Scope**: Information architecture generation with content planning and navigation design #### 5. Deployment Workflow Tool (`generateWorkflow`) **Purpose**: Create optimized GitHub Actions workflows for automated deployment **Scope**: SSG-specific workflow generation with security best practices and performance optimization #### 6. Git Integration Tool (`generateGitCommands`) **Purpose**: Provide ready-to-execute Git commands for deployment and maintenance **Scope**: Context-aware command generation with branch management and deployment verification ### Supporting Tools: - `validateConfiguration`: Validate generated configurations and identify issues - `troubleshootDeployment`: Analyze deployment failures and provide remediation guidance - `optimizePerformance`: Analyze and optimize existing documentation site performance - `migrateDocumentation`: Assist with migration between different SSGs or frameworks ## Alternatives Considered ### Monolithic Single Tool Approach - **Pros**: Simpler API surface, single entry point, easier client integration - **Cons**: Complex parameter structures, poor separation of concerns, difficult error handling - **Decision**: Rejected due to poor usability and maintainability ### Micro-Tool Architecture (15+ Small Tools) - **Pros**: Maximum granularity, precise control, composable workflows - **Cons**: Complex orchestration, cognitive overhead, fragmented user experience - **Decision**: Rejected due to complexity and poor user experience ### Stateful Session-Based API - **Pros**: Could maintain context across tool calls, simplified parameter passing - **Cons**: Session management complexity, state synchronization issues, harder client integration - **Decision**: Rejected to maintain MCP stateless principles ### External API Integration (REST/GraphQL) - **Pros**: Standard web technologies, extensive tooling ecosystem - **Cons**: Not MCP-compliant, additional infrastructure requirements, authentication complexity - **Decision**: Rejected due to MCP specification requirements ## Consequences ### Positive - **Clear Separation of Concerns**: Each tool has well-defined responsibility and scope - **Progressive Complexity**: Users can start simple and add sophistication as needed - **Excellent Error Handling**: Tool-specific validation and error reporting - **Client-Friendly**: Rich metadata and consistent response formats enhance client UX - **Extensible Architecture**: Easy to add new tools without breaking existing functionality ### Negative - **API Surface Complexity**: Six core tools plus supporting tools require comprehensive documentation - **Inter-Tool Coordination**: Some workflows require multiple tool calls with parameter passing - **Validation Overhead**: Each tool requires comprehensive input validation and error handling ### Risks and Mitigations - **API Complexity**: Provide comprehensive documentation and usage examples - **Parameter Evolution**: Use versioned schemas with backward compatibility - **Client Integration**: Offer reference implementations and integration guides ## Implementation Details ### Tool Parameter Schemas ```typescript // Core tool parameter interfaces interface AnalyzeRepositoryParams { repositoryPath: string; analysisDepth?: 'basic' | 'comprehensive' | 'deep'; focusAreas?: ('structure' | 'languages' | 'documentation' | 'complexity')[]; excludePatterns?: string[]; } interface RecommendSSGParams { projectAnalysis: ProjectAnalysis; teamCapabilities?: TeamCapabilities; performanceRequirements?: PerformanceRequirements; customizationNeeds?: CustomizationNeeds; existingConstraints?: ProjectConstraints; } interface GenerateConfigurationParams { selectedSSG: SSGType; projectAnalysis: ProjectAnalysis; customizations?: SSGCustomizations; deploymentTarget?: DeploymentTarget; advancedOptions?: AdvancedConfigOptions; } interface CreateDiataxisStructureParams { selectedSSG: SSGType; projectType: ProjectType; existingContent?: ExistingContentAnalysis; contentComplexity?: 'minimal' | 'standard' | 'comprehensive'; navigationPreferences?: NavigationPreferences; } interface GenerateWorkflowParams { ssgType: SSGType; deploymentStrategy: 'github-actions' | 'branch-based' | 'hybrid'; securityRequirements?: SecurityRequirements; performanceOptimizations?: PerformanceOptions; environmentConfiguration?: EnvironmentConfig; } interface GenerateGitCommandsParams { deploymentStrategy: DeploymentStrategy; repositoryState: RepositoryState; branchConfiguration: BranchConfiguration; commitPreferences?: CommitPreferences; } ``` ### Response Format Standardization ```typescript // Standardized response structure for all tools interface MCPToolResponse<T> { success: boolean; data?: T; error?: ErrorDetails; metadata: ResponseMetadata; recommendations?: Recommendation[]; nextSteps?: NextStep[]; } interface ResponseMetadata { toolVersion: string; executionTime: number; confidenceScore?: number; analysisDepth: string; timestamp: string; correlationId: string; } interface ErrorDetails { code: string; message: string; details: string; resolution?: string; documentation?: string; } interface Recommendation { type: 'optimization' | 'alternative' | 'enhancement'; priority: 'low' | 'medium' | 'high'; description: string; implementation?: string; resources?: string[]; } interface NextStep { action: string; description: string; toolRequired?: string; parameters?: Record<string, any>; estimated_time?: string; } ``` ### analyzeRepository Tool Implementation ```typescript const analyzeRepositoryTool: MCPTool = { name: 'analyzeRepository', description: 'Comprehensive repository analysis for documentation planning', inputSchema: { type: 'object', properties: { repositoryPath: { type: 'string', description: 'Path to the repository to analyze' }, analysisDepth: { type: 'string', enum: ['basic', 'comprehensive', 'deep'], default: 'comprehensive', description: 'Depth of analysis to perform' }, focusAreas: { type: 'array', items: { type: 'string', enum: ['structure', 'languages', 'documentation', 'complexity'] }, description: 'Specific areas to focus analysis on' }, excludePatterns: { type: 'array', items: { type: 'string' }, description: 'File patterns to exclude from analysis' } }, required: ['repositoryPath'] } }; async function handleAnalyzeRepository(params: AnalyzeRepositoryParams): Promise<MCPToolResponse<RepositoryAnalysis>> { try { const analysis = await repositoryAnalyzer.analyze(params); return { success: true, data: analysis, metadata: { toolVersion: '1.0.0', executionTime: analysis.executionTime, analysisDepth: params.analysisDepth || 'comprehensive', timestamp: new Date().toISOString(), correlationId: generateCorrelationId() }, recommendations: generateAnalysisRecommendations(analysis), nextSteps: [ { action: 'Get SSG Recommendation', description: 'Use analysis results to get intelligent SSG recommendations', toolRequired: 'recommendSSG', parameters: { projectAnalysis: analysis }, estimated_time: '< 1 minute' } ] }; } catch (error) { return { success: false, error: { code: 'ANALYSIS_FAILED', message: 'Repository analysis failed', details: error.message, resolution: 'Verify repository path and permissions', documentation: 'https://documcp.dev/troubleshooting#analysis-errors' }, metadata: { toolVersion: '1.0.0', executionTime: 0, analysisDepth: params.analysisDepth || 'comprehensive', timestamp: new Date().toISOString(), correlationId: generateCorrelationId() } }; } } ``` ### recommendSSG Tool Implementation ```typescript const recommendSSGTool: MCPTool = { name: 'recommendSSG', description: 'Intelligent static site generator recommendation with detailed justifications', inputSchema: { type: 'object', properties: { projectAnalysis: { type: 'object', description: 'Repository analysis results from analyzeRepository tool' }, teamCapabilities: { type: 'object', properties: { technicalSkills: { type: 'array', items: { type: 'string' } }, maintenanceCapacity: { type: 'string', enum: ['minimal', 'moderate', 'extensive'] }, learningAppetite: { type: 'string', enum: ['low', 'medium', 'high'] } } }, performanceRequirements: { type: 'object', properties: { buildTimeImportance: { type: 'string', enum: ['low', 'medium', 'high'] }, siteSpeedPriority: { type: 'string', enum: ['standard', 'fast', 'ultra-fast'] }, scalabilityNeeds: { type: 'string', enum: ['small', 'medium', 'large', 'enterprise'] } } } }, required: ['projectAnalysis'] } }; async function handleRecommendSSG(params: RecommendSSGParams): Promise<MCPToolResponse<SSGRecommendation>> { const recommendation = await ssgRecommendationEngine.analyze(params); return { success: true, data: recommendation, metadata: { toolVersion: '1.0.0', executionTime: recommendation.analysisTime, confidenceScore: recommendation.confidence, analysisDepth: 'comprehensive', timestamp: new Date().toISOString(), correlationId: generateCorrelationId() }, recommendations: [ { type: 'optimization', priority: 'medium', description: 'Consider performance optimization strategies', implementation: 'Review build caching and incremental build options' } ], nextSteps: [ { action: 'Generate Configuration', description: 'Create customized configuration for recommended SSG', toolRequired: 'generateConfiguration', parameters: { selectedSSG: recommendation.primaryRecommendation.ssg, projectAnalysis: params.projectAnalysis }, estimated_time: '2-3 minutes' } ] }; } ``` ### Input Validation System ```typescript interface ValidationRule { field: string; validator: (value: any) => ValidationResult; required: boolean; errorMessage: string; } class MCPToolValidator { validateParameters<T>(params: T, schema: JSONSchema): ValidationResult { const results = this.runSchemaValidation(params, schema); const semanticResults = this.runSemanticValidation(params); return this.combineValidationResults(results, semanticResults); } private runSemanticValidation(params: any): ValidationResult { const issues: ValidationIssue[] = []; // Repository path validation if (params.repositoryPath && !this.isValidRepositoryPath(params.repositoryPath)) { issues.push({ field: 'repositoryPath', message: 'Repository path does not exist or is not accessible', severity: 'error', resolution: 'Verify the path exists and you have read permissions' }); } // Cross-parameter validation if (params.analysisDepth === 'deep' && params.focusAreas?.length > 2) { issues.push({ field: 'analysisDepth', message: 'Deep analysis with multiple focus areas may be slow', severity: 'warning', resolution: 'Consider using comprehensive analysis or fewer focus areas' }); } return { valid: issues.length === 0, issues }; } } ``` ## Tool Orchestration Patterns ### Sequential Workflow Pattern ```typescript // Common workflow: Analysis → Recommendation → Configuration → Deployment class DocumentationWorkflow { async executeCompleteWorkflow(repositoryPath: string): Promise<WorkflowResult> { try { // Step 1: Analyze repository const analysisResult = await this.callTool('analyzeRepository', { repositoryPath }); if (!analysisResult.success) { throw new Error(`Analysis failed: ${analysisResult.error?.message}`); } // Step 2: Get SSG recommendation const recommendationResult = await this.callTool('recommendSSG', { projectAnalysis: analysisResult.data }); if (!recommendationResult.success) { throw new Error(`Recommendation failed: ${recommendationResult.error?.message}`); } // Step 3: Generate configuration const configResult = await this.callTool('generateConfiguration', { selectedSSG: recommendationResult.data.primaryRecommendation.ssg, projectAnalysis: analysisResult.data }); if (!configResult.success) { throw new Error(`Configuration generation failed: ${configResult.error?.message}`); } // Step 4: Create Diataxis structure const structureResult = await this.callTool('createDiataxisStructure', { selectedSSG: recommendationResult.data.primaryRecommendation.ssg, projectType: analysisResult.data.projectType }); if (!structureResult.success) { console.warn(`Diataxis structure creation failed: ${structureResult.error?.message}`); } // Step 5: Generate deployment workflow const workflowResult = await this.callTool('generateWorkflow', { ssgType: recommendationResult.data.primaryRecommendation.ssg, deploymentStrategy: 'github-actions' }); if (!workflowResult.success) { console.warn(`Workflow generation failed: ${workflowResult.error?.message}`); } return this.combineResults([ analysisResult, recommendationResult, configResult, structureResult, workflowResult ]); } catch (error) { throw new Error(`Complete workflow failed: ${error.message}`); } } } ``` ## Error Handling and Recovery ### Comprehensive Error Classification ```typescript enum ErrorCategory { VALIDATION = 'validation', FILESYSTEM = 'filesystem', ANALYSIS = 'analysis', GENERATION = 'generation', CONFIGURATION = 'configuration', DEPLOYMENT = 'deployment', NETWORK = 'network', PERMISSION = 'permission' } interface ErrorContext { tool: string; operation: string; parameters: Record<string, any>; environment: EnvironmentInfo; } class MCPErrorHandler { handleError(error: Error, context: ErrorContext): MCPToolResponse<null> { const classification = this.classifyError(error); const resolution = this.generateResolution(classification, context); return { success: false, error: { code: this.generateErrorCode(classification), message: this.formatUserMessage(error, classification), details: error.message, resolution: resolution.guidance, documentation: resolution.documentationUrl }, metadata: this.generateErrorMetadata(context), nextSteps: resolution.suggestedActions }; } private generateResolution(classification: ErrorClassification, context: ErrorContext): ErrorResolution { switch (classification.category) { case ErrorCategory.FILESYSTEM: return { guidance: 'Verify file paths and permissions', documentationUrl: 'https://documcp.dev/troubleshooting#filesystem-errors', suggestedActions: [ { action: 'Check file exists', description: `Verify ${context.parameters.repositoryPath} exists` }, { action: 'Check permissions', description: 'Ensure read access to repository directory' } ] }; // ... other error categories } } } ``` ## Performance Optimization ### Response Caching Strategy ```typescript interface CacheConfiguration { analyzeRepository: { ttl: 300, keyFields: ['repositoryPath', 'analysisDepth'] }; recommendSSG: { ttl: 3600, keyFields: ['projectAnalysis.signature'] }; generateConfiguration: { ttl: 1800, keyFields: ['selectedSSG', 'projectAnalysis.signature'] }; } class MCPToolCache { async getCachedResponse<T>( toolName: string, parameters: any ): Promise<MCPToolResponse<T> | null> { const cacheKey = this.generateCacheKey(toolName, parameters); const cached = await this.cache.get(cacheKey); if (cached && !this.isExpired(cached)) { return { ...cached, metadata: { ...cached.metadata, fromCache: true, cacheAge: Date.now() - cached.metadata.timestamp } }; } return null; } } ``` ## Testing Strategy ### Tool Testing Framework ```typescript describe('MCP Tools API', () => { describe('analyzeRepository', () => { it('should analyze JavaScript project correctly'); it('should handle missing repository gracefully'); it('should respect analysis depth parameters'); it('should exclude specified patterns'); }); describe('recommendSSG', () => { it('should recommend Hugo for large documentation sites'); it('should recommend Jekyll for GitHub Pages simple sites'); it('should provide confidence scores for all recommendations'); it('should handle incomplete project analysis'); }); describe('Tool Integration', () => { it('should support complete workflow from analysis to deployment'); it('should maintain parameter consistency across tool calls'); it('should provide appropriate next steps guidance'); }); }); ``` ### Integration Testing ```typescript class MCPToolIntegrationTests { async testCompleteWorkflow(): Promise<void> { const testRepo = await this.createTestRepository(); // Test full workflow const analysis = await this.callTool('analyzeRepository', { repositoryPath: testRepo }); expect(analysis.success).toBe(true); const recommendation = await this.callTool('recommendSSG', { projectAnalysis: analysis.data }); expect(recommendation.success).toBe(true); expect(recommendation.data.primaryRecommendation).toBeDefined(); const config = await this.callTool('generateConfiguration', { selectedSSG: recommendation.data.primaryRecommendation.ssg, projectAnalysis: analysis.data }); expect(config.success).toBe(true); // Validate generated configuration await this.validateGeneratedFiles(config.data.files); } } ``` ## Documentation and Examples ### Tool Usage Examples ```typescript // Example: Complete documentation setup workflow const examples = { basicSetup: { description: 'Basic documentation setup for a JavaScript project', steps: [ { tool: 'analyzeRepository', parameters: { repositoryPath: './my-project' }, expectedResult: 'Project analysis with language ecosystem detection' }, { tool: 'recommendSSG', parameters: { projectAnalysis: '${analysis_result}' }, expectedResult: 'SSG recommendation with justification' } ] }, advancedSetup: { description: 'Advanced setup with custom requirements', steps: [ // ... detailed workflow steps ] } }; ``` ## Future Enhancements ### Planned Tool Additions - `analyzeExistingDocs`: Deep analysis of existing documentation quality and structure - `generateMigrationPlan`: Create migration plans between different documentation systems - `optimizeContent`: AI-powered content optimization and gap analysis - `validateAccessibility`: Comprehensive accessibility testing and recommendations ### API Evolution Strategy - Versioned tool schemas with backward compatibility - Deprecation notices and migration guidance - Feature flags for experimental functionality - Community feedback integration for API improvements ## References - [Model Context Protocol Specification](https://spec.modelcontextprotocol.io/) - [JSON Schema Validation](https://json-schema.org/) - [API Design Best Practices](https://swagger.io/resources/articles/best-practices-in-api-design/)

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/tosin2013/documcp'

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