get_activity
Retrieve the full details of a specific Garmin workout activity using its activity ID.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- The handler function for the 'get_activity' MCP tool. Takes an activity_id, formats the Garmin API endpoint, and returns the activity data via the Garmin Connect API.
@mcp.tool def get_activity(activity_id: str) -> dict: endpoint = GET_ACTIVITY_ENDPOINT.format(activity_id=activity_id) return _connectapi(endpoint) - src/garmin_workouts_mcp/server.py:151-154 (registration)The tool is registered via the @mcp.tool decorator on the get_activity function, which automatically registers it with the FastMCP server.
@mcp.tool def get_activity(activity_id: str) -> dict: endpoint = GET_ACTIVITY_ENDPOINT.format(activity_id=activity_id) return _connectapi(endpoint) - The endpoint constant used by get_activity to construct the Garmin API URL for fetching activity details.
GET_ACTIVITY_ENDPOINT = "/activity-service/activity/{activity_id}" GET_ACTIVITY_WEATHER_ENDPOINT = "/activity-service/activity/{activity_id}/weather" LIST_ACTIVITIES_ENDPOINT = "/activitylist-service/activities/search/activities" CREATE_WORKOUT_ENDPOINT = "/workout-service/workout" SCHEDULE_WORKOUT_ENDPOINT = "/workout-service/schedule/{workout_id}" CALENDAR_WEEK_ENDPOINT = "/calendar-service/year/{year}/month/{month}/day/{day}/start/{start}" CALENDAR_MONTH_ENDPOINT = "/calendar-service/year/{year}/month/{month}" logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", stream=sys.stderr, ) logger = logging.getLogger(__name__) mcp = FastMCP(name="GarminWorkoutsMCP") _AUTH_LOCK = Lock() _AUTH_READY = False def _ensure_authenticated() -> None: global _AUTH_READY if _AUTH_READY: return with _AUTH_LOCK: if _AUTH_READY: return email = os.environ.get("GARMIN_EMAIL") password = os.environ.get("GARMIN_PASSWORD") if email or password: if not (email and password): raise RuntimeError( "Garmin credentials are incomplete. Set both GARMIN_EMAIL and GARMIN_PASSWORD." ) try: garth.login(email, password) except Exception as exc: raise RuntimeError( "Failed to authenticate with Garmin using GARMIN_EMAIL and GARMIN_PASSWORD." ) from exc _AUTH_READY = True return raise RuntimeError( "Garmin credentials are required for this tool. Set GARMIN_EMAIL and GARMIN_PASSWORD." ) def _connectapi(endpoint: str, method: str = "GET", **kwargs) -> dict: _ensure_authenticated() return garth.connectapi(endpoint, method=method, **kwargs) - The helper function that wraps the garth.connectapi call with authentication, used by get_activity to make the actual API request.
def _connectapi(endpoint: str, method: str = "GET", **kwargs) -> dict: _ensure_authenticated() return garth.connectapi(endpoint, method=method, **kwargs)