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
JavaScript
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