Withings MCP vs Fitbit MCP — MCP Server Comparison | AllMCPs
Side-by-Side Model Context Protocol Comparison
Withings MCP vs Fitbit MCP
In-depth architectural comparison of the Withings MCP and Fitbit MCP MCP servers. Compare execution transports, security boundaries, tool capabilities, quality scores, and ready-to-paste client installation snippets for Claude, Cursor, Windsurf, and VS Code.
At a Glance & Executive Verdict
Withings MCP
Sports · Local stdio
Quality: 59/100 (Good) | Auth: OAuth 2.0
Fitbit MCP
Sports · Local stdio
Quality: 63/100 (Good) | Auth: OAuth 2.0
Verdict Summary: Choose Withings MCP if you need specialized Sports tools running via a local process. Choose Fitbit MCP if your workspace requires Sports integration with local subprocess execution. Both servers can be configured concurrently in your client's mcpServers manifest.
Which MCP Server Should You Choose?
Choose Withings MCP when:
You need dedicated capabilities in the Sports domain.
You prefer local stdio subprocess transport architecture.
Your security boundary fits: OAuth 2.0 (Free / Open Source).
MCP server for the Withings Health API: OAuth, local SQLite cache, and trend analysis for body composition, sleep, activity, workouts, and ECG.
MCP server for the Fitbit Web API. OAuth 2.0 PKCE, local SQLite cache with auto-sync, and trend analysis. Tools for heart rate, activity, exercises, sleep, weight, SpO2, and HRV.
Sync Withings health data to the local cache.
Fetches data from the Withings API and stores it in SQLite for fast
offline queries. Run this before using other withings_get_* tools.
Syncs incrementally: only fetches data newer than the last sync.
First sync fetches the specified number of days of history.
Args:
data_types: What to sync. Options: "all", "body", "sleep",
"activity", "workouts". Comma-separated for multiple,
e.g. "body,sleep". Default: "all".
days: Days of history for first sync (default: 30). Ignored
on subsequent syncs (uses last sync timestamp).
Returns summary of records synced per data type.
Not for querying data - use withings_get_body, withings_get_sleep,
withings_get_activity, or withings_get_workouts instead.
withings_get_activity
Get daily activity summaries (steps, distance, calories, active time).
Returns one entry per day from the local cache by default.
Run withings_sync first to populate the cache.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d".
Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
live: If true, fetch from Withings API instead of cache.
Returns daily activity data sorted by date, with steps, distance
in km, calories, and active minutes by intensity level.
Not for workout sessions -- use withings_get_workouts instead.
withings_get_workouts
Get workout sessions (type, duration, HR, calories).
Returns individual workout sessions from the local cache by default.
Run withings_sync first to populate the cache.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "90d".
Default: last 90 days.
end_date: End date as "YYYY-MM-DD". Default: today.
category: Filter by workout type, e.g. "cycling", "walk", "run".
Case-insensitive partial match.
live: If true, fetch from Withings API instead of cache.
Returns workout sessions sorted by date with type, duration,
calories, distance, and heart rate data.
Not for daily step/activity totals -- use withings_get_activity.
Ready-to-Paste Client Configurations
Paste either (or both) of these JSON server blocks into your client config file (e.g. claude_desktop_config.json or ~/.cursor/mcp.json).
Withings MCP is categorized under Sports and uses a local stdio subprocess. In contrast, Fitbit MCP belongs to Sports using local stdio subprocess. Select Withings MCP when you need capabilities focused on sports and Fitbit MCP when you require tools for sports.
Analyse trends in cached health data.
Computes averages, min/max, and changes over time from the local
cache. Auto-syncs if the cache is stale (no sync today).
Args:
data_type: What to analyse. Options: "body", "sleep", "activity".
period: Aggregation period. Options: "weekly", "monthly",
"quarterly". Default: "monthly".
start_date: Start date as "YYYY-MM-DD" or "12m" for relative.
Default: last 12 months.
end_date: End date as "YYYY-MM-DD". Default: today.
compare: Compare two periods. Format: "last_30d vs previous_30d",
"2026-03 vs 2026-02", "2026-Q1 vs 2025-Q4".
When set, period/start_date/end_date are ignored.
Returns aggregated averages with change indicators. For body data:
weight, fat%, muscle trends. For sleep: duration, score, HR trends.
For activity: steps, distance, calorie trends.
Not for raw data -- use withings_get_body/sleep/activity instead.
withings_get_body
Get body composition measurements (weight, fat, muscle, etc.).
Returns measurements from the local cache by default. Use live=True
to fetch directly from Withings API. Run withings_sync first to
populate the cache.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d" for
relative days. Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
metrics: Comma-separated metric filter, e.g. "weight_kg,fat_pct".
Default: all available metrics. Options: weight_kg, fat_pct,
fat_mass_kg, muscle_mass_kg, hydration_kg, bone_mass_kg,
heart_rate, systolic_bp, diastolic_bp, spo2_pct.
live: If true, fetch from Withings API instead of cache.
Returns measurements sorted by date, one entry per measurement group.
Not for sleep or activity data -- use withings_get_sleep or
withings_get_activity instead.
withings_get_devices
Get connected Withings devices with battery and firmware info.
Always fetched live from the Withings API.
Returns device type, model name, battery level (high/medium/low),
and last session date for each connected device.
withings_get_heart
Get ECG recordings and atrial fibrillation detection results.
Always fetched live from the Withings API (not cached due to large
signal data). Requires a Withings device with ECG capability
(ScanWatch, BPM Core).
Args:
start_date: Start date as "YYYY-MM-DD" or "30d". Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
Returns ECG recording list with timestamps, AFib classification
(negative/positive/inconclusive), and heart rate. Does not include
raw signal waveforms.
For resting heart rate trends, use withings_get_body or
withings_get_sleep instead.
withings_get_sleep
Get sleep data (summaries or detailed phases).
Summary mode (default): nightly totals with duration, sleep score,
HR, respiratory rate, and snoring. From local cache unless live=True.
Detail mode (detail=True): minute-by-minute sleep phases (awake,
light, deep, REM) with HR and respiratory rate. Always fetched live.
Maximum 7 days per request (Withings API limit).
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "7d".
Default: last 7 days (detail) or last 30 days (summary).
end_date: End date as "YYYY-MM-DD". Default: today.
detail: If true, return minute-by-minute sleep phases instead
of nightly summaries. Always live, max 7 days.
live: If true, fetch summaries from API instead of cache.
Ignored when detail=True (always live).
Returns nightly sleep data sorted by date.
Not for body composition -- use withings_get_body instead.
Fitbit MCP Tools (18)
fitbit_sync
Sync Fitbit health data to the local cache.
Fetches data from the Fitbit API and stores it in SQLite for fast
offline queries. Run this before using other fitbit_get_* tools.
Syncs incrementally: only fetches data newer than the most recent
entry in each table. First sync fetches the specified number of days.
Args:
data_types: What to sync. Options: "all", "heart_rate", "activity",
"exercises", "sleep", "weight", "spo2", "hrv", "azm",
"breathing_rate", "skin_temperature", "core_temperature",
"cardio_fitness", "food_log".
Comma-separated for multiple, e.g. "sleep,hrv". Default: "all".
days: Days of history for first sync (default: 30). Ignored
on subsequent syncs (uses last synced date).
since: Optional "YYYY-MM-DD" backfill date. When set, fetches from this
date regardless of what is already cached - use to pull history
older than the current cache. Overrides incremental resume and days.
until: Optional "YYYY-MM-DD" inclusive end date; requires since.
Together they re-fetch and upsert exactly the since..until window -
use to repair a gap in the middle of the cache without re-pulling
everything from the gap to today.
Returns summary of records synced per data type.
Not for querying data - use fitbit_get_heart_rate, fitbit_get_activity,
fitbit_get_sleep, etc. instead.
fitbit_get_activity
Get daily activity summaries (steps, calories, active minutes, distance).
Returns data from the local cache by default. Use live=True to fetch
from Fitbit API. Run fitbit_sync first to populate the cache.
Note: live=True fetches one API call per day - avoid large ranges to
stay within the 150 requests/hour rate limit.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d". Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
live: If true, fetch directly from Fitbit API instead of cache.
Returns one entry per day with steps, calories, active minutes, distance.
active_minutes = very_active + fairly_active (excludes lightly active).
fitbit_trends
Analyse trends in cached Fitbit data.
Computes averages and totals over time from the local cache,
auto-syncing if stale.
Args:
data_type: What to analyse. Options: "heart_rate", "activity",
"exercises", "sleep", "weight", "spo2", "hrv", "azm",
"breathing_rate", "skin_temperature", "core_temperature",
"cardio_fitness", "food_log". Default: "activity".
period: Aggregation period. Options: "weekly", "monthly",
"quarterly". Default: "monthly".
start_date: Start date as "YYYY-MM-DD" or "365d". Default: last 12 months.
end_date: End date as "YYYY-MM-DD". Default: today.
compare: Compare two periods. Format: "last_30d vs previous_30d",
"2026-03 vs 2026-02", "2026-Q1 vs 2025-Q4".
When set, period/start_date/end_date are ignored.
Returns aggregated averages per period. For activity: steps, distance,
active minutes. For exercises: sessions, duration, calories.
For sleep: duration, efficiency, stage breakdown.
For heart_rate: resting HR min/avg/max. For weight: weight, fat%, BMI.
For spo2: avg/min/max oxygen saturation. For hrv: daily and deep RMSSD.
Not for raw data - use fitbit_get_* tools instead.
fitbit_get_azm
Get daily Active Zone Minutes (AZM) - Fitbit's headline cardio metric.
AZM counts minutes spent in heart rate zones at or above Fat Burn intensity.
Cardio and Peak zone minutes count double. Returns from local cache by default,
auto-syncing if stale. Use live=True to bypass the cache.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d". Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
live: If true, fetch directly from Fitbit API instead of cache.
Returns one entry per day with total_minutes plus per-zone breakdown
(fat_burn_minutes, cardio_minutes, peak_minutes).
Distinct from active_minutes in fitbit_get_activity, which counts wall-clock
minutes regardless of intensity.
fitbit_get_breathing_rate
Get nightly breathing rate (avg breaths per minute during sleep).
Sourced during sleep tracking. Useful as an illness/recovery signal:
sustained increases of 2-3 bpm above personal baseline can indicate
incipient infection or strain. Returns from cache by default,
auto-syncing if stale.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d". Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
live: If true, fetch directly from Fitbit API instead of cache.
Returns one entry per night with breaths_per_min.
Typical adult range: 12-20 bpm at rest.
fitbit_get_cardio_fitness
Get Cardio Fitness Score (VO2 Max estimate).
Fitbit estimates VO2 Max from resting HR, HR during walks/runs, and demographics.
Updates roughly weekly. Returns from cache by default, auto-syncing if stale.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d". Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
live: If true, fetch directly from Fitbit API instead of cache.
Returns entries with vo2_max_low and vo2_max_high (mL/kg/min).
Fitbit reports as a range (e.g. 39-43); when a single value is given,
low and high are equal. Higher = better cardiorespiratory fitness.
fitbit_get_devices
List paired Fitbit devices with battery level and last sync time.
Live-only (no caching) - reflects current device state. Useful for
monitoring tracker health, knowing which device produced data, and
spotting sync gaps.
Returns one entry per paired device with id, type, device_version,
battery (e.g. "High"), battery_level (0-100), last_sync_time, mac,
and features list.
fitbit_get_exercises
Get exercise log entries (individual tracked activities).
Returns exercise sessions from the local cache by default. Use live=True
to fetch from Fitbit API. Run fitbit_sync first to populate the cache.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d". Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
exercise_type: Filter by activity name (case-insensitive substring match),
e.g. "cycling", "walk", "run". Default: all types.
live: If true, fetch directly from Fitbit API instead of cache.
Returns exercise entries with name, duration, calories, avg heart rate,
distance, and source (auto-detect vs manual).
Note: HR data from cycling may be unreliable (optical sensor vs handlebar grip).
fitbit_get_food_log
Get daily food and water log summary.
Returns calories consumed and water intake (in mL) per day. Only populated
if the user logs food/water in the Fitbit app. Returns from cache by default,
auto-syncing if stale.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d". Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
live: If true, fetch directly from Fitbit API. Uses one API call per day.
Returns one entry per day with calories_in and water_ml.
Days with no logging are omitted.
fitbit_get_heart_rate
Get daily resting heart rate and heart rate zones.
Returns resting HR and zone breakdown (Out of Range, Fat Burn, Cardio, Peak)
from the local cache by default, auto-syncing if stale. Use live=True to
bypass the cache entirely.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d". Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
live: If true, fetch directly from Fitbit API instead of cache.
Returns one entry per day with resting_hr and zones array.
Zone data: name, minutes, caloriesOut, max/min HR for each zone.
fitbit_get_hrv
Get nightly HRV (heart rate variability) data.
Returns data from the local cache by default. Use live=True to fetch
from Fitbit API. Run fitbit_sync first to populate the cache.
HRV data is sparse: only nights with on-wrist sleep tracking produce readings.
Requires Fitbit Premium for access to this endpoint.
Args:
start_date: Start date as "YYYY-MM-DD", "YYYY-MM", or "30d". Default: last 30 days.
end_date: End date as "YYYY-MM-DD". Default: today.
live: If true, fetch directly from Fitbit API instead of cache.
Returns one entry per night with daily_rmssd and deep_rmssd (ms).
RMSSD = root mean square of successive RR interval differences.
Higher values generally indicate better recovery and parasympathetic activity.
fitbit_get_lifetime_stats
Get all-time activity totals and personal best records.
Live-only (no caching). Returns lifetime totals (steps, distance, floors,
calories, active score) and personal bests (best day for steps, distance,
floors), each with the date the record was set.
Useful for long-term context that the daily activity table can't easily
answer (e.g. "what's my best step day ever?").