UNPKG

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

358 lines 14.7 kB
import { getTypesenseClient, fetchQADetails, getPmsEtlDatabase, getArtifact, insertDataLinkToMongoDB } from "syia-mcp-utils"; import { logger } from "../../index.js"; export class FuelAnalysisToolHandler { constructor() { this.typesenseClient = getTypesenseClient(); } async getFuelOilAnalysisTableSchema(args) { logger.info("getFuelOilAnalysisTableSchema called", args); const category = args.category; if (!category) { throw new Error("Category is required"); } try { const db = await getPmsEtlDatabase(); const collection = db.collection("typesense_schema"); const query = { category }; const projection = { _id: 0, schema: 1, category: 1 }; const documents = await collection.find(query, { projection }).toArray(); const formattedResults = { count: documents.length, documents }; const formattedText = JSON.stringify(formattedResults, null, 2); const response = { type: "text", text: formattedText }; return [response]; } catch (error) { logger.error(`Error querying collection typesense_schema: ${error}`); throw new Error(`Error querying collection: ${error}`); } } async getLatestFuelBunkerDetails(args) { logger.info("getLatestFuelBunkerDetails called", args); try { const imo = args.imo; const sessionId = args.session_id || "testing"; if (!imo) { throw new Error("IMO number is required"); } // Fetch QA details for question 83 (Latest Fuel Bunker Details) let result; try { result = await fetchQADetails(imo, 83); } catch (error) { // If no fuel bunker details found, return appropriate message const noResultsResponse = { type: "text", text: "No fuel bunker details found for this vessel." }; return [noResultsResponse]; } // Get link and vessel name for MongoDB const dataLink = result.Artifactlink ?? ""; const vesselName = result.vesselName || ""; // Insert the data link to mongodb collection await insertDataLinkToMongoDB(dataLink, "latest fuel bunker details", sessionId, imo, vesselName); // Format results as JSON const formattedText = JSON.stringify(result, null, 2); // Create artifact const artifactData = getArtifact("get_latest_fuel_bunker_details", dataLink); const content = { type: "text", text: formattedText }; const artifact = { type: "text", text: JSON.stringify(artifactData, null, 2) }; return [content, artifact]; } catch (error) { logger.error("Error in getLatestFuelBunkerDetails", { error }); const errorResponse = { type: "text", text: `Error retrieving fuel bunker details: ${error instanceof Error ? error.message : String(error)}` }; return [errorResponse]; } } async getFleetFuelOilBunkerAnalysis(args) { logger.info("getFleetFuelOilBunkerAnalysis called", args); try { const imo = args.imo; const sessionId = args.session_id || "testing"; if (!imo) { throw new Error("IMO number is required"); } // Fetch QA details for question 209 (Fleet Fuel Oil Bunker Analysis) let result; try { result = await fetchQADetails(imo, 209); } catch (error) { // If no fuel bunker details found, return appropriate message const noResultsResponse = { type: "text", text: "No fuel bunker details found for this vessel." }; return [noResultsResponse]; } // Get link and vessel name for MongoDB const dataLink = result.Artifactlink ?? ""; const vesselName = result.vesselName || ""; // Insert the data link to mongodb collection await insertDataLinkToMongoDB(dataLink, "fleet fuel oil bunker analysis", sessionId, imo, vesselName); // Format results as JSON const formattedText = JSON.stringify(result, null, 2); // Create artifact const artifactData = getArtifact("get_fleet_fuel_oil_bunker_analysis", dataLink); const content = { type: "text", text: formattedText }; const artifact = { type: "text", text: JSON.stringify(artifactData, null, 2) }; return [content, artifact]; } catch (error) { logger.error("Error in getFleetFuelOilBunkerAnalysis", { error }); const errorResponse = { type: "text", text: `Error retrieving fleet fuel oil bunker analysis: ${error instanceof Error ? error.message : String(error)}` }; return [errorResponse]; } } } // export async function getHistoricalFuelAnalysisData(args: HistoricalFuelAnalysisArgs): Promise<ToolResponse> { // logger.info("Executing get_historical_fuel_analysis_data", { args }); // // try { // const imo = args.imo; // const lookbackMonths = args.lookback_months; // const fuelType = args.fuelType; // const perPage = args.per_page || 100; // const sessionId = args.session_id || "testing"; // // if (!imo || !lookbackMonths) { // throw new Error("IMO number and lookback period are required"); // } // // // Calculate the start date for the lookback period // const startDate = new Date(); // startDate.setMonth(startDate.getMonth() - lookbackMonths); // const startTs = Math.floor(startDate.getTime() / 1000); // // // Build filter_by string // const filterBy = `imo:${imo} && bunkerDate:>${startTs}`; // // // Set up search parameters // const searchParameters: any = { // q: fuelType || "*", // filter_by: filterBy, // sort_by: "bunkerDate:desc", // per_page: perPage // }; // // if (fuelType) { // searchParameters.query_by = "fuelType"; // } // // // Execute search using TypesenseClient // const results = await getTypesenseClient().collections("fuel_oil_data").documents().search(searchParameters); // // if (!results || !results.hits) { // const noDataMessage = `No fuel analysis reports found for vessel ${imo} in the last ${lookbackMonths} months${fuelType ? ' with fuel type ' + fuelType : ''}.`; // const noDataResponse: TextContent = { // type: "text", // text: noDataMessage // }; // return [noDataResponse]; // } // // // Process all records // const hits = results.hits; // const processedReports = []; // // if (hits.length === 0) { // const noDataMessage = `No fuel analysis reports found for vessel ${imo} in the last ${lookbackMonths} months${fuelType ? ' with fuel type ' + fuelType : ''}.`; // const noDataResponse: TextContent = { // type: "text", // text: noDataMessage // }; // return [noDataResponse]; // } // // for (const hit of hits as TypesenseHit[]) { // let documentData = hit.document || {}; // // Convert dates if needed // documentData = convertUnixDates(documentData); // // // Parse the report if a link is available // const reportLink = documentData.reportLink; // if (reportLink) { // const report = await parseDocumentLink({ document_link: reportLink }); // documentData.report = report; // } // // processedReports.push(documentData); // } // // // Get data link // const dataLink = await getDataLink(processedReports); // // // Get vessel name from processed reports // const vesselName = processedReports[0]?.vesselName || ""; // // // Insert the data link to mongodb collection // const linkHeader = `historical fuel analysis data for past ${lookbackMonths} months${fuelType ? ' - ' + fuelType : ''}`; // await insertDataLinkToMongoDB(dataLink || "", linkHeader, sessionId, imo, vesselName); // // // Format results // const formattedText = JSON.stringify(processedReports, null, 2); // // // Create artifact // const artifactData = getArtifact("get_historical_fuel_analysis_data", dataLink || "no_link"); // // const content: TextContent = { // type: "text", // text: formattedText // }; // const artifact: TextContent = { // type: "text", // text: JSON.stringify(artifactData, null, 2) // }; // return [content, artifact]; // // } catch (error) { // logger.error("Error in getHistoricalFuelAnalysisData", { error }); // const errorResponse: TextContent = { // type: "text", // text: `Error retrieving historical fuel analysis data: ${error instanceof Error ? error.message : String(error)}` // }; // return [errorResponse]; // } // } // export async function getLatestFuelAnalysisReport(args: LatestFuelAnalysisReportArgs): Promise<ToolResponse> { // logger.info("Executing get_latest_fuel_analysis_report", { args }); // // try { // const imo = args.imo; // const fuelType = args.fuelType; // const perPage = args.per_page || 5; // const sessionId = args.session_id || "testing"; // // if (!imo) { // throw new Error("IMO number is required"); // } // // // Build filter_by string // const filterBy = `imo:${imo}`; // // // Set up search parameters // const searchParameters: any = { // q: fuelType || "*", // filter_by: filterBy, // sort_by: "bunkerDate:desc", // per_page: perPage // }; // // if (fuelType) { // searchParameters.query_by = "fuelType"; // } // // // Execute search using TypesenseClient // const results = await getTypesenseClient().collections("fuel_oil_data").documents().search(searchParameters); // // // Check if results exist and have hits // if (!results || !results.hits || results.hits.length === 0) { // let noResultsMessage = `No fuel analysis reports found for vessel ${imo}`; // if (fuelType) { // noResultsMessage += ` with fuel type ${fuelType}`; // } // // const noResultsResponse: TextContent = { // type: "text", // text: noResultsMessage // }; // return [noResultsResponse]; // } // // // Get the hits array // const hits = results.hits; // // // Additional safety check before accessing first element // if (hits.length === 0) { // const emptyResultsResponse: TextContent = { // type: "text", // text: `Search returned empty results for vessel ${imo}${fuelType ? ' with fuel type ' + fuelType : ''}.` // }; // return [emptyResultsResponse]; // } // // // Safely get the latest record // let latest; // try { // latest = hits[0].document; // } catch (error) { // const errorResponse: TextContent = { // type: "text", // text: `Error accessing search results: ${error instanceof Error ? error.message : String(error)}. The search results may be malformed.` // }; // return [errorResponse]; // } // // latest = convertUnixDates(latest); // // // Parse the report if a link is available // const reportLink = latest.reportLink; // const report = reportLink ? await parseDocumentLink({ document_link: reportLink }) : null; // // latest.report = report; // latest.reportLink = reportLink; // // // Get documents for data link // const documents = hits.map((hit: any) => hit.document); // // // Get data link // const dataLink = await getDataLink(documents); // // // Get vessel name from latest record // const vesselName = latest.vesselName || ""; // // // Insert the data link to mongodb collection // const linkHeader = `latest fuel analysis report${fuelType ? ' for ' + fuelType : ''}`; // await insertDataLinkToMongoDB(dataLink || "", linkHeader, sessionId, imo, vesselName); // // // Format results // const formattedText = JSON.stringify(latest, null, 2); // // // Create artifact // const artifactData = getArtifact("get_latest_fuel_analysis_report", dataLink || "no_link"); // const content: TextContent = { // type: "text", // text: formattedText // }; // const artifact: TextContent = { // type: "text", // text: JSON.stringify(artifactData, null, 2) // }; // return [content, artifact]; // // } catch (error) { // logger.error("Error in getLatestFuelAnalysisReport", { error }); // const errorResponse: TextContent = { // type: "text", // text: `Error retrieving fuel analysis report: ${error instanceof Error ? error.message : String(error)}` // }; // return [errorResponse]; // } // } //# sourceMappingURL=fuelAnalysisTools.js.map