UNPKG

pms-analysis-reports-mcp-server

Version:

PMS analysis reports server handling maintenance reports, equipment analysis, compliance tracking, and performance metrics with ERP access for data extraction

254 lines 13.7 kB
import { fetchCompanyImoNumbers, shouldBypassImoFiltering, isValidImoForCompany } from "../utils/imoUtils.js"; import { logger } from "../index.js"; import { config } from "../config/index.js"; // import { SearchToolHandler } from "./handlers/searchTools.js"; // import { VendorToolHandler } from "./handlers/vendorTools.js"; // Import tool handler classes import { FuelAnalysisToolHandler } from "./handlers/fuelAnalysisTools.js"; import { LubeOilToolHandler } from "./handlers/lubeOilTools.js"; import { PerformanceToolHandler } from "./handlers/performanceTools.js"; import { MaintenanceToolHandler } from "./handlers/maintenanceTools.js"; import { PmsToolHandler } from "./handlers/pmsTools.js"; import { MongodbToolsHandler } from "./handlers/mongofetchTools.js"; import { UniversalToolsHandler } from "./handlers/universalTools.js"; import { ExportToolHandler } from "./handlers/exportTools.js"; /** * Main tool handler that coordinates different categories of tools */ export class ToolHandler { constructor(server) { // Initialize tool handlers as needed this.exportToolHandler = new ExportToolHandler(); this.fuelAnalysisToolHandler = new FuelAnalysisToolHandler(); this.lubeOilToolHandler = new LubeOilToolHandler(); this.performanceToolHandler = new PerformanceToolHandler(); this.maintenanceToolHandler = new MaintenanceToolHandler(); this.pmsToolHandler = new PmsToolHandler(); this.mongodbToolsHandler = new MongodbToolsHandler(); this.universalToolsHandler = new UniversalToolsHandler(); } /** * Get company IMO numbers for validation */ async getCompanyImos() { try { const mongodbEtlDevDataDbName = process.env.MONGODB_ETL_DEV_DATA_DB_NAME || process.env.mongodbEtlDevDataDbName || 'syia-etl-dev'; const mongodbEtlDevDataUri = process.env.MONGODB_ETL_DEV_DATA_URI || process.env.mongodbEtlDevDataUri || ''; return await fetchCompanyImoNumbers(config.companyName, mongodbEtlDevDataDbName, mongodbEtlDevDataUri); } catch (error) { logger.warn('Failed to fetch company IMOs, allowing request to proceed'); return []; } } /** * Validate IMO numbers against company IMO list */ async validateImoNumber(imo) { // Skip validation for companies that don't require IMO validation if (shouldBypassImoFiltering(config.companyName)) { logger.debug(`Skipping IMO validation for company: "${config.companyName}"`); return null; } const companyImos = await this.getCompanyImos(); if (companyImos.length === 0) { logger.warn('No company IMOs available for validation, allowing request to proceed'); return null; } const isValid = await isValidImoForCompany(imo, config.companyName); if (!isValid) { return [{ type: "text", text: `Error: IMO number ${imo} is not associated with the current company. Please provide a valid IMO number. Available IMO numbers: ${companyImos.join(", ")}`, title: "Invalid IMO Number", format: "json" }]; } return null; } /** * Type-safe casting and validation of tool arguments */ async processToolArguments(toolName, arguments_) { // Validate IMO numbers if (arguments_.imo) { const error = await this.validateImoNumber(arguments_.imo); if (error) return { args: arguments_, error }; } if (arguments_.filters?.imo) { const error = await this.validateImoNumber(arguments_.filters.imo); if (error) return { args: arguments_, error }; } // Runtime type casting - the schema validation ensures correctness return { args: arguments_ }; } /** * Handles tool calls by routing them to appropriate specialized handlers * @param name - The name of the tool to call * @param arguments_ - The arguments for the tool * @returns Promise resolving to the tool response */ async handleCallTool(name, arguments_) { try { // 🔒 AUTHORIZATION: Validate company IMO access before any tool execution const authResult = await this.processToolArguments(name, arguments_); if (authResult.error) { return authResult.error; } const validatedArgs = authResult.args; let response; switch (name) { case "get_fuel_oil_analysis_table_schema": response = await this.fuelAnalysisToolHandler.getFuelOilAnalysisTableSchema(validatedArgs); break; case "get_latest_fuel_bunker_details": response = await this.fuelAnalysisToolHandler.getLatestFuelBunkerDetails(validatedArgs); break; case "get_fleet_fuel_oil_bunker_analysis": response = await this.fuelAnalysisToolHandler.getFleetFuelOilBunkerAnalysis(validatedArgs); break; // case "get_historical_fuel_analysis_data": // response = await getHistoricalFuelAnalysisData(validatedArgs as any); // break; // case "get_latest_fuel_analysis_report": // response = await getLatestFuelAnalysisReport(validatedArgs as any); // break; // Typesense tools // case "lube_report_table_query": // response = await lubeReportTableQuery(validatedArgs as any); // break; case "get_lube_oil_shore_analysis": response = await this.lubeOilToolHandler.getLubeOilShoreAnalysis(validatedArgs); break; // case "list_overdue_lube_oil_samples": // response = await listOverdueLubeOilSamples(validatedArgs as any); // break; // case "machinery_with_warning_lube_oil_analysis": // response = await machineryWithWarningLubeOilAnalysis(validatedArgs as any); // break; // case "list_lube_oil_samples_by_frequency": // response = await listLubeOilSamplesByFrequency(validatedArgs as any); // break; // case "fetch_lube_oil_analysis_with_link": // response = await fetchLubeOilAnalysisWithLink(validatedArgs as any); // break; // case "get_latest_lube_oil_analysis_for_machinery": // response = await getLatestLubeOilAnalysisForMachinery(validatedArgs as any); // break; case "get_onboard_lube_analysis_form": response = await this.lubeOilToolHandler.getOnboardLubeAnalysisForm(validatedArgs); break; case "get_lube_oil_rob": response = await this.lubeOilToolHandler.getLubeOilRob(validatedArgs); break; case "get_latest_engine_performance": response = await this.performanceToolHandler.getLatestEnginePerformance(validatedArgs); break; case "get_historical_engine_performance": response = await this.performanceToolHandler.getHistoricalEnginePerformance(validatedArgs); break; case "get_main_engine_performance_review": response = await this.performanceToolHandler.getMainEnginePerformanceReview(validatedArgs); break; case "get_auxiliary_engine_performance_review": response = await this.performanceToolHandler.getAuxiliaryEnginePerformanceReview(validatedArgs); break; case "get_overall_maintenance_summary": response = await this.maintenanceToolHandler.getOverallMaintenanceSummary(validatedArgs); break; case "get_main_engine_maintenance_summary": response = await this.maintenanceToolHandler.getMainEngineMaintenanceSummary(validatedArgs); break; case "get_auxiliary_engine_maintenance_summary": response = await this.maintenanceToolHandler.getAuxiliaryEngineMaintenanceSummary(validatedArgs); break; case "get_purifier_maintenance_summary": response = await this.maintenanceToolHandler.getPurifierMaintenanceSummary(validatedArgs); break; case "get_compressor_maintenance_summary": response = await this.maintenanceToolHandler.getCompressorMaintenanceSummary(validatedArgs); break; case "get_critical_spares_list": response = await this.maintenanceToolHandler.getCriticalSparesList(validatedArgs); break; case "get_main_engine_scavenge_inspection_review": response = await this.maintenanceToolHandler.getMainEngineScavengeInspectionReview(validatedArgs); break; case "get_fleet_major_machinery_overdue_jobs": response = await this.maintenanceToolHandler.getFleetMajorMachineryOverdueJobs(validatedArgs); break; case "get_vessel_pms_historical_data": response = await this.pmsToolHandler.getVesselPmsHistoricalData(validatedArgs); break; case "get_month_end_form_submission_status": response = await this.pmsToolHandler.getMonthEndFormSubmissionStatus(validatedArgs); break; case "get_historical_form_submission_status": response = await this.pmsToolHandler.getHistoricalFormSubmissionStatus(validatedArgs); break; case "get_fleet_pms_weekly_overview": response = await this.pmsToolHandler.getFleetPmsWeeklyOverview(validatedArgs); break; case "get_month_end_consolidated_technical_report": response = await this.pmsToolHandler.getMonthEndConsolidatedTechnicalReport(validatedArgs); break; case "get_fleet_month_end_technical_forms_status": response = await this.pmsToolHandler.getFleetMonthEndTechnicalFormsStatus(validatedArgs); break; // case "list_pms_jobs_by_category_and_status": // response = await listPmsJobsByCategoryAndStatus(validatedArgs as any); // break; // case "list_pms_jobs_for_component": // response = await listPmsJobsForComponent(validatedArgs as any); // break; // case "list_pms_jobs_for_component_due_within": // response = await listPmsJobsForComponentDueWithin(validatedArgs as any); // break; // case "list_overdue_pms_jobs": // response = await listOverduePmsJobs(validatedArgs as any); // break; // MongoDB tools case "get_vessel_pms_information": response = await this.mongodbToolsHandler.getVesselPmsInformation(validatedArgs); break; case "get_vessel_forms_information": response = await this.mongodbToolsHandler.getVesselFormsInformation(validatedArgs); break; case "get_vessel_shore_analysis_information": response = await this.mongodbToolsHandler.getVesselShoreAnalysisInformation(validatedArgs); break; case "get_fleet_pms_forms_fuel_information": response = await this.mongodbToolsHandler.getFleetPmsFormsFuelInformation(validatedArgs); break; case "universal_lube_oil_search": response = await this.universalToolsHandler.universalLubeOilAnalysisSearchHandler(validatedArgs); break; case "universal_fuel_analysis_search": response = await this.universalToolsHandler.universalFuelAnalysisSearchHandler(validatedArgs); break; case "universal_pms_maintenance_search": response = await this.universalToolsHandler.universalPmsMaintenanceSearchHandler(validatedArgs); break; // case "get_vessel_details": // response = await getVesselDetails(validatedArgs as any); // break; case "export_fleet_pms": response = await this.exportToolHandler.exportFleetPms(validatedArgs); break; // case "export_fleet_surveys": // response = await exportFleetSurveys(validatedArgs as any); // break; default: throw new Error(`Unknown tool: ${name}`); } return response; } catch (error) { logger.error(`Error calling tool ${name}:`, error); throw error; } } } //# sourceMappingURL=index.js.map