/**
* PDF Analysis Tools for MCP Server
*/
import { z } from 'zod';
import { PDFAnalysisService } from '../services/pdf-analysis.service.js';
import { logger } from '../utils/logger.js';
import { validateNotEmpty } from '../utils/validation.js';
import * as fs from 'fs/promises';
export function createPDFTools(pdfService: PDFAnalysisService) {
return {
analyze_bioimpedance_pdf: {
description: 'Analyze a bioimpedance PDF document and extract health metrics with recommendations',
parameters: z.object({
filePath: z.string().describe('Absolute path to the PDF file to analyze')
}),
execute: async (args: { filePath: string }) => {
try {
logger.info('Analyzing bioimpedance PDF', args);
validateNotEmpty(args.filePath, 'File path');
// Check if file exists
try {
await fs.access(args.filePath);
} catch {
throw new Error(`File not found: ${args.filePath}`);
}
const analysis = await pdfService.analyzeBioimpedancePDF(args.filePath);
return {
content: [
{
type: 'text',
text: JSON.stringify(
{
success: true,
analysis: {
patientInfo: {
name: analysis.patientName,
date: analysis.date
},
measurements: {
weight: analysis.weight ? `${analysis.weight} kg` : 'N/A',
height: analysis.height ? `${analysis.height} cm` : 'N/A',
bmi: analysis.bmi || 'N/A',
bodyFatPercentage: analysis.bodyFatPercentage ? `${analysis.bodyFatPercentage}%` : 'N/A',
muscleMassPercentage: analysis.muscleMassPercentage ? `${analysis.muscleMassPercentage}%` : 'N/A',
boneMass: analysis.boneMass ? `${analysis.boneMass} kg` : 'N/A',
bodyWaterPercentage: analysis.bodyWaterPercentage ? `${analysis.bodyWaterPercentage}%` : 'N/A',
visceralFat: analysis.visceralFat || 'N/A',
bmr: analysis.bmr ? `${analysis.bmr} kcal` : 'N/A'
},
analysis: analysis.analysis,
recommendations: analysis.recommendations
}
},
null,
2
)
}
]
};
} catch (error) {
logger.error('Failed to analyze bioimpedance PDF', error);
return {
content: [
{
type: 'text',
text: JSON.stringify(
{
success: false,
error: error instanceof Error ? error.message : 'Unknown error'
},
null,
2
)
}
],
isError: true
};
}
}
},
analyze_bioimpedance_pdf_base64: {
description: 'Analyze a bioimpedance PDF document from base64-encoded data',
parameters: z.object({
base64Data: z.string().describe('Base64-encoded PDF data'),
patientId: z.string().optional().describe('Optional patient ID for reference')
}),
execute: async (args: { base64Data: string; patientId?: string }) => {
try {
logger.info('Analyzing bioimpedance PDF from base64', {
patientId: args.patientId,
dataLength: args.base64Data.length
});
validateNotEmpty(args.base64Data, 'Base64 data');
const analysis = await pdfService.analyzeBioimpedancePDFFromBase64(args.base64Data);
return {
content: [
{
type: 'text',
text: JSON.stringify(
{
success: true,
patientId: args.patientId,
analysis: {
patientInfo: {
name: analysis.patientName,
date: analysis.date
},
measurements: {
weight: analysis.weight ? `${analysis.weight} kg` : 'N/A',
height: analysis.height ? `${analysis.height} cm` : 'N/A',
bmi: analysis.bmi || 'N/A',
bodyFatPercentage: analysis.bodyFatPercentage ? `${analysis.bodyFatPercentage}%` : 'N/A',
muscleMassPercentage: analysis.muscleMassPercentage ? `${analysis.muscleMassPercentage}%` : 'N/A',
boneMass: analysis.boneMass ? `${analysis.boneMass} kg` : 'N/A',
bodyWaterPercentage: analysis.bodyWaterPercentage ? `${analysis.bodyWaterPercentage}%` : 'N/A',
visceralFat: analysis.visceralFat || 'N/A',
bmr: analysis.bmr ? `${analysis.bmr} kcal` : 'N/A'
},
analysis: analysis.analysis,
recommendations: analysis.recommendations
}
},
null,
2
)
}
]
};
} catch (error) {
logger.error('Failed to analyze bioimpedance PDF from base64', error);
return {
content: [
{
type: 'text',
text: JSON.stringify(
{
success: false,
error: error instanceof Error ? error.message : 'Unknown error'
},
null,
2
)
}
],
isError: true
};
}
}
}
};
}