Skip to main content
Glama

withings-mcp

A small, local MCP server that lets Claude (Claude Code, Claude Desktop or any MCP client) read your own Withings health data through the official Withings Public API: body measurements from the scale and blood pressure monitor, daily activity from the watch, nightly sleep summaries from the sleep analyzer, plus the list of paired devices.

Everything runs on your machine: the server talks to wbsapi.withings.net with tokens stored locally and hands the data to the MCP client. No third-party service in between.

Tool

Returns

withings_status

connection state, granted scopes, access-token expiry

withings_devices

paired devices (model, type, battery, last sync)

withings_measurements

measurement sessions: weight, fat/muscle/bone/water mass, blood pressure, heart rate, SpO2, temperature, PWV, ECG intervals, ...

withings_activity

daily steps, distance, elevation, active minutes, calories, heart-rate zones

withings_sleep

nightly time in bed / asleep, light/REM/deep, efficiency, wake-ups, HR/RR, breathing disturbances, snoring, sleep score, HRV

Ask things like "how did my blood pressure trend over the last month?", "compare this week's sleep with the previous one" or "plot my weight since January" and Claude picks the right tool, date range and filters.

Requirements

  • Python 3.13+ and uv

  • a Withings account with at least one device (or use the Withings demo user, see below)

  • a Withings developer application: free, no contract, takes two minutes (step 1)

Works on Windows, macOS and Linux.

Related MCP server: Withings MCP Server

Install

git clone https://github.com/stefanocaronia/withings-mcp.git
cd withings-mcp
uv sync

1. Create the Withings application

API credentials are not on account.withings.com; they live on the developer dashboard:

  1. open https://developer.withings.com/dashboard/ and pick Europe Cloud (the one open to everybody)

  2. log in with your normal Withings account

  3. Create an application with integration type Public API

  4. set the callback / redirect URL to exactly http://localhost:8765/callback (another port works too: pass the same value to auth --redirect-uri)

  5. keep the generated client_id and client_secret

uv run withings-mcp auth --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET

This opens the Withings consent page in your browser, listens on localhost:8765 for the redirect, exchanges the authorization code (it is valid for 30 seconds) and stores the tokens. With a family account Withings first asks which user's data to share. Re-running auth later reuses the saved credentials; add --demo to use the Withings demo user instead of a real account.

Where things are stored: %LOCALAPPDATA%\withings-mcp\ on Windows, $XDG_CONFIG_HOME/withings-mcp or ~/.config/withings-mcp elsewhere (config.json with the app credentials, tokens.json with the OAuth tokens). Override the directory with WITHINGS_MCP_DIR; WITHINGS_CLIENT_ID / WITHINGS_CLIENT_SECRET take precedence over config.json. Access tokens (3 h) are refreshed automatically; refresh tokens (1 year) rotate on every refresh and the newest one is always persisted. If a tool ever reports status 342/343, run auth again.

uv run withings-mcp status shows the current state.

3. Register the server with your MCP client

Claude Code

claude mcp add --scope user withings -- uv --directory /path/to/withings-mcp run withings-mcp

Claude Desktop — add to claude_desktop_config.json:

{
  "mcpServers": {
    "withings": {
      "command": "uv",
      "args": ["--directory", "/path/to/withings-mcp", "run", "withings-mcp"]
    }
  }
}

Any other MCP client: it is a stdio server started with uv --directory /path/to/withings-mcp run withings-mcp.

Notes on the data

  • Dates are YYYY-MM-DD in local time; without dates the last 30 days are returned.

  • Measurement values are decoded into the unit carried by the key (weight_kg, fat_ratio_pct, systolic_bp_mmHg, ...); types accepts names or Withings type ids (weight,fat_ratio or 1,6), and include_manual=false drops entries typed by hand in the app.

  • Durations are seconds unless the key says otherwise.

  • Withings asks partners not to poll more than once every 10 minutes per user; the server tells Claude so.

Development

uv run pytest

The tests run against tests/fake_withings.py, a stand-in for the Withings API (token exchange and rotation, a one-off 343 to exercise the retry, two-page pagination, the OAuth callback with right and wrong state, the tools in-process and the real server spawned over stdio). No credentials needed.

References: the one-file API summary at https://developer.withings.com/llms.md and the OpenAPI spec at https://developer.withings.com/openapi.yaml.

Disclaimer

Unofficial project, not affiliated with or endorsed by Withings. It only reads data you already own; nothing here is medical advice.

License

MIT

Available Tools

5 tools
withings_activityC

Daily activity summaries: steps, distance (m), elevation (floors), soft/moderate/intense/active durations (s), calories (active, kcal), totalcalories, heart rate average/min/max and hr_zone_0..3 durations (s).

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure and fails to do so. It says nothing about authentication, rate limits, pagination, date-range defaults (what happens when start_date/end_date are null), or the date format expected, all of which matter for a date-ranged retrieval tool.

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?

It is a compact, front-loaded sentence that opens with the core resource and then enumerates details without filler. The trade-off is that it is a dense field dump rather than prose guidance, but it wastes no words.

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

Completeness2/5

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

An output schema already exists, so the description need not explain return values—yet it spends its entire content doing exactly that, duplicating the schema. It leaves the more important gaps (implicit action, parameter formats, null-date behavior, no annotation coverage) unaddressed.

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

Parameters2/5

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

Schema description coverage is 0% and the description does not mention start_date or end_date at all. It adds zero semantic value about the two parameters—no date format, no default-window behavior when null—leaving the agent to infer their meaning from the bare property names.

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 clearly as 'Daily activity summaries' and enumerates exactly what data it covers (steps, distance, calories, heart rate), which makes it distinguishable from activity-less siblings like withings_sleep or withings_devices. However, it never states an explicit action verb (e.g., 'retrieve' or 'get'), leaving the operation implicit rather than stated.

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 when to pick this over withings_measurements (which could overlap on activity metrics) or how it relates to withings_sleep. The reader must infer the usage entirely from the field list.

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

withings_devicesB

Devices paired to the account (model, type, battery, last sync).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden, and it discloses almost nothing beyond output fields. It doesn't state that this is a read operation, that it takes no parameters, or that it returns all 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.

Conciseness4/5

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

A single compact parenthetical sentence with no waste. It is front-loaded, though the telegraphic style sacrifices clarity for brevity.

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?

An output schema exists, so return values need not be described, and a zero-parameter read has low complexity. However, with no annotations and no usage context, the definition is only minimally sufficient for correct invocation.

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 empty schema is fully consistent with a no-argument endpoint and the description doesn't need to explain 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?

States a specific resource (devices paired to the account) and enumerates the returned fields. It is distinguishable from siblings like withings_measurements or withings_sleep, though the verbless phrasing leaves the operation (list/retrieve) implicit.

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?

No when-to-use or when-not-to-use guidance, and no reference to any sibling tool. The agent must infer this is the device-inventory endpoint purely from the name and noun phrases.

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

withings_measurementsA

Body measurements (scale, blood pressure monitor, thermometer, ECG) grouped by measurement session.

types filters by comma-separated names or Withings type ids, e.g. "weight,fat_ratio,muscle_mass" or "1,6,76"; omit it for everything. Names: weight, height, fat_free_mass, fat_ratio, fat_mass, diastolic_bp, systolic_bp, heart_rate, temperature, spo2, body_temperature, skin_temperature, muscle_mass, hydration, bone_mass, pulse_wave_velocity, vo2_max, afib_ecg, qrs_interval, pr_interval, qt_interval, qtc_interval, afib_ppg, vascular_age, extracellular_water, intracellular_water, visceral_fat, basal_metabolic_rate, metabolic_age. Values are already decoded into the unit in the key (weight_kg, fat_ratio_pct, systolic_bp_mmHg, ...). include_manual=false keeps only device-captured groups (drops manual entries).

ParametersJSON Schema
NameRequiredDescriptionDefault
typesNo
end_dateNo
start_dateNo
include_manualNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden. It does add genuinely useful context: that values are pre-decoded with units baked into keys, and that include_manual=false drops manual entries (a filter behavior). However, it says nothing about pagination, auth requirements, limits, or return shape risk.

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

Conciseness3/5

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

The core purpose and filter behavior are front-loaded and useful, but the long enumeration of 30+ type names bloats the description significantly. The list is helpful but indigestibly long for a tool description.

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?

Given an output schema exists, return value explanation is unnecessary, and the description covers the measurement domains and the key filter. It is largely complete, though the date parameters and pagination behavior remain unaddressed.

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 description coverage is 0%, so the description must compensate, and it does for `types` (with a full enumerated list and id mapping) and partially for `include_manual`. It provides no format guidance for start_date/end_date, leaving two of four parameters underspecified.

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 clearly states what the tool returns ('Body measurements ... grouped by measurement session'), naming the resource and the grouping scope. It does not explicitly differentiate itself from siblings like withings_activity or withings_sleep, which is what keeps it at 4 rather than 5.

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?

It implies when to use the tool (retrieving measurement data) and describes an optional filter, but it never explicitly says when-to-use vs alternatives or provides exclusions. No alternative routing is given despite four sibling tools existing.

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

withings_sleepC

Nightly sleep summaries: time in bed / asleep, light/REM/deep durations (s), efficiency, latency, wake-ups, heart and respiration rate, breathing disturbances, snoring, sleep_score, HRV (rmssd). date is the night's date.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden, yet it only lists returned fields and says nothing about pagination, authentication, or what happens when the date range is empty/omitted. Since an output schema already exists, the field enumeration adds limited behavioral insight.

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?

The resource is front-loaded and the sentence is information-dense without filler. The long field list is somewhat heavy but each item is meaningful, so the structure is efficient overall.

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

Completeness2/5

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

An output schema covers return values, but the definition is missing guidance on the two input parameters and on date-window usage. The reference to a `date` parameter that is not in the schema actively misleads, making it incomplete for a data-retrieval tool with zero annotation coverage.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must explain start_date and end_date. Instead it discusses a non-existent `date` parameter and never clarifies that the two parameters form a range or what format/direction they take, leaving both actual parameters undocumented.

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 specific resource (nightly sleep summaries) and enumerates its contents (time in bed/asleep, sleep stages, sleep_score, HRV), which lets an agent distinguish it from withings_devices, withings_measurements, and withings_activity. It is a noun list rather than a clear verb, but the purpose is unambiguous.

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?

No guidance on when to call this versus withings_activity or how to use the date window. The only contextual statement ('`date` is the night's date') refers to a parameter that does not exist in the schema, and there is no mention of defaults when start_date/end_date are omitted.

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

withings_statusB

Whether the Withings account is connected, which scopes were granted and when the access token expires.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It lists the returned fields but does not state that the operation is read-only, whether authentication is required, or any rate limits or side effects. This is a significant gap for a tool with zero annotation coverage.

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?

The description is a single, well-structured sentence that front-loads the core purpose. Every element (connection status, scopes, token expiry) earns its place without redundancy.

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?

Given the simplicity (zero parameters) and the presence of an output schema, the description is nearly complete for understanding what the tool provides. It does not explain when to use it or any authentication prerequisite, but those are minor omissions for a straightforward status endpoint.

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. There are no parameter semantics to clarify, and the description does not need to compensate for any schema gaps.

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 clearly states the three pieces of information returned (connection status, granted scopes, token expiry), which distinguishes it from the data-fetching siblings like withings_devices and withings_measurements. It lacks an explicit verb like 'get' and does not name a sibling for differentiation, so it is clear but not maximally specific.

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 guidance on when to call this tool versus alternatives, nor any mention of prerequisites such as needing an authenticated Withings connection. The description only states what information is returned, leaving the agent to infer usage.

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. 5 tool updatesv0.1.0
    • First observedwithings_activity
    • First observedwithings_devices
    • First observedwithings_measurements
    • First observedwithings_sleep
    • First observedwithings_status

TDQS

B3.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool maps to a clearly distinct data domain: connection status, devices, body measurements, activity, and sleep. There is no overlap in purpose, and the descriptions anchor each to a specific resource. An agent can select the right tool unambiguously.

Naming Consistency5/5

All five tools follow the same predictable withings_<noun> pattern (status, devices, measurements, activity, sleep). No verb-style mixing or case inconsistencies. The naming is uniform and readable.

Tool Count4/5

Five tools is well-scoped and each earns its place by covering a major Withings data category. It is slightly thin in that related surfaces (e.g. workouts, user profile) are not exposed, but nothing feels redundant or padded.

Completeness4/5

The set provides solid read coverage across status, devices, measurements, activity, and sleep, covering the core lifecycle of a health-data reader. Minor gaps remain, such as workouts or intraday data, but core agent workflows are supported without dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    A Model Context Protocol (MCP) server that brings your Withings health data into Claude, allowing natural conversation access to sleep patterns, body measurements, workouts, heart data, and more.
    42
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that connects Claude to Withings health data using OAuth 2.0. Provides 11 read-only tools to access body measurements, activity, sleep, heart rate, and device information from Withings devices.
    MIT