{"name":"io.github.Zsadigzade/trainbud","slug":"zsadigzade-trainbud","title":"TrainBud","description":"Talk to your own fitness data. Findings computed in code against your own 28-day baselines.","url":"https://mcp.market/server/zsadigzade-trainbud","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":30,"stars":0,"forks":0,"downloads_week":252,"last_push_at":"2026-10-14T00:48:11.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"mixed","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Zsadigzade/trainbud","website":"https://github.com/Zsadigzade/trainbud#readme","version":"0.9.0","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"trainbud","version":"0.9.0","transport":{"type":"stdio"},"packageArguments":[{"value":"start","type":"positional"}],"environmentVariables":[{"description":"The email address for your Connect account. Stored only in your local .env; `npx trainbud setup` writes it for you.","isRequired":true,"name":"GARMIN_EMAIL"},{"description":"Your Connect password. Stored only in your local .env. Accounts with MFA enabled are not supported, because the unofficial library this drives cannot complete that flow.","isRequired":true,"isSecret":true,"name":"GARMIN_PASSWORD"},{"description":"Optional, and only for the watch app's Ask card and daily insight. The MCP tools themselves need no model key: every finding is computed in code, and the model only phrases it.","isSecret":true,"name":"ANTHROPIC_API_KEY"}]},{"registryType":"oci","identifier":"ghcr.io/zsadigzade/trainbud:0.9.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"The email address for your Connect account.","isRequired":true,"name":"GARMIN_EMAIL"},{"description":"Your Connect password.","isRequired":true,"isSecret":true,"name":"GARMIN_PASSWORD"}]}],"tools":[{"name":"compare_workouts","description":"Compares one workout against the user's own earlier workouts of the same type and a similar distance (or duration, for sports that record no distance). Reports duration, pace, heart rate, elevation and calories against the closest previous effort, with the typical value across the comparable set. Defaults to the most recent activity. Use this when asked how a session went compared with usual, rath","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_activities_range","description":"Returns Garmin activities within an ISO 8601 date range.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_body_composition","description":"Returns weight, body fat, and muscle mass trends over a time period.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_findings","description":"Returns what stands out in the user's stored history against their own 28-day baselines: resting heart rate elevation, sleep debt, HRV trend breaks, and training load ratio. Prefer this over reading raw metrics when asked how things are going.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_heart_rate_trends","description":"Returns resting, max, and average heart rate trends over a time period.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_latest_activity","description":"Returns the most recent Garmin activity with distance, duration, pace, and heart rate stats.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_recovery_status","description":"Combines HRV, sleep, stress, and resting heart rate into a recovery score and training recommendation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_sleep_data","description":"Returns sleep duration, quality score, stage breakdown, and interruptions for recent nights.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_stress_levels","description":"Returns daily stress averages and trends from Garmin Connect.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_training_insights","description":"Returns a combined weekly training summary: latest activity, recent workouts, sleep, recovery, and stress.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_user_context","description":"Returns the goals, races, injuries and notes on record for the user. Read this before giving training advice.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_vo2_max_trends","description":"Returns VO2 max fitness trends over time from Garmin Connect.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_week_review","description":"Returns this training week against the previous one — sessions, training load, sleep, resting heart rate, HRV and stress — plus where the acute:chronic load ratio lands if next week repeats this one, a sleep debt and consistency read against the user's own baseline, and the next race on record. Prefer this over reading individual metrics when asked how the week or the block is going, whether to ba","write_action":false,"price_micros":0,"input_schema":null},{"name":"log_subjective","description":"Records how a day or session actually felt, rated 1-10: perceived effort (rpe), soreness, or mood. Garmin has no equivalent.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remember_context","description":"Records something about the user that Garmin does not know: a goal, a race and its date, an injury, or a free-form note. Use this whenever the user mentions one in passing. It can also silence a finding the user has already accounted for — see `mutes`.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":83,"grade":"B","scanned_at":"2026-10-15T11:59:25.550Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-15T11:59:25.492Z","components":{"code":{"score":25,"max":25,"notes":["159 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"trainbud","version":"0.9.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":10,"publishedAt":"2026-09-18T14:08:39.740Z","repositoryUrl":"git+https://github.com/Zsadigzade/trainbud.git"}],"repo":{"found":true,"owner":"Zsadigzade","repo":"trainbud","archived":false,"pushedAt":"2026-10-14T00:48:11Z","stars":0,"forks":0,"openIssues":3,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/86562691?v=4","ownerCreatedAt":"2021-06-27T14:45:46Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/86562691?v=4&s=128","source":"registry"},"presence":{"stars":0,"forks":0,"downloadsWeek":252,"license":"MIT","lastPushAt":"2026-10-14T00:48:11.000Z","score":30}}}},"grade_history":[{"kind":"restore","fromGrade":"C","toGrade":"B","reason":"score 83","createdAt":"2026-09-19T21:04:09.437Z"}],"reviews":[]}