Personal longevity tracking system with health data management, diet logging, exercise tracking, biomarkers, supplements, and N-of-1 trials. Provides database initialization, dashboard API, and Apple Health import capabilities.
26 tools with mixed quality. Naming is generally verb-based (get_, log_, create_) but lacks consistency in parameter naming conventions. Descriptions range from adequate (50-150 chars) to verbose (200+ chars), but many lack actionable context for LLM selection. Input schemas are present for most tools but lack type constraints (enums, ranges). Output schemas are undocumented, LLMs cannot predict response structure. Error handling is absent; no recovery guidance. Security concerns: hardcoded DB path in setup.py, no permission gates on destructive operations (cmd_reset). Composition is reasonable, tools are single-purpose, but chaining metadata (IDs needed for downstream calls) is not consistently returned.
GET /api/biomarkers — Returns biomarker test results including panel name, marker name, value, reference ranges, and optimal ranges.
Verify that setup is complete and healthy. Checks database existence, permissions, schema version, table presence, row counts, directories, and migration files.
Reset the database: back up, drop all tables, re-run migrations. Requires --confirm flag to prevent accidental data loss. Creates backup with timestamp before removing database.
Full project setup: create directories, run initial migration, verify schema and tables. Creates required directories, initializes database, sets file permissions (0600), and verifies all expected tables are present.
Create an N-of-1 trial. Args: name, hypothesis, intervention, primary_outcome_metric, optional secondary_outcomes_json, design (ABA/crossover), phase_duration_days, washout_duration_days, min_observations_per_phase, literature_evidence_json. Returns trials row id.
GET /api/daily-summary?date=YYYY-MM-DD — Returns today's totals plus 7-day averages for key metrics including calories, protein, exercise minutes, and sleep hours.
Output schemas undocumented. LLMs cannot predict response structure for any of the 26 tools. No documentation of returned fields, types, or pagination.
No error handling or recovery guidance. Tools lack descriptions of failure modes, retryability, or actionable error messages. Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | 2026-07-28+ | v2 |
GET /api/exercises — Returns exercise entries including activity type, duration, distance, heart rate, and RPE for a date range.
Get biomarker results in a date range. Args: start_date, end_date (ISO 8601 or YYYY-MM-DD), optional panel_name filter. Returns list of biomarker dicts.
Get exercise entries in a date range. Args: start_date, end_date (ISO 8601 or YYYY-MM-DD), optional activity_type filter. Returns list of exercise entry dicts with details.
Get generated insights. Args: optional insight_type filter (correlation/trend/anomaly/pattern), start_date, end_date. Returns list of insight dicts.
Get diet entries with their ingredients in a date range. Args: start_date, end_date (ISO 8601 or YYYY-MM-DD). Returns list of diet entry dicts, each with an 'ingredients' key.
Get body metrics in a date range. Args: start_date, end_date (ISO 8601 or YYYY-MM-DD), optional metric_type filter. Returns list of metric dicts.
Get supplement regimen. Args: optional active_only (bool, default True). Returns list of supplement dicts.
Get N-of-1 trials. Args: optional status filter (proposed/approved/active/completed/abandoned). Returns list of trial dicts with observations.
GET /api/insights — Returns generated insights including correlations, trends, anomalies, and patterns with statistical details and confidence levels.
Log a biomarker test result. Args: timestamp (ISO 8601 UTC), marker_name, value, unit, optional panel_name, reference_low, reference_high, optimal_low, optimal_high, lab_source, notes. Returns biomarkers row id.
Log an exercise session. Args: timestamp (ISO 8601 UTC), activity_type, duration_minutes, optional distance_km, avg_hr, rpe (1-10), notes, details list. Returns exercise_entries row id.
Log a meal with its ingredients. Args: timestamp (ISO 8601 UTC), meal_type (breakfast/lunch/dinner/snack), description, ingredients list with nutrition data, optional confidence_score, photo_path, notes. Returns diet_entries row id.
Log a body metric (weight, heart rate, sleep, etc.). Args: timestamp (ISO 8601 UTC), metric_type, value, unit, optional context, device_method, notes. Returns body_metrics row id.
Log a supplement regimen. Args: compound_name, dosage, dosage_unit, frequency, optional timing, start_date, end_date, reason, brand, cost_per_unit, notes. Returns supplements row id.
Log an observation for a trial. Args: trial_id, date (YYYY-MM-DD), phase (baseline/intervention/washout/control), metric_name, value, optional compliance_score, notes. Returns trial_observations row id.
GET /api/metrics — Returns body metrics data including weight, heart rate, blood pressure, sleep, and other tracked measurements.
GET /api/nutrition — Returns nutrition data including diet entries with ingredients, meal types, and macronutrient totals for a date range.
Upsert a recipe into the library. Args: name (unique key), description, ingredients_json, nutrition_json. Returns recipe_library row id.
GET /api/supplements — Returns current and historical supplement regimen including compound name, dosage, frequency, and timing.
GET /api/trials — Returns N-of-1 trial data including hypothesis, intervention, design, phase duration, and observations.
Destructive tool (cmd_reset) lacks confirmation pattern. No dry-run, no explicit warning in description. Agents could accidentally reset database without safeguards.
Parameter enums missing. Tools accept free-form strings (meal_type, metric_type, activity_type, phase, insight_type, status) without enum constraints. LLMs will hallucinate invalid values.
Hardcoded database path in setup.py (/Users/A.Y/Desktop/...) is not portable and exposes user directory structure. Should use environment variables or relative paths.