Skip to main content
Glama

analyze_bioimpedance_pdf_base64

Analyze bioimpedance PDF data to extract health metrics and generate personalized recommendations from base64-encoded documents.

Instructions

Analyze a bioimpedance PDF document from base64-encoded data

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
base64DataYes
patientIdNo

Implementation Reference

  • MCP tool handler for 'analyze_bioimpedance_pdf_base64'. Defines input schema with Zod, executes PDF analysis from base64 data using PDFAnalysisService, and returns structured JSON response with health metrics, analysis, and recommendations.
    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
          };
        }
      }
    }
  • src/index.ts:60-68 (registration)
    Registers the PDF tools (including analyze_bioimpedance_pdf_base64) by calling createPDFTools and merging into the allTools object used by MCP server handlers.
    const ticketTools = createTicketTools(apiService);
    const chatbotTools = createChatbotTools(chatbotService);
    const pdfTools = createPDFTools(pdfService);
    
    const allTools = {
      ...ticketTools,
      ...chatbotTools,
      ...pdfTools
    };
  • Core service method that implements the bioimpedance PDF analysis from base64: decodes data, parses PDF text, extracts measurements using regex patterns, generates analysis/recommendations, optionally enhances with AI.
    async analyzeBioimpedancePDFFromBase64(base64Data: string): Promise<BioimpedanceData> {
      try {
        logger.info('Starting PDF analysis from base64');
    
        // Decode base64 to buffer
        const buffer = Buffer.from(base64Data, 'base64');
        
        // Create parser and extract text
        const pdfParser = new PDFParse({ data: buffer });
        const textResult = await pdfParser.getText();
    
        logger.debug('PDF parsed successfully', {
          pages: textResult.pages.length,
          textLength: textResult.text.length
        });
    
        // Extract bioimpedance data from text
        const extractedData = this.extractBioimpedanceData(textResult.text);
    
        // Generate analysis and recommendations
        const insights = await this.enhanceWithAI(extractedData);
        const { analysis, recommendations } = insights;
    
        const result: BioimpedanceData = {
          ...extractedData,
          analysis,
          recommendations
        };
    
        logger.info('PDF analysis completed successfully');
        return result;
      } catch (error) {
        logger.error('Failed to analyze PDF from base64', error);
        throw new Error(`PDF analysis failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
      }
    }
  • Helper method that uses regex patterns to extract key bioimpedance measurements (patient info, weight, height, BMI, body fat %, muscle %, etc.) from parsed PDF text.
    private extractBioimpedanceData(text: string): Omit<BioimpedanceData, 'analysis' | 'recommendations'> {
      const data: Omit<BioimpedanceData, 'analysis' | 'recommendations'> = {};
    
      // Extract patient name
      const nameMatch = text.match(/(?:paciente|patient|nome|name)[:\s]+([^\n]+)/i);
      if (nameMatch) {
        data.patientName = nameMatch[1].trim();
      }
    
      // Extract date
      const dateMatch = text.match(/(?:data|date)[:\s]+(\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4})/i);
      if (dateMatch) {
        data.date = dateMatch[1];
      }
    
      // Extract weight (kg)
      const weightMatch = text.match(/(?:peso|weight)[:\s]+(\d+(?:\.\d+)?)\s*(?:kg)?/i);
      if (weightMatch) {
        data.weight = parseFloat(weightMatch[1]);
      }
    
      // Extract height (cm)
      const heightMatch = text.match(/(?:altura|height)[:\s]+(\d+(?:\.\d+)?)\s*(?:cm)?/i);
      if (heightMatch) {
        data.height = parseFloat(heightMatch[1]);
      }
    
      // Extract body fat percentage
      const bodyFatMatch = text.match(/(?:gordura corporal|body fat|%\s*gordura)[:\s]+(\d+(?:\.\d+)?)\s*%?/i);
      if (bodyFatMatch) {
        data.bodyFatPercentage = parseFloat(bodyFatMatch[1]);
      }
    
      // Extract muscle mass percentage
      const muscleMassMatch = text.match(/(?:massa muscular|muscle mass|%\s*m[uú]sculo)[:\s]+(\d+(?:\.\d+)?)\s*%?/i);
      if (muscleMassMatch) {
        data.muscleMassPercentage = parseFloat(muscleMassMatch[1]);
      }
    
      // Extract bone mass (kg)
      const boneMassMatch = text.match(/(?:massa [óo]ssea|bone mass)[:\s]+(\d+(?:\.\d+)?)\s*(?:kg)?/i);
      if (boneMassMatch) {
        data.boneMass = parseFloat(boneMassMatch[1]);
      }
    
      // Extract body water percentage
      const bodyWaterMatch = text.match(/(?:[áa]gua corporal|body water|%\s*[áa]gua)[:\s]+(\d+(?:\.\d+)?)\s*%?/i);
      if (bodyWaterMatch) {
        data.bodyWaterPercentage = parseFloat(bodyWaterMatch[1]);
      }
    
      // Extract visceral fat
      const visceralFatMatch = text.match(/(?:gordura visceral|visceral fat)[:\s]+(\d+(?:\.\d+)?)/i);
      if (visceralFatMatch) {
        data.visceralFat = parseFloat(visceralFatMatch[1]);
      }
    
      // Extract BMR (Basal Metabolic Rate)
      const bmrMatch = text.match(/(?:taxa metab[óo]lica basal|bmr|tmb)[:\s]+(\d+(?:\.\d+)?)\s*(?:kcal)?/i);
      if (bmrMatch) {
        data.bmr = parseFloat(bmrMatch[1]);
      }
    
      // Calculate or extract BMI
      const bmiMatch = text.match(/(?:imc|bmi)[:\s]+(\d+(?:\.\d+)?)/i);
      if (bmiMatch) {
        data.bmi = parseFloat(bmiMatch[1]);
      } else if (data.weight && data.height) {
        // Calculate BMI if not found: BMI = weight(kg) / (height(m))^2
        const heightInMeters = data.height / 100;
        data.bmi = parseFloat((data.weight / (heightInMeters * heightInMeters)).toFixed(2));
      }
    
      logger.debug('Extracted bioimpedance data', data);
      return data;
    }
  • TypeScript interface defining the structure of bioimpedance analysis data returned by the tool.
    export interface BioimpedanceData {
      patientName?: string;
      date?: string;
      weight?: number;
      height?: number;
      bodyFatPercentage?: number;
      muscleMassPercentage?: number;
      boneMass?: number;
      bodyWaterPercentage?: number;
      visceralFat?: number;

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/osmarsant/fitslot-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server