Open Wearables MCP server connects Claude Desktop and Cursor to wearable health data. Query sleep, workouts, and activity in natural language. Self-hosted, FastMCP-based, MIT license.
MCP (Model Context Protocol) is a standard for connecting AI assistants to external data sources. The Open Wearables MCP server enables AI tools like Claude Desktop and Cursor to query your wearable health data through natural language conversations.
The MCP server is decoupled from the backend - it communicates via REST API using your API key. This means it can be deployed independently and uses existing, tested API endpoints.
This demo uses generated sample data to show the capabilities of Claude’s MCP integration with Open Wearables. User 1 has short, irregular sleep patterns while User 2 shows longer, more consistent sleep quality. Claude analyzes both datasets to identify key differences and health implications.
User: "How much sleep did John get last week?"Claude: [calls get_users() to get John's user_id]Claude: [calls get_sleep_summary(user_id="uuid-1", start_date="2026-01-28", end_date="2026-02-04")]Claude: "John slept an average of 7 hours and 45 minutes over the last week.His longest sleep was 8h 15m on Monday, and shortest was 6h 30m on Thursday."
User: "Fetch workouts for John"Claude: [calls get_users() to get John's user_id]Claude: [defaults to last 2 weeks: calls get_workout_events(user_id="uuid-1", start_date="2026-01-21", end_date="2026-02-04")]Claude: "Over the last 2 weeks, John completed 8 workouts..."
If the server starts successfully, you should see output similar to:
2026-02-10 07:48:22,016 - app.main - INFO - Open Wearables MCP server initialized. API URL: http://localhost:8000[02/10/26 07:48:22] INFO Starting MCP server 'open-wearables' with transport 'stdio'2026-02-10 07:48:22,048 - docket.worker - INFO - Starting worker 'MacBook-Pro-26.local#19901' with the following tasks:2026-02-10 07:48:22,049 - docket.worker - INFO - * trace(message: str, ...)2026-02-10 07:48:22,049 - docket.worker - INFO - * fail(message: str, ...)2026-02-10 07:48:22,049 - docket.worker - INFO - * sleep(seconds: float, ...)
You can stop the server now - the LLM client you configure in the next steps will start it automatically on launch.