Health MCP Server
Provides tools for tracking fitness activities, performance metrics, and training zones. It enables monitoring distance, pace, elevation, and heart rate, as well as accessing athlete stats and gear tracking.
Click on "Install 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., "@Health MCP ServerShow me my recovery score and sleep summary from last night"
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.
Health MCP Server
A Model Context Protocol (MCP) server for aggregating and analyzing health and fitness data from multiple sources. Currently supports Whoop and Strava with an extensible adapter architecture for future integrations (Withings, Oura, Garmin, etc.).
Features
Multi-Provider Support
Modular Architecture: Each adapter is optional and independently configurable
Auto-Enable: Adapters are automatically enabled when credentials are configured
Unified Auth: Single OAuth callback server shared across all providers
Whoop Integration
Sleep Analysis: Track sleep duration, stages (deep, REM, light), efficiency, and consistency
Recovery Tracking: Monitor recovery scores, HRV, resting heart rate, and SpO2
Strain Monitoring: View daily strain, workout history, and heart rate zones
Advanced Insights: Get personalized recommendations, trend analysis, and correlations
Strava Integration
Activity Tracking: View runs, rides, swims, and all activity types with full stats
Performance Metrics: Distance, pace, speed, elevation, heart rate, power, and cadence
Training Zones: Heart rate and power zone configuration and per-activity distribution
Athlete Stats: All-time totals, year-to-date, and recent activity summaries
Gear Tracking: Monitor distance on bikes, shoes, and other equipment
Related MCP server: Domestique
Available Tools
General
Tool | Description |
| List all available adapters and their authentication status |
Whoop Tools
Authentication
Tool | Description |
| Initiate OAuth2 login flow for Whoop |
| Check current authentication status |
Profile
Tool | Description |
| Get user profile and body measurements |
Sleep
Tool | Description |
| Recent sleep with performance, stages, and needs |
| Sleep history over date range with trends |
Recovery
Tool | Description |
| Latest recovery with HRV and status |
| Recovery trends over time |
Strain & Workouts
Tool | Description |
| Current day strain and heart rate |
| Daily strain patterns over time |
| Workout details with HR zones and calories |
Analysis & Insights
Tool | Description |
| Comprehensive health dashboard |
| Sleep timing, consistency, and recommendations |
| Correlations affecting recovery |
| Week-over-week comparison with trends |
| Workout intensity recommendations |
Strava Tools
Authentication
Tool | Description |
| Initiate OAuth2 login flow for Strava |
| Check current Strava authentication status |
Profile & Stats
Tool | Description |
| Athlete profile with all-time stats and gear |
Activities
Tool | Description |
| Recent activities with distance, pace, HR, etc. |
| Detailed activity with laps, segments, and full stats |
| Weekly training summary by activity type |
Training Zones
Tool | Description |
| Your configured HR and power training zones |
| Zone distribution for a specific activity |
Installation
Prerequisites
Python 3.10 or higher
API credentials for at least one provider (Whoop and/or Strava)
Setup
Clone the repository
cd /path/to/health_mcpCreate a virtual environment
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activateInstall dependencies
pip install -r requirements.txtConfigure API credentials
Copy the example configuration:
cp config.example.yaml config.yamlEdit
config.yamlwith your API credentials (configure one or both):# Whoop - Get credentials from https://developer.whoop.com/ whoop: client_id: "your_client_id_here" client_secret: "your_client_secret_here" redirect_uri: "http://localhost:8787/callback" # Strava - Get credentials from https://www.strava.com/settings/api strava: client_id: "your_client_id_here" client_secret: "your_client_secret_here" redirect_uri: "http://localhost:8787/callback"Alternative: Environment Variables
# Whoop export HEALTH_MCP_WHOOP_CLIENT_ID="your_client_id" export HEALTH_MCP_WHOOP_CLIENT_SECRET="your_client_secret" # Strava export HEALTH_MCP_STRAVA_CLIENT_ID="your_client_id" export HEALTH_MCP_STRAVA_CLIENT_SECRET="your_client_secret"
Getting API Credentials
Whoop
Go to Whoop Developer Portal
Create a new application
Set the redirect URI to
http://localhost:8787/callbackCopy your Client ID and Client Secret
Strava
Go to Strava API Settings
Create a new application (or use an existing one)
Set the "Authorization Callback Domain" to
localhostCopy your Client ID and Client Secret
Usage with Claude Desktop
Add the following to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"health": {
"command": "/path/to/health_mcp/venv/bin/python",
"args": ["-m", "src.server"],
"cwd": "/path/to/health_mcp",
"env": {
"HEALTH_MCP_WHOOP_CLIENT_ID": "your_whoop_client_id",
"HEALTH_MCP_WHOOP_CLIENT_SECRET": "your_whoop_client_secret",
"HEALTH_MCP_STRAVA_CLIENT_ID": "your_strava_client_id",
"HEALTH_MCP_STRAVA_CLIENT_SECRET": "your_strava_client_secret"
}
}
}
}Usage with Cursor
Add the following to your Cursor MCP settings:
{
"mcpServers": {
"health": {
"command": "/path/to/health_mcp/venv/bin/python",
"args": ["-m", "src.server"],
"cwd": "/path/to/health_mcp"
}
}
}First-Time Authentication
After setting up the MCP server, authenticate with each provider you've configured:
Whoop
Ask the AI: "Authenticate with my Whoop account"
A browser window will open for OAuth authorization
Log in and authorize the application
The token is automatically saved
Strava
Ask the AI: "Authenticate with my Strava account"
A browser window will open for Strava OAuth
Authorize the requested permissions
The token is automatically saved
You can check which adapters are available and authenticated by asking: "List my health adapters"
Example Questions
Whoop-Specific
"How did I sleep last night?"
"What's my recovery score today?"
"Show me my sleep trends for the past month"
"Am I ready for a hard workout today?"
"What factors are affecting my recovery?"
Strava-Specific
"Show me my recent Strava activities"
"What's my weekly training summary?"
"Show me details for my last run"
"What are my training zones?"
"How much have I cycled this year?"
Combined Analysis (when both are connected)
"Compare my workout strain from Whoop with my Strava activities"
"Show me my overall fitness status"
"How does my training load look across all sources?"
Project Structure
health_mcp/
├── src/
│ ├── __init__.py
│ ├── server.py # Main MCP server with dynamic adapter loading
│ ├── config.py # Configuration management
│ ├── auth/
│ │ ├── __init__.py
│ │ ├── oauth_server.py # Shared OAuth callback server
│ │ └── token_store.py # Token persistence
│ ├── adapters/
│ │ ├── __init__.py
│ │ ├── base.py # Abstract adapter interface
│ │ ├── whoop.py # Whoop API adapter
│ │ └── strava.py # Strava API adapter
│ └── tools/
│ ├── __init__.py
│ ├── sleep.py # Whoop sleep tools
│ ├── recovery.py # Whoop recovery tools
│ ├── strain.py # Whoop strain & workout tools
│ ├── profile.py # Whoop profile tools
│ ├── insights.py # Whoop analysis tools
│ └── strava.py # Strava-specific tools
├── config.example.yaml
├── requirements.txt
└── README.mdAdapter Architecture
The server uses a modular adapter pattern:
Optional Adapters: Each adapter is optional and independently enabled
Auto-Discovery: Adapters are automatically enabled when credentials are present
Explicit Control: Use
enabled: true/falsein config to override auto-detectionUnified Interface: All adapters implement a common base class for consistency
Provider-Specific Tools: Each adapter can expose unique tools for provider-specific features
Configuration Options
# Each adapter section supports:
provider_name:
client_id: "..."
client_secret: "..."
redirect_uri: "http://localhost:8787/callback"
enabled: true # Optional: explicitly enable/disable (auto-detected by default)Extending with New Adapters
To add a new health data provider:
Create a new adapter in
src/adapters/implementing theHealthAdapterbase classAdd configuration properties in
src/config.pyCreate provider-specific tools in
src/tools/Register the adapter and tools in
src/server.py
Example adapter skeleton:
from .base import HealthAdapter, SleepRecord, RecoveryRecord, WorkoutRecord
class NewProviderAdapter(HealthAdapter):
provider_name = "new_provider"
async def is_authenticated(self) -> bool:
# Check auth status
pass
async def authenticate(self) -> bool:
# Initiate OAuth flow
pass
async def get_workouts(self, start=None, end=None, limit=10) -> list[WorkoutRecord]:
# Implement workout data fetching
pass
# Implement other methods (return empty lists for unsupported features)Token Storage
OAuth tokens are stored securely at ~/.health_mcp/tokens.json with restricted file permissions (600). Tokens are automatically refreshed when expired.
Troubleshooting
"Not authenticated" errors
Run the appropriate authenticate tool:
Whoop:
whoop_authenticateStrava:
strava_authenticate
"Missing configuration" errors
Ensure your config.yaml is set up correctly or environment variables are exported.
OAuth callback fails
Ensure port 8787 is available
Check that your redirect URI matches exactly in the provider's developer portal
For Strava, ensure the Authorization Callback Domain is set to
localhost
Token refresh fails
Delete ~/.health_mcp/tokens.json and re-authenticate.
Adapter not showing up
Check that credentials are configured correctly
Use
list_adapterstool to see adapter statusCheck server logs for initialization errors
License
MIT License
Contributing
Contributions are welcome! Please feel free to submit pull requests for:
New health data adapters (Withings, Oura, Garmin, Apple Health, etc.)
Additional analysis tools
Bug fixes and improvements
Available Tools
1 toollist_adaptersA
List all available health data adapters and their authentication status.
| Name | Required | Description | Default |
|---|---|---|---|
No 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. 'List' suggests a read-only operation, which is transparent, but the description does not explicitly state it is non-destructive or mention any rate limits or authentication requirements.
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 a single sentence that concisely conveys the tool's purpose and the information it provides. No extraneous 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?
Given the tool's simplicity (no parameters, no siblings, no output schema), the description is mostly complete. It covers what the tool does and what data it returns, though it could benefit from mentioning the output format or any default behaviors.
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 has zero parameters, so schema coverage is 100%. The description adds no parameter information beyond what is already known, which is acceptable for a parameterless tool.
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 identifies the action 'list' and the resource 'health data adapters' with the specific attribute 'authentication status'. There are no sibling tools, so differentiation is not required.
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 that the tool is used to retrieve a list of all adapters, but does not explicitly state when to avoid using it or alternatives. Since there are no sibling tools, the lack of exclusions is acceptable.
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. Dates show when Glama detected each change.
1 tool update
v0.1.0- First observed
list_adapters
TDQS
With only a single tool, there is no possibility of ambiguity between tools. The purpose of 'list_adapters' is clear and distinct by default.
The single tool name 'list_adapters' follows a consistent verb_noun pattern, which is clear and predictable. No inconsistencies exist due to the singular tool.
The server has only one tool, which feels insufficient for a server branded as 'Health MCP Server'. The scope appears extremely narrow, and a health-related server would typically require multiple tools to be useful (e.g., data retrieval, management).
The tool surface is severely incomplete. A health server should include tools for querying health data, managing adapters (add/remove/update), and possibly filtering or analyzing data. The single 'list_adapters' tool covers only a trivial subset of expected functionality.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
- freddyOAuthcoach.freddy
Connect your wearables, rings and training apps, then ask your AI about your own health data.
Track, curate, and analyze data about your health, habits, and goals.
Track workouts, nutrition, body metrics, habits, and SMART goals with insights and trends. Connect…
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA comprehensive AI-powered fitness tracking application that enables AI tools to interact intelligently with user fitness data, providing personalized workout plans, nutrition tracking, and progress analysis through natural language.15MIT
- AlicenseNot gradedqualityBmaintenanceIntegrates with Intervals.icu, Whoop, and TrainerRoad to provide unified access to fitness data, including completed workouts, recovery metrics, planned training, and performance trends across all sports.20MIT
- FlicenseNot gradedqualityNot gradedmaintenanceConnects AI assistants to fitness data from over 150 wearables including Strava, Garmin, and Fitbit through the Model Context Protocol. It provides 47 tools for sports science-based analysis, training load management, recovery tracking, and personalized nutrition planning.16-
- FlicenseNot gradedqualityBmaintenanceA multi-platform fitness MCP server that syncs data from Garmin, Strava, Google Fit, and Suunto into a local DuckDB database and provides analytics tools via MCP.1-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Marholoubek/health_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server