COLMI Smart Ring MCP Server
Enables interaction with COLMI smart rings over Bluetooth Low Energy, providing tools for scanning rings, reading battery and device status, syncing time, blinking LEDs, retrieving daily activity, sleep and recovery metrics, real-time heart rate/SpO2, and raw 3-axis accelerometer motion data.
Click 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., "@COLMI Smart Ring MCP Servercheck my ring's battery and blink the LED if it's under 20%"
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.
COLMI Smart Ring Toolkit & Cross-Platform MCP Server
The definitive open-source toolkit, reverse-engineered Bluetooth Low Energy (BLE) protocol specification, and Model Context Protocol (MCP) server for COLMI R02, COLMI R03, and compatible smart rings. Connect physical health rings directly to AI agents (Claude Desktop, Cursor, Antigravity, VS Code) without vendor clouds, accounts, or subscriptions.
๐ Search Keywords & Supported Hardware
Supported Devices:
COLMI R02 & COLMI R03 Smart Rings
COLMI R01, R04, R05, R06, R07, R08, R10 family
QRing OEM Variants: KSIX Ring, boAt Ring, Blaupunkt, VK-5098, MERLIN, Hello Ring, RING1, TR-R02, OneRing, BOK.
SoC Families: BlueX Micro RF03 / RF03-01 (ARM Cortex-M0) & Realtek RTL8762E / RTL8762ESF (ARM Cortex-M4F, RT02R revision).
Comparative Ecosystem:
Oura Ring (Gen 2, Gen 3, Ring 4)
Ultrahuman Ring AIR
RingConn (Gen 1 & Gen 2)
Samsung Galaxy Ring
Tags & Topic Index:
colmi, colmi-r02, colmi-r03, smart-ring, oura-alternative, mcp-server, model-context-protocol, claude-desktop, cursor-ai, antigravity, bluetooth-le, ble, qring, reverse-engineering, local-first, biometrics, heart-rate-variability, hrv, sleep-staging, hypnogram, accelerometer, firmware.
Related MCP server: oura-ring-mcp
๐ Is it Cross-Platform?
YES, 100% Cross-Platform!
The toolkit and MCP server run natively on Linux, macOS, and Windows 10/11:
Cross-Platform Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ colmi-smart-ring MCP Server โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ bleak Cross-Platform Engine โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โผ โผ โผ
โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ
โ Linux โ โ macOS โ โ Windows โ
โโโโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโโโค
โ โข BlueZ DBus โ โ โข Native Core โ โ โข Windows. โ
โ โข Systemd / โ โ Bluetooth โ โ Devices. โ
โ Raspberry Piโ โ โข Apple Silicon/โ โ Bluetooth โ
โ โข dbus-fast โ โ Intel Mac โ โ (WinRT BLE) โ
โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโBluetooth Layer (
bleak): Automatically selects the native OS Bluetooth subsystem:Linux: Speaks directly to the Linux BlueZ daemon via asynchronous DBus sockets.
macOS: Communicates through Apple's native
CoreBluetoothframework on both Apple Silicon (M1/M2/M3/M4) and Intel Macs.Windows: Interfaces with the native
Windows.Devices.BluetoothUniversal Windows Runtime (WinRT) APIs.
MCP Protocol Layer (
mcp 2.x): Operates over standard input/output (stdio), supported identically across all operating systems.No External Cloud Dependencies: Communicates directly from your computer to the ring on your finger over local 2.4 GHz radio.
โก Feature Overview
๐ค Model Context Protocol (MCP) Server: Exposes 8 native tools to AI agents (
scan_rings,get_ring_status,blink_ring,sync_time,get_daily_activity,get_sleep_and_recovery,read_realtime_vitals,get_motion_sample).๐ Device Health & Battery: Real-time battery %, charging state, hardware revision (
RY03_V3.0), firmware version (RY03_3.00.22).๐ก Physical Bidirectional Alerts: Let your AI assistant physically blink the optical LEDs on your ring (
blink_ring) when code finishes compiling or tests pass.๐ค Sleep Staging & Hypnogram: Reads multi-night sleep data (Deep, REM, Light, Awake) via the Big Data channel (
0xBC/ ID0x27).๐ Insight Engine (Recovery Score 0โ100): Computes clinical-grade Recovery Scores, sleep efficiency, and Resting Heart Rate Nadir timing locally.
๐ Step & Activity Telemetry: Daily cumulative steps, estimated calories, and distance.
๐ฎ Raw 3-Axis Accelerometer (12-bit): Stream real-time motion at 25โ350 Hz with pitch, roll, vector magnitude, and tap detection for gesture control or MIDI.
๐ Zero Telemetry / 100% Privacy: No QRing app, no Chinese cloud servers, no account registration.
๐ Quickstart Installation
1. Clone & Install
git clone https://github.com/orviwan/mcp-for-colmi-smartring.git
cd mcp-for-colmi-smartring
# Create virtual environment
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
pip install -e .๐ค Configuring with AI Assistants (Claude Desktop / Cursor)
A. Claude Desktop
Edit your Claude Desktop configuration file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"smart-ring": {
"command": "/path/to/Colmi/.venv/bin/python",
"args": ["/path/to/Colmi/tools/colmi_mcp.py"],
"env": {
"PYTHONPATH": "/path/to/Colmi",
"COLMI_RING_ADDRESS": "31:31:43:30:A9:00"
}
}
}
}(Tip: If you omit COLMI_RING_ADDRESS, the server will automatically scan and bind to whichever ring is closest).
B. Cursor IDE
In Cursor Settings $\rightarrow$ Features $\rightarrow$ MCP Servers (or in .cursor/mcp.json):
{
"mcpServers": {
"smart-ring": {
"command": "/path/to/Colmi/.venv/bin/python",
"args": ["/path/to/Colmi/tools/colmi_mcp.py"],
"env": {
"PYTHONPATH": "/path/to/Colmi"
}
}
}
}๐ ๏ธ MCP Tools Reference (What the AI Can Do)
Tool Name | Parameters | Description |
|
| Scans for nearby rings and returns names, addresses, and RSSI. |
|
| Reads battery percentage, charging state, hardware & firmware revisions. |
|
| Physically pulses green optical sensor LEDs twice (locator or notification chime). |
|
| Synchronizes ring's internal RTC clock with computer's clock. |
|
| Returns cumulative steps, calories (kcal), and distance (m). |
|
| Pulls sleep hypnogram and calculates Recovery Score (0โ100) with sleep stage breakdown. |
|
| Takes an active optical pulse (Heart Rate BPM or SpO2 %). |
|
| Samples 3-axis accelerometer for 2s (X/Y/Z g-forces, pitch, roll, magnitude). |
๐ป Standalone Command-Line Tools
You can also run all tools directly from your terminal:
# 1. Scan for nearby rings
colmi-scanner
# (or: python tools/colmi_scanner.py)
# 2. Query status & battery
colmi-reader --address 31:31:43:30:A9:00 --info --battery --set-time
# 3. Blink finder LED
colmi-reader --address 31:31:43:30:A9:00 --blink
# 4. Stream real-time 3-axis motion & tap detector
colmi-accel --address 31:31:43:30:A9:00
# 5. Record accelerometer samples to CSV for ML/gesture training
colmi-accel --address 31:31:43:30:A9:00 --csv my_gesture.csv
# 6. Run the Biometric Insight & Recovery Scoring Engine (Demo Simulation)
colmi-insights --demo๐ Deep-Dive Documentation Index
Documentation Guide | Contents |
Full architectural specification, JSON-RPC schemas, and Claude/Cursor conversation scenarios. | |
Physiological reference matrix comparing smart ring insights: HRV (RMSSD vs proxy), Resting Heart Rate nadir timing, sleep architecture, sleep apnea (ODI), temperature deviation, and custom recovery scoring formulas. | |
Teardown analysis, physical specifications, SoC variants (BlueX RF03 vs Realtek RTL8762E), sensors (STK8321, VC30F), battery systems, and SWD debug pads. | |
Byte-level wire protocol specification: 16-byte packet framing, checksum calculation, command tables ( | |
Master comparison matrix across COLMI, Oura Ring 3/4, Ultrahuman Ring AIR, RingConn Gen 1/2, and Samsung Galaxy Ring. Details sensor arrays, pricing, subscription models, cloud APIs, and BLE hackability. | |
Survey of GitHub projects, Python/Go/TypeScript tools, Web Bluetooth apps, custom firmware patches (FasterRawValuesMOD, Nosh118 Low-Latency, 352Hz overdrive), and privacy analysis. | |
Biophysical principles of smart ring sensors, AC/DC PPG signal decomposition, optical pulse oximetry, HRV proxy analysis, and debunking fake metrics (blood pressure, blood glucose, ECG). | |
Step-by-step tutorial on connecting to the ring, querying battery, synchronizing time, and streaming real-time heart rate using Python and | |
How to stream raw 12-bit 3-axis motion data, calculate pitch/roll/g-force, detect taps and wave gestures, and map tilt to virtual mice or MIDI controllers. | |
How to ditch the proprietary QRing app and set up a 100% private, self-hosted telemetry pipeline with SQLite, VictoriaMetrics, Home Assistant, and Grafana. |
๐งช Automated Testing
The repository includes a comprehensive pytest test suite with 20 unit tests verifying packet framing, 8-bit checksum algorithms, 12-bit signed accelerometer math, sleep hypnogram decoders, and MCP tool registrations:
PYTHONPATH=. pytest -v tests/๐ Attributions & Prior Art
This project builds directly upon the reverse-engineering breakthroughs, packet logs, and hardware teardowns conducted by the open-source smart ring research community. We gratefully credit the following upstream projects and authors:
Aaron Christophel (@atc1441): Reverse-engineering the BlueX Micro RF03 SoC, STK8321 accelerometer, VC30F optical sensor, SWD pinouts, and creating the
FasterRawValuesMODfirmware patch and Web Bluetooth flasher (atc1441/ATC_RF03_Ring).Wesley Ellis (@tahnok): Developing the foundational Python BLE client, discovering the 16-byte packet structure and 8-bit checksum algorithm (tahnok/colmi_r02_client).
Tony Smith (@smittytone): Discovering and reverse-engineering the Big Data GATT channel (
DE5BF728...) for multi-night sleep hypnograms and 24-hour SpO2 max/min records (smittytone/RingCLI).Puxtril (@Puxtril): Documenting the complete QRing opcode catalog, device settings, and response schemas reverse-engineered from the COLMI R03 (Puxtril/colmi-docs).
Nosh118 (@Nosh118): Discovering the Realtek RTL8762ESF / RT02R hardware revision, QRing DFU OTA transfer protocol, and motion-to-MIDI mapping (Nosh118/colmi-ring-tools).
Robin O'JW (@robinojw): TypeScript implementation, modular BLE adapters, and test fixture references (robinojw/openring).
Cyril Zakka, MD (@cyrilzakka): Native iOS companion app connecting COLMI rings to Apple HealthKit with 100% local privacy (cyrilzakka/Halo-iOS).
CitizenOneX (@CitizenOneX): 12-bit accelerometer two's complement decoding and wave gesture detection (CitizenOneX/colmi_r0x_controller).
Juan Perez (@perezjuanj): Research into RingConn Gen 2 BLE protocol (perezjuanj/OpenCircuit).
See ATTRIBUTIONS.md for full license notices and upstream project details.
๐ License
This project is licensed under the permissive MIT License โ see the LICENSE file for details.
Available Tools
8 toolsblink_ringA
Causes the green optical biosensor LEDs on the smart ring to blink twice. Can be used as a physical locator ('Find my ring') or as a physical notification signal from the AI.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the physical effect (green LEDs blink twice) and intended purposes, but does not state prerequisites such as ring connection, proximity requirements, or whether any permissions are needed.
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?
Two tight sentences, front-loaded with the core action and followed by use cases. No redundant or filler content.
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 physical action tool with an output schema, the description covers the main purpose and usage contexts. However, it omits parameter semantics and operational prerequisites, which are especially important given the absence of annotations and schema descriptions.
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 one optional 'address' parameter with 0% description coverage, so the description must compensate. It never mentions the address parameter or explains what address refers to, leaving its semantics undocumented.
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 states a specific action on a specific resource: causing the green optical biosensor LEDs on the smart ring to blink twice. This distinguishes it from read-oriented siblings such as get_ring_status and scan_rings.
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?
It explicitly gives two usage contexts: physical locator ('Find my ring') and physical notification from the AI. It does not name exclusions or alternative tools, but the intended use cases are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_activityA
Queries the smart ring for step count, estimated calories burned, and distance walked. days_ago: 0 for today, 1 for yesterday, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| days_ago | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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. 'Queries' implies a read-only operation and the metric list implies the payload, but there is no mention of authentication, rate limits, caching, or how historical data availability is bounded on the ring.
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?
Two lines, both load-bearing, with the core capability front-loaded and the only parameter convention on its own line. No filler or restatement of the tool name.
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, zero-required-parameter tool with an output schema already covering return values, the description is nearly sufficient. The one substantive hole is the undocumented address parameter and the absence of any note about how far back data is retained.
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 must compensate. It does explain days_ago (0 = today, 1 = yesterday), adding real meaning beyond the schema's bare default, but the address parameter is left completely undocumented in both schema and description, leaving half the inputs 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?
States a specific verb (Queries) plus the resource (smart ring) and enumerates the exact metrics returned: step count, calories burned, distance walked. This cleanly separates it from siblings like get_sleep_and_recovery, read_realtime_vitals, and get_motion_sample without opening any schema.
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?
There is no guidance on when to prefer this over read_realtime_vitals or get_motion_sample, nor any prerequisites or exclusions. The only usage-ish content is the days_ago convention, which is parameter semantics rather than tool selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_motion_sampleB
Samples the Sensortek STK8321 3-axis accelerometer for 2 seconds. Returns g-force along X, Y, Z, total vector magnitude, pitch, and roll in degrees.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden. It usefully discloses the exact sensor model, the 2-second blocking sample window, and what is returned, but says nothing about permissions, error conditions, or whether the call blocks.
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?
Two tight sentences with no filler, front-loading the operation and then the return payload. Every clause earns its place.
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?
An output schema exists, so return values need not be re-explained, yet the description still adds value by enumerating them. The remaining gap is the undocumented 'address' parameter and the absence of any behavioral caveats, which leaves the definition only minimally 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 single 'address' parameter has 0% schema description coverage and is not mentioned in the description at all. An agent cannot tell whether it is an I2C address, a device selector, or what happens when it is omitted (default null).
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 names a specific verb (samples) and a precise resource (the Sensortek STK8321 3-axis accelerometer), plus the exact data it yields. This clearly distinguishes it from siblings like read_realtime_vitals or get_daily_activity without needing to name them.
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?
There is no guidance on when to call this versus alternatives, nor any mention of prerequisites such as hardware availability or required permissions. The 2-second sampling window is a behavioral fact, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ring_statusA
Connects to the smart ring and queries hardware revision, firmware revision, battery percentage, and current charging status. If address is omitted, automatically finds and connects to the nearest ring.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the auto-discovery/auto-connect behavior when address is omitted, which is genuinely useful, but says nothing about pairing prerequisites, connection side effects, or failure modes if no ring is found.
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?
Two tight sentences with no filler; the queried fields are front-loaded and the address fallback is stated second. Every clause earns its place.
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?
An output schema exists, so return values need not be documented, and the description still usefully enumerates what is queried. For a no-annotation tool the remaining gap is behavioral โ no mention of connection side effects or error handling โ which keeps it from being 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?
Schema coverage is 0%, so the description must compensate for the single address parameter โ and it does, explaining that omitting it triggers nearest-ring discovery and connection. This adds real meaning beyond the bare 'Address' schema field, though the expected address format is not specified.
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?
States specific verbs (connects, queries) and a precise resource (the smart ring) plus the exact data returned: hardware revision, firmware revision, battery percentage, and charging status. It is distinguishable from siblings like get_sleep_and_recovery or get_daily_activity by the status/telemetry framing, though it never names a sibling explicitly.
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 when-to-use or when-not guidance and no named alternatives (e.g., scan_rings to discover an address). The one usage note given โ that omitting address auto-discovers the nearest ring โ is helpful but partial, leaving the agent to infer when this status query is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleep_and_recoveryB
Pulls multi-night sleep hypnograms (Light, Deep, REM, Awake) from the ring's Big Data service and runs the physiological InsightEngine to compute a 0-100 Recovery / Readiness Score.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden, and it does add some real context: data comes from an external 'Big Data service' (implying network latency/caching behavior) and a compute pass via 'InsightEngine' is run. It stops short of anything about permissions, rate limits, or whether results are cached/regenerated, which are relevant for a remote compute call.
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?
One dense, front-loaded sentence that spends its words on the actual data returned and the derived score rather than filler. Slightly jargon-heavy ('Big Data service', 'InsightEngine') but not wasteful.
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?
An output schema exists, so return-value explanation is not required, and the description covers the data scope and derived metric. However, for an unannotated read/compute tool the description omits the optional address parameter, usage conditions, and any access or cost characteristics, leaving real gaps.
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 single 'address' parameter has 0% schema description coverage and is never mentioned in the description, so its purpose (target ring or endpoint selector) is entirely undocumented. The description adds no meaning beyond the bare property name.
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 states a specific verb (Pulls / runs) and precise resources (multi-night sleep hypnograms with Light/Deep/REM/Awake stages, and a 0-100 Recovery/Readiness Score). The scope is clearly distinct from siblings like get_daily_activity or read_realtime_vitals, but no sibling is named so the differentiation is left implicit.
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?
There is no when-to-use guidance, no prerequisites, and no alternatives named (e.g. it never says to prefer this over read_realtime_vitals for overnight data). The agent must infer usage purely from the tool name and resource scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_realtime_vitalsA
Activates the optical PPG biosensor on the ring to take a live measurement of Heart Rate (BPM) or SpO2 (%). metric: 'heart_rate' or 'spo2' duration_seconds: Duration to sample (10 to 30 seconds recommended). Note: The ring must be worn snugly on a finger with the sensor on the palm side.
| Name | Required | Description | Default |
|---|---|---|---|
| metric | No | heart_rate | |
| address | No | ||
| duration_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does disclose meaningful behavior: it activates a physical sensor, samples over a duration, and requires correct ring placement. It omits failure modes (ring not worn, sensor contact lost) and whether the call blocks for the full duration.
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 purpose is front-loaded in the first sentence and the parameter notes follow compactly with no filler. Minor formatting awkwardness from line-broken parameter lines, but nothing wasteful.
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?
An output schema exists, so return values need not be described. However, for a hardware-activating tool with zero annotations, the definition leaves gaps: the address parameter is unexplained, and there is no mention of error or readiness conditions.
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 must compensate. It does explain metric (naming the two valid values 'heart_rate'/'spo2') and duration_seconds (10-30s recommended), which is genuine added value, but the address parameter is undocumented in both the schema and the description.
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?
States a specific action (activating the optical PPG biosensor) and a specific resource (live Heart Rate or SpO2 measurement), which is materially different from the retrieval-oriented siblings like get_sleep_and_recovery or get_daily_activity. An agent can tell this is a live-sensor read, not a historical data fetch, without opening the schema.
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 the use case (live on-demand measurement) and gives the physical prerequisite that the ring be worn snugly with the sensor on the palm side. It never states when to prefer this over the historical siblings or what conditions make it fail, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_ringsB
Scans for nearby smart rings over Bluetooth Low Energy. Returns list of discovered rings with device name, MAC address/UUID, and RSSI signal level.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It conveys that this is a discovery operation returning a list (implying a read-only, non-destructive nature), but says nothing about whether the call blocks for the scan duration, required BLE permissions/pairing state, or environment prerequisites.
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?
Two short sentences, front-loaded with the action and scope, with zero filler. Every clause carries information, even if the return-value sentence is partially redundant with the output 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?
An output schema exists, so the return-field enumeration is largely redundant, and the description does not need to explain return values. However, with no annotations and an undocumented parameter, key operational context (blocking behavior, permissions, timeout effect) is missing for what is an environment-interacting discovery tool.
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 single parameter timeout_seconds is never mentioned in the description, so the agent gets no guidance on what the value controls, its unit interpretation, or how it affects scan behavior. The description fails to compensate for the coverage gap.
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 states a specific verb and resource ('Scans for nearby smart rings over Bluetooth Low Energy'), which is unambiguous and distinct from data-retrieval siblings like get_ring_status or get_daily_activity. It does not, however, explicitly contrast itself with get_ring_status, the closest sibling, leaving the boundary to inference.
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?
There is no when-to-use, when-not-to-use, or alternative-tool guidance. The agent must infer that this is the discovery step used before other ring operations, and nothing tells it how this differs from get_ring_status or when a scan is preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_timeB
Synchronizes the smart ring's internal real-time clock (RTC) with the host system's current time.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It usefully clarifies the direction of the sync (host time is written into the ring's RTC), which is real behavioral information, but it omits whether a connection is required, whether the write is reversible, and what happens on failure.
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?
One sentence, front-loaded with the action and target, with no 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?
An output schema exists, so return values need not be described, and the operation itself is simple. However, for a device-writing tool with no annotations and an undocumented parameter, the description leaves when-to-use and preconditions unaddressed.
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 single optional 'address' parameter has 0% schema description coverage, and the description never mentions it. The phrase 'the smart ring' faintly implies a default target device, but this does not compensate for the undocumented address argument.
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?
States a specific verb ('Synchronizes') and a precise resource ('the smart ring's internal real-time clock (RTC)'), including both endpoints of the sync. No sibling tool performs a comparable action, so an agent can identify it unambiguously.
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 says what the tool does but never states when to invoke it โ e.g., after clock drift, on connection, or before time-stamped reads. No alternatives or preconditions are named, so usage must be inferred entirely by the agent.
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.
8 tool updates
v0.1.0- First observed
blink_ring - First observed
get_daily_activity - First observed
get_motion_sample - First observed
get_ring_status - First observed
get_sleep_and_recovery - First observed
read_realtime_vitals - First observed
scan_rings - First observed
sync_time
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose: scanning/discovery, status/battery, time sync, sleep/recovery, daily activity, live vitals, motion sampling, and physical LED signaling. The only mild overlap is scan_rings vs get_ring_status, but their outputs and roles are well separated.
All tool names use snake_case and follow a predictable verb_noun or verb_noun_phrase pattern (scan_rings, get_ring_status, sync_time, read_realtime_vitals). The use of get_, read_, scan_, sync_, and blink_ is consistent and readable.
Eight tools are well-scoped for a smart ring MCP server, covering discovery, status, sync, health metrics, and device actions without feeling bloated or thin. Each tool appears to earn its place.
The surface covers core smart ring workflows: discovery, status, time sync, sleep, activity, live vitals, motion, and physical notification. Minor gaps exist for historical heart-rate/SpO2 retrieval or alarm/notification configuration, but agents can work around these for many use cases.
Maintenance
Related MCP Connectors
Garmin data in Claude: 135 tools โ activities, sleep, HRV, training, workouts. Free, open source.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.
Real-time chat hub for AI agents โ Claude Code, Cursor, Cline, Codex over MCP or REST.
Related MCP Servers
- AlicenseBqualityAmaintenanceLocal-first MCP server that connects AI agents to your Garmin sleep, HRV, Body Battery, stress, training readiness and activities, keeping tokens on your machine.4271911MIT
- AlicenseBqualityFmaintenanceConnects your Oura Ring to AI assistants like Claude, providing human-readable insights about sleep, readiness, activity, and health metrics with smart analysis.274227MIT
- AlicenseBqualityAmaintenanceLocal-first MCP server that connects AI agents to your Oura Ring readiness, sleep, activity, and HRV data. Tokens never leave your machine.27882MIT
- AlicenseNot gradedqualityBmaintenanceA lightweight Bluetooth Low Energy debug MCP server for AI agents. It provides 21 tools for BLE scanning, connection, GATT read/write, descriptor access, MTU query, notification subscription, device recon, and engine diagnostics.Apache 2.0