Zepp Cloud MCP
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
Unofficial. This project is not affiliated with, endorsed by, or supported by Zepp Health, Huami or Amazfit. It uses Zepp's private, undocumented cloud API, which can change or break at any time.
Why
Amazfit watches send a lot of data to Zepp Cloud: sleep stages, HRV, readiness, training load, strength sets, GPS routes. The Zepp app is the only place you can see it. Zepp Cloud MCP reads that data with your own app token, turns it into clean typed JSON, and serves it over the Model Context Protocol. You can then ask an assistant questions like "how did my sleep change after I started lifting in the evening?". The self-hosted Node server can also sync the data into a local SQLite database and show it on a private web dashboard.
Related MCP server: mcp-garmin
Features
19 read-only MCP tools for daily summary, sleep, heart rate, recovery (HRV, readiness, stress, SpO2), training status (load, VO2max), workouts, per-workout samples, GPS routes, strength sets, weight, blood pressure, Hybrid Charge, emotion/stress events and sync status.
Long ranges. Date ranges up to 366 days. Ranges longer than Zepp's 31-day window are split into several upstream requests and merged.
Strength training. Set-by-set exercises, reps, weight and volume, mapped to primary and secondary muscle groups.
Two deployment targets:
Node server (VPS, home server) with an OAuth 2.1 authorization server, a dashboard, and a daily SQLite sync.
Cloudflare Worker: stateless, with a static bearer token and no database.
OAuth 2.1 for remote connectors. Single owner, dynamic client registration, PKCE (S256), refresh tokens and token revocation. Works with ChatGPT and Claude custom connectors.
Dashboard. Overview, Sleep, Recovery, Activity, Hybrid Charge, Workouts (with muscle map and OpenStreetMap route map), Training, Exercises, Weight and Sync pages, plus GPX/TCX export. The layout is responsive and works on phones.
Safe by design.
No arbitrary upstream URLs.
The region host is validated against Zepp/Huami origins before any credentials are attached.
Raw payloads are sanitized.
Secrets come only from the environment.
Screenshots
|
|
|
|
|
|
|
|
Quick start (Node server)
Requirements:
Node.js 22.5 or later. The sync store uses the built-in
node:sqlite.A Zepp app token, your Zepp user ID and your regional API host. See docs/ZEPP_AUTH.md.
git clone https://github.com/aryarfani/zepp-cloud-mcp.git
cd zepp-cloud-mcp
npm ci
cp .dev.vars.example .env # then edit .env (see the table below)
npm start # listens on http://127.0.0.1:8788Check that it is running:
curl http://127.0.0.1:8788/healthTo fill the local database right away instead of waiting for the daily sync, run:
npm run sync -- --days 30Configuration
The Node server reads .env (via dotenv) and the process environment.
Variable | Required | Default | Description |
| yes | (none) | Static bearer token accepted on |
| yes | (none) | Zepp |
| yes | (none) | Numeric Zepp user ID. |
| yes | (none) | Bare HTTPS origin such as |
| no |
| IANA zone used to turn local dates into day boundaries. |
| no |
| Port to listen on. The server always binds to |
| no | (none) | At least 16 characters. Turns on the OAuth 2.1 server and the dashboard login. If it is missing, only the static bearer works. |
| no |
| Where OAuth clients and tokens are stored. |
| no | from request | Public base URL, for example |
| no | derived from owner password | Session signing key, 32 characters or more. |
| no |
| Run the daily sync. |
| no |
| Local hour (0 to 23) for the daily sync. |
| no |
| Days fetched on the first run (max 730). |
| no |
| Minimum window for incremental syncs (capped by the 31-day smart window). |
| no |
| Days re-fetched before the last successful sync. |
| no |
| Delay between upstream requests. |
| no |
| SQLite database file. |
Deploy
Option A: Node server behind nginx (systemd)
/etc/systemd/system/zepp-mcp.service:
[Unit]
Description=Zepp Cloud MCP
After=network-online.target
[Service]
WorkingDirectory=/opt/zepp-cloud-mcp
ExecStart=/usr/bin/npx tsx src/server-node.ts
Restart=on-failure
User=zepp
# Secrets live in /opt/zepp-cloud-mcp/.env (chmod 600)
[Install]
WantedBy=multi-user.targetnginx (TLS through certbot or similar):
server {
server_name zepp.example.com;
location / {
proxy_pass http://127.0.0.1:8788;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off; # streamable HTTP
proxy_read_timeout 300s;
}
listen 443 ssl;
}sudo systemctl enable --now zepp-mcpYou get these endpoints:
/mcp: MCP over Streamable HTTP./dashboard: the web dashboard./authorize,/token,/register,/revoke: OAuth./.well-known/oauth-authorization-serverand/.well-known/oauth-protected-resource: OAuth discovery metadata./health: health check.
Option B: Cloudflare Workers (stateless)
The Worker (src/index.ts) serves /mcp with the static MCP_SECRET bearer only. It has no OAuth, no dashboard, no sync, and no sync_status tool, so it exposes 18 tools.
npm ci
npx wrangler login
# edit wrangler.jsonc vars: ZEPP_USER_ID, ZEPP_REGION_HOST, USER_TIMEZONE
npx wrangler secret put ZEPP_APP_TOKEN
npx wrangler secret put MCP_SECRET
npm run deploySee docs/DEPLOY.md for details.
Connecting a client
Client | How |
ChatGPT | Settings → Apps & Connectors → Create (developer mode). URL |
Claude | Settings → Connectors → Add custom connector. URL |
Cursor | Add the server to |
{
"mcpServers": {
"zepp": {
"url": "https://zepp.example.com/mcp",
"headers": { "Authorization": "Bearer YOUR_MCP_SECRET" }
}
}
}More detail is in docs/MCP_SETUP.md.
MCP tools
All tools are read-only. Each call fetches live from Zepp Cloud; only sync_status reads the local database. Dates are local YYYY-MM-DD in USER_TIMEZONE.
Tool | What it returns |
| Checks auth and upstream reachability. Returns no health values. |
| One day's steps, distance, calories, resting HR and other daily fields |
| Sleep sessions and stages ( |
| Heart-rate summaries for a range |
| HRV, readiness, stress, SpO2, respiratory rate |
| Training load, VO2max, lactate threshold |
| Workouts in a range, with an optional local type filter |
| Summary and detail availability for one workout |
| Per-workout metric samples, downsampled deterministically |
| GPS and elevation route, downsampled |
| Set-by-set exercises, reps, weight, HR, per-exercise rollups |
| Time series for a reviewed scalar metric |
| Sanitized raw payload for an allow-listed metric (max 31 days) |
| Weigh-ins (weight, height, BMI) |
| Blood pressure readings |
| Hybrid Charge score (total, mental, physical), per day |
| Spot-stress and emotion events |
| Discovery: known Zepp streams and whether each has data |
| (Node only) local store coverage and last sync result |
Range tools accept up to 366 days.
Architecture
flowchart LR
W[Amazfit watch] --> A[Zepp app] --> Z[(Zepp Cloud API)]
subgraph Node server
C[Zepp client<br/>+ normalizers] --> M[MCP server /mcp]
O[OAuth 2.1<br/>/authorize /token /register] --> M
S[Daily sync] --> DB[(SQLite<br/>node:sqlite)]
DB --> D[Dashboard /dashboard]
C --> S
end
Z --> C
M --> L[ChatGPT / Claude / Cursor]
subgraph Cloudflare Worker
CW[Zepp client] --> MW[MCP /mcp<br/>static bearer]
end
Z --> CWThe code layout:
Path | Contents |
| Upstream client, endpoint allow-list, normalizers and the sport, exercise and muscle catalogs |
| Tool definitions |
| OAuth server |
| Sync engine, SQLite schema and migrations |
| Server-rendered dashboard |
| Node entry point |
| Worker entry point |
Data and privacy
You host it. Health data goes only between Zepp Cloud, your server and the MCP clients you connect. There is no telemetry.
The Node server stores synced data in
data/zepp.dband OAuth state indata/oauth-store.json. Both are git-ignored. Protect them like any other health record.The Worker keeps no durable storage. It only caches validated responses briefly.
The server never stores your Zepp email or password. It uses an app token that you supply and rotate.
Route maps load tiles from OpenStreetMap, so your browser requests map tiles for the areas you ran in.
Development
npm ci
npm run typecheck # tsc --noEmit
npm test # Workers (workerd) suite, then the Node suite
npm run test:node # Node suite only
npm run dev # wrangler dev (Worker)
npm start # Node serverOther scripts:
npm run test:liveruns a read-only probe against your real account.npm run exercises:rederiverebuilds exercise labels in the local database.
Contributions are welcome. Please read CONTRIBUTING.md.
Roadmap
Multi-user support (more than one Zepp account per server)
Docker image and compose file
Dashboard view for blood pressure and emotion events
Assistant-side prompts and resources (weekly report templates)
Automatic detection of the region host
Acknowledgements
ZeppBridge was the original inspiration. Its sport catalog data is used under the MIT License.
Gadgetbridge is the source of the strength exercise and muscle catalogs (AGPL-3.0-or-later).
OpenStreetMap contributors provide the route map tiles.
The Model Context Protocol SDK.
License
AGPL-3.0-or-later © Ary Arfani and contributors. If you run a modified version as a network service, you must offer its source to the users of that service.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
Access COROS activity, training and health data, and manage training plans and workouts.
Related MCP Servers
- FlicenseAqualityDmaintenanceProvides read-only access to your Garmin Connect health data, including sleep, HRV, body battery, stress, training readiness, and activities, through an MCP server.214-
- AlicenseNot gradedqualityDmaintenanceExposes Garmin Connect data through MCP, enabling retrieval of activities, health metrics, training status, and workouts, with OAuth authentication and confirmed write operations.MIT
- AlicenseAqualityAmaintenanceMCP server that reads Zepp/Amazfit health and workout data, exposing tools for daily summaries, sleep, heart rate, and workout details to any MCP client.885MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to access Zepp/Amazfit health and fitness data such as steps, sleep, heart rate, workouts, and user profile information via tools.ISC
Sleep: nightly stages and recent nights
Recovery: HRV, resting HR, readiness
Training: weekly distance and load by sport
Workouts: searchable list with muscle thumbnails
Strength detail: muscles worked, sets, volume
Run detail: OpenStreetMap route, pace, HR
Activity: steps, calories, resting HR
Sync: local database coverage and run history