Sensor Bio MCP Server
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Sensor Bio MCP Server Show me my sleep data from the past week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Sensor Bio MCP Server
Connect your Sensor Bio wearable data to Claude, ChatGPT, and other AI assistants using the Model Context Protocol (MCP).
Ask your AI assistant things like "How did I sleep last week?", "What's my resting heart rate trend?", or "Show me my recovery scores for the past month" and get answers pulled directly from your Sensor Bio data.
Quick Start
1. Get your API token
Log in to your Sensor Bio developer portal and grab your Organization API Token.
2. Install uv
This server uses uv to run. Install it with one command:
Mac / Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"3. Add to Claude Desktop
Open your Claude Desktop config file:
OS | Path |
macOS |
|
Windows |
|
Linux |
|
Add (or merge into) the mcpServers section:
{
"mcpServers": {
"sensorbio": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/GetSensr-io/sensorbio-mcp-server",
"sensorbio-mcp-server"
],
"env": {
"SENSR_ORG_TOKEN": "paste-your-token-here"
}
}
}
}4. Restart Claude Desktop
Quit and reopen Claude Desktop. You should see "sensorbio" in the MCP tools list (look for the hammer icon).
5. Try it out
Ask Claude something like:
"Show me my sleep data from the past week"
"How many calories did I burn yesterday?"
"List all users in my organization"
Related MCP server: runalyze-mcp-server
Other MCP Clients
Cursor / Windsurf
These editors support MCP servers natively. Use the same config format above in their respective MCP settings.
OpenAI (ChatGPT)
MCP support in ChatGPT is rolling out. When available, the same server and config pattern will work.
Any MCP Client
Any application that supports the Model Context Protocol can connect using this server. Just point it at:
uvx --from git+https://github.com/GetSensr-io/sensorbio-mcp-server sensorbio-mcp-serverAuthentication
Method | Env Vars | Best For |
API Token |
| Most users (recommended) |
OAuth2 |
| Programmatic / advanced use |
The server checks for SENSR_ORG_TOKEN first, then SENSR_API_KEY as a fallback. If neither is set, it tries OAuth2 client credentials.
OAuth2 Config (advanced)
{
"mcpServers": {
"sensorbio": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/GetSensr-io/sensorbio-mcp-server",
"sensorbio-mcp-server"
],
"env": {
"SENSR_CLIENT_ID": "your-client-id",
"SENSR_CLIENT_SECRET": "your-client-secret"
}
}
}
}What You Can Ask
Once connected, your AI assistant has access to these tools:
Tool | What it does | Example question |
list_users | List all users in your organization | "Show me all users" |
get_user_ids | Get all user IDs | "How many users are in the org?" |
get_user_by_email | Find a user by their email address | "Look up john@example.com" |
get_user_profile | Get a specific user's full profile | "Show me Bryan's profile" |
search_user | Search users by name or email | "Find users named Sarah" |
get_sleep | Sleep data: duration, score, stages | "How did I sleep last week?" |
get_scores | Recovery, sleep, and activity scores | "What's my recovery score today?" |
get_activities | Workouts and activity sessions | "What workouts did I do this week?" |
get_biometrics | Heart rate, HRV, SpO2, respiratory rate | "What's my resting heart rate?" |
get_calories | Calorie burn details | "How many calories did I burn today?" |
get_org_sleep_summary | Sleep overview across your whole org | "How did the team sleep last night?" |
get_org_scores_summary | Score overview across your whole org | "Show me the team's recovery scores" |
debug_request | Raw API request (for troubleshooting) | Usually not needed directly |
Most tools support flexible date ranges. You can say things like "last 7 days", "March 1st to March 10th", or "yesterday" and the AI will figure out the right parameters.
Environment Variables
Variable | Required | Description |
| * | Organization API token (recommended) |
| * | Alias for |
| ** | OAuth2 client ID |
| ** | OAuth2 client secret |
| OAuth2 scope (optional) | |
| Override API base URL (default: | |
| Timezone for "today" calculations (default: |
* Set one of SENSR_ORG_TOKEN or SENSR_API_KEY for token auth.
** Set both for OAuth2 auth. Token auth takes precedence if both are configured.
Troubleshooting
"Server not connecting"
Make sure
uvis installed: runuv --versionin your terminalCheck that your config file path is correct (see table above)
Make sure you restarted Claude Desktop after editing the config
"Authentication error" or "Invalid API Key"
Double-check your token. Copy it fresh from the developer portal.
Make sure there are no extra spaces or line breaks in the token
Tokens can expire. Generate a new one if yours is old.
"No data showing"
Your Sensor Bio device needs to have synced recently
Check that the user ID exists in your organization
Try asking for a specific date: "Show my sleep for March 10th"
"Tool not found"
Make sure the MCP server name in your config is exactly
sensorbioCheck Claude Desktop's MCP tools list for connection status
Development
Want to contribute or run locally?
# Clone the repo
git clone https://github.com/GetSensr-io/sensorbio-mcp-server.git
cd sensorbio-mcp-server
# Install dependencies
uv sync --dev
# Run tests
uv run pytest -v
# Lint
uv run ruff check .
# Run the server locally
SENSR_ORG_TOKEN=your-token uvx --from . sensorbio-mcp-server
# Smoke test (needs a valid token)
SENSR_ORG_TOKEN=your-token uv run python scripts/smoke_test.pyLicense
MIT
Available Tools
13 toolsdebug_requestA
Low-level debugging helper: make a GET request and return {status, headers_subset, body_preview}.
Params:
path (str, required): may be '/v1/...' or 'v1/...'
query (dict[str,str], optional)
Inputs: path (required), query. Returns: object
get_activitiesA
Get activities for a user with optional date/timestamp filtering.
Params:
user_id (str, required)
start_date/end_date (YYYY-MM-DD, optional): filter by activity timestamp
start_timestamp_ms/end_timestamp_ms (int, optional): filter by ms since epoch
cursor (str, optional): pagination cursor
limit (int, default 50)
Returns: {data, next_cursor, has_more, next_url}
Inputs: user_id (required), limit, cursor, end_date, +4 more. Returns: object
get_biometricsA
Get biometrics for a user with optional date/timestamp filtering.
Params:
user_id (str, required)
start_date/end_date (YYYY-MM-DD, optional)
start_timestamp_ms/end_timestamp_ms (int, optional)
cursor (str, optional)
limit (int, default 50)
Returns: {data, next_cursor, has_more, next_url}
Inputs: user_id (required), limit, cursor, end_date, +4 more. Returns: object
get_caloriesA
Get calorie details for a user.
Params:
user_id (str, required)
date (YYYY-MM-DD, optional; default: today in SENSR_TZ or America/Chicago)
granularity (enum str, optional; default 'day'): day|week|month|year
Returns: Sensr /v1/calorie/details response
Inputs: user_id (required), date, granularity. Returns: object
get_org_scores_summaryA
Bulk: scores summary across users in the org.
Date selection (mutually exclusive): date OR (start_date+end_date) OR days. Params:
date (YYYY-MM-DD, optional; default today)
start_date/end_date (YYYY-MM-DD, optional)
days (int>=1, optional)
max_users (int, default 50)
concurrency (int, default 5)
Returns: {range, users:[{user_id,days:[{date,data}],summary}], errors}
Inputs: date, days, end_date, max_users, +2 more. Returns: object
get_org_sleep_summaryA
Bulk: sleep summary across users in the org.
Date selection (mutually exclusive): date OR (start_date+end_date) OR days. Params:
date (YYYY-MM-DD, optional; default today)
start_date/end_date (YYYY-MM-DD, optional)
days (int>=1, optional)
max_users (int, default 50)
concurrency (int, default 5)
Returns: {range, users:[{user_id,days:[{date,data}],summary}], errors}
Inputs: date, days, end_date, max_users, +2 more. Returns: object
get_scoresA
Get scores for a user.
Accepted date inputs (mutually exclusive):
date (YYYY-MM-DD, optional; default: today in SENSR_TZ or America/Chicago)
OR start_date/end_date (YYYY-MM-DD, inclusive)
OR days (int >=1): last N days ending today
Returns: {range, results:[{date,data}], summary}
Inputs: user_id (required), date, days, end_date, +1 more. Returns: object
get_sleepA
Get sleep for a user.
Accepted date inputs (mutually exclusive):
date (YYYY-MM-DD, optional; default: today in SENSR_TZ or America/Chicago)
OR start_date/end_date (YYYY-MM-DD, inclusive)
OR days (int >=1): last N days ending today
Other params:
summary_only (bool, default true): if true, strips verbose time-series
Returns: {range, results:[{date,data}], summary}
Inputs: user_id (required), date, days, end_date, +2 more. Returns: object
get_user_by_emailA
Find a user by email (exact match preferred).
Params:
email (str, required)
Returns: {data: user|null} or {error:...}
Inputs: email (required). Returns: object
get_user_idsB
Get all organization user IDs. Returns /v1/organizations/users/ids
Inputs: no named parameters. Returns: object
get_user_profileA
Get a specific user's full profile by user ID.
Params:
user_id (str, required): the user's ID
Returns: {data: user|null} or {error:...}
Inputs: user_id (required). Returns: object
list_usersA
List organization users.
Params:
page (int, default 1)
limit (int, default 100)
search (str, optional): substring query
Returns: Sensr /v1/organizations/users response
Inputs: page, limit, search. Returns: object
search_userB
Search for users by a free-text query (name/email).
Params:
query (str, required)
page (int, default 1)
limit (int, default 50)
Returns: Sensr /v1/organizations/users response
Inputs: query (required), page, limit. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 13 tools
Each tool targets a distinct resource or action: user lookups by email, ID, or query; sleep, scores, biometrics, activities, calories are separate data types; bulk summaries are distinct; debug_request is a utility. No overlapping purposes.
All tools follow snake_case with a consistent verb_noun pattern: get_*, list_*, search_*, debug_*. No mixing of camelCase or inconsistent verb styles.
13 tools is well within the ideal 3-15 range for a focused sensor bio API. Each tool serves a clear purpose without being excessive or insufficient.
The tool surface covers user management (lookup, search, list) and key health data (sleep, scores, biometrics, activities, calories) both individually and in bulk for sleep and scores. Minor omission: no bulk versions for biometrics, activities, or calories, but core workflows are complete.
Maintenance
Related MCP Connectors
Connect your health, fitness, nutrition, sleep, and wearable data to your AI assistant.
Connect your wearables, rings and training apps, then ask your AI about your own health data.
N-of-1 health experiments in your AI assistant: Oura/RescueTime data, protocols, workouts.
Your Garmin, Oura, WHOOP, Hevy and 35 more fitness apps, queryable from your own AI.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides access to Oura Ring health data, including sleep, activity, readiness, and stress metrics via the Model Context Protocol. It enables users to query their personal biometric information and daily health summaries through natural language in MCP-compatible clients.2,203 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to access and analyze health metrics from Runalyze, including HRV, sleep, resting heart rate, and activities, through the Model Context Protocol.9MIT
- AlicenseAqualityDmaintenanceExposes real-time health data from the Ultrahuman Ring to AI agents via the Model Context Protocol, providing optimized summaries with trend analysis and actionable insights.7MIT
- AlicenseAqualityDmaintenanceConnects AI assistants to health data via the Biological Sovereignty Protocol, with cryptographically verified user consent enforced on-chain.138 npmApache 2.0