Skip to main content
Glama
data-analysis.js5.19 kB
// Advanced data analysis example for WHOOP MCP Server // This example shows how to analyze fitness and health data // Example of analyzing WHOOP data for insights: // 1. Get the last 30 days of data const thirtyDaysAgo = new Date(); thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); const startDate = thirtyDaysAgo.toISOString(); // 2. Fetch comprehensive data for analysis const cycles = await callTool('whoop-get-cycle-collection', { limit: 30, start: startDate }); const sleepData = await callTool('whoop-get-sleep-collection', { limit: 30, start: startDate }); const workouts = await callTool('whoop-get-workout-collection', { limit: 30, start: startDate }); const recoveryData = await callTool('whoop-get-recovery-collection', { limit: 30, start: startDate }); // 3. Analyze sleep patterns function analyzeSleep(sleepRecords) { const totalSleep = sleepRecords.reduce((sum, record) => { if (record.score?.stage_summary) { return sum + record.score.stage_summary.total_in_bed_time_milli / (1000 * 60 * 60); // Convert to hours } return sum; }, 0); const avgSleepHours = totalSleep / sleepRecords.length; const sleepEfficiency = sleepRecords.reduce((sum, record) => { return sum + (record.score?.sleep_efficiency_percentage || 0); }, 0) / sleepRecords.length; return { averageSleepHours: avgSleepHours.toFixed(2), averageSleepEfficiency: sleepEfficiency.toFixed(1) + '%', totalSleepRecords: sleepRecords.length }; } // 4. Analyze workout patterns function analyzeWorkouts(workoutRecords) { const totalStrain = workoutRecords.reduce((sum, record) => { return sum + (record.score?.strain || 0); }, 0); const avgStrain = totalStrain / workoutRecords.length; const totalCalories = workoutRecords.reduce((sum, record) => { return sum + (record.score?.kilojoule || 0) / 4.184; // Convert kJ to kcal }, 0); const sportBreakdown = workoutRecords.reduce((acc, record) => { const sport = record.sport_name; acc[sport] = (acc[sport] || 0) + 1; return acc; }, {}); return { averageStrain: avgStrain.toFixed(2), totalCalories: Math.round(totalCalories), totalWorkouts: workoutRecords.length, sportBreakdown }; } // 5. Analyze recovery patterns function analyzeRecovery(recoveryRecords) { const avgRecoveryScore = recoveryRecords.reduce((sum, record) => { return sum + (record.score?.recovery_score || 0); }, 0) / recoveryRecords.length; const avgHRV = recoveryRecords.reduce((sum, record) => { return sum + (record.score?.hrv_rmssd_milli || 0); }, 0) / recoveryRecords.length; const avgRestingHR = recoveryRecords.reduce((sum, record) => { return sum + (record.score?.resting_heart_rate || 0); }, 0) / recoveryRecords.length; return { averageRecoveryScore: avgRecoveryScore.toFixed(1) + '%', averageHRV: Math.round(avgHRV) + 'ms', averageRestingHR: Math.round(avgRestingHR) + ' bpm', totalRecoveryRecords: recoveryRecords.length }; } // 6. Generate insights const sleepInsights = analyzeSleep(sleepData.records); const workoutInsights = analyzeWorkouts(workouts.records); const recoveryInsights = analyzeRecovery(recoveryData.records); console.log('=== WHOOP Data Analysis (Last 30 Days) ==='); console.log('\nSleep Analysis:'); console.log(`- Average Sleep: ${sleepInsights.averageSleepHours} hours`); console.log(`- Sleep Efficiency: ${sleepInsights.averageSleepEfficiency}`); console.log(`- Sleep Records: ${sleepInsights.totalSleepRecords}`); console.log('\nWorkout Analysis:'); console.log(`- Average Strain: ${workoutInsights.averageStrain}`); console.log(`- Total Calories Burned: ${workoutInsights.totalCalories} kcal`); console.log(`- Total Workouts: ${workoutInsights.totalWorkouts}`); console.log('- Sport Breakdown:', workoutInsights.sportBreakdown); console.log('\nRecovery Analysis:'); console.log(`- Average Recovery Score: ${recoveryInsights.averageRecoveryScore}`); console.log(`- Average HRV: ${recoveryInsights.averageHRV}`); console.log(`- Average Resting HR: ${recoveryInsights.averageRestingHR}`); console.log(`- Recovery Records: ${recoveryInsights.totalRecoveryRecords}`); // 7. Generate recommendations function generateRecommendations(sleep, workouts, recovery) { const recommendations = []; if (parseFloat(sleep.averageSleepHours) < 7) { recommendations.push('Consider increasing sleep duration to 7-9 hours for better recovery'); } if (parseFloat(sleep.averageSleepEfficiency) < 85) { recommendations.push('Focus on improving sleep efficiency through better sleep hygiene'); } if (parseFloat(recovery.averageRecoveryScore) < 70) { recommendations.push('Consider reducing training intensity or increasing recovery time'); } if (parseFloat(workouts.averageStrain) > 15) { recommendations.push('High average strain detected - ensure adequate recovery between sessions'); } return recommendations; } const recommendations = generateRecommendations(sleepInsights, workoutInsights, recoveryInsights); console.log('\nRecommendations:'); recommendations.forEach((rec, index) => { console.log(`${index + 1}. ${rec}`); });

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/nissand/whoop-mcp-server-claude'

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