Skip to main content
Glama
google-health-mcp

google-health-mcp

by gokulkrishh

google-health-mcp

Unofficial. This is a community project. It is not made, endorsed or supported by Google or Fitbit.

Ask Claude, ChatGPT or Grok about your Fitbit data: "How did I sleep last night?", "Steps per day this month?", "Is my resting heart rate trending down?"

This is a read-only MCP server for the Google Health API v4, which replaced the Fitbit Web API on 2 November 2026. It works with any Fitbit or Pixel Watch that syncs to the Google Health (Fitbit) app. You deploy it once to Vercel (free), sign in with Google in your browser, and connect your AI apps to it. Nothing runs on your computer.

It only asks Google for read access, so it can never change or delete your data.

What you need

  • A Fitbit or Pixel Watch that syncs to the Fitbit / Google Health app, signed in with your Google account.

  • A free Vercel account and a GitHub account.

  • About 15 minutes.

Related MCP server: google-health-mcp

Setup

1. Deploy to Vercel

  1. Fork or copy this repo to your GitHub account.

  2. In Vercel, click Add New → Project, import the repo and click Deploy. Note your app's address, for example https://my-health.vercel.app. Below it is called YOUR-APP.

  3. In the project, open Storage → Create → Blob, choose Private, and connect it to the project. This is where your Google sign-in is kept.

  4. Open Settings → Environment Variables and add MCP_HTTP_TOKEN with a long random password (32+ characters; a password manager can generate one, or run openssl rand -hex 32). This is the key your AI apps use to reach your data. Save it in your password manager.

2. Create a Google sign-in for your app

  1. Go to the Google Cloud console and create a project (any name).

  2. APIs & Services → Library: search for Google Health API and click Enable.

  3. Google Auth Platform → Branding: enter an app name and your email.

  4. Audience: choose External, add your Gmail address under Test users, then click Publish app. Publishing stops your sign-in from expiring every 7 days. Google will show an "unverified app" warning when you sign in; that is expected for a personal app.

  5. Data Access → Add or remove scopes: filter by "Google Health API" and tick the .readonly scopes for activity_and_fitness, health_metrics_and_measurements, sleep, profile and settings. Save.

  6. Clients → Create client → Web application. Under Authorized redirect URIs add https://YOUR-APP/oauth2callback. Create it.

  7. Back in Vercel, add GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET from that client as environment variables, then go to Deployments and Redeploy the latest one.

3. Sign in

Open https://YOUR-APP/auth, paste your MCP_HTTP_TOKEN, and sign in with Google. You should see Connected.

If it says your account has no Google Health profile, open the Fitbit / Google Health phone app with the same Google account, finish any setup or "move to Google account" prompt, and sign in again.

4. Connect your AI app

Your server address is https://YOUR-APP/mcp.

App

How

Claude (web, desktop, mobile)

Settings → Connectors → Add custom connector. URL https://YOUR-APP/mcp, authentication No sign in, and under Request headers add Authorization = Bearer YOUR_MCP_HTTP_TOKEN.

ChatGPT

Settings → Apps & Connectors → Advanced → turn on Developer mode, then create a connector. URL https://YOUR-APP/mcp?key=YOUR_MCP_HTTP_TOKEN, authentication No authentication. Needs a paid plan.

Grok

grok.com/connectors → New Connector → Custom. Use the header form if offered, otherwise the ?key= URL.

Claude Code

claude mcp add --transport http google-health https://YOUR-APP/mcp --header "Authorization: Bearer YOUR_MCP_HTTP_TOKEN"

Other MCP apps

Streamable HTTP URL https://YOUR-APP/mcp with the Authorization: Bearer header, or the ?key= URL.

Menu names in these apps change often; look for "connectors" or "MCP servers". Prefer the header over ?key= when an app allows it, because URLs end up in logs.

What you can ask

Tool

Answers

get_daily_summary

"How was my day?" Steps, distance, calories, Active Zone Minutes, floors, resting heart rate, HRV, last night's sleep, workouts.

get_daily_rollup

Trends per day or week: steps, distance, heart rate, weight (up to 90 days; 14 for heart rate, active minutes and calories).

get_rollup

Hour-by-hour or per-N-minute values, such as heart rate during a run.

get_data_points

Raw records: sleep stages, workouts, weight, SpO2, HRV, ECG and more.

get_user_info

Profile, units, time zone and goals.

list_paired_devices

Your devices, battery level and last sync.

list_data_types

All 35 readable data types.

Not available: food and water logs. Google Health API v4 has no read permission for nutrition yet.

Troubleshooting

You see

Fix

Not signed in to Google Health yet

Open https://YOUR-APP/auth and sign in.

Google rejected the saved sign-in

Sign in again at /auth. If it keeps happening weekly, publish the Google app (step 2.4).

Google OAuth client is not configured

Add GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in Vercel and redeploy.

redirect_uri_mismatch on Google's page

The redirect URI must be exactly https://YOUR-APP/oauth2callback. If you use a custom domain, also set PUBLIC_BASE_URL=https://your-domain.

has no Google Health profile yet

Set up the Fitbit / Google Health phone app with the same Google account.

Your AI app gets 401

The token in the app does not match MCP_HTTP_TOKEN.

No data for today

Open the Fitbit app so the tracker syncs.

To disconnect, remove the app at https://myaccount.google.com/connections. To lock out your AI apps, change MCP_HTTP_TOKEN and redeploy.

Settings

Variable

Required

Purpose

MCP_HTTP_TOKEN

yes

Secret your AI apps send (32+ characters)

GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET

yes

Your Google OAuth web client

Blob store (BLOB_READ_WRITE_TOKEN)

yes on Vercel

Added automatically when you connect a private Blob store

PUBLIC_BASE_URL

custom domains only

Public https:// address used for the Google redirect

GOOGLE_HEALTH_SCOPES

no

Extra scopes, e.g. activity,metrics,sleep,profile,settings,ecg,irn

GOOGLE_REFRESH_TOKEN

no

Use a refresh token from elsewhere instead of signing in at /auth

Running on your own computer (optional)

For Claude Desktop or Claude Code without hosting anything:

  1. Do step 2 above, but use the redirect URI http://127.0.0.1:8765/oauth2callback and save the downloaded client JSON as ~/.config/google-health-mcp/credentials.json.

  2. Run npm install then npm run auth.

  3. Point your app at the command node /path/to/google-health-mcp/dist/index.js serve. In Claude Code that is claude mcp add google-health -s user -- node /path/to/google-health-mcp/dist/index.js serve.

node dist/index.js serve --http runs the same HTTP server as Vercel on 127.0.0.1:8787 if you want to put your own tunnel in front of it.

Development

npm test builds and runs the unit tests. See AGENTS.md for how the code is organised.

Unofficial project. Not affiliated with Google or Fitbit.

Available Tools

7 tools
get_daily_rollupDaily totals over a date rangeA
Read-only

Aggregated values per day (or per N days) for a data type, e.g. steps per day this week, average heart rate per day, weekly distance. Best tool for trends. Max range is 14 days for heart-rate, active-minutes, total-calories and calories-in-heart-rate-zone, 90 days otherwise.

NameRequiredDescriptionDefault
endDateYesInclusive last date, YYYY-MM-DD.
dataTypeYes
startDateYesDate in YYYY-MM-DD (the user's local calendar date).
windowDaysNoDays per bucket. Default 1 (one value per day); 7 gives weekly buckets.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral context beyond them: hard range caps that differ by data type (14 days for heart-rate, active-minutes, total-calories, calories-in-heart-rate-zone; 90 days otherwise), which is not present in the schema and directly affects call planning. It does not say what happens when the cap is exceeded (error vs truncation), which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with what is returned and the bucketing model before the constraint sentence. No filler. The date-limit sentence is dense but every clause carries a distinct, actionable constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter read tool with no output schema and presence/absence of annotations covering only safety, the description supplies the essentials: bucketing semantics, examples of the per-day vs per-N-days output, and range limits. Remaining gaps are boundary behavior (does an out-of-range request error or clamp?) and timezone handling of startDate/endDate across buckets.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so dataType, startDate, endDate and windowDays are all documented in the schema, including the default-1 and 7-for-weekly behavior of windowDays. The description reinforces this with the "per N days" and "weekly distance" phrasing but adds no new semantics such as unit of the returned values or how partial buckets are handled at range boundaries. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete verb+resource: aggregated values bucketed per day (or per N days) for a named data type, with three illustrative examples (steps per day, average heart rate per day, weekly distance). It establishes its role as the trends tool, but never names or contrasts the near-identical siblings get_rollup and get_daily_summary, so an agent cannot fully disambiguate from the text alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Best tool for trends" is a usable when-to-use cue, and the per-data-type max range (14 vs 90 days) tells the agent when the call will fail. However, no alternative is named for point-in-time retrieval, and the relationship to get_daily_summary/get_rollup is left implicit, which is a significant gap given how similar those siblings appear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_daily_summaryDaily health summaryA
Read-only

One-call overview of a single day: steps, distance, calories, active zone minutes, floors, resting heart rate, HRV, sleep that ended that day, and exercise sessions. Start here for questions like 'how did I do today/yesterday'.

NameRequiredDescriptionDefault
dateNoLocal date YYYY-MM-DD. Defaults to today in the user's Google Health time zone.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful scoping semantics (all metrics in one call, sleep attributed to the day it ended, date defaults to the user's Google Health time zone) but says nothing about response shape, missing-data behavior, or payload size. With annotations carrying the safety burden, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose and a metric inventory, followed by a concrete usage example. No filler, no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter read tool with no output schema, this covers purpose, scope, time-zone defaulting, and entry-point routing well. The only gap is not describing what happens for days with no data or how the metrics are aggregated, which a caller might reasonably want to know.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single date parameter is fully documented in the schema, including the local-date format and today's default. The description adds only the implicit notion of a bounded single-day window, which is marginal value beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource (one-call overview of a single day) and enumerates exactly which metrics are returned: steps, distance, calories, active zone minutes, floors, resting heart rate, HRV, sleep, and exercise sessions. This enumeration clearly differentiates it from siblings like get_data_points or get_daily_rollup, which imply narrower raw or ranged access.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says "Start here for questions like 'how did I do today/yesterday'", giving a clear entry-point rule for day-level questions. It does not explicitly name the alternative to use for multi-day ranges or raw point queries, which is why this falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_data_pointsRaw data pointsA
Read-only

Raw records for a data type, newest first: sleep sessions with stages, exercise sessions, weight entries, daily resting heart rate, HRV, SpO2, ECG and so on. Heart-rate and steps produce many points per day, so prefer the rollup tools for those. Pass nextPageToken back as pageToken to read more. For electrocardiogram the API only filters by start, treated as UTC, and end is ignored.

NameRequiredDescriptionDefault
endNoLocal end. A date-only value includes that whole day. Defaults to start.
startNoLocal start, YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss. Omit start and end to get the most recent records.
filterNoAdvanced: raw AIP-160 filter that overrides start/end.
dataTypeYes
pageSizeNoDefault 50 (sleep and exercise are capped at 25).
pageTokenNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint, so the description carries the behavioral load and does so well: result ordering (newest first), the pagination contract ('Pass nextPageToken back as pageToken' — an output field documented nowhere else), and an API quirk that filtering for electrocardiogram treats start as UTC and ignores end. Those are exactly the non-obvious traits an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, front-loaded with what the tool returns before caveats and pagination mechanics. Every sentence carries distinct information — examples, alternative routing, pagination, and the ECG exception — with no restatement of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter read tool with no output schema, the description covers return ordering, result volume, pagination tokens, and a filtering edge case, which is most of what's needed. Minor gaps remain: no mention of how the advanced 'filter' parameter supersedes start/end, and no guidance on pageSize tradeoffs beyond what the schema states.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and the description fills the most consequential gaps: it explains pageToken's real source (nextPageToken from a prior response, which the schema leaves undocumented) and overrides the schema's 'end defaults to start' with the ECG-specific rule that end is ignored. It does not mention the filter parameter's override of start/end, which remains schema-only.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Raw records for a data type, newest first') and enumerates the record families it returns (sleep sessions with stages, exercise sessions, weight entries, resting heart rate, HRV, SpO2, ECG). It also positions itself against siblings by naming the rollup tools as the alternative for high-frequency types, so an agent can distinguish it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit conditional exclusion: for heart-rate and steps, prefer the rollup tools because they produce many points per day. That is real routing guidance, not implied usage. It stops short of covering the other siblings (get_daily_summary, list_data_types) or when raw-vs-summary is otherwise preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_rollupAggregates over fixed time windowsA
Read-only

Aggregated values over physical-time windows (e.g. heart rate per 60 minutes during a workout, steps per hour today). Use get_daily_rollup for per-day values.

NameRequiredDescriptionDefault
endTimeYesRFC-3339 timestamp with offset (exclusive).
dataTypeYes
startTimeYesRFC-3339 timestamp with offset, e.g. 2026-11-07T06:00:00+05:30.
windowMinutesYesBucket size in minutes, e.g. 60 for hourly.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description contributes the non-obvious trait that buckets are anchored to physical elapsed time rather than calendar boundaries, which materially affects interpretation. It does not discuss how gaps, partial buckets at range edges, or empty windows are handled, which is the remaining behavioral unknown for a time-bucketing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler: the first defines the operation and its scope, the second handles disambiguation. The examples do real work rather than padding, and the alternative is placed after the definition where it is most useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description is the only place the return shape could be characterized, and it never says what a result looks like (buckets with timestamps, units, empty periods). For a four-required-parameter aggregation tool with an open-world enum, this leaves a meaningful gap for correct interpretation of results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, with unit examples already inline for startTime/endTime and windowMinutes, so the schema carries most of the load. The description reinforces the windowMinutes meaning through the "60 minutes" example but adds nothing about the dataType enum or how it interacts with bucket size. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Aggregated values over physical-time windows" states a specific operation (aggregation) plus the axis of aggregation (physical-time windows), and the two parenthetical examples make the concept concrete. The final sentence explicitly routes away from get_daily_rollup, so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names one alternative (get_daily_rollup) and the condition that selects it (per-day vs sub-day windows), which is genuinely actionable routing. It gives no guidance for the other paths an agent might take — e.g. raw points via get_data_points versus aggregated windows — so the exclusion set is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_user_infoProfile, settings and identityC
Read-only

The user's Google Health identity (user IDs), profile (age, height, stride, etc.) and settings (units, time zone, goals).

NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the description's main remaining duties are the shape of the response and any auth or account-scoping caveats. It lists content categories but not how they are returned or what happens if no account/identity exists, adding little beyond the annotation profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence, front-loaded with the main categories, with no redundant wording. The missing verb is a content gap rather than verbosity, so it stays efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-argument read with no output schema, the description gives a reasonable inventory of what comes back, but it does not map fields to the profile/settings distinction or explain the relationship between the returned user IDs and other tools. Adequate to call correctly, thin on result interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; the description correctly presents this as an identity-scoped lookup with nothing to pass in. The mention of user IDs is a small extra hint that the response is keyed to an authenticated account.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates the resources involved (Google Health identity, profile, settings) and gives concrete examples (age, height, units, time zone, goals), which distinguishes it from siblings like get_daily_summary or list_paired_devices. However, it is a bare noun phrase with no verb, so it never states that the tool retrieves/returns this data rather than, say, updating it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance at all: nothing says to call this first to obtain user IDs before calling data-point tools, and no exclusions or alternatives are named. The agent must infer usage from the name and sibling list alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_data_typesList Google Health data typesA
Read-only

Lists every readable Google Health / Fitbit data type, which tools support it, and the maximum rollup range.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral value by disclosing what the response contains (data types, which tools support them, max rollup range), which is exactly the context needed to use the output. It does not mention response size or pagination, keeping it just short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the primary fact (it lists all data types) and appends the two secondary facts an agent needs. No filler, no restatement of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining return values, and it does so adequately by naming the three things returned. For a zero-parameter read-only catalog tool this is nearly complete; only the exact shape/format of the response is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to compensate for. Nothing in the text conflicts with the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ("Lists every readable Google Health / Fitbit data type") and goes further by naming the payload contents: tool support and maximum rollup range. That clearly separates it from the data-fetching siblings like get_data_points or get_rollup, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit statement of when to call this versus the sibling retrieval tools. The usage is only implied — an agent must infer it is a discovery step to run before get_data_points or get_rollup, and no exclusions or alternatives are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_paired_devicesPaired devicesA
Read-only

Devices paired to the account (e.g. Fitbit Air, Pixel Watch), with battery and last sync time when available.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real value by disclosing the return payload (battery level, last sync time) and hedges with 'when available', signalling that these fields may be null or absent — useful for an agent parsing results. It stops short of noting auth requirements or what happens with no paired devices.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence: resource first, concrete examples second, return fields last. Nothing is padded and nothing an agent needs is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read with no output schema, the description covers what the call does and roughly what it returns, while annotations carry the safety profile. A brief note on empty-result behavior or the absence of arguments would close the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case: there is nothing for the description to disambiguate and no schema gaps to compensate for. It would earn a 5 only if it explicitly told the agent the call requires no arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource precisely (devices paired to the account) and gives concrete examples (Fitbit Air, Pixel Watch), so an agent knows exactly what comes back. The verb 'list' is only implied by 'Devices paired to...', and it does not explicitly distinguish itself from the sibling retrieval tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the content: an agent calls this when it needs the user's paired hardware. There is no explicit statement of when to prefer it over alternatives or of any prerequisite such as an authenticated account, though the sibling tools cover unrelated data domains so overlap risk is low.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.0
    • First observedget_daily_rollup
    • First observedget_daily_summary
    • First observedget_data_points
    • First observedget_rollup
    • First observedget_user_info
    • First observedlist_data_types
    • First observedlist_paired_devices

TDQS

A3.8/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct granularity or resource: catalog (list_data_types), one-day overview (get_daily_summary), per-day aggregation (get_daily_rollup), time-window aggregation (get_rollup), raw records (get_data_points), identity (get_user_info), and hardware (list_paired_devices). The only near-overlap, get_daily_rollup vs get_rollup, is explicitly disambiguated in both descriptions ('per-day' vs 'per 60 minutes/hourly').

Naming Consistency5/5

All seven names follow a clean verb_noun snake_case pattern (list_data_types, get_daily_summary, get_rollup, get_user_info, etc.). Verbs are used consistently and predictably: 'list' for enumerations, 'get' for retrieval.

Tool Count5/5

Seven tools is well-scoped for a read-oriented health data server, with each tool earning its place at a distinct layer (catalog, summary, two rollup granularities, raw points, identity, devices). No redundant or filler tools.

Completeness4/5

The read surface is thorough: data-type discovery, high-level summary, both rollup granularities, paginated raw points, profile, and paired devices cover the typical query lifecycle. Gaps are minor and likely API-imposed (read-only — no goal/profile updates) and there is no dedicated sleep or heart-rate-zone helper, though get_data_points and get_rollup can reach those.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Gives Claude read access to wearable health data from Fitbit or Wear OS devices via the Google Health API, exposing tools for metrics like steps, heart rate, sleep, and workouts, plus a computed recovery score.
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to securely read and analyze your Google Health data from Fitbit, Pixel Watch, and Health Connect, providing baseline-aware insights, readiness scores, trends, and anomalies while keeping data local and read-only.
    9
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables Claude to read, write, and delete Google Health (Fitbit successor) metrics such as activity, sleep, heart rate, weight, and nutrition, plus log meals with photo-based nutrition estimation.
    MIT