Brad MCP
An experimental, unified interface for personal data. For both agents and myself to run queries or scripts against.
I deploy it with MetaMCP on my home server.
Domains
Data sources are combined into domains.
| Domain | Source | Description |
|---|---|---|
music | Last.fm | Listening history, charts |
weight | Withings | Weight, BMI, body composition |
sleep | Sleep as Android | Sleep with quality scores |
gaming | Steam + RetroAchievements | Playtime & achievements |
fitness | Strava | Activities with training load metrics |
films | Letterboxd | Film diary, reviews, lists |
boardgames | BoardGameGeek | Collection, play logs |
nutrition | Agent logging | Nutrition, calories, alcohol, etc. |
home | Home Assistant | Presence, indoor environment, weather |
nature | iNaturalist | Nature observations, geolocation |
Tools
Tools take a domain and optional filters. Most also accept a period (today, week, month, year).
Querying Domains
recent("films", 10)query("fitness", filters={"activity_type": "Ride"})top("music", group_by="artist", period="month")summary("week")
Health Summary
health_summary("week")unified view of health domains
Training Metrics
training_status()current metrics (CTL, ATL, TSB, ACWR) derived from fitness activities
Timeline Context
on_date("2025-03-15")timeline(start_date, end_date, domains=[...])day_of_week("home", "steps", "month")
During
Given any activity record, during() finds everything else that was happening across other domains in the same time window:
during("fitness", record_id="5890123456") # what was I listening to during this ride?
during("sleep", date="2026-03-15") # what was happening during last night's sleep?
during("nature", record_id="345782430", include=["music"]) # was there music near this observation?
Analysis
For finding connections between domains:
Correlation
correlate(metric1, metric2, period) - Pearson correlation between any two metrics:
correlate("nutrition.drinks", "sleep.quality", "month") # does drinking hurt sleep?
correlate("home.pm25_downstairs", "sleep.duration", "month") # does air quality matter?
correlate("fitness.tss", "sleep.duration", "month") # does hard training mean more sleep?
Coincidence
coincidence(domain1, field1, threshold, domain2, field2) - compares a metric on days when something else crosses a threshold. Answers questions like “what does my sleep look like on high-step days vs. low-step days?”:
coincidence("home", "steps", 10000, "sleep", "duration") # active days vs. rest days
coincidence("fitness", "distance", 1, "home", "steps") # training days vs. off days
Patterns
patterns(domain, field, threshold, compare) - find next-day effects: what tends to follow a day above a threshold?
patterns("fitness", "tss", 100, compare=["sleep.duration", "home.steps"]) # day after hard training
patterns("sleep", "quality", 85, compare=["fitness.tss", "home.steps"]) # what follows a good night's sleep?