Garmin MCP Server

by Taxuspt
Verified
""" Health & Wellness Data functions for Garmin Connect MCP Server """ import datetime from typing import Any, Dict, List, Optional, Union # The garmin_client will be set by the main file garmin_client = None def configure(client): """Configure the module with the Garmin client instance""" global garmin_client garmin_client = client def register_tools(app): """Register all health and wellness tools with the MCP server app""" @app.tool() async def get_stats(date: str) -> str: """Get daily activity stats Args: date: Date in YYYY-MM-DD format """ try: stats = garmin_client.get_stats(date) if not stats: return f"No stats found for {date}" return stats except Exception as e: return f"Error retrieving stats: {str(e)}" @app.tool() async def get_user_summary(date: str) -> str: """Get user summary data (compatible with garminconnect-ha) Args: date: Date in YYYY-MM-DD format """ try: summary = garmin_client.get_user_summary(date) if not summary: return f"No user summary found for {date}" return summary except Exception as e: return f"Error retrieving user summary: {str(e)}" @app.tool() async def get_body_composition(start_date: str, end_date: str = None) -> str: """Get body composition data for a single date or date range Args: start_date: Date in YYYY-MM-DD format or start date if end_date provided end_date: Optional end date in YYYY-MM-DD format for date range """ try: if end_date: composition = garmin_client.get_body_composition(start_date, end_date) if not composition: return f"No body composition data found between {start_date} and {end_date}" else: composition = garmin_client.get_body_composition(start_date) if not composition: return f"No body composition data found for {start_date}" return composition except Exception as e: return f"Error retrieving body composition data: {str(e)}" @app.tool() async def get_stats_and_body(date: str) -> str: """Get stats and body composition data Args: date: Date in YYYY-MM-DD format """ try: data = garmin_client.get_stats_and_body(date) if not data: return f"No stats and body composition data found for {date}" return data except Exception as e: return f"Error retrieving stats and body composition data: {str(e)}" @app.tool() async def get_steps_data(date: str) -> str: """Get steps data Args: date: Date in YYYY-MM-DD format """ try: steps_data = garmin_client.get_steps_data(date) if not steps_data: return f"No steps data found for {date}" return steps_data except Exception as e: return f"Error retrieving steps data: {str(e)}" @app.tool() async def get_daily_steps(start_date: str, end_date: str) -> str: """Get steps data for a date range Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format """ try: steps_data = garmin_client.get_daily_steps(start_date, end_date) if not steps_data: return f"No daily steps data found between {start_date} and {end_date}" return steps_data except Exception as e: return f"Error retrieving daily steps data: {str(e)}" @app.tool() async def get_training_readiness(date: str) -> str: """Get training readiness data Args: date: Date in YYYY-MM-DD format """ try: readiness = garmin_client.get_training_readiness(date) if not readiness: return f"No training readiness data found for {date}" return readiness except Exception as e: return f"Error retrieving training readiness data: {str(e)}" @app.tool() async def get_body_battery(start_date: str, end_date: str) -> str: """Get body battery data Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format """ try: battery_data = garmin_client.get_body_battery(start_date, end_date) if not battery_data: return f"No body battery data found between {start_date} and {end_date}" return battery_data except Exception as e: return f"Error retrieving body battery data: {str(e)}" @app.tool() async def get_body_battery_events(date: str) -> str: """Get body battery events data Args: date: Date in YYYY-MM-DD format """ try: events = garmin_client.get_body_battery_events(date) if not events: return f"No body battery events found for {date}" return events except Exception as e: return f"Error retrieving body battery events: {str(e)}" @app.tool() async def get_blood_pressure(start_date: str, end_date: str) -> str: """Get blood pressure data Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format """ try: bp_data = garmin_client.get_blood_pressure(start_date, end_date) if not bp_data: return f"No blood pressure data found between {start_date} and {end_date}" return bp_data except Exception as e: return f"Error retrieving blood pressure data: {str(e)}" @app.tool() async def get_floors(date: str) -> str: """Get floors climbed data Args: date: Date in YYYY-MM-DD format """ try: floors_data = garmin_client.get_floors(date) if not floors_data: return f"No floors data found for {date}" return floors_data except Exception as e: return f"Error retrieving floors data: {str(e)}" @app.tool() async def get_training_status(date: str) -> str: """Get training status data Args: date: Date in YYYY-MM-DD format """ try: status = garmin_client.get_training_status(date) if not status: return f"No training status data found for {date}" return status except Exception as e: return f"Error retrieving training status data: {str(e)}" @app.tool() async def get_rhr_day(date: str) -> str: """Get resting heart rate data Args: date: Date in YYYY-MM-DD format """ try: rhr_data = garmin_client.get_rhr_day(date) if not rhr_data: return f"No resting heart rate data found for {date}" return rhr_data except Exception as e: return f"Error retrieving resting heart rate data: {str(e)}" @app.tool() async def get_heart_rates(date: str) -> str: """Get heart rate data Args: date: Date in YYYY-MM-DD format """ try: hr_data = garmin_client.get_heart_rates(date) if not hr_data: return f"No heart rate data found for {date}" return hr_data except Exception as e: return f"Error retrieving heart rate data: {str(e)}" @app.tool() async def get_hydration_data(date: str) -> str: """Get hydration data Args: date: Date in YYYY-MM-DD format """ try: hydration_data = garmin_client.get_hydration_data(date) if not hydration_data: return f"No hydration data found for {date}" return hydration_data except Exception as e: return f"Error retrieving hydration data: {str(e)}" @app.tool() async def get_sleep_data(date: str) -> str: """Get sleep data Args: date: Date in YYYY-MM-DD format """ try: sleep_data = garmin_client.get_sleep_data(date) if not sleep_data: return f"No sleep data found for {date}" return sleep_data except Exception as e: return f"Error retrieving sleep data: {str(e)}" @app.tool() async def get_stress_data(date: str) -> str: """Get stress data Args: date: Date in YYYY-MM-DD format """ try: stress_data = garmin_client.get_stress_data(date) if not stress_data: return f"No stress data found for {date}" return stress_data except Exception as e: return f"Error retrieving stress data: {str(e)}" @app.tool() async def get_respiration_data(date: str) -> str: """Get respiration data Args: date: Date in YYYY-MM-DD format """ try: respiration_data = garmin_client.get_respiration_data(date) if not respiration_data: return f"No respiration data found for {date}" return respiration_data except Exception as e: return f"Error retrieving respiration data: {str(e)}" @app.tool() async def get_spo2_data(date: str) -> str: """Get SpO2 (blood oxygen) data Args: date: Date in YYYY-MM-DD format """ try: spo2_data = garmin_client.get_spo2_data(date) if not spo2_data: return f"No SpO2 data found for {date}" return spo2_data except Exception as e: return f"Error retrieving SpO2 data: {str(e)}" @app.tool() async def get_all_day_stress(date: str) -> str: """Get all-day stress data Args: date: Date in YYYY-MM-DD format """ try: stress_data = garmin_client.get_all_day_stress(date) if not stress_data: return f"No all-day stress data found for {date}" return stress_data except Exception as e: return f"Error retrieving all-day stress data: {str(e)}" @app.tool() async def get_all_day_events(date: str) -> str: """Get daily wellness events data Args: date: Date in YYYY-MM-DD format """ try: events = garmin_client.get_all_day_events(date) if not events: return f"No daily wellness events found for {date}" return events except Exception as e: return f"Error retrieving daily wellness events: {str(e)}" return app