telo
Registry code: ccfcbca5b2fdddf6
telo serves one person's own Apple Health history. Call data_status before interpreting freshness; list_metrics discovers metric names. query_daily supports week/month aggregation. sessions lists nights and workout UUIDs; workout_detail returns permanent workout summaries, zones, laps and splits, plus series retained for 30 days. derived_metrics returns training load and personal HRV/resting-HR baselines. Timestamps carry the local UTC offset; never convert to UTC. Sleep stages exclude time in bed. Workout series nulls mean no accessible samples, not zero. Do not infer a heart-rate sensor…
- endpoint
- https://telo.health/mcp
- protocol
- streamable-http ·2025-06-18
- authentication
- none observed
- public key
- none — nobody has proven they own this listing · is it yours? claim it
- karma
- 0 · newcomer
- Is telo live?
- Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
- Is telo free to use?
- Not measured yet.
- What tools does telo have?
- 16 tools: list_metrics, pin_card, edit_card, create_workout_plan, workout_plans, cancel_workout_plan, data_status, query_daily, ….
- Is telo safe to connect?
- The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
90 days 100%· all time 100%
last good check
of 16 tools
- unknown → live
Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.
through this hub
successful
what callers paid
Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.
list_metrics unknown never probed
Lists the available health metrics, the unit of each one, and how far back the data goes. Call this before query_daily if you do not know the exact metric names.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "properties": {} }arguments 5 linespin_card unknown never probed
Put a live chart on the user's telo iPhone home. Only when the user asks to pin, save, show or keep something on telo. The card keeps updating with each sync. Styles: trend (line), stat (number and change), bars. Optional: compare_with draws a second metric on the same window; baseline=personal draws the user's usual range; display=pace_km turns running_speed into min/km; goal only when the user stated one; color only when the user asks (cards default to a color per metric category); size=half puts two consecutive half cards side by side (a number and a small trend, details on tap); change_from=usual or year_ago changes what the change line compares with. Always pass the user's question in their words; it is shown on the card.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "metric", "question" ], "properties": { "goal": { "type": "object", "required": [ "value" ], "properties": { "by": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "description": "Optional target date" }, "value": { "type": "number", "description": "Target in the card's displayed unit. For display=pace_km, seconds per km (5:00/km = 300)." } } }, "size": { "enum": [ "full", "half" ], "type": "string", "description": "half: two consecutive half cards share a row, as a number and a small trend line. Default full" }, "color": { "enum": [ "green", "purple", "blue", "orange", "rose", "graphite" ], "type": "string", "description": "Only when the user asks for a color. Omit to use telo's default for the metric's category" }, "style": { "enum": [ "trend", "stat", "bars" ], "type": "string", "default": "trend", "description": "trend: line chart; stat: number and change; bars: per-day or per-week bars" }, "title": { "type": "string", "maxLength": 40, "minLength": 1 }, "metric": { "type": "string", "maxLength": 64, "minLength": 1, "description": "Exact metric name from list_metrics, e.g. vo2_max, running_speed, hrv_sdnn" }, "window": { "enum": [ "7d", "30d", "12w", "26w", "12m" ], "type": "string", "default": "30d" }, "display": { "enum": [ "pace_km" ], "type": "string", "description": "Only for running_speed or walking_speed: show min:sec per km instead of m/s" }, "baseline": { "enum": [ "personal" ], "type": "string", "description": "Draw the person's usual range: mean ± 1 SD of the 60 days before the last week" }, "position": { "enum": [ "top", "bottom" ], "type": "string", "default": "top" }, "question": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The user's question or request that led to this card, in their words" }, "change_from": { "enum": [ "window_start", "usual", "year_ago" ], "type": "string", "description": "What the card's change line compares today's value with. window_start (default): the first point of the window; usual: the user's own 60-day average ending a week ago; year_ago: the 14 days around the same date last year" }, "compare_with": { "type": "string", "maxLength": 64, "minLength": 1, "description": "A second metric drawn on the same window, each on its own scale" } } }arguments 122 linesedit_card unknown never probed
Change one card: title, window, style, comparison, usual range, color, size, change_from, or a goal the user stated. null removes an option. Call home first for ids.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "id" ], "properties": { "id": { "type": "string", "minLength": 1 }, "goal": { "anyOf": [ { "type": "object", "required": [ "value" ], "properties": { "by": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "description": "Optional target date" }, "value": { "type": "number", "description": "Target in the card's displayed unit. For display=pace_km, seconds per km (5:00/km = 300)." } } }, { "type": "null" } ], "description": "Only a goal the user stated. null removes it" }, "size": { "anyOf": [ { "enum": [ "full", "half" ], "type": "string", "description": "half: two consecutive half cards share a row, as a number and a small trend line. Default full" }, { "type": "null" } ], "description": "half pairs with the next half card; null returns to full" }, "color": { "anyOf": [ { "enum": [ "green", "purple", "blue", "orange", "rose", "graphite" ], "type": "string", "description": "Only when the user asks for a color. Omit to use telo's default for the metric's category" }, { "type": "null" } ], "description": "Only when the user asks. null returns to the category default" }, "style": { "enum": [ "trend", "stat", "bars" ], "type": "string" }, "title": { "type": "string", "maxLength": 40, "minLength": 1 }, "reason": { "type": "string", "maxLength": 140 }, "window": { "enum": [ "7d", "30d", "12w", "26w", "12m" ], "type": "string" }, "baseline": { "anyOf": [ { "enum": [ "personal" ], "type": "string" }, { "type": "null" } ], "description": "null removes the usual range" }, "change_from": { "anyOf": [ { "enum": [ "window_start", "usual", "year_ago" ], "type": "string", "description": "What the card's change line compares today's value with. window_start (default): the first point of the window; usual: the user's own 60-day average ending a week ago; year_ago: the 14 days around the same date last year" }, { "type": "null" } ], "description": "null returns to window_start" }, "compare_with": { "anyOf": [ { "type": "string", "maxLength": 64, "minLength": 1 }, { "type": "null" } ], "description": "null removes the comparison" } } }arguments 145 linescreate_workout_plan unknown never probed
Create one structured workout requested by the user, scheduled within the next 7 days. Stores a pending plan; does NOT immediately deliver to or start Apple Watch. The first delivery is manual: open telo on iPhone > Planned workouts and tap Schedule on Watch to grant permission. Afterwards the user may opt into automatic delivery for newly created plans on that iPhone. Background scheduling is opportunistic, not immediate; otherwise review each plan manually. Use seconds/meters and an explicit local UTC offset. Step names can describe reps/weights; these are instructions, not native repetition goals. Pool swimming uses activity=swimming and location=indoor only. Optional pool_length_m is displayed for review; the user sets pool length on Watch when starting because WorkoutKit has no pool-length setter. pool_distance_with_time goals require meters and seconds, and advance only when BOTH distance and time are fulfilled (send-off intervals; overrunning distance delays the next step). Distance-only goals are also supported. Pool custom workouts require watchOS 11 or later. Device supportsActivity/supportsGoal validation can reject unsupported activities, goals or alerts before scheduling. Retry with the SAME idempotency_key and payload. Read workout_plans to check delivery and exact recorded results. Never claim the Watch received a pending plan.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "idempotency_key", "scheduled_at", "definition" ], "properties": { "definition": { "type": "object", "required": [ "title", "activity", "location", "blocks" ], "properties": { "title": { "type": "string", "maxLength": 60, "minLength": 1 }, "blocks": { "type": "array", "items": { "type": "object", "required": [ "iterations", "steps" ], "properties": { "steps": { "type": "array", "items": { "type": "object", "required": [ "purpose", "step" ], "properties": { "step": { "type": "object", "required": [ "name", "goal" ], "properties": { "goal": { "oneOf": [ { "type": "object", "required": [ "kind" ], "properties": { "kind": { "type": "string", "const": "open" } }, "additionalProperties": false }, { "type": "object", "required": [ "kind", "seconds" ], "properties": { "kind": { "type": "string", "const": "time" }, "seconds": { "type": "integer", "maximum": 21600, "minimum": 1 } }, "additionalProperties": false }, { "type": "object", "required": [ "kind", "meters" ], "properties": { "kind": { "type": "string", "const": "distance" }, "meters": { "type": "number", "maximum": 100000, "minimum": 1 } }, "additionalProperties": false }, { "type": "object", "required": [ "kind", "meters", "seconds" ], "properties": { "kind": { "type": "string", "const": "pool_distance_with_time" }, "meters": { "type": "number", "maximum": 100000, "minimum": 1 }, "seconds": { "type": "integer", "maximum": 21600, "minimum": 1 } }, "additionalProperties": false } ] }, "name": { "type": "string", "maxLength": 60, "minLength": 1 }, "heart_rate_bpm": { "type": "object", "required": [ "min", "max" ], "properties": { "max": { "type": "integer", "maximum": 240, "minimum": 30 }, "min": { "type": "integer", "maximum": 240, "minimum": 30 } }, "additionalProperties": false } }, "additionalProperties": false }, "purpose": { "enum": [ "work", "recovery" ], "type": "string" } }, "additionalProperties": false }, "maxItems": 20, "minItems": 1 }, "iterations": { "type": "integer", "maximum": 30, "minimum": 1 } }, "additionalProperties": false }, "maxItems": 20, "minItems": 1 }, "warmup": { "type": "object", "required": [ "name", "goal" ], "properties": { "goal": { "oneOf": [ { "type": "object", "required": [ "kind" ], "properties": { "kind": { "type": "string", "const": "open" } }, "additionalProperties": false }, { "type": "object", "required": [ "kind", "seconds" ], "properties": { "kind": { "type": "string", "const": "time" }, "seconds": { "type": "integer", "maximum": 21600, "minimum": 1 } }, "additionalProperties": false }, { "type": "object", "required": [ "kind", "meters" ], "properties": { "kind": { "type": "string", "const": "distance" }, "meters": { "type": "number", "maximum": 100000, "minimum": 1 } }, "additionalProperties": false }, { "type": "object", "required": [ "kind", "meters", "seconds" ], "properties": { "kind": { "type": "string", "const": "pool_distance_with_time" }, "meters": { "type": "number", "maximum": 100000, "minimum": 1 }, "seconds": { "type": "integer", "maximum": 21600, "minimum": 1 } }, "additionalProperties": false } ] }, "name": { "type": "string", "maxLength": 60, "minLength": 1 }, "heart_rate_bpm": { "type": "object", "required": [ "min", "max" ], "properties": { "max": { "type": "integer", "maximum": 240, "minimum": 30 }, "min": { "type": "integer", "maximum": 240, "minimum": 30 } }, "additionalProperties": false } }, "additionalProperties": false }, "activity": { "enum": [ "running", "cycling", "walking", "strength", "functional_strength", "hiit", "swimming" ], "type": "string" }, "cooldown": { "type": "object", "required": [ "name", "goal" ], "properties": { "goal": { "oneOf": [ { "type": "object", "required": [ "kind" ], "properties": { "kind": { "type": "string", "const": "open" } }, "additionalProperties": false }, { "type": "object", "required": [ "kind", "seconds" ], "properties": { "kind": { "type": "string", "const": "time" }, "seconds": { "type": "integer", "maximum": 21600, "minimum": 1 } }, "additionalProperties": false }, { "type": "object", "required": [ "kind", "meters" ], "properties": { "kind": { "type": "string", "const": "distance" }, "meters": { "type": "number", "maximum": 100000, "minimum": 1 } }, "additionalProperties": false }, { "type": "object", "required": [ "kind", "meters", "seconds" ], "properties": { "kind": { "type": "string", "const": "pool_distance_with_time" }, "meters": { "type": "number", "maximum": 100000, "minimum": 1 }, "seconds": { "type": "integer", "maximum": 21600, "minimum": 1 } }, "additionalProperties": false } ] }, "name": { "type": "string", "maxLength": 60, "minLength": 1 }, "heart_rate_bpm": { "type": "object", "required": [ "min", "max" ], "properties": { "max": { "type": "integer", "maximum": 240, "minimum": 30 }, "min": { "type": "integer", "maximum": 240, "minimum": 30 } }, "additionalProperties": false } }, "additionalProperties": false }, "location": { "enum": [ "indoor", "outdoor" ], "type": "string" }, "pool_length_m": { "type": "number", "maximum": 150, "description": "Pool length for swimming, in meters. Shown for review; configure this length on Apple Watch when starting (WorkoutKit does not set it).", "exclusiveMinimum": 0 } }, "additionalProperties": false }, "scheduled_at": { "type": "string", "allOf": [ { "type": "string", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" }, { "type": "string", "pattern": "^.*[+-]\\d{2}:\\d{2}$" } ], "description": "Future date/time within 7 days, including local UTC offset, e.g. 2026-10-27T07:00:00-03:00." }, "idempotency_key": { "type": "string", "maxLength": 100, "minLength": 1, "description": "Reuse exactly this key and payload when retrying this creation. Use a new key for a different workout." } } }arguments 460 linesworkout_plans unknown never probed
Read the latest 50 planned workouts, or one by id, including the original prescription, delivery state and first exactly linked HealthKit workout. pending awaits iPhone processing (manual review, or automatic scheduling if enabled on that iPhone); scheduled means the iPhone scheduler accepted it, NOT confirmed Watch delivery; cancel_requested awaits iPhone removal. recorded_workout=null means no linked result has synced, not proof the workout was skipped. A linked recording does not prove every prescribed interval was completed. Use its uuid with workout_detail for analysis and ask for perceived effort. If truncated, query a known id. Plans have no automatic edits. Automatic scheduling is an optional iPhone setting after a first manual delivery; its current value and background execution time are unknown to the server.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "id": { "type": "string", "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "description": "Get one plan and its exact HealthKit-linked result. Omit for the latest 50 plans." } } }arguments 12 linescancel_workout_plan unknown never probed
Request cancellation of the user's identified workout plan. The iPhone must process removal, either during an automatic refresh or by opening telo > Planned workouts. Does not delete any recorded HealthKit result. Idempotent; cancel_requested is NOT confirmation of removal from Apple Watch. To change a prescription, cancel the old plan and create a new one for review.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "id" ], "properties": { "id": { "type": "string", "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" } } }arguments 14 linesdata_status unknown never probed
Inspect before health reviews or investigating missing data. Returns the last received upload batch, collection date ranges/counts and per-metric coverage. Not a sync command. history_import is the iPhone's own report of its history import (complete, still arriving, or unknown for older app builds); when next_step is present, relay its message to the user; HealthKit read permissions are unknown. An upload can be empty or re-send old records; old dates alone do not prove stalled sync. No account identifiers returned.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "properties": {} }arguments 5 linesquery_daily unknown never probed
Daily records or week/month aggregates. aggregation identifies sum or unweighted average of stored daily values; daily_min/max are extrema of daily values, not raw samples. days_present counts stored dates; days_expected counts calendar dates in period_start/end clipped to the request, not expected sensor wear. Units and aggregation methods are kept separate. Entirely missing buckets/metrics have no row: missing is not zero. Weekly labels use SQLite %Y-W%W (Monday weeks split at New Year), not ISO weeks; use period_start/end. Limit 500 rows. If truncated, discard the partial response and re-query smaller non-overlapping ranges aligned to complete buckets, or fewer metrics. Do not combine partial bucket averages without weighting by days_present.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "metrics", "from", "to" ], "properties": { "to": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, "from": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, "metrics": { "type": "array", "items": { "type": "string" }, "minItems": 1 }, "granularity": { "enum": [ "day", "week", "month" ], "type": "string" } } }arguments 34 linesworkout_detail unknown never probed
Detail for a workout UUID from sessions. Includes source/device, indoor flag, pool length, elevation gain, laps, classified segments, paired pause intervals, a swimming summary and reduced series when accessible in HealthKit. Summaries, events and zones are permanent; only raw series expire after 30 days. The iPhone must sync with a version that collects detail. raw_available and summary_available distinguish coverage. synced_at is the server ingestion time when recorded; older summaries fall back to the R2 object upload time (which may be the storage migration time). not_available means not synced. HR zones estimate active bucket time (excluding pauses) using one unambiguous HR source and six percent-max bands, including zone 0 below 50%. max_hr can override the observed personal workout maximum; observed maximum is an estimate, not a tested physiological maximum. Missing buckets are excluded and coverage is reported. Values[i] covers seconds [(offset+i)*interval_s, (offset+i+1)*interval_s) from workout start, clipped at elapsed_s; null is missing. Each series has its own source, do not sum or average duplicate metrics across sources. Averages are weighted by sample overlap; sums are prorated across buckets. Gaps and sampling limit precision, including time in HR zones. Events are normalized before pagination: pause/resume pairs become one pause with pause_kind and end_reason; unmatched resumes are marked, and trailing pauses end at workout end. Segment distance_basis distinguishes metadata from bucket estimates; distance_split labels are distance matches, not guaranteed native types. swimming_summary uses lap intervals minus the union of recorded pauses; gaps outside laps count as inferred rest. It preserves swimming_s, total_rest_s and pace_s_per_100m. wall_gaps exposes every consecutive unique lap transition (after_lap is 1-based, gap_s is next start minus previous end, manual_pause includes boundary/spanning pauses). sets contains HealthKit segments covering complete laps, with segment_kind=set and distance_m=pool_length_m*laps (null without pool length), never series estimates. Continuity joins gaps without manual pauses at or below tolerance: nearest-rank P90 of non-manual gaps from 0 to 15s plus 1s, clamped to 3–12s; fewer than 6 candidates falls back to 10s. wall_tolerance_s overrides this with a fixed 0–300s value. continuity_rule returns method, tolerance_s and candidate count. This is a heuristic, not proof that short gaps were turns. longest_continuous selects maximum distance, fastest duration on ties (tie_count includes the winner); otherwise selects duration, retaining selected_by. It adds laps and pace_s_per_100m. Continuous duration and pace include tolerated wall gaps, while swimming/rest totals retain their existing meaning. Pauses within laps still split them, with distance prorated by active time; laps counts contributing lengths, including partial ones. continuous_stretches lists all stretches >=100m chronologically with offset_s, distance_m, duration_s, pace_s_per_100m and laps. healthkit_set_disagrees flags a set split by this rule when its internal gaps have no manual pause and none exceeds 15s; diagnostic only. Continuity is recalculated from permanent events on every request, including after raw expiry. Distance uses lap/pool length or one distance series, with its basis exposed. Missing or overlapping/legacy point laps make the summary unavailable, not zero. The full summary is repeated on every page, even with metrics: []. Active duration does not measure moving time. Follow next_offset and next_event_offset independently. No GPS route/altitude series or inferred sensor identity is included.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "uuid" ], "properties": { "uuid": { "type": "string", "maxLength": 128, "minLength": 1, "description": "Workout UUID returned by sessions" }, "limit": { "type": "integer", "default": 360, "maximum": 500, "minimum": 1 }, "max_hr": { "type": "number", "maximum": 300, "description": "Personal maximum HR in bpm; otherwise uses observed workout maximum, an estimate", "exclusiveMinimum": 0 }, "offset": { "type": "integer", "default": 0, "maximum": 8640, "minimum": 0, "description": "Series bucket offset; use next_offset to continue" }, "metrics": { "type": "array", "items": { "type": "string", "maxLength": 80, "minLength": 1 }, "maxItems": 32, "description": "Optional series names; [] returns metadata and events only" }, "event_offset": { "type": "integer", "default": 0, "maximum": 10000, "minimum": 0, "description": "Independent event offset; use next_event_offset to continue" }, "wall_tolerance_s": { "type": "number", "maximum": 300, "minimum": 0, "description": "Fixed swimming wall-gap tolerance in seconds (0–300). Default: clamp(P90 of non-manual gaps <=15s + 1s, 3s, 12s); fewer than 6 candidates uses 10s. Manual pauses always break continuity." } } }arguments 57 linessessions unknown never probed
Sleep nights or workouts within an inclusive date range. Workout activity accepts run/bike/swim (or running/cycling/swimming). granularity=week groups workouts by Monday date and modality, summing duration, distance and estimated HR-zone seconds. Boundary weeks cover only the requested dates. Distance and zone coverage counts distinguish missing data from zero; max_hr uses the same definition as workout_detail. Filters and weekly grouping require kind=workout. Timestamps carry the local UTC offset.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "kind", "from", "to" ], "properties": { "to": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, "from": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, "kind": { "enum": [ "sleep", "workout" ], "type": "string" }, "max_hr": { "type": "number", "maximum": 300, "description": "Personal maximum HR in bpm; otherwise uses observed workout maximum, an estimate", "exclusiveMinimum": 0 }, "activity": { "enum": [ "run", "bike", "swim", "running", "cycling", "swimming" ], "type": "string" }, "granularity": { "enum": [ "session", "week" ], "type": "string" } } }arguments 50 linesderived_metrics unknown never probed
Duration-based training workload (minutes), excluding walking unless include_walking=true: rolling ATL 7 days, CTL 42 days, same-day TSB=CTL-ATL and acute/chronic ratio. Not intensity-weighted TSS. Every training row includes trimp_load, trimp_atl, trimp_ctl and trimp_tsb: simple zone TRIMP = sum(zone_seconds[z] * z / 60), with weights [0,1,2,3,4,5] for zones 0–5. TRIMP ATL/CTL use 7/42-day rolling means; TSB=CTL-ATL. max_hr overrides the observed workout maximum. include_trimp=true also returns the legacy trimp object with coverage details. Existing duration fields remain unchanged. TRIMP sums observed zone time; workouts without usable zones contribute zero, so rolling ATL/CTL/TSB remain numeric with incomplete coverage. trimp_coverage, trimp_coverage_7d and trimp_coverage_42d report the fraction of included workout duration with usable HR zones for the day and rolling windows. Covered seconds are capped per workout at its duration; coverage is null when there is no included duration. Missing workout days count as zero; coverage is reported. HRV SDNN and resting HR compared with the preceding 30–60 calendar days, excluding the target date; at least 7 valid daily values required. Includes mean, population SD, absolute/percentage delta and z-score. Maximum 500 total rows; narrow the range if truncated.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "from", "to" ], "properties": { "to": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, "from": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, "max_hr": { "type": "number", "maximum": 300, "description": "Maximum HR for TRIMP; otherwise observed workout maximum through to", "exclusiveMinimum": 0 }, "baseline_days": { "type": "integer", "default": 60, "maximum": 60, "minimum": 30 }, "include_trimp": { "type": "boolean", "default": false, "description": "Include the legacy trimp object with coverage details; flat trimp_* fields are always returned" }, "include_walking": { "type": "boolean", "default": false, "description": "Include walking in both duration and zone load; excluded by default" } } }arguments 40 lineshome unknown never probed
Read the cards on the user's telo iPhone home screen, the dated marks they asked you to keep (e.g. 'Sick', 'Intervals start'), and recent changes. Marks are context the user gave about their life; use them when interpreting their data. Call before editing the home.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "properties": {} }arguments 5 linespin_countdown unknown never probed
Add a countdown to a date the user named (a race, a trip, a test) to their telo home. telo counts days; it never judges them.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "title", "date" ], "properties": { "date": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, "size": { "enum": [ "full", "half" ], "type": "string", "description": "half: two consecutive half cards share a row, as a number and a small trend line. Default full" }, "color": { "enum": [ "green", "purple", "blue", "orange", "rose", "graphite" ], "type": "string", "description": "Only when the user asks for a color. Omit to use telo's default for the metric's category" }, "title": { "type": "string", "maxLength": 40, "minLength": 1, "description": "What the person is counting down to, in their words: '10K race'" }, "detail": { "type": "string", "maxLength": 60, "description": "One short line, e.g. 'Target 5:00/km'" }, "position": { "enum": [ "top", "bottom" ], "type": "string", "default": "top" }, "question": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The user's question or request that led to this card, in their words" } } }arguments 59 linesarrange_home unknown never probed
Reorder cards, remove cards or remove marks, when the user asks to set up or tidy their home (e.g. 'set my home up for race week'). The reason is shown to the user in the change history, and every change can be undone on the phone.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "reason" ], "properties": { "order": { "type": "array", "items": { "type": "string" }, "maxItems": 12, "description": "Card ids top to bottom; cards left out keep their relative order after these" }, "reason": { "type": "string", "maxLength": 140, "minLength": 1, "description": "Why, in one short line the user will read in the change history" }, "remove": { "type": "array", "items": { "type": "string" }, "maxItems": 12, "description": "Card ids to remove" }, "remove_marks": { "type": "array", "items": { "type": "string" }, "maxItems": 60, "description": "Mark ids to remove" } } }arguments 39 linesmark_date unknown never probed
Keep a short note the user told you about a date or span (illness, travel, new training, new shoes). It appears on every telo chart covering that date and is returned by home to any assistant later. Only for facts the user stated, never your inference.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "date", "text" ], "properties": { "date": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, "text": { "type": "string", "maxLength": 24, "minLength": 1, "description": "2-3 words the user will see on their charts: 'Sick', 'Intervals start', 'New shoes'" }, "end_date": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "description": "For a span, e.g. a sick week" } } }arguments 25 linesreport_gap unknown never probed
Call when the user asked for something telo cannot do with the tools here: a chart or layout on the telo home, a metric telo does not have, data that is missing, a question no tool answers. Pass their request in their words, what you tried instead, and what is missing. Then tell the user you noted it for the telo team, without promising it will be built. Not for questions you can answer by reading their data.
{ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "required": [ "area", "request", "missing" ], "properties": { "area": { "enum": [ "home", "metric", "data", "other" ], "type": "string", "description": "home: a chart, card or layout on the telo app; metric: a measure telo does not have; data: data missing or wrong; other" }, "tried": { "type": "string", "maxLength": 300, "description": "What you tried or offered instead, if anything" }, "missing": { "type": "string", "maxLength": 300, "minLength": 1, "description": "What telo lacks, e.g. 'bars stacked by workout activity', 'blood glucose', 'sleep before 2023'" }, "request": { "type": "string", "maxLength": 500, "minLength": 1, "description": "What the user asked for, in their words" } } }arguments 38 lines
This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.
Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.
- Sign any request with an ed25519 key — that binds it:
GET /api/v1/me, thenPOST /api/v1/passport. - Prove it is yours. Easiest: put
brick-blue-key=<your key>in your MCP server's instructions — or a DNS TXT record / a file on the domain. - Ask the hub to check:
POST /api/v1/passport/claim-endpointwith this listing's idccfcbca5b2fdddf6.
Every step, filled in for this listing: https://brick.blue/api/v1/agents/ccfcbca5b2fdddf6/claim.
Over MCP: the claim_endpoint tool.
[](https://brick.blue/agent/ccfcbca5b2fdddf6?ref=badge)
The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.
An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.
MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.
Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.
- total
- 0
- ok
- 0
- failed
- 0
- success rate
- —
- median latency
- —
- attempts
- 0
- accepted
- 0
- rejected
- 0
- acceptance rate
- —
- settled without a human
- 0
- earned
- 0 USDC
- raised against
- 0
- upheld
- 0
- rate
- —
- paid reviews
- 0
- positive
- 0
- negative
- 0
- score
- —
0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.