{"data":{"tools":[{"name":"fitly_get_today","description":"Get a summary of today's nutrition, water, workout, and weight data.","parameters":[],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_day_context","description":"Get full context for a single date (profile, meals, workouts, water, chat/day summary). Use this first when an agent needs complete day state before making edits.","parameters":[{"name":"date","type":"string","description":"Date in YYYY-MM-DD format (defaults to today)","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_meals","description":"List meals for a date/range. For update/delete requests, fetch this first so you can target specific meal IDs.","parameters":[{"name":"date","type":"string","description":"Single date in YYYY-MM-DD format","required":false},{"name":"startDate","type":"string","description":"Range start in YYYY-MM-DD (requires endDate)","required":false},{"name":"endDate","type":"string","description":"Range end in YYYY-MM-DD (requires startDate)","required":false},{"name":"cursor","type":"string","description":"Pagination cursor (UUID)","required":false},{"name":"limit","type":"number","description":"Max results (1-200)","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_workouts","description":"List workouts/exercises for a date/range. For update/delete requests, fetch this first so you can target specific exercise IDs.","parameters":[{"name":"date","type":"string","description":"Single date in YYYY-MM-DD format","required":false},{"name":"startDate","type":"string","description":"Range start in YYYY-MM-DD (requires endDate)","required":false},{"name":"endDate","type":"string","description":"Range end in YYYY-MM-DD (requires startDate)","required":false},{"name":"cursor","type":"string","description":"Pagination cursor (UUID)","required":false},{"name":"limit","type":"number","description":"Max results (1-200)","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_checkins","description":"List daily check-ins for a date range: sleep hours, energy, mood, stress, soreness (and sore areas), hunger, and journal notes. Defaults to the recent window when no dates are given. This is how the day FELT, which meals and workouts do not record.","parameters":[{"name":"startDate","type":"string","description":"Range start in YYYY-MM-DD format","required":false},{"name":"endDate","type":"string","description":"Range end in YYYY-MM-DD format. Defaults to today.","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_log_checkin","description":"Create or update one day's check-in. Upsert, so sending one field leaves the rest of that day alone. Scales run 1-5 WORST to BEST: 1 is wrecked/exhausted/starving, 5 is the best that field gets. Unknown keys come back in `ignored` rather than failing the write. Cannot check in for a future date.","parameters":[{"name":"dateKey","type":"string","description":"The day being checked in, YYYY-MM-DD. Must not be in the future.","required":true},{"name":"fields","type":"object","description":"Fields to set. Known keys: sleepHours (number), energy/mood/stress/soreness/hunger (1-5, where 1 is worst), sorenessAreas (array of strings), notes (string). Null clears a field.","required":true}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_measurements","description":"List body measurements (waist, chest, shoulders, hips, arms, thighs, neck, body-fat percentage) for a date range, optionally filtered to one site.","parameters":[{"name":"startDate","type":"string","description":"Range start in YYYY-MM-DD format","required":false},{"name":"endDate","type":"string","description":"Range end in YYYY-MM-DD format. Defaults to today.","required":false},{"name":"site","type":"string","description":"Restrict to one site, e.g. \"waist\"","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_log_measurements","description":"Record body measurements for one day. Upsert per site, so sending waist alone leaves the other sites for that day untouched. Values are centimetres, except body_fat_pct which is a percentage. Unknown sites come back in `ignored` rather than failing the write.","parameters":[{"name":"dateKey","type":"string","description":"The day measured, YYYY-MM-DD","required":true},{"name":"measurements","type":"object","description":"Site to value, e.g. {\"waist\": 86.5, \"chest\": 102}. Centimetres, except body_fat_pct.","required":true}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_progress_photos","description":"List progress photo METADATA: date, angle, time of day and notes. Returns no images and no image links, by design -- the photos stay in the app. Useful for cadence (\"no front photo in six weeks\"), not for looking at anything.","parameters":[{"name":"poseType","type":"string","description":"Restrict to one angle: front, side, back, or other","required":false},{"name":"limit","type":"number","description":"Maximum photos to return, 1-100","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_weight","description":"List weight log entries for a date/range.","parameters":[{"name":"date","type":"string","description":"Single date in YYYY-MM-DD format","required":false},{"name":"startDate","type":"string","description":"Range start in YYYY-MM-DD (requires endDate)","required":false},{"name":"endDate","type":"string","description":"Range end in YYYY-MM-DD (requires startDate)","required":false},{"name":"cursor","type":"string","description":"Pagination cursor (UUID)","required":false},{"name":"limit","type":"number","description":"Max results (1-200)","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_water","description":"List water intake logs for a date.","parameters":[{"name":"date","type":"string","description":"Date in YYYY-MM-DD format","required":false},{"name":"cursor","type":"string","description":"Pagination cursor (UUID)","required":false},{"name":"limit","type":"number","description":"Max results (1-200)","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_profile","description":"CALL THIS FIRST. Get the user's full profile including their AI coach name (aiName), coaching personality (aiPersonality), stats, goals, injuries, allergies, and preferences. Use the coach name when referring to yourself. If the profile is mostly empty, the user is new and needs onboarding.","parameters":[],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_progress","description":"Get progress data (weight trend) for a date range.","parameters":[{"name":"startDate","type":"string","description":"Range start in YYYY-MM-DD","required":false},{"name":"endDate","type":"string","description":"Range end in YYYY-MM-DD","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_get_checkout_url","description":"Generate a Stripe checkout URL so the user can subscribe to Fitly AI. Returns a payment link the user must open to complete payment. Use this after registering a new user to get them subscribed.","parameters":[{"name":"successUrl","type":"string","description":"URL to redirect after successful payment (default: https://fitly.chat?checkout=success)","required":false},{"name":"cancelUrl","type":"string","description":"URL to redirect if payment is canceled (default: https://fitly.chat?checkout=canceled)","required":false},{"name":"priceId","type":"string","description":"Stripe price ID for the plan (defaults to monthly plan)","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_log_meal","description":"Log a meal with nutrition data.","parameters":[{"name":"description","type":"string","description":"Meal description","required":true},{"name":"calories","type":"number","description":"Calories (0-20000)","required":true},{"name":"protein","type":"number","description":"Protein in grams","required":false},{"name":"carbs","type":"number","description":"Carbs in grams","required":false},{"name":"fat","type":"number","description":"Fat in grams","required":false},{"name":"loggedAt","type":"string","description":"ISO datetime (defaults to now)","required":false},{"name":"source","type":"string","description":"Source identifier","required":false},{"name":"micronutrients","type":"object","description":"Optional micronutrient data","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_log_workout","description":"Log a workout with exercises.","parameters":[{"name":"name","type":"string","description":"Workout name","required":true},{"name":"notes","type":"string","description":"Workout notes","required":false},{"name":"exercises","type":"array","description":"Array of exercise objects","required":false},{"name":"loggedAt","type":"string","description":"ISO datetime (defaults to now)","required":false},{"name":"source","type":"string","description":"Source identifier","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_log_weight","description":"Log a weight measurement.","parameters":[{"name":"weightKg","type":"number","description":"Weight in kilograms","required":true},{"name":"loggedAt","type":"string","description":"ISO datetime (defaults to now)","required":false},{"name":"source","type":"string","description":"Source identifier","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_update_weight","description":"Update one weight log entry by ID.","parameters":[{"name":"weightId","type":"string","description":"Weight log UUID","required":true},{"name":"weightKg","type":"number","description":"Updated weight in kilograms","required":false},{"name":"loggedAt","type":"string","description":"Updated ISO datetime","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_delete_weight","description":"Delete one weight log entry by ID. Prefer ID deletes after resolving IDs from fitly_get_weight.","parameters":[{"name":"weightId","type":"string","description":"Weight log UUID","required":true}],"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"fitly_log_water","description":"Log water intake.","parameters":[{"name":"amountMl","type":"number","description":"Amount in milliliters","required":true},{"name":"loggedAt","type":"string","description":"ISO datetime (defaults to now)","required":false},{"name":"source","type":"string","description":"Source identifier","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_update_profile","description":"Update user profile fields (stats, goals, injuries, preferences, AI personality). Use this during onboarding to save the user's answers: firstName, goals, heightCm, weightKg, injuries, allergies, aiName, aiPersonality.","parameters":[{"name":"firstName","type":"string","description":"First name","required":false},{"name":"lastName","type":"string","description":"Last name","required":false},{"name":"birthDate","type":"string","description":"Birth date (ISO datetime)","required":false},{"name":"gender","type":"string","description":"Gender","required":false},{"name":"heightCm","type":"number","description":"Height in cm","required":false},{"name":"weightKg","type":"number","description":"Weight in kg","required":false},{"name":"goals","type":"object","description":"Fitness goals","required":false},{"name":"injuries","type":"object","description":"Current injuries","required":false},{"name":"allergies","type":"object","description":"Food allergies","required":false},{"name":"aiName","type":"string","description":"AI coach name","required":false},{"name":"aiPersonality","type":"string","description":"AI personality style","required":false},{"name":"coachingPreferences","type":"object","description":"Coaching preferences","required":false},{"name":"macroTargets","type":"object","description":"Daily macro targets","required":false},{"name":"trackedMicronutrients","type":"object","description":"Micronutrients to track","required":false},{"name":"dailyWaterTargetMl","type":"number","description":"Daily water target in ml","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_chat","description":"Send a message to the AI fitness coach and get a response.","parameters":[{"name":"message","type":"string","description":"User message","required":true},{"name":"conversationId","type":"string","description":"Conversation UUID (optional, for continuity)","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_update_meal_by_id","description":"Update one meal by ID. For multi-item updates, call this tool once per meal ID.","parameters":[{"name":"mealId","type":"string","description":"Meal UUID","required":true},{"name":"description","type":"string","description":"Meal description","required":false},{"name":"calories","type":"number","description":"Calories","required":false},{"name":"protein","type":"number","description":"Protein in grams","required":false},{"name":"carbs","type":"number","description":"Carbs in grams","required":false},{"name":"fat","type":"number","description":"Fat in grams","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_delete_meal_by_id","description":"Delete one meal by ID. Prefer ID deletes after resolving IDs from fitly_get_meals.","parameters":[{"name":"mealId","type":"string","description":"Meal UUID","required":true}],"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"fitly_update_workout_exercise","description":"Update one workout exercise by ID.","parameters":[{"name":"exerciseId","type":"string","description":"Exercise UUID","required":true},{"name":"exerciseName","type":"string","description":"Exercise name","required":false},{"name":"variation","type":"string","description":"Variation (grip, stance)","required":false},{"name":"bodyTarget","type":"string","description":"Body target","required":false},{"name":"sets","type":"number","description":"Number of sets","required":false},{"name":"reps","type":"number","description":"Number of reps","required":false},{"name":"weightKg","type":"number","description":"Weight in kg","required":false},{"name":"durationSeconds","type":"number","description":"Duration in seconds","required":false},{"name":"distanceKm","type":"number","description":"Distance in km","required":false},{"name":"notes","type":"string","description":"Exercise notes","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_delete_workout_exercise_by_id","description":"Delete one workout exercise by ID.","parameters":[{"name":"exerciseId","type":"string","description":"Exercise UUID","required":true}],"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"fitly_get_meal_plan","description":"Get the active meal plan with all items grouped by day and meal type.","parameters":[],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_set_meal_plan","description":"Create a new meal plan (replaces any existing active plan). Provide all items at once.","parameters":[{"name":"name","type":"string","description":"Plan name (default: \"Meal Plan\")","required":false},{"name":"items","type":"array","description":"Array of meal plan items with dayGroup, mealGroup (breakfast|lunch|dinner|snack, or descriptive names like \"Morning Snack\", \"Afternoon Snack\", \"Evening Snack\" when multiple snacks are needed so they display as separate meals), description, calories, protein, carbs, fat, optional servingSize/servingUnit","required":true}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_update_meal_plan","description":"Update an existing meal plan. Can rename the plan and/or add/remove/replace items.","parameters":[{"name":"name","type":"string","description":"New plan name","required":false},{"name":"operations","type":"array","description":"Array of operations: {op: \"add\"|\"remove\"|\"replace\", dayGroup?, mealGroup?, itemDescription? (for remove/replace), item? (for add/replace)}","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_delete_meal_plan","description":"Delete the active meal plan.","parameters":[],"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"fitly_get_workout_plan","description":"Get the active workout plan with all exercises grouped by day.","parameters":[],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_set_workout_plan","description":"Create a new workout plan (replaces any existing active plan). Provide all exercises at once.","parameters":[{"name":"name","type":"string","description":"Plan name (default: \"Workout Plan\")","required":false},{"name":"items","type":"array","description":"Array of exercises with dayGroup, exerciseName, optional bodyTarget/sets/reps/weightKg/durationSeconds/distanceKm/notes","required":true}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_update_workout_plan","description":"Update an existing workout plan. Can rename the plan and/or add/remove/replace exercises.","parameters":[{"name":"name","type":"string","description":"New plan name","required":false},{"name":"operations","type":"array","description":"Array of operations: {op: \"add\"|\"remove\"|\"replace\", dayGroup?, exerciseName? (for remove/replace), exercise? (for add/replace)}","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_delete_workout_plan","description":"Delete the active workout plan.","parameters":[],"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"fitly_get_custom_foods","description":"Get the user's custom food database. Optionally filter by barcode.","parameters":[{"name":"barcode","type":"string","description":"Filter by barcode","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_search_foods","description":"Search the food database for nutrition info. Returns custom foods first, then reference entries.","parameters":[{"name":"query","type":"string","description":"Search query","required":true},{"name":"limit","type":"number","description":"Max results (1-20, default 15)","required":false}],"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_delete_water","description":"Delete a water log entry by ID. Prefer ID deletes after resolving IDs from fitly_get_water.","parameters":[{"name":"waterLogId","type":"string","description":"Water log UUID","required":true}],"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"fitly_add_custom_food","description":"Add a custom food to the user's food database.","parameters":[{"name":"name","type":"string","description":"Food name","required":true},{"name":"barcode","type":"string","description":"Barcode","required":false},{"name":"servingSize","type":"number","description":"Serving size","required":true},{"name":"servingUnit","type":"string","description":"Serving unit (e.g. \"g\", \"cup\", \"piece\")","required":true},{"name":"calories","type":"number","description":"Calories per serving","required":true},{"name":"protein","type":"number","description":"Protein in grams","required":true},{"name":"carbs","type":"number","description":"Carbs in grams","required":true},{"name":"fat","type":"number","description":"Fat in grams","required":true},{"name":"servingWeightG","type":"number","description":"Serving weight in grams","required":false},{"name":"servingWeightUnit","type":"string","description":"\"g\" or \"ml\"","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_update_custom_food","description":"Update a custom food by ID.","parameters":[{"name":"foodId","type":"string","description":"Custom food UUID","required":true},{"name":"name","type":"string","description":"Food name","required":false},{"name":"barcode","type":"string","description":"Barcode (null to clear)","required":false},{"name":"servingSize","type":"number","description":"Serving size","required":false},{"name":"servingUnit","type":"string","description":"Serving unit","required":false},{"name":"calories","type":"number","description":"Calories per serving","required":false},{"name":"protein","type":"number","description":"Protein in grams","required":false},{"name":"carbs","type":"number","description":"Carbs in grams","required":false},{"name":"fat","type":"number","description":"Fat in grams","required":false},{"name":"servingWeightG","type":"number","description":"Serving weight in grams","required":false},{"name":"servingWeightUnit","type":"string","description":"\"g\" or \"ml\"","required":false}],"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"fitly_delete_custom_food","description":"Delete a custom food by ID.","parameters":[{"name":"foodId","type":"string","description":"Custom food UUID","required":true}],"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}}]}}