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 ServerShow 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)
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It transparently notes that it returns a limited subset (status, headers_subset, body_preview) and accepts path format variations. However, it does not disclose whether any authentication is required, potential side effects (though it's a GET), rate limits, or how headers are subset. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: opening with the core purpose and return shape, followed by a clear parameter list. Every sentence earns its place, and the formatting enhances readability. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity debug tool, the description is largely complete. It covers the action, return format, and parameter formats. The existence of an output schema reduces the need to explain returns, but the description still previews the return shape. It could mention what headers_subset includes or typical usage scenarios, but given the tool's simplicity, it is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It adds path format details ('/v1/...' or 'v1/...') and notes query is a dict of strings, optional. However, it does not explain what the query parameter is used for (e.g., appended to URL) or provide examples. The added value over the schema is moderate but incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool makes a GET request and returns a structured response with status, headers subset, and body preview. This specific verb and resource distinguish it from sibling tools that are user/data query tools. The 'low-level debugging helper' positioning further differentiates its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'low-level debugging helper' implies a use case for raw HTTP inspection, which is useful context. However, the description does not explicitly state when to use this tool over sibling high-level getters, nor does it mention exclusions or alternatives. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| user_id | Yes | ||
| end_date | No | ||
| start_date | No | ||
| last_timestamp | No | ||
| end_timestamp_ms | No | ||
| start_timestamp_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses optional filtering, pagination via cursor, and the return shape. However, it does not mention ordering, authentication needs, rate limits, or potential side effects, leaving some behavioral transparency gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line summary, a bulleted parameter list, and a returns line. Every sentence provides value and does not repeat the schema verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides core invocation details (user_id, filters, pagination) and return fields, making it largely complete. However, the missing last_timestamp parameter and lack of usage alternatives leave gaps for a tool with 8 parameters and no schema descriptions, so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning beyond the schema for most parameters, explaining date/timestamp filter formats, cursor as pagination, and limit default. However, it completely omits the last_timestamp parameter that exists in the schema, and it does not clarify whether date and timestamp filters can be combined, leaving some semantic ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get activities for a user with optional date/timestamp filtering.' This gives a specific verb, resource, and scope, and distinguishes it from sibling tools like get_sleep, get_scores, and get_biometrics, which target different data types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a user's activities, but it does not provide explicit when-to-use guidance, exclusions, or alternatives among the sibling tools. There is no mention of when to prefer this over get_biometrics or other get_* tools, so guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| user_id | Yes | ||
| end_date | No | ||
| start_date | No | ||
| last_timestamp | No | ||
| end_timestamp_ms | No | ||
| start_timestamp_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses pagination behavior via the 'cursor' parameter and return fields (next_cursor, has_more, next_url), and it specifies optional filtering with date/timestamp. However, it does not mention authentication requirements, rate limits, or behavior on invalid inputs, leaving some gaps in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct and well-structured: a one-sentence purpose followed by a bulleted parameter list and a clear return format. Every line provides essential information without redundancy or padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 8 parameters and no annotations, the description provides a complete picture of the request and response shape. It includes pagination, optional filters, and the exact return object. Minor gaps exist, such as interaction between date and timestamp filters or any maximum limit, but overall it is thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must compensate. It does so by listing all parameters with types, requiredness, defaults, and date format (YYYY-MM-DD). This adds meaningful context beyond the bare schema, such as limit default 50 and optional cursor for pagination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Get biometrics for a user') with an optional scope of date/timestamp filtering. This distinguishes it from sibling tools like get_sleep or get_scores, which target different data types. The verb 'get' plus the resource 'biometrics' is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when biometrics are needed but does not explicitly contrast with alternatives or provide when-not conditions. For example, it does not say to use a sibling tool for sleep or scores. The context is clear from the tool name, but explicit guidance for choice among siblings is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| user_id | Yes | ||
| granularity | No | day |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses useful behavioral nuances such as the timezone-dependent default date (SENSR_TZ or America/Chicago) and default granularity, and notes the return type. However, it does not cover potential error cases, rate limits, or data availability, leaving some opacity for a getter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise and well-structured. It opens with a clear one-line purpose, follows with a bulleted parameter list, and ends with a return note. Every sentence provides actionable information without filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with one required parameter, the description covers purpose, parameters, defaults, and return. Since an output schema exists, missing detailed return formatting is acceptable. The only minor gap is lack of mention of error conditions or data history limits, but this is not critical for a routine getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides minimal descriptions (0% coverage), but the description compensates fully by explaining each parameter, including type, requiredness, the date format (YYYY-MM-DD), the timezone for the default, and the allowed enum values for granularity (day|week|month|year). This is essential added meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'Get calorie details for a user', which is a specific verb+resource. This distinguishes it from sibling tools like get_sleep, get_scores, and get_activities that target different metrics, so an agent can unambiguously select it for calorie data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool instead of alternatives. The description only lists parameters and return type, with no mention of exclusions, prerequisites, or comparisons to sibling tools, leaving the agent without directional context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| days | No | ||
| end_date | No | ||
| max_users | No | ||
| start_date | No | ||
| concurrency | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility. It discloses the return structure ('Returns: {range, users:[...], summary, errors}') and mentions the 'errors' field, which is valuable. It also documents default values for max_users and concurrency. However, it doesn't explicitly state whether this is a read-only operation or describe side effects, but the nature of the tool is inherently non-destructive, and the provided return shape adds transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-line summary, followed by a compact parameter list and return shape. Every sentence adds value; the parameter details are necessary given the sparse schema. It is slightly longer than a minimal description but avoids redundancy and is front-loaded with the key purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk summary tool with 6 optional parameters and no output schema provided in the prompt, the description adequately covers the necessary context: date selection rules, defaults, and return format. It lacks edge-case behavior or response size warnings, but the included 'errors' field and user list structure make it sufficiently complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is crucial. It explains each parameter with types, optionality, defaults, and constraints (e.g., 'days (int>=1)'), and highlights the mutual exclusivity of date parameters—information absent from the schema. It does not deeply explain concurrency semantics, but the name and default provide some context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Bulk: scores summary across users in the org.' The verb 'get' combined with 'scores summary across users' specifies both the action and the resource scope. It also distinguishes from siblings like get_scores (likely single-user) and get_org_sleep_summary (sleep instead of scores).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly describes mutually exclusive date selection options ('date OR (start_date+end_date) OR days'), providing clear guidance on how to specify the date range. It implies bulk org-level usage against individual tools like get_scores, though it doesn't explicitly name alternatives or state when not to use it. Still, the usage constraints are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| days | No | ||
| end_date | No | ||
| max_users | No | ||
| start_date | No | ||
| concurrency | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It discloses mutually exclusive date modes, defaults, concurrency, and return structure. However, it states 'concurrency (int, default 5)' while the schema default is 3, making the behavioral guidance inaccurate and reducing trust.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line purpose, a clear date-selection rule, a compact parameter list, and a return shape. Every sentence adds value and no content is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (bulk operation, 6 parameters, no annotations), the description covers date selection, limits, concurrency, and output. It does not explain pagination or behavior when max_users is exceeded, but the presence of an output schema and the parameter details make it sufficiently complete for agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates by explaining all six parameters, including date formats, mutual exclusivity, and defaults. It loses a point because the stated concurrency default (5) contradicts the schema default (3), and 'date default today' is not reflected in the schema's null default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Bulk: sleep summary across users in the org,' clearly stating the resource (sleep summary), scope (all users in the org), and bulk nature. This distinguishes it from sibling tools like get_sleep (individual) and get_org_scores_summary (scores, not sleep).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Bulk' prefix and 'across users in the org' provide clear context for org-level aggregation, implicitly contrasting with per-user tools. However, it does not explicitly name alternatives or give when-not-to-use guidance, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| days | No | ||
| user_id | Yes | ||
| end_date | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses date input behavior, defaults (today in SENSR_TZ or America/Chicago), inclusive ranges, and the return structure. It does not mention error handling or auth, but 'get' clearly implies a safe read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: a one-line purpose, a bulleted list of input options, and a return shape summary. Every sentence earns its place, with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the description covers parameter semantics, defaults, and return format, the tool is fully specified for invocation. It lacks minor edge-case details but is complete for its purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates thoroughly by explaining the date parameters (format, defaults, exclusivity, inclusive range, days >=1). It also implies user_id via 'for a user.' No parameter is left ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get scores for a user' with a specific verb and resource, and the user-level scope distinguishes it from the sibling get_org_scores_summary. It is immediately obvious what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by detailing accepted date input modes and their mutual exclusivity, and the 'for a user' phrasing implies user-level usage distinct from org summaries. It does not name explicit alternatives or exclusions, but the context is strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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}
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| days | No | ||
| user_id | Yes | ||
| end_date | No | ||
| start_date | No | ||
| summary_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors: the default timezone (SENSR_TZ or America/Chicago), mutual exclusivity of date inputs, inclusive date ranges, and the effect of summary_only. It stops short of error handling or rate limits, but covers the core behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the purpose, and structured with bullet-like lines for date inputs and other params. Every line adds value; no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all six parameters, explains return structure, and captures the main behavioral nuances. It lacks edge-case details like max days or timezone definition, but given the output schema exists and the tool's moderate complexity, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description is the only source of parameter meaning. It explains date, start_date/end_date, days, and summary_only with formats, defaults, and constraints. This fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Get sleep for a user', which is a specific verb+resource with clear scope. It distinguishes from the sibling 'get_org_sleep_summary' by explicitly targeting a single user, and from other get_* tools by focusing on sleep data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on how to invoke the tool: three mutually exclusive date input modes, defaults, and the summary_only flag. It does not mention when to prefer this over alternatives like get_org_sleep_summary, but the usage patterns are well-specified enough for an agent to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_by_emailA
Find a user by email (exact match preferred).
Params:
email (str, required)
Returns: {data: user|null} or {error:...}
| Name | Required | Description | Default |
|---|---|---|---|
| Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full transparency burden. It discloses the return shape ({data: user|null} or {error:...}) but does not address permissions, case sensitivity, or side effects. Adequate for a simple read-only lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and well-structured: a one-line purpose followed by a param block and a return block. Every sentence adds value with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter lookup tool, the description covers purpose, parameter meaning, and return format. It is complete enough, but the output schema already covers return values, and the description misses explicit boundaries or edge cases. Overall sufficient for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only provides type and required status, while the description adds the 'exact match preferred' semantic for email. This compensates for the 0% schema description coverage, though it lacks details like case-insensitivity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb 'Find' + object 'user' + method 'by email (exact match preferred)' distinguishes it from broader siblings like search_user and list_users. 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like search_user or list_users. The 'exact match preferred' hint implies a use case but does not state exclusions or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_idsB
Get all organization user IDs. Returns /v1/organizations/users/ids
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the operation is 'Get all' but does not explicitly disclose read-only nature, authentication requirements, pagination behavior, or any side effects. The endpoint reference adds little behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, with the primary purpose front-loaded in the first sentence. The second sentence about the endpoint is of marginal value and could be considered slightly unnecessary, but it does not significantly detract from the overall conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters and an output schema, the description is minimally viable. It states what it does, but it lacks context on when to use it relative to sibling tools and does not provide any behavioral details beyond the basic get operation. Given the simplicity of the tool, the description is adequate but leaves room for improvement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description is not required to explain parameter semantics. Schema coverage is effectively 100% due to the empty parameter set, and the description adds no unnecessary parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get all organization user IDs.' It uses a specific verb+resource combination and distinguishes itself from sibling tools like list_users by focusing specifically on IDs rather than full user objects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as list_users or get_user_by_email. It does not mention scenarios where ID-only retrieval is preferred, nor does it exclude other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:...}
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the return shape including null and error cases, but does not mention authentication, permissions, or rate limits. Some behavioral context is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: a clear one-sentence purpose, a compact param list, and a return format. Every element serves a purpose and it is front-loaded with the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, output schema present), the description adequately covers purpose, parameter, and return format. It omits usage context among siblings but that is not critical for a straightforward getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates by listing the required user_id with type and a brief description. While minimal, it does clarify the parameter's purpose beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get a specific user's full profile by user ID', identifying the action, target, and lookup method. This distinguishes it from siblings like get_user_by_email or search_user.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: if you have a user ID, use this tool. However, there is no explicit guidance about when to prefer it over alternative lookup methods or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| search | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses pagination defaults (page=1, limit=100) and that search is a substring query, which adds some behavioral context. However, it does not mention whether pagination is complete, maximum limits, sorting order, or rate limiting. The return type is stated as a Sensr API response but with no details on structure (though output schema exists).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: a one-line purpose, a bullet list of parameters with types and defaults, and a return note. Every sentence earns its place; no fluff or redundancy. Front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple list endpoint with 3 optional parameters and an output schema, so repetitive return-structure explanation is unnecessary. The description covers the basics, but lacks guidance on pagination behavior (e.g., if all pages must be fetched or if limit is capped) and when to use this versus specific lookup tools. Given the simplicity, this is mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no property descriptions (0% coverage), so the description must and does add meaning. It explains 'search' as a substring query, which is not apparent from the schema. For page and limit, it only lists names/defaults that the schema already provides, but the description at least consolidates the intent. It adds genuine value for the search parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List organization users.', a specific verb+resource. It distinguishes from sibling tools like get_user_by_email or search_user, which target specific users. Scope is explicitly 'organization users'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and parameters: it lists users (potentially paginated). However, no explicit guidance is given about when to prefer this over search_user, get_user_by_email, or get_user_profile. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It mentions the return type ('Sensr /v1/organizations/users response') and pagination params, but fails to state that this is a read-only operation, whether it requires specific permissions, or details about matching semantics (e.g., case insensitivity, partial match). This is a significant gap for a tool with no annotation safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured with a one-line purpose, a bulleted parameter list, and a return statement. Every sentence adds value, and the format is scannable and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool, the description is adequate: it covers query and pagination, and references a known response structure. However, with sibling tools like get_user_by_email and list_users, it would be more complete if it clarified the distinction (e.g., 'Use this when you don't have an exact email'). The presence of an output schema reduces the need for return-value detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description's parameter list provides essential meaning. It clarifies query is required and free-text, and gives defaults for page and limit. This compensates well for the schema's lack of descriptions, though it could elaborate on query formatting or pagination behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for users via free-text query on name/email, which is a specific and actionable purpose. It implicitly distinguishes from siblings like list_users (which likely lists all users) and get_user_by_email (which might be exact match), but does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied through 'free-text query'—the tool is for when you need to search by partial name or email. However, there is no explicit guidance on when NOT to use it or which sibling tools are better suited for exact email lookup or listing all users.
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.
13 tool updates
v0.2.0- First observed
debug_request - First observed
get_activities - First observed
get_biometrics - First observed
get_calories - First observed
get_org_scores_summary - First observed
get_org_sleep_summary - First observed
get_scores - First observed
get_sleep - First observed
get_user_by_email - First observed
get_user_ids - First observed
get_user_profile - First observed
list_users - First observed
search_user
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.
- freddyOAuthcoach.freddy
Connect your wearables, rings and training apps, then ask your AI about your own health data.
Collect Apple Health data from your wearables through the Context app and query it via MCP
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
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.681 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to access and analyze health metrics from Runalyze, including HRV, sleep, resting heart rate, and activities, through the Model Context Protocol.9-
- FlicenseAqualityDmaintenanceExposes 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.7-
- AlicenseAqualityDmaintenanceConnects AI assistants to health data via the Biological Sovereignty Protocol, with cryptographically verified user consent enforced on-chain.1310 npmApache 2.0