MCP Health Coach
MCP server that turns any MCP-compatible LLM client into a wellness coach grounded in verified public data, offering nutrition, exercise, biometric, and preventive care tools with safety guardrails.
README
MCP Health Coach
An MCP server that turns any MCP-compatible LLM client (Claude Desktop, etc.) into a wellness coach grounded in verified public data.
Core design principle: the coaching conversation lives in the LLM, but every factual claim — a nutrient value, a supplement warning, a screening recommendation — is backed by a real tool call to a government or verified source, not generated from the model's training data.
Demo
No API keys needed to see the core logic run — demo/run_example.py calls the local-computation tools directly (the same functions the MCP server exposes) using the persona from the coaching session example below:
python demo/run_example.py
<details> <summary>Sample output</summary>
============================================================
1. calculate_daily_needs — establish calorie/macro targets
============================================================
{
"bmr": 1422,
"tdee": 2204,
"target_calories": 1704,
"macro_split": {
"protein_g": 122,
"carbs_g": 189,
"fat_g": 51
},
"goal": "lose",
"goal_label": "Fat loss (~0.5 kg/week deficit)",
"activity_level": "moderate",
"note": "~500 kcal/day deficit; expect ~0.5 kg loss per week",
"coaching_context": "For a 32-year-old female at 68 kg / 170 cm with moderate activity, targeting lose. Daily target: 1704 kcal (122g protein / 189g carbs / 51g fat)."
}
============================================================
2. calculate_bmi — quick screening metric
============================================================
{
"bmi": 23.5,
"category": "Normal weight",
"healthy_weight_range_kg": { "min": 53.5, "max": 72.0 },
"weight_kg": 68,
"height_cm": 170,
"note": "BMI is a population-level screening tool. It does not account for muscle mass, bone density, age, or fat distribution. Body fat percentage and waist circumference provide a fuller picture."
}
============================================================
3. calculate_water_intake — daily hydration target
============================================================
{
"daily_water_target_ml": 2780,
"range_ml": { "min": 2502, "max": 3058 },
"in_liters": 2.78,
"in_cups_8oz": 12,
"activity_level": "moderate",
"climate": "temperate",
"note": "This is an estimate for total fluid intake (water, beverages, food moisture). Pure water needs are roughly 70-80% of this figure. Urine color is the simplest real-time hydration check: pale yellow = well hydrated."
}
============================================================
4. calculate_calories_burned — factor in a planned workout
============================================================
{
"activity": "running (5mph / 12 min/mile)",
"duration_minutes": 30,
"weight_kg": 68,
"met_value": 8.3,
"intensity": "vigorous",
"calories_burned": 282,
"calories_per_minute": 9.4,
"source": "2011 Compendium of Physical Activities (Ainsworth et al.)",
"note": "MET-based estimates assume average metabolic efficiency. Individual variation (fitness level, terrain, pace consistency) typically puts real burn within ±15% of this estimate."
}
</details>
The full experience — chaining in suggest_recipe, build_workout_plan, and get_preventive_care_recommendations against live external APIs — runs through an MCP client like Claude Desktop; see Setup below.
Tools (31 total)
Core coaching
| Tool | Source | What it does |
|---|---|---|
calculate_daily_needs |
Local (Mifflin-St Jeor) | BMR, TDEE, calorie + macro targets |
get_food_nutrition |
USDA FoodData Central → Open Food Facts | Unified nutrition facts by name or barcode |
suggest_recipe |
Edamam | Recipes matching calorie/macro/dietary targets |
get_exercise |
Wger + ExerciseDB | Exercises by muscle group, equipment, difficulty |
build_workout_plan |
Wger + program-design logic | Full weekly plan with sets/reps/rest |
get_health_topic_summary |
MedlinePlus (NLM/NIH) | Plain-language topic summaries + citations |
check_supplement_interaction |
openFDA | FDA-reported warnings and interactions |
get_preventive_care_recommendations |
ODPHP MyHealthfinder | Age/sex-appropriate screenings + vaccines |
Body metrics & calculations
| Tool | What it does |
|---|---|
calculate_bmi |
Body mass index + category |
calculate_body_fat |
Body fat % (Navy method) |
calculate_water_intake |
Daily hydration target |
estimate_healthy_weight_range |
Healthy weight range for a given height |
calculate_calories_burned |
Calories burned for an activity + duration |
list_activities |
Browse the local calorie-burn activity table |
Nutrition utilities
| Tool | Source | What it does |
|---|---|---|
get_meal_totals |
Local (composes get_food_nutrition) |
Aggregate macros/calories across a meal's items |
compare_foods |
USDA FoodData Central → Open Food Facts | Side-by-side nutrition comparison |
find_foods_high_in_nutrient |
USDA FoodData Central | Foods ranked by a target nutrient |
get_vitamin_mineral_info |
Local reference data | RDA, deficiency/toxicity signs, food sources |
search_nutrition_research |
PubMed | Peer-reviewed research summaries + citations |
Biometrics & device integrations
Pulls live data from the user's own wearables/scales rather than static reference data. All integrations are optional and env-var gated — tools degrade gracefully with setup instructions when nothing is configured. See Wearable Integrations below.
| Tool | What it does |
|---|---|
get_available_integrations |
Reports which wearable/device integrations are configured and ready |
get_biometric_summary |
Unified resting HR, HRV, sleep, steps, active calories, body composition |
get_sleep_analysis |
Per-night sleep breakdown, averages, sleep-debt and quality coaching flags |
get_recovery_score |
0–100 recovery score (Oura readiness or computed from HRV/RHR/sleep) |
get_hrv_trends |
Daily HRV, 7-day rolling average, trend direction |
get_activity_summary |
Daily steps/active minutes vs. WHO 150 min/week guideline |
get_body_composition_trend |
Weight/body-fat trend, rate of change, aggressive-loss flag |
get_strain_score |
TRIMP-based training load from workouts / HR zones |
log_behavior_entry |
Journal lifestyle factors (sleep, alcohol, stress, caffeine, etc.) |
get_behavior_correlations |
Pearson correlations between journaled behaviors and next-day biometrics |
scan_ble_devices |
Discover nearby BLE health devices |
read_live_heart_rate |
Stream live HR + RMSSD HRV from a BLE heart rate monitor |
Workflow
A typical coaching session chains tools in order:
1. calculate_daily_needs → establishes calorie/macro targets
2. get_food_nutrition → checks specific foods against those targets
3. suggest_recipe → finds meals that fit the daily plan
4. build_workout_plan → creates a training program for the goal
5. get_health_topic_summary → answers background health questions with citations
6. check_supplement_interaction → safety-checks supplements being considered
7. get_preventive_care_recommendations → surfaces relevant screenings
Wearable Integrations
Each integration is activated purely by setting its env vars in .env — no code changes needed. get_available_integrations reports what's active and what's missing, including setup links.
| Integration | Env vars | Extra install |
|---|---|---|
| Oura Ring | OURA_PAT |
— |
| Polar (Accesslink) | POLAR_ACCESS_TOKEN, POLAR_USER_ID |
— |
| Withings | WITHINGS_ACCESS_TOKEN |
— |
| Fitbit | FITBIT_ACCESS_TOKEN |
— |
| Garmin Connect | GARMIN_EMAIL, GARMIN_PASSWORD |
pip install garminconnect>=0.2.0 |
| Direct BLE (Polar H10, Bangle.js 2, PineTime, ESP32+MAX30102) | BLE_DEVICE_ADDRESS (optional default) |
pip install bleak>=0.21.0 |
Aggregation tools (get_biometric_summary, get_sleep_analysis, etc.) use whatever sources are active and label each metric with its source, generally preferring Oura > Withings > Garmin > Fitbit > Polar depending on the metric.
Safety
- Emergency hard-guard: All tool inputs are checked against a hardcoded list of emergency phrases (chest pain, suicidal ideation, overdose, etc.) before any tool logic runs. Matching inputs return a fixed emergency-services redirect — this is not LLM-dependent.
- Structural disclaimers: Every Health Reference tool (MedlinePlus, openFDA, ODPHP) wraps its payload with a source citation and standard disclaimer before returning to the model. The LLM cannot forget to include it.
- Scope boundary: This tool covers general wellness, nutrition, and fitness. It does not diagnose, does not recommend medication dosages, and does not override physician guidance.
Setup
1. Install dependencies
cd mcp-health-coach
pip install -r requirements.txt
2. Configure API keys
cp .env.example .env
# Edit .env with your keys
Required keys:
EDAMAM_APP_ID+EDAMAM_APP_KEY— free tier at developer.edamam.com
Optional (free-tier or keyless):
USDA_FDC_API_KEY— works without a key at low volumeEXERCISEDB_RAPIDAPI_KEY— enables GIF links in exercise results
3. Test locally
pytest tests/ -v
4. Connect to Claude Desktop
Copy config/claude_desktop_config.example.json to your Claude Desktop config and update the path:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"health-coach": {
"command": "python",
"args": ["/absolute/path/to/mcp-health-coach/server.py"],
"env": {
"EDAMAM_APP_ID": "your-id",
"EDAMAM_APP_KEY": "your-key"
}
}
}
}
Restart Claude Desktop. You should see the health-coach tools available.
5. Try a coaching session
Prompt example:
"I'm a 32-year-old woman, 68kg, 170cm, moderately active. I want to lose weight. Help me build a meal and workout plan."
Claude will chain: calculate_daily_needs → suggest_recipe → build_workout_plan → get_preventive_care_recommendations.
Project Structure
mcp-health-coach/
├── server.py # MCP entrypoint, tool registration (31 tools)
├── tools/
│ ├── nutrition.py # get_food_nutrition (USDA + OFF)
│ ├── recipes.py # suggest_recipe (Edamam)
│ ├── exercise.py # get_exercise (Wger + ExerciseDB)
│ ├── workout_plan.py # build_workout_plan (composition)
│ ├── daily_needs.py # calculate_daily_needs (pure logic)
│ ├── health_topics.py # get_health_topic_summary (MedlinePlus)
│ ├── supplement_interactions.py # check_supplement_interaction (openFDA)
│ ├── preventive_care.py # get_preventive_care_recommendations (ODPHP)
│ ├── body_metrics.py # BMI, body fat, water intake, weight range
│ ├── calorie_burn.py # calculate_calories_burned, list_activities
│ ├── meal_totals.py # get_meal_totals, compare_foods
│ ├── nutrient_search.py # find_foods_high_in_nutrient
│ ├── vitamin_info.py # get_vitamin_mineral_info
│ ├── research.py # search_nutrition_research (PubMed)
│ └── biometrics.py # wearable aggregation, recovery/strain/HRV, behavior journal
├── integrations/
│ ├── oura.py # Oura Ring API v2
│ ├── polar.py # Polar Accesslink API v3
│ ├── withings.py # Withings Health API
│ ├── fitbit.py # Fitbit Web API
│ ├── garmin.py # Garmin Connect (via garminconnect lib)
│ └── ble_gatt.py # Direct BLE Heart Rate Service (via bleak)
├── lib/
│ ├── cache.py # Shared TTL cache (1hr, 512 entries)
│ ├── http_client.py # Retry/timeout HTTP client
│ ├── normalization.py # Unified NutritionFact schema
│ ├── disclaimers.py # Structural disclaimer wrapper
│ └── safety_filters.py # Hardcoded emergency redirect
├── tests/
│ ├── test_daily_needs.py # BMR/TDEE formula correctness
│ ├── test_normalization.py # Cross-source schema consistency
│ ├── test_disclaimer_wrapper.py # Disclaimer always present
│ ├── test_safety_filters.py # Emergency patterns 100% blocked
│ ├── test_biometrics.py # Wearable aggregation, recovery/strain/HRV, journal
│ └── test_integrations.py # Per-device auth/parsing + degradation paths
├── config/
│ └── claude_desktop_config.example.json
├── demo/
│ └── run_example.py # Key-free walkthrough of the local-logic tool chain
├── .env.example
└── requirements.txt
Data Sources
All free-tier. No paid infrastructure required to run locally.
| Source | What | Key required? |
|---|---|---|
| USDA FoodData Central | Whole food nutrition | No (optional for higher rate limits) |
| Open Food Facts | Branded/packaged foods | No |
| Edamam | Recipes | Yes (free tier) |
| Wger | Exercise database | No |
| ExerciseDB | Exercise GIFs | Yes (free tier via RapidAPI) |
| MedlinePlus (NLM) | Health topic summaries | No |
| openFDA | Drug/supplement labels | No |
| ODPHP MyHealthfinder | Preventive care guidelines | No |
| PubMed | Nutrition research | No |
| Oura / Polar / Withings / Fitbit / Garmin | Wearable biometrics | Yes, per-platform (see Wearable Integrations) |
| Direct BLE hardware | Live heart rate / HRV | No (local Bluetooth only) |
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。