Documentation
Connect Claude Desktop to BioOps
The BioOps web + MCP MVP works without the iPhone app. Create an account, give Claude only the permissions you choose, load structured laboratory results through MCP, and review them in the Labs dashboard.
iPhone app coming soon
Public iPhone access has not launched. Existing invited mobile users keep their current Apple Health sync, physiology, and mobile dashboard experience unchanged.
1. Create your BioOps account
Create or sign in to your BioOps account with Apple or Google. On first use, review and accept the current Terms and Privacy Policy, then open the Connectors tab in the web dashboard.
Create an account or sign in2. Create a scoped Claude connection
- In BioOps, open Dashboard → Connectors → Create an MCP connection.
- Use a recognizable name such as Claude Desktop.
- Register Claude's remote MCP OAuth callback:https://claude.ai/api/mcp/auth_callback
- For the Labs MVP, select read:labs and write:labs. Leave health and context scopes off unless you want Claude to access those categories too.
- Create the client and immediately save the client ID and one-time client secret. BioOps stores only a hash of the secret and cannot show it again.
3. Add BioOps in Claude Desktop
- Use the latest Claude Desktop and open Settings → Connectors.
- Add a custom remote connector using the BioOps endpoint below.
- When Claude asks for custom OAuth client credentials, enter the client ID and secret you just created in BioOps.
- Choose Connect. Claude opens BioOps in your browser; sign in, review the exact scopes, and authorize the connection.
https://bioops.app/api/public/mcp
Claude Desktop adds remote MCP servers through Settings → Connectors. Do not put this remote URL directly in claude_desktop_config.json. Connector availability and labels can vary by Claude version and plan. See Anthropic's current remote connector instructions.
4. Load a laboratory report
Start a Claude conversation, attach or paste the report you want Claude to transcribe, and ask Claude to use the BioOps laboratory tools. Claude should search the pinned terminology catalog, preserve every reported value and unit, write one structured report per collection date or accession, then read the stored report back for verification.
Please load this report into my BioOps laboratory history. - Preserve the exact reported values, comparators, units, flags, ranges, collection time, laboratory, and source document name. - Search BioOps laboratory terminology before choosing LOINC/UCUM identities. - Do not diagnose, infer missing flags, or convert the source values. - After writing, call get_lab_report and show me the stored transcription so I can compare it with the source.
The document is handled in your Claude conversation; BioOps receives the structured report fields through MCP and does not retain the source PDF. Review Claude's proposed tool call and verify the stored transcription against the source. Updating an existing report is patch-safe: omitted optional metadata is preserved, while an explicit null clears a nullable field and returns a targeted or bulk-clear warning.
5. Visualize results in BioOps
Return to bioops.app and open Dashboard → Labs. The web dashboard lists reports and plots comparable biomarker histories while keeping mixed units in separate series. It presents the exact stored laboratory facts and does not interpret a result, replace the laboratory's range, or provide a diagnosis.
Reports is the default view. Home places a flask on each report's collection date and lists every report linked to the selected day. Open a report to review every stored result. Report and result trash actions require confirmation and use revision-checked soft deletion; deleting the final result also removes the empty report from normal views. Audit and tombstone metadata remains subject to BioOps retention practices.
Open the Labs dashboardLog alcohol at the time it was consumed
Alcohol access is separately opt-in. Grant write:alcoholto queue entries for Apple Health and read:alcoholto read confirmed observations. An updated, linked iPhone must have Apple Health alcohol read and write access enabled.
Log 3 standard drinks from last night at 9:30 PM in Pacific/Auckland. - Resolve "last night" to an explicit ISO 8601 timestamp with UTC offset. - Pass the calculated standard_drinks value and a stable idempotency key. - Do not substitute the current time. - Check get_alcohol_write_status until the iPhone has saved and synced it.
BioOps queues the exact count and consumption time for the iPhone. The item appears on the daily timeline only after the phone confirms the HealthKit sample and uploads the resulting Apple Health observation. Commands expire after seven days if no eligible phone completes them.
6. Scopes and access control
Laboratory permissions are independent: read:labspermits terminology search and report/history reads; write:labs permits create, update, and soft-delete operations. Writing does not implicitly grant reading.
Sleep, workouts, nutrition, body, vitals, fitness, and health context each have separate scopes. Alcohol uses dedicated read:alcoholand write:alcohol grants and is never included by default. Conditions, injuries, symptoms, events, notes, and manually supplied external readings use read:context and write:context, not laboratory permissions.
You can revoke an OAuth client or its active token from Dashboard → Connectors. Revoking a client blocks new authorization and revokes active access tokens issued to it.
7. Laboratory safety boundary
BioOps stores laboratory values, comparators, units, H/L flags, and report-specific reference ranges exactly as supplied. The backend does not diagnose, infer flags, or convert units. Plausibility profiles only identify likely transcription or unit errors; a verified source value can be explicitly overridden and audited. A known LOINC paired with an unlisted UCUM unit remains writable but returns a structured warning and stores its unit-catalog mismatch for review; BioOps never substitutes a converted value.
Source documents are not retained. Laboratory mutations use idempotency keys, optimistic revisions, atomic transactions, and explicit soft deletion.
8. Health and physiology boundary
Health categories are available only when an iPhone has authored and synced finalized artifacts for the account. BioOps Mobile calculates Sleep, Recovery, Strain, rolling baselines, Z-scores, and workout heart-rate zones. The web and MCP server filter and present those values but do not recalculate physiology or choose a different sleep session.
Health context is separately versioned and user-supplied. It can add conditions, injuries, symptoms, events, notes, and external measurements, but it is not a clinical record or a diagnosis.
9. Tools exposed
list_data_sources
List connected health data sources and their current sync status.
read:sleep read:workouts read:nutrition read:alcohol read:body read:vitals read:fitness
get_recent_metrics
Get final daily values and rolling baselines for a specific metric, such as VO2 max or body mass.
read:sleep read:workouts read:nutrition read:alcohol read:body read:vitals read:fitness
get_metric_timeseries
Get mobile-final-v2 daily values or canonical hourly winners with explicit baseline status and uniform baseline objects. Pass source_ids for a producer or source_device_keys for one physical device; excluded and unmatched filters are reported explicitly. Hourly cursors use absolute bucket start time plus a stable server-sequence tie-breaker.
read:sleep read:workouts read:nutrition read:alcohol read:body read:vitals read:fitness
get_hourly_metrics
Get absolute-time chronological MCP v5 hourly buckets with explicit bucket status and coverage semantics. Step buckets use conserved integer apportionment. Pass source_ids for a producer or source_device_keys for one physical device; excluded and unmatched filters are reported explicitly.
read:sleep read:workouts read:nutrition read:body read:vitals read:fitness
get_daily_summary
Get one local day's scores, canonical sleep, activities, and daily metrics with the same mobile-calculated rolling baselines and z-scores used by sleep summaries. Sleep requires one valid Mobile-authored winner; unavailable/conflicting selection returns no sleep event and an explicit sleep_selection status, visible only with read:sleep. include_timeline controls only the events array; detail defaults to compact.
read:sleep read:workouts read:nutrition read:alcohol read:body read:vitals read:fitness
list_supported_metrics
List scoped metric identifiers, units, aliases, daily and hourly support, aggregations, and embedded sleep/workout metric families.
read:sleep read:workouts read:nutrition read:alcohol read:body read:vitals read:fitness
get_nutrition_summary
Get final daily calorie, carbohydrate, fat, and protein totals and rolling baselines. Logging timestamps are not treated as meal times.
read:nutrition
log_alcohol_consumption
Queue a user-directed Apple Health alcohol entry using an AI-calculated standard-drink count and an explicit consumption timestamp. The timestamp never defaults to the current time.
write:alcohol
get_alcohol_write_status
Get the iPhone and Apple Health synchronization status of an alcohol write command.
write:alcohol
delete_alcohol_consumption
Queue deletion of a BioOps-created Apple Health alcohol entry using optimistic revision control and a required audit reason.
write:alcohol
get_alcohol_entry_history
Get the attributable revision and deletion audit history for a BioOps-created alcohol entry.
read:alcohol
list_alcohol_consumption
List only Apple Health-confirmed alcohol observations newest-first by consumption time, expressed as standard drinks at their supplied local offsets with chronological keyset pagination.
read:alcohol
begin_alcohol_import
Begin a resumable Apple Health alcohol-history import with an explicit complete local-date coverage window and expected row count.
write:alcohol
append_alcohol_import_batch
Stage up to 1,000 stable-ID alcohol events with explicit time basis in a resumable import. Identical batch retries are no-ops; changed retries conflict.
write:alcohol
commit_alcohol_import
Validate a fully staged alcohol import. dry_run performs device collision preflight without writes; commit proceeds to durable iPhone HealthKit writing only after a clear preflight.
write:alcohol
get_alcohol_import_status
Get staging, HealthKit, ingestion, materialization, synchronization, collision, and failure progress for an alcohol import.
write:alcohol
get_sleep_summary
Get an inclusive wake/visual-date spine, mobile baselines, and mobile-authored preferred-session identity. start_date and end_date are wake dates matching Daily Sleep and Recovery scores; local_sleep_date preserves preceding-night provenance. Compact returns only a single valid explicit winner, or no sessions for unavailable/conflicting selection. session_selection reports candidate counts and retains no_sessions for empty days. Full preserves all candidates; never average alternatives.
read:sleep
get_daily_timeline
Get final timeline events for a local day, including canonical sleep, measurements, and workouts filtered by granted scopes. Sleep requires one valid Mobile-authored winner; sleep_selection explains selected/unavailable/conflict and is null without read:sleep.
read:sleep read:workouts read:nutrition read:alcohol read:body read:vitals read:fitness
get_workout_details
Get mobile-final activities, immutable heart-rate zone profiles, and daily zone z-scores; both detail levels hoist repeated zone construction data, while compact also omits raw payloads.
read:workouts
get_daily_scores
Get chronologically ordered mobile-calculated Sleep, Recovery, and Strain scores with formula versions and provenance. Strain includes provisional/final status and its data window; detail defaults to compact.
read:sleep read:fitness
get_deviations
Filter existing mobile-authored daily and sleep Z-scores by absolute standard-deviation threshold without recalculating physiology. Every deviation uses one normalized baseline schema and identifies its baseline origin.
read:sleep read:workouts read:nutrition read:body read:vitals read:fitness
get_health_profile
Get the scope-filtered Apple Health profile and latest dedicated Mobile-authored maximum-heart-rate epoch when read:workouts or read:fitness is granted. Exact canonical records identify schema, formula and record provenance; workout snapshots are labelled migration fallback only before any dedicated profile history. No values or zone boundaries are recalculated.
read:sleep read:workouts read:nutrition read:body read:vitals read:fitness
export_health_data
Export cursor-paginated mobile-final health artifacts with source provenance and mobile-calculated z-scores. The undated current health_profile singleton is included when requested regardless of the date window and its fields remain scope-filtered. Dated heart_rate_max_profile records require read:workouts or read:fitness.
read:sleep read:workouts read:nutrition read:alcohol read:body read:vitals read:fitness
search_lab_tests
Search the pinned LOINC/NZPOCS laboratory catalog, UCUM units, and versioned reference and plausibility profiles. Exact LOINC and biomarker keys rank first; weak free-text matches return no candidates rather than a speculative identity.
read:labs
upsert_lab_report
Atomically create or patch an authenticated patient's laboratory report and structured results without converting units or inferring flags. Omitted optional report metadata is preserved; explicit null clears a nullable field and returns a targeted or high-severity bulk-clear warning. Known but unlisted LOINC/UCUM pairs are stored verbatim with a structured warning. Every reported analyte with a value and defensible identity, including Free T3, belongs in results rather than notes or extraction_notes.
write:labs
update_lab_results
Atomically patch revision-checked laboratory results; omitted fields and other results remain unchanged.
write:labs
delete_lab_data
Revision-check and soft-delete laboratory reports or individual results with an audit reason.
write:labs
list_lab_reports
List cursor-paginated laboratory report summaries filtered by date, provider, laboratory, LOINC, or biomarker family.
read:labs
get_lab_report
Get a specific or latest laboratory report. detail compact returns report metadata and notes without result payloads; detail full returns every exact reported value, unit, flag, reference snapshot, terminology identity, and provenance.
read:labs
get_biomarker_history
Get chronological history for one or several biomarkers, grouped into directly comparable LOINC/UCUM series with report provenance and mixed-unit conversion flags.
read:labs
upsert_health_context
Create or revision-check health context with explicit time semantics, confidence, provenance, and relationships. Notes/external measurements use onset_precision not_applicable; external measurements require observed_at on every item and should be grouped by source and local day (maximum 20 items).
write:context
list_health_context
List cursor-paginated, non-deleted health context entries by date, type, or controlled status with confidence, relationships, source provenance, and an explicit repair_required instruction for any pre-schema entry that needs one same-key replay.
read:context
delete_health_context
Revision-check and soft-delete one health context entry with an audit reason.
write:context
10. Protocol details and other clients
BioOps uses Streamable HTTP MCP with OAuth 2.1 + PKCE. Current BioOps MCP contract: v5.1.0.
RFC 8414 OAuth metadata:
GET https://bioops.app/.well-known/oauth-authorization-server
Dashboard-created clients are confidential OAuth clients and use client_secret_post. Public PKCE clients can use authenticated dynamic client registration with token_endpoint_auth_method: "none". For clients that accept a JSON connection record, the dashboard's generated values use this shape:
{
"mcpServers": {
"bioops": {
"url": "https://bioops.app/api/public/mcp",
"oauth": {
"client_id": "bio_...",
"client_secret": "bio_mcp_cs_...",
"scope": "read:sleep read:workouts read:nutrition read:labs write:labs",
"token_endpoint_auth_method": "client_secret_post"
}
}
}
}This JSON is for compatible clients that accept connection records. Claude Desktop remote connectors are added through Settings → Connectors as described above.