Mirobody
Lab results to LOINC codes and UCUM units, symptoms and diagnoses to ICPC-3. Offline, no API key.
Description from the maker (original English)
Self-hosted Polar health analytics with a built-in MCP server: sleep, HRV, workouts, baselines.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
DATABASE_URL, POLAR_CLIENT_ID, POLAR_CLIENT_SECRET, BASE_URLValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"polar-flow": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URL",
"-e",
"POLAR_CLIENT_ID",
"-e",
"POLAR_CLIENT_SECRET",
"-e",
"BASE_URL",
"docker.io/stumason/polar-flow-server:1.6.2"
],
"env": {
"DATABASE_URL": "your-value",
"POLAR_CLIENT_ID": "your-value",
"POLAR_CLIENT_SECRET": "your-value",
"BASE_URL": "your-value"
}
}
}
}Run this in your terminal
claude mcp add polar-flow --env DATABASE_URL=your-value --env POLAR_CLIENT_ID=your-value --env POLAR_CLIENT_SECRET=your-value --env BASE_URL=your-value -- docker run -i --rm -e DATABASE_URL -e POLAR_CLIENT_ID -e POLAR_CLIENT_SECRET -e BASE_URL docker.io/stumason/polar-flow-server:1.6.2Fill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"polar-flow": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URL",
"-e",
"POLAR_CLIENT_ID",
"-e",
"POLAR_CLIENT_SECRET",
"-e",
"BASE_URL",
"docker.io/stumason/polar-flow-server:1.6.2"
],
"env": {
"DATABASE_URL": "your-value",
"POLAR_CLIENT_ID": "your-value",
"POLAR_CLIENT_SECRET": "your-value",
"BASE_URL": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"polar-flow": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URL",
"-e",
"POLAR_CLIENT_ID",
"-e",
"POLAR_CLIENT_SECRET",
"-e",
"BASE_URL",
"docker.io/stumason/polar-flow-server:1.6.2"
],
"env": {
"DATABASE_URL": "your-value",
"POLAR_CLIENT_ID": "your-value",
"POLAR_CLIENT_SECRET": "your-value",
"BASE_URL": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
BASE_URL envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account StuMason, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: DATABASE_URL, POLAR_CLIENT_ID, POLAR_CLIENT_SECRET
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (1.6.2) reached the registry 19 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Docker on your computer.
In the same category: Mirobody, FHIR MCP Server, Google Health MCP
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Lab results to LOINC codes and UCUM units, symptoms and diagnoses to ICPC-3. Offline, no API key.
MCP server providing seamless access to FHIR APIs for AI tools and healthcare applications
Privacy-first unofficial Google Health API v4 MCP server for health, sleep, activity, HR agents
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
Self-hosted health analytics for Polar devices — own your data, analyze it against your own baselines, and let your AI assistant read it.
[Full Documentation](https://stumason.github.io/polar-flow-server/) · MCP Server · Integration Guide · API Reference
Your watch knows more about you than you do — and Polar's API only lets you see the last 28-30 days of it. This server syncs everything, keeps it forever, and turns it into answers:
A built-in Model Context Protocol server — protocol revision 2026-07-28, streamable HTTP — runs inside the main server at /mcp. Ten curated tools cover the one-shot health assessment, sleep, recovery, activity, workouts, seven biosensing streams, personal baselines, patterns/anomalies, and sync control.
In clients that render MCP Apps (claude.ai, Claude Desktop, VS Code), asking "how am I doing?" draws an actual card in the conversation:
Connecting is a sign-in, not a paste. With BASE_URL set, the server is its own OAuth 2.1 authorization server: add https://your-server/mcp as a custom connector in Claude Desktop or claude.ai, click Connect, log in on *your* server, approve the consent screen. Tokens are user-scoped, expire hourly, refresh automatically, and every connected app is revocable from Settings. API keys still work for headless clients:
claude mcp add polar-health https://your-server.example.com/mcp \
--transport http \ --header "X-API-Key: pfk_your_key_here"
Full setup in the MCP docs.
Polar API → polar-flow SDK → Sync Service → PostgreSQL
↓ Admin Dashboard (HTMX) ↓ REST API
Stack:
Don't fancy running a server? A hosted version is in the works — join the waitlist. Self-hosting stays free forever.
# Pull and run
curl -O https://raw.githubusercontent.com/StuMason/polar-flow-server/main/docker-compose.prod.yml docker-compose -f docker-compose.prod.yml up -d
git clone https://github.com/StuMason/polar-flow-server.git
cd polar-flow-server docker-compose up -d
http://localhost:8000/admin/oauth/callback)The server syncs data every hour automatically.
The admin panel at /admin/dashboard is organised into tabs (with a floating tab bar on mobile):
Charts have a selectable 7/14/30-day range and CSV export. API keys are managed from the settings page, with rate limit tracking. All frontend assets are vendored - the dashboard works offline and on a LAN with no CDNs.
| Endpoint | Data |
|---|---|
| Sleep | Score, stages (light/deep/REM), duration |
| Nightly Recharge | HRV, ANS charge, recovery status |
| Daily Activity | Steps, distance, calories, active time |
| Exercises | Sport, duration, HR zones, training load |
| Cardio Load | Strain, tolerance, load ratio, status |
| SleepWise Alertness | Hourly alertness predictions |
| SleepWise Bedtime | Optimal sleep timing recommendations |
| Activity Samples | Minute-by-minute step data |
| Continuous HR | All-day heart rate (5-min intervals) |
| SpO2 | Blood oxygen tests (compatible devices) |
| ECG | Electrocardiogram tests (compatible devices) |
| Body Temperature | Continuous body temperature |
| Skin Temperature | Nightly skin temperature with baseline deviation |
| Variable | Description | Required |
|---|---|---|
DATABASE_URL | PostgreSQL connection string | Yes |
ENCRYPTION_KEY | 32-byte Fernet key for token encryption | Yes (production) |
Generate an encryption key:
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
| Variable | Description | Default |
|---|---|---|
DEPLOYMENT_MODE | self_hosted or saas | self_hosted |
SYNC_INTERVAL_HOURS | Auto-sync frequency | 1 |
SYNC_ON_STARTUP | Sync when server starts | false |
SYNC_DAYS_LOOKBACK | Days of history to sync | 28 |
LOG_LEVEL | Logging verbosity | INFO |
API_KEY | Master API key (bypasses rate limits) | None |
API endpoints require authentication. Health data should never be publicly accessible.
API_KEY env var for full access (bypasses rate limits)# With per-user API key (includes rate limit headers)
curl -H "X-API-Key: pfk_your_api_key_here" \ http://localhost:8000/api/v1/users/{user_id}/sleep?days=7
API_KEY env var) bypasses rate limitingFor applications that need to integrate with polar-flow-server (e.g., Laravel, mobile apps, web frontends).
This allows any Polar user to connect their account to your application.
┌─────────────────┐ ┌─────────────────────┐ ┌─────────────────┐
│ Your App │────▶│ polar-flow-server │────▶│ Polar Flow │ │ (Laravel etc) │ │ │ │ (OAuth) │ │ │◀────│ │◀────│ │ └─────────────────┘ └─────────────────────┘ └─────────────────┘
Step 1: Redirect user to start OAuth
GET /oauth/start?callback_url=https://yourapp.com/callback&client_id=your-app-name
| Parameter | Required | Description |
|---|---|---|
callback_url | Yes | Where to redirect after OAuth (your app's callback endpoint) |
client_id | No | Identifier for your app (validated during exchange) |
Step 2: User authorizes on Polar
User is redirected to Polar, logs in with their credentials, and authorizes your app.
Step 3: User redirected to your callback
https://yourapp.com/callback?code=TEMP_CODE_HERE
Step 4: Exchange temp code for API key (server-to-server)
POST /oauth/exchange
Content-Type: application/json
{ "code": "TEMP_CODE_HERE", "client_id": "your-app-name" }
Response:
{
"api_key": "pfk_abc123...", "polar_user_id": "12345678", "expires_at": null }
Step 5: Store and use the API key
Store api_key and polar_user_id for this user. Use the API key for all data requests:
curl -H "X-API-Key: pfk_abc123..." \
"https://your-polar-server.com/api/v1/users/12345678/sleep?days=7"
In admin.polaraccesslink.com, set your app's redirect URI to:
https://your-polar-server.com/oauth/callback
# Get key info
GET /api/v1/users/{user_id}/api-key/info X-API-Key: pfk_...
POST /api/v1/users/{user_id}/api-key/regenerate X-API-Key: pfk_...
POST /api/v1/users/{user_id}/api-key/revoke X-API-Key: pfk_...
# Health check (no auth required)
curl http://localhost:8000/health
curl -H "X-API-Key: pfk_..." \ "http://localhost:8000/api/v1/users/{user_id}/sleep?days=7"
curl -H "X-API-Key: pfk_..." \ "http://localhost:8000/api/v1/users/{user_id}/activity?days=7"
curl -H "X-API-Key: pfk_..." \ "http://localhost:8000/api/v1/users/{user_id}/recharge?days=7"
curl -H "X-API-Key: pfk_..." \ "http://localhost:8000/api/v1/users/{user_id}/exercises?days=30"
curl -H "X-API-Key: pfk_..." \ "http://localhost:8000/api/v1/users/{user_id}/export/summary?days=30"
# Install dependencies
uv sync --all-extras
docker-compose up -d postgres
uv run uvicorn polar_flow_server.app:app --reload
uv run pytest
uv run mypy src/polar_flow_server
uv run ruff check src/
Deploy anywhere that runs Docker:
# Download and run
curl -O https://raw.githubusercontent.com/StuMason/polar-flow-server/main/docker-compose.prod.yml docker-compose -f docker-compose.prod.yml up -d
Coolify, Railway, Render, etc. - Point at the GitHub repo, it builds from the Dockerfile.
Required for production:
ENCRYPTION_KEY environment variable (tokens won't persist across restarts otherwise)DATABASE_URL to your PostgreSQL instanceDatabase migrations run automatically on startup.
The server supports multiple users out of the box:
user_id columnuser_idOnly the beginning is shown; read the rest in the repo