import { MCPTool } from 'mcp-framework';
import NamingValidator from '../validators/NamingValidator.js';
import ErrorHandlingValidator from '../validators/ErrorHandlingValidator.js';
import SecurityValidator from '../validators/SecurityValidator.js';
import PerformanceValidator from '../validators/PerformanceValidator.js';
import DocumentationValidator from '../validators/DocumentationValidator.js';
import CalendarIntegrationValidator from '../validators/CalendarIntegrationValidator.js';
import { z } from 'zod';
// Définition de l'interface pour les paramètres d'entrée
interface WorkflowValidatorInput {
workflow: any;
validators: Array<'naming' | 'errorHandling' | 'security' | 'performance' | 'documentation' | 'calendarIntegration' | 'all'>;
strictness: 'low' | 'medium' | 'high';
}
/**
* Outil de validation des workflows n8n
* Permet de valider les workflows selon différents critères (nommage, gestion d'erreurs, sécurité, performance, documentation)
*/
class WorkflowValidatorTool extends MCPTool<WorkflowValidatorInput> {
/**
* Nom de l'outil
*/
name = 'workflow_validator';
/**
* Description de l'outil
*/
description = 'Valide les workflows n8n selon différents critères';
/**
* Schéma de validation des paramètres
*/
schema = {
workflow: {
type: z.any(),
description: 'Le workflow n8n à valider'
},
validators: {
type: z.array(z.enum(['naming', 'errorHandling', 'security', 'performance', 'documentation', 'calendarIntegration', 'all'])),
description: 'Liste des validateurs à exécuter'
},
strictness: {
type: z.enum(['low', 'medium', 'high']),
description: 'Niveau de rigueur de la validation'
}
};
/**
* Exécute la validation du workflow
* @param input Paramètres d'entrée
* @returns Résultats de la validation
*/
async execute(input: WorkflowValidatorInput): Promise<any> {
try {
// Initialiser les résultats
const results: any = {
workflow: input.workflow.name || 'Workflow sans nom',
strictness: input.strictness,
validators: input.validators,
validations: {},
summary: {
errors: 0,
warnings: 0,
suggestions: 0,
passed: 0,
total: 0
}
};
// Exécuter les validateurs sélectionnés
const validatorsToRun = this.getValidatorsToRun(input.validators);
for (const validatorName of validatorsToRun) {
const validator = this.getValidator(validatorName);
if (validator) {
const validationResult = await validator.validate(input.workflow, input.strictness);
results.validations[validatorName] = validationResult;
// Mettre à jour le résumé
results.summary.errors += validationResult.errors?.length || 0;
results.summary.warnings += validationResult.warnings?.length || 0;
results.summary.suggestions += validationResult.suggestions?.length || 0;
results.summary.passed += validationResult.passed?.length || 0;
results.summary.total += validationResult.total || 0;
}
}
return results;
} catch (error: unknown) {
console.error('Erreur lors de la validation du workflow:', error);
const errorMessage = error instanceof Error ? error.message : String(error);
return {
success: false,
error: errorMessage
};
}
}
/**
* Retourne la liste des validateurs à exécuter
*/
private getValidatorsToRun(validators: string[]): string[] {
if (validators.includes('all')) {
return ['naming', 'errorHandling', 'security', 'performance', 'documentation', 'calendarIntegration'];
}
return validators;
}
/**
* Retourne l'instance du validateur demandé
*/
private getValidator(validatorName: string): any {
switch (validatorName) {
case 'naming':
return new NamingValidator();
case 'errorHandling':
return new ErrorHandlingValidator();
case 'security':
return new SecurityValidator();
case 'performance':
return new PerformanceValidator();
case 'documentation':
return new DocumentationValidator();
case 'calendarIntegration':
return new CalendarIntegrationValidator();
default:
return null;
}
}
}
export default WorkflowValidatorTool;