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.

DomainSourceDescription
musicLast.fmListening history, charts
weightWithingsWeight, BMI, body composition
sleepSleep as AndroidSleep with quality scores
gamingSteam + RetroAchievementsPlaytime & achievements
fitnessStravaActivities with training load metrics
filmsLetterboxdFilm diary, reviews, lists
boardgamesBoardGameGeekCollection, play logs
nutritionAgent loggingNutrition, calories, alcohol, etc.
homeHome AssistantPresence, indoor environment, weather
natureiNaturalistNature 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?