Google Health MCP
Google Health MCP lets an AI agent locally authenticate and read user-authorized Google Health API v4 data while inspecting setup, privacy, and wellness context.
Discover supported data types, scopes, privacy modes, and coverage plans.
Generate OAuth URLs, exchange codes for local tokens, and revoke access with explicit-intent gating.
Check local config, token, OAuth scope, cache, and connection readiness without exposing secrets.
Query detailed data points, reconcile across sources, and run daily or physical-time rollups.
Build daily/weekly summaries and normalized wellness context from activity, sleep, and heart data.
Audit privacy posture, redaction behavior, local token paths, and SQLite cache status.
Read/update a shared Delx Wellness profile and run onboarding flows.
Provide agent manifests, quickstart guidance, capabilities, and demo payloads.
Run over stdio by default or optional loopback-only HTTP; read-only Google Health access, beta, and non-medical.
Allows access to health data from Android devices like Pixel Watch via the Google Health API, including activity, sleep, and health metrics.
Enables reading user-authorized health data from Fitbit devices through the Google Health API, such as steps, sleep, heart rate, and exercise.
Provides tools to read authorized health data from the Google Health API v4, including data from Fitbit, Pixel Watch, and other supported sources.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Health MCP show my daily summary for yesterday"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
⚡ One-command install with Delx Wellness for Hermes:
npx -y delx-wellness-hermes setup— preconfigures this connector and the other 8 in a dedicated Hermes profile.Or wire it standalone into Claude Desktop / Cursor / ChatGPT Desktop — see the install section below.
What's new in 0.7.3 (2026-08-03): headless OAuth (
auth --manual) for SSH / containers / WSL · real-account rollup/filter fixes from external testers · opt-inclinicalscopes for ECG/IRN · pins live in Hermes/living-body. Full notes in CHANGELOG.md.
Highest-leverage contribution — real-account coverage
If you have Fitbit, Pixel Watch, Android health data or Google Health API v4 access, the most useful help is a redacted coverage report:
npx -y google-health-mcp-unofficial coverage --live --jsonReview the output, remove anything you do not want public, then post the report
on issue #2 (or a
new issue). The timed proof loop on #21
closed 1/2 — see docs/proof-loop-status.md.
The command is read-only and is designed to omit OAuth secrets, local paths and raw
health measurements. A static preflight is available before OAuth with
coverage --json.
Other ways to help (no account required)
Action | Link |
Star if the project earned it | |
Docs GFI — headless auth walkthrough | |
Compose with other wearables | |
One-command Hermes pack | |
Full registry |
Related MCP server: google-health-mcp-server
HTTP (v2 stateless)
Default is stdio. Optional Streamable HTTP — no session id, JSON responses, loopback only:
npx -y google-health-mcp-unofficial --http
# GET http://127.0.0.1:3000/health
# POST http://127.0.0.1:3000/mcp (sessionless)Env: GOOGLE_HEALTH_MCP_HOST, GOOGLE_HEALTH_MCP_PORT, GOOGLE_HEALTH_MCP_TRANSPORT=http.
Google Health MCP
Local-first MCP server that gives your AI agent user-authorized Google Health API v4 data — Fitbit, Pixel Watch and partners — over OAuth.
Install one connector —
npx -y google-health-mcp-unofficial setupRun it in Claude · Cursor · ChatGPT · Hermes · OpenClaw — see the client examples.
Local-first — your tokens never leave your machine (privacy).
Which connector should I use? — see the front-door guide.
Beta status: Google Health API v4 is live for builders but still evolving. Google's release notes show scope and data-type changes continuing after launch, so this connector stays in early beta and points testers to safe read-only validation paths before public production use.
Unofficial project. Not affiliated with, endorsed by or supported by Google, Fitbit or Alphabet. Not a medical device. Not medical advice.
Why this exists
Google Health API is the successor to Fitbit Web API: new OAuth, new base URL, v4 endpoint schema, standardized data types, reconciled streams and rollups.
This MCP gives agents a clean way to discover the API, check setup, authenticate locally and query data without pasting tokens into prompts or agent configs.
Quickstart in 60 seconds
Create a Google Cloud OAuth client, enable the Google Health API, and add the redirect http://127.0.0.1:3000/callback. Then:
npx -y google-health-mcp-unofficial setup --scope-preset full # writes local config
npx -y google-health-mcp-unofficial auth # OAuth, tokens saved locally
npx -y google-health-mcp-unofficial doctor # verifies you're readydoctor --live calls safe Google Health identity/profile/settings endpoints after auth to prove the API is reachable — the connection proof for this beta. That does not prove Claude Desktop can invoke tools: Desktop validates outputSchema as JSON Schema 2020-12. Use google-health-mcp-unofficial@0.7.6+ (see #23). Full install details (scope presets, MFA, recovery) are in the Install section below.
Try it with your agent
Three things to ask first, based on tools this connector actually ships:
Use google_health_connection_status to check setup, then run
google_health_data_inventory. Tell me which Google Health domains
and scopes I have authorized.Call google_health_daily_summary for today, then google_health_weekly_summary.
Separate observed data from suggestions and stay non-medical.Run google_health_privacy_audit, then summarize exactly what is stored
locally and what would be sent to Google on the next call.Tools
Start here:
google_health_connection_status— local config, token, scope and client readinessgoogle_health_data_inventory— supported domains, scopes, data type naming and agent flowgoogle_health_data_type_coverage— static coverage plan, or explicit live read-only validation for issue #21google_health_daily_summary— daily beta summary from rollups and reconciled streamsgoogle_health_weekly_summary— weekly beta reviewgoogle_health_privacy_audit— what is stored locally and what is sent to Google
The full tool catalog — Google Health API methods, agent manifest, diagnostics and data-type naming notes (kebab-case endpoints, snake_case filters, source families) — lives in docs/tools.md.
Privacy & what runs offline
OAuth tokens are stored locally at
~/.google-health-mcp/tokens.jsonwith0600permissions.Secrets can live in
~/.google-health-mcp/config.jsonorGOOGLE_HEALTH_*environment variables.Tools never return access tokens, refresh tokens or client secrets.
GOOGLE_HEALTH_PRIVACY_MODE=structuredis the default;rawmode is explicit and should be used only for debugging or deep analysis. An agent asking forprivacy_mode=rawis refused unless it passesexplicit_user_intent=true; settingGOOGLE_HEALTH_PRIVACY_MODE=rawyourself is your own call and needs no per-call intent.Structured mode preserves complete upstream physiological fields and future v4 additions while removing identity, location and secret-bearing values.
"Location redaction" means a concrete key list, not a slogan. Coordinate-bearing leaf keys, always dropped in
structuredandsummary(matched ignoring case,_and-, solatitude_e7andlatitudeE7are the same key):startLatitude,startLongitude,start_latlng,endLatitude,endLongitude,end_latlng,latitude,longitude,lat,lon,lng,latlng,coordinates,coordinate,gps,gpx,geoPolylineDTO,map,polyline,summary_polyline,activities-tracker-gps,latitudeE7,longitudeE7,latE7,lngE7,lonE7,startLatitudeE7,startLongitudeE7,endLatitudeE7,endLongitudeE7,lat_deg,lng_deg,lon_deg,latitudeDegrees,longitudeDegreesLocation container keys, dropped as a whole object — with their
address/city/placeIdsiblings and any coordinate spelling this list never anticipated — whenever they hold a place record (an object, or an array containing objects). A container holding only scalars is a label, not a place, and survives:location: ["gym", "home"]stays,location: { latitudeE7: … }does not.location,locations,geoLocation,geoLocations,geo,geoJson,route,routes,position,positions,waypoint,waypoints,trackPoint,trackPoints,placeVisitgoogle_health_privacy_auditreturns both live lists ingps_redacted_keysandgps_redacted_container_keys, andgps_redaction_defaultis measured at call time by pushing a synthetic record through both non-raw modes and scanning the output by key and by coordinate value — it is not a hardcodedtrue.npm run test:redaction-docsfails the build if these two blocks stop matching the code, so the published promise cannot drift from the enforcement list again. Google Health API v4 does not currently document a location/route data type, so this is a forward-compatible guard rather than a patch for an observed leak.Limits of that promise, stated instead of implied. Every line below is proved by a behavioural test (
npm run test:declared-limits) that fails if the behaviour changes; a line marked NOT VERIFIED is a statement no test backs, labelled instead of left to read as a guarantee. A limit written here without a test fails the build:default_mode_is_structured— with noprivacy_modeargument and noGOOGLE_HEALTH_PRIVACY_MODE, every read runs instructured.raw_requires_explicit_user_intent— an agent asking forprivacy_mode=rawis refused withUSER_ACTION_REQUIREDunless it also passesexplicit_user_intent=true.local_raw_default_needs_no_per_call_intent—GOOGLE_HEALTH_PRIVACY_MODE=rawin your own config or environment is honoured on every call with no per-call intent; the gate is about agent escalation, not about the machine owner.raw_is_an_unfiltered_passthrough—rawreturns the upstream payload unchanged; redaction is a property ofstructuredandsummary, never ofraw.structured_drops_identity_and_secret_keys— tokens,authorization, e-mail, names and avatars are dropped at any depth instructured, while physiology and provenance survive.summary_is_never_less_restrictive_than_structured—summarystrips first and summarizes after, so nothingstructureddrops can reappear insummary.summary_flattens_numeric_leaves_to_depth_2—summarypromotes numeric leaves down to depth 2 of the data-type payload intovalue; anything deeper is not reported at all.summary_promotes_unlisted_coordinate_keys— a coordinate key outside the lists above is promoted bysummary, not hidden. The key list is the boundary, not the mode.altitude_and_elevation_are_not_location—altitudeis an official v4 data type (activity_and_fitness) and survives redaction, as doeselevation; an altitude alone does not localize a user.altitude_inside_a_place_container_is_dropped— the same altitude inside a redacted location container dies with the container.location_guard_never_observed_upstream— NOT VERIFIED: Google Health API v4 documents no location/route data type, so no test here has ever seen a real Google payload carrying coordinates. The key list is a forward-compatible guard derived from Google's own encodings, not a measured fix for an observed leak.
Daily rollups use validated civil
YYYY-MM-DDranges; general rollups preserve exact timezone-aware ISO date-times. Invalid or reversed ranges fail before HTTP."today"in summaries and daily rollups resolves in thetimezoneargument, else the wellness profile's timezone, else UTC. An invalid IANA timezone is rejected.support --redactedprints a copy-paste support bundle for GitHub issues without tokens, secrets, local paths or health measurements.support --feedback --jsonprints an anonymous setup-feedback bundle for beta testers and MCP client reports.coverage --live --jsonprints only redacted data-type status and point-count buckets; it never includes raw Google Health payloads.
Authorization model & trust boundary
Google OAuth controls which Google account and health scopes this connector can access. It does not authorize individual MCP callers or tools. The intended deployment is one local user running one trusted MCP host; callers that can reach the same process share its tool catalog and local OAuth grant.
There is currently no per-user, per-agent, API-key or per-tool RBAC layer. The
optional HTTP transport binds to 127.0.0.1 by default and must not be exposed
publicly without standards-compliant MCP authentication, isolated per-user
Google credentials and an explicit authorization policy. See the full
authorization model.
See the full agent demo →
Want to see an agent actually reason over this connector alongside the rest of the stack? The shared, reproducible demo answers the anchor question "Should I train hard today?":
npx -y delx-living-body demodelx-living-body composes whatever connectors it detects locally with rule-based (offline) synthesis — readiness-first and non-medical. For this connector specifically, npx -y google-health-mcp-unofficial doctor --live is the local proof that your Google Health auth is wired correctly.
Beta Testers Wanted
The highest-leverage contribution right now is real setup feedback from Fitbit, Pixel Watch, Android and Google Health API v4 users.
If you can test with a real account:
Run
npx -y google-health-mcp-unofficial doctorand confirm the OAuth flow is clear.Run
npx -y google-health-mcp-unofficial support --feedback --jsonand paste the anonymous bundle into issue #4.Run
npx -y google-health-mcp-unofficial coverage --jsonfor the static coverage plan.After OAuth, run
npx -y google-health-mcp-unofficial coverage --live --jsonand paste the reviewed, redacted report into issue #2.Try
google_health_connection_status,google_health_data_inventoryandgoogle_health_daily_summaryfrom your MCP client.Open an issue for missing data types, confusing setup steps, client-specific friction or privacy concerns.
Do not paste OAuth tokens, client secrets, local paths or personal health measurements into public issues.
Useful links:
Install
Create a Google Cloud OAuth client, enable the Google Health API, and add the local redirect:
http://127.0.0.1:3000/callbackThen run:
npx -y google-health-mcp-unofficial setup --scope-preset full
npx -y google-health-mcp-unofficial auth
npx -y google-health-mcp-unofficial doctorHeadless hosts (servers, SSH, containers, WSL)
auth normally opens a browser and catches the redirect on 127.0.0.1. On a host with no
browser that cannot work. When it detects a headless host — SSH, or no DISPLAY /
WAYLAND_DISPLAY — it switches to pasting the redirect back in:
npx -y google-health-mcp-unofficial auth --manualNon-interactive provisioning:
npx -y google-health-mcp-unofficial auth --print-url
npx -y google-health-mcp-unofficial auth --code "http://127.0.0.1:3000/callback?code=..."See docs/oauth.md for --local-callback, SSH tunnel notes, and
GOOGLE_HEALTH_HEADLESS.
Scope presets keep OAuth consent easier to reason about — basic, activity, sleep and full. The full preset list, the exact read-only scope URLs and the OAuth endpoints live in docs/oauth.md.
If setup gets stuck:
npx -y google-health-mcp-unofficial doctor --fix # repairs local config/token permissions (chmod 600 where supported)
npx -y google-health-mcp-unofficial doctor --live # calls safe identity/profile/settings endpoints to prove the API is reachable
npx -y google-health-mcp-unofficial coverage --live --json # redacted read-only data-type coverage for issue #21
npx -y google-health-mcp-unofficial support --redacted # copy-paste support bundle, no tokens/secrets/measurements
npx -y google-health-mcp-unofficial support --feedback --json # anonymous setup feedback for issue #4Standalone MCP config:
{
"mcpServers": {
"google_health": {
"command": "npx",
"args": ["-y", "google-health-mcp-unofficial"]
}
}
}Hermes
npx -y google-health-mcp-unofficial setup --client hermes --no-auth
npx -y google-health-mcp-unofficial auth
npx -y google-health-mcp-unofficial doctor --client hermes --fix
npx -y google-health-mcp-unofficial doctor --client hermes --live
hermes mcp test google_healthAfter config changes, use /reload-mcp or hermes mcp test google_health. Do not restart the gateway for normal data access.
Development
git clone https://github.com/davidmosiah/google-health-mcp.git
cd google-health-mcp
npm install
npm testLinks
Google Health API: https://developers.google.com/health
Release notes: https://developers.google.com/health/release-notes
REST reference: https://developers.google.com/health/reference/rest
Data types: https://developers.google.com/health/data-types
Migration guide: https://developers.google.com/health/migration
Delx Wellness registry: https://github.com/davidmosiah/delx-wellness
See also
The full Delx Wellness connector library:
Provider | Package | Repo |
WHOOP | ||
Oura | ||
Garmin | ||
Strava | ||
Fitbit | ||
Withings | ||
Apple Health | ||
Polar | ||
Nourish (nutrition) |
One-command setup for Hermes — preconfigures every connector above plus wellness skills + onboarding: delx-wellness-hermes.
📧 Contact & Support
📨 support@delx.ai — general questions, integration help, partnerships
🐛 Bug reports / feature requests — GitHub Issues
🐦 Updates — @delx369 on X
🌐 Site — wellness.delx.ai
License
MIT - see LICENSE. Code of Conduct.
Agent-ready yardstick: mcp-scorecard — aim ≥90 on CI.
Skill or MCP
Same package, two doors. MCP registers tools on stdio/HTTP. The skill can drive the same tools through the CLI when the client has no MCP:
npx -y google-health-mcp-unofficial call google_health_connection_status --json '{}'Copy skill/SKILL.md into your agent skills dir.
Release migration
Before upgrading to 0.8.0, review the compatibility and migration notes.
Available Tools
26 toolsgoogle_health_agent_manifestGoogle Health Agent ManifestARead-onlyIdempotent
Machine-readable install, runtime and client guidance for AI agents. Does not call Google Health or expose secrets.
Inputs: client, response_format. Returns: links, oauth, client, hermes, +12 more
google_health_cache_statusGoogle Health Cache StatusARead-onlyIdempotent
Show optional local SQLite cache status. Enable with GOOGLE_HEALTH_CACHE=sqlite or GOOGLE_HEALTH_CACHE=true.
Inputs: response_format. Returns: path, enabled, entries, http_cache, +1 more
google_health_capabilitiesGoogle Health MCP CapabilitiesBRead-onlyIdempotent
Explain supported Google Health data, privacy boundaries, beta status and recommended agent workflow.
Inputs: response_format. Returns: links, status, creator, project, +11 more
google_health_connection_statusGoogle Health Connection StatusARead-onlyIdempotent
Check local Google Health config, token file, Node version, privacy mode, cache readiness and optional MCP client readiness without calling Google APIs or exposing secrets.
Inputs: client, response_format. Returns: ok, node, cache, oauth, +12 more
google_health_daily_rollupGoogle Health Daily RollupBRead-onlyIdempotent
Aggregate a data type over civil days using Google Health dailyRollUp. Useful for steps, distance, calories, active minutes, weight and heart summaries.
Inputs: end_date, data_type, page_size, page_token, +6 more. Returns: data, endpoint, privacy_mode
google_health_daily_summaryGoogle Health Daily SummaryBRead-onlyIdempotent
Build a practical daily summary from Google Health rollups and reconciled streams when available. Read-only, beta, non-medical.
Inputs: date, timezone, response_format. Returns: kind, generated_at
google_health_data_inventoryGoogle Health Data InventoryARead-onlyIdempotent
Inventory supported Google Health data types, auth scopes, privacy modes and recommended first calls without calling Google APIs.
Inputs: response_format. Returns: auth, kind, links, notes, +12 more
google_health_data_type_coverageGoogle Health Data Type CoverageARead-onlyIdempotent
Build a data-type coverage plan from the official Google Health API data-type table, or run explicit live read-only checks against a real OAuth account. Live mode returns only redacted status and point-count buckets, never raw health payloads.
Inputs: date, live, data_types, response_format, +1 more. Returns: kind, mode
google_health_demoGoogle Health DemoARead-onlyIdempotent
Returns realistic Pixel-Watch-style example payloads of google_health_daily_summary, google_health_wellness_context, and google_health_daily_rollup so agents see the contract before calling real Google Health APIs.
Inputs: response_format.
google_health_exchange_codeExchange Google Health OAuth CodeA
Exchange a Google OAuth authorization code for local tokens. Tokens are stored locally with 0600 permissions and are never returned. Gated: requires explicit user intent — agents must not call this autonomously.
Inputs: code (required), code_verifier (required), response_format. Returns: ok, note, scope, expires_at, +1 more
google_health_get_auth_urlGet Google Health OAuth URLARead-onlyIdempotent
Generate a Google OAuth authorization URL for Google Health API. Use this first when no local token exists.
Inputs: state, scopes, response_format. Returns: scopes, auth_url, next_step, redirect_uri, +1 more
google_health_get_identityGet Google Health IdentityARead-onlyIdempotent
Get the Google Health identity mapping for the authenticated user. Useful for Fitbit-to-Google migrations.
Inputs: privacy_mode, response_format, explicit_user_intent. Returns: data, endpoint, privacy_mode
google_health_get_profileGet Google Health ProfileARead-onlyIdempotent
Get authenticated user profile details from Google Health. Requires profile scope.
Inputs: privacy_mode, response_format, explicit_user_intent. Returns: data, endpoint, privacy_mode
google_health_get_settingsGet Google Health SettingsARead-onlyIdempotent
Get authenticated user settings such as units and timezone. Requires settings scope.
Inputs: privacy_mode, response_format, explicit_user_intent. Returns: data, endpoint, privacy_mode
google_health_list_data_pointsList Google Health Data PointsCRead-onlyIdempotent
Query detailed data points for a Google Health data type. Use kebab-case endpoint data types, e.g. steps, sleep, heart-rate.
Inputs: filter, data_type, page_size, page_token, +3 more. Returns: data, endpoint, privacy_mode
google_health_list_data_typesList Google Health Data TypesARead-onlyIdempotent
List the canonical kebab-case data_type slugs accepted by the data point, reconcile and rollup tools, with each slug's unit, OAuth scope family, and which endpoint verbs (list/reconcile/rollup) support it. Call this before list_data_points, reconcile_data_points, daily_rollup or rollup to choose a valid data_type instead of guessing a slug. Static metadata; does not call Google APIs.
Inputs: response_format. Returns: kind, note, count, source, +3 more
google_health_onboardingDelx Wellness Onboarding FlowARead-onlyIdempotent
Return the 11-question onboarding flow plus the current profile state and missing fields. Read-only — does NOT persist anything. Pair with google_health_profile_update once the user answers. Cross-connector: the same profile is shared by every Delx Wellness MCP (whoop, garmin, oura, fitbit, strava, polar, withings, apple-health, samsung-health, google-health, nourish, cycle-coach, cgm, air).
Inputs: locale, response_format.
google_health_privacy_auditGoogle Health Privacy AuditARead-onlyIdempotent
Return local privacy, cache, token-path and env-presence posture without revealing secret values.
Inputs: response_format. Returns: notes, project, cache_path, token_path, +15 more
google_health_profile_getGet Delx Wellness ProfileARead-onlyIdempotent
Read the shared Delx Wellness profile from ~/.delx-wellness/profile.json. Returns preferred name, goals, devices, training/nutrition/exercise/agent preferences and safety flags. NEVER contains OAuth tokens or API secrets. Read-only.
Inputs: response_format.
google_health_profile_updateUpdate Delx Wellness ProfileA
Persist a partial patch to ~/.delx-wellness/profile.json. Requires explicit_user_intent=true (otherwise returns USER_ACTION_REQUIRED). Rejects secret-like fields (oauth, token, secret, password, cookie, refresh, api_key, session) at write time. Use to record preferred name, goals, devices, training context, nutrition context, exercise preferences, agent preferences, and safety flags.
Inputs: patch (required), response_format, explicit_user_intent.
google_health_quickstartGoogle Health QuickstartARead-onlyIdempotent
Personalized 3-step setup walkthrough for the human user. Adapts to current state (env vars set? token present? what's next?). Call this first when the user asks 'how do I connect Google Health?'
Inputs: response_format.
google_health_reconcile_data_pointsReconcile Google Health Data PointsBRead-onlyIdempotent
Read a reconciled stream for one data type across sources. Supports all-sources, google-wearables and google-sources data source families.
Inputs: filter, data_type, page_size, page_token, +4 more. Returns: data, endpoint, privacy_mode
google_health_revoke_accessRevoke Google Health OAuth AccessADestructive
Revoke the current Google OAuth grant and delete the local token file. Use only when the user explicitly wants to disconnect Google Health. Gated: requires explicit user intent — agents must not call this autonomously.
Inputs: response_format, explicit_user_intent. Returns: ok, note, token_path, local_tokens_cleared
google_health_rollupGoogle Health Physical-Time RollupCRead-onlyIdempotent
Aggregate a data type over physical time intervals using Google Health rollUp.
Inputs: end_time (required), start_time (required), data_type, page_size, +6 more. Returns: data, endpoint, privacy_mode
google_health_weekly_summaryGoogle Health Weekly ReviewARead-onlyIdempotent
Build a weekly Google Health scorecard with activity, sleep, heart context and missing-data awareness. Read-only, beta, non-medical.
Inputs: days, timezone, compare_days, response_format. Returns: kind, generated_at
google_health_wellness_contextGoogle Health Wellness ContextBRead-onlyIdempotent
Normalize Google Health activity/sleep context into the shared wellness_context shape for recommendation engines.
Inputs: days, notes, soreness, timezone, +2 more. Returns: notes, source, soreness, generated_at, +2 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 26 tools
Multiple tools overlap in purpose: connection_status, privacy_audit, and cache_status all touch local config/cache/token readiness; data_inventory, list_data_types, data_type_coverage, and capabilities all describe supported data types/scopes. The get_profile vs profile_get pair is especially easy to confuse because one is a Google Health profile and the other is a local Delx wellness profile.
All tools share the google_health_ prefix and use snake_case, but beyond that the pattern is mixed: verb-first names (get_profile, list_data_points, revoke_access) coexist with noun-first names (profile_get, profile_update) and pure noun names (capabilities, quickstart, data_inventory). This is readable but not a consistent verb_noun convention.
At 26 tools, the server crosses the threshold where the set becomes heavy. Many tools are narrow status/help/metadata endpoints (cache_status, privacy_audit, capabilities, agent_manifest, quickstart, demo) that could reasonably be consolidated into fewer, broader tools without losing capability.
The tool surface covers the main lifecycle for this domain: OAuth setup, identity/profile/settings reads, data type discovery, data point listing, reconciliation, rollups, summaries, local profile persistence, and access revocation. Minor gaps exist (e.g., no explicit token-refresh tool, no update for Google Health settings), but they are unlikely to block the core read-only Google Health workflow.
Maintenance
Related MCP Connectors
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Hosted MCP server for the Healthie EHR & telehealth API: patients, appointments, charting, tasks.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Hosted MCP server for Cliniko — patients, appointments, availability, and invoices for AI agents.
Related MCP Servers
- AlicenseBqualityBmaintenanceLocal-first MCP server that connects AI agents to your Fitbit activity, sleep, heart-rate, HRV, SpO2 and weight data.33352 npm5MIT
- AlicenseAqualityDmaintenanceMCP server to read daily activity, sleep, heart rate, and body metrics from Google Health API, allowing AI assistants like Claude to access your health data. Optionally syncs health metrics to an Obsidian vault.5MIT
- AlicenseNot gradedqualityDmaintenanceSelf-hosted MCP server that aggregates personal health data from Google Health, Oura, and Withings into a single, provider-attributed interface with configurable source of truth preferences.MIT
- AlicenseCqualityDmaintenanceA local-first, model-agnostic MCP server that stores personal health data in a SQLite file and provides analysis-ready views for any AI client to log, retrieve, and reason over health records.79MIT