MacroFactor MCP

MacroFactor MCP

Enables Claude.ai to read your MacroFactor nutrition data and log food back into MacroFactor.

Category
访问服务器

README

MacroFactor MCP

A personal Model Context Protocol server that lets Claude.ai read your MacroFactor nutrition data and log food back into MacroFactor.

MacroFactor has no public API, so this uses only official mechanisms:

  • Reads come from MacroFactor's built‑in Data Export (.xlsx), parsed locally and uploaded to the server.
  • Writes (logging food) go through MacroFactor's official Apple Shortcuts Log by JSON action on your iPhone, triggered via a notification you tap to confirm.

No reverse‑engineering, no private API — so no meaningful ToS/ban risk (see "Risk").

Architecture

        reads                                   writes
  ┌──────────────┐   export.xlsx   ┌─────────────────────┐   /mcp    ┌──────────┐
  │ MacroFactor  │ ──────────────▶ │ scripts/ingest.mjs  │           │ Claude.ai│
  │   app (iOS)  │   (manual)      │ (local parse+upload)│           │   web    │
  └──────────────┘                 └──────────┬──────────┘           └────┬─────┘
        ▲                                      │ /ingest                   │ tool calls
        │ Log by JSON (tap)                    ▼                           ▼
  ┌─────┴────────┐   push    ┌────────────────────────────────────────────────┐
  │ iPhone       │ ◀──────── │  Cloudflare Worker (this repo)                   │
  │ Shortcut     │  Pushcut  │  • /mcp   authless MCP (read & log tools)        │
  └──────────────┘           │  • /upload-export  parses an export, refreshes D1│
                             │  • /today  live today feed from the phone        │
                             │  • /pending(-water) queues for iPhone Shortcut   │
                             └────────────────────────────────────────────────┘

Tools exposed to Claude

Tool What it does
get_daily_nutrition Daily calories / protein / carbs / fat / expenditure / weight / steps
get_micronutrients Daily micros — fiber, sugars, sodium, vitamins, minerals, amino acids
get_food_log Individual foods you ate, with time + macros (meal‑by‑meal); includes alcohol field, suspect flag for entries that may be inaccurate, and optional detail parameter for extended nutrient columns
get_weight_history Scale weight (kg and lbs), trend weight, body‑fat %
get_expenditure MacroFactor's calculated TDEE vs intake
get_steps Daily step count
search_my_foods Your Favorites / Custom Foods / history, with per‑serving macros
data_status How fresh the loaded data is (incl. the live "today" feed)
get_today Today's running totals live from your phone (no export needed) — consumed, micros, targets, what's left, freshness
get_targets Calorie/macro targets for a date (resolves weekday cycling) + weight‑goal progress; week:true returns all 7 weekday rows of the governing program
get_goal_history Every weight goal ever set, with planned (rate, ETA) vs actual (trend change, duration, realized rate) per goal
get_adherence Per‑day intake vs target — hit‑rate, surplus/deficit, avg carb/fat gap vs target, true energy balance, est. kg change
weekly_summary ONE digest over rolling 7/14/28‑day windows — avg calories/macros, adherence (incl. carb/fat gap), trend‑weight rate, TDEE drift, training volume, recent PRs
weekly_review The whole weekly check-in in one call: weekly_summary + get_pr_alerts + day_of_week_patterns, sharing one end date
get_training_volume Working sets + tonnage per muscle group over a range
get_exercise_progress MacroFactor's per‑exercise metrics over time (1RM/3RM/10RM, heaviest, volume, reps, sets)
get_workouts Logged sessions with per‑exercise sets (weight × reps × RIR), duration, top set; timed/distance/assisted sets carry duration/distance/base-weight fields
get_prs Personal records per exercise — estimated 1RM (Epley), heaviest weight, best‑set volume; duration/distance bests for timed exercises
get_body_metrics Body measurements (cm) + visual body‑fat assessment over time
get_program Your planned training program — cycles, workouts, each exercise's planned sets (type, rep range, RIR, rest) + rest days
forecast_weight When you'll hit goal weight — OLS trend regression and a calorie-math ETA; their divergence flags TDEE miscalibration. Optional target_date → required daily deficit
reconcile_energy_balance Your implied maintenance calories (from weight delta + intake) vs MacroFactor's TDEE — catches under/over-logging
day_of_week_patterns Per-weekday averages + each weekday's share of your weekly surplus — pinpoints the single highest-leverage day
get_nutrient_timing Food log bucketed by time of day (fasted/morning/midday/afternoon/evening/late) — reveals protein distribution
detect_stall Plateau vs metabolic adaptation vs intake-drift classifier with an adaptation_kcal estimate
micro_gap_analysis 28-day micronutrient averages vs NIH RDAs → ranked deficiency list (real export columns)
get_training_day_nutrition Nutrition grouped by training-load tier (rest/light/moderate/heavy) — do you eat more on heavy days?
get_pr_alerts Lifts that hit a new all-time PR (e1RM / heaviest / best-set volume / duration / distance), detected automatically on each export; includes the live front-squat:back-squat e1RM ratio (bottleneck_kpi)
log_food Send a food to your phone to log in MacroFactor — optional intended_time records when you ate it and matches against the Food Log CSV on the next export import
log_saved_food Log one of your saved Favorites/Custom foods by name × servings — scales the food's stored macros; disambiguates when the name matches more than one; accepts intended_time
log_water Log water (mL) via MacroFactor's dedicated Log Water action on your phone
log_weight Log a body weight (kg or lbs) via MacroFactor's dedicated Log Weight action on your phone
log_recipe Log a named multi-ingredient meal — sums macros, attaches a recipe[] breakdown (reuses the food push); accepts intended_time
relog_meal Re-log a past day's meal (optional hour window) as one entry — "log yesterday's lunch" in one tap; accepts intended_time
log_foods_batch Log up to 20 foods in a single phone tap — ideal for a full meal or photo-estimated intake; each item accepts intended_time
cancel_pending_log Delete queued-but-not-yet-tapped food/water/weight/batch logs ("never mind")
get_day Full picture of a single day — nutrition totals, food log entries, body weight, and workout in one call
get_pending_logs Queued (not-yet-tapped) food dispatches and recent dispatch history with landed status — see whether Claude's log reached MacroFactor

Proactive: when you upload an export (and once daily via cron), the server checks your lift log for new personal records and fires a Pushcut "New PR" push (set PUSHCUT_PR_WEBHOOK_URL); tap it and ask Claude get_pr_alerts for specifics.

Write-path audit log: every food dispatch is recorded in food_dispatch_log (queued, landed, or cancelled); optional intended_time on all five food-write tools is stored in food_intent_log and matched against the Food Log CSV on the next export import. When Shortcut 2 runs after a tap, it POSTs ?ack_id=N to /today, which simultaneously marks the dispatch landed in the audit log and refreshes live today data.

Three exports, all sent to the same /upload-export endpoint (auto‑detected by content): the .xlsx workbook (daily totals, all micronutrients, saved‑food library, nutrition targets + weight goals, body measurements + visual body‑fat, your planned training program, and MacroFactor's per‑muscle / per‑exercise training aggregates); the Food Log .csv (every item you ate, with time + macros); and the Workout Log .csv (every set: weight, reps, RIR). Upload any subset — each refreshes only its own tables.

Strength numbers: get_prs and get_workouts report the barbell load from your logged sets. get_exercise_progress and get_training_volume mirror MacroFactor's own figures, which (a) include bodyweight contribution for compound lifts — so a 100 kg front squat can show as ~160 kg — and (b) for per-muscle volume, credit each exercise to every muscle it trains, so per-muscle tonnage overlaps and sums to more than the session's bar tonnage. All correct; they just measure different things (bar load vs. training stimulus).

Prerequisites

  • Node.js ≥ 22 (Wrangler requires it — you're warned if not). Use nvm/volta or the official installer.
  • A free Cloudflare account.
  • The MacroFactor iOS app (for the optional logging path).

Setup

1. Install + log in

npm install
npx wrangler login

2. Create the database

npx wrangler d1 create macrofactor

Copy the printed database_id into wrangler.jsonc (replace REPLACE_WITH_YOUR_D1_DATABASE_ID), then create the tables:

npm run db:init

3. Set the secrets

npx wrangler secret put INGEST_SECRET   # pick any strong random string
npx wrangler secret put MCP_TOKEN       # recommended — protects the MCP endpoint (see step 6)

4. Deploy

npm run deploy

Note the URL it prints, e.g. https://macrofactor-mcp.<you>.workers.dev.

5. Load your data

  1. In MacroFactor: More → Data Management → Data Export → run the export and get the .xlsx onto this PC (AirDrop/iCloud/email). One file is all you need.
  2. cp ingest.config.example.json ingest.config.json and fill in your Worker URL + the INGEST_SECRET you chose.
  3. Upload (pass any subset of the three exports):
    npm run ingest -- "C:\path\to\workbook.xlsx" "C:\path\to\foodlog.csv" "C:\path\to\workoutlog.csv"
    
    Re‑run any time you export fresh data (each file replaces only its own tables).

6. Connect to Claude.ai

Claude.ai → Settings → Connectors → Add custom connector:

  • URL: https://macrofactor-mcp.<you>.workers.dev/mcp/<MCP_TOKEN>
  • Authentication: None (the secret token in the URL is the auth)

If you skipped MCP_TOKEN the URL is plain /mcpnot recommended: without a token, anyone who learns your Worker URL can read your nutrition/health data and queue food logs to your phone. Treat the full connector URL as a secret either way.

Ask things like "what was my protein this week?" or "how does my intake compare to my expenditure this month?"

7. (Optional) Log food via Claude

See ios-setup.md to wire up Pushcut + the iPhone Shortcut, then:

npx wrangler secret put PUSHCUT_WEBHOOK_URL

log_saved_food, log_recipe, and relog_meal reuse this same path (no extra setup). To also log water via Claude (log_water), add the small "MF Log Water" shortcut + its own Pushcut notification (see ios-setup.md), then:

npx wrangler secret put PUSHCUT_WATER_WEBHOOK_URL

log_weight and log_foods_batch each need their own small shortcut + Pushcut notification (see ios-setup.md), then their own webhook secret:

npx wrangler secret put PUSHCUT_WEIGHT_WEBHOOK_URL   # for log_weight
npx wrangler secret put PUSHCUT_BATCH_WEBHOOK_URL    # for log_foods_batch

For proactive PR alerts, create a Pushcut "New PR" notification and set its webhook:

npx wrangler secret put PUSHCUT_PR_WEBHOOK_URL

Risk

  • Data export → reads: clean. Your own data via a feature built for it.
  • Apple Shortcuts → writes: low risk. MacroFactor publishes the Shortcuts integration and endorses LLM‑driven Log by JSON; the write path requires a physical tap.
  • We avoid the private Firestore API (App Check–blocked since ~May 2026, and a ToS breach).
  • Optional: email support@macrofactor.com to confirm automation use in writing.

Known limits

  • Food-write tools log at the tap time — MacroFactor's Log by JSON action uses the current time when the Shortcut runs. Pass intended_time to any food-write tool to store your intended eat-time server-side; it is matched against the Food Log CSV on the next import.
  • Reads are as fresh as your last export/upload. Refresh from your phone with the "Update MF" Shortcut (POSTs the export to /upload-export) or from a PC with npm run ingest — see ios-setup.md.
  • get_food_log needs the Food Log CSV and the training tools need the Workout Log CSV; the .xlsx workbook gives daily totals + micros + saved foods + targets + body metrics + planned training program + per‑muscle/per‑exercise training aggregates.
  • get_exercise_progress for 1RM/3RM/10RM only returns data once MacroFactor has computed those estimates (needs a few logged sessions); until then use get_prs or the heaviest_weight / total_volume metrics.
  • Weights are in kg (MacroFactor exports normalise to kg even if your app shows pounds).

Make it yours

Three constants encode preferences you'll want to adjust:

  • TimezoneUSER_TZ in src/db/utils.ts decides what "today" means (defaults to UTC). Set it to your IANA timezone (e.g. America/New_York) or post-midnight /today updates can land on the wrong day.
  • Bottleneck KPIsquatBottleneck() in src/db/prs.ts tracks a front-squat : back-squat e1RM ratio surfaced by get_pr_alerts / weekly_review. Swap the exercise pair for your own, or ignore it — it returns null when either lift is absent.
  • Micronutrient RDAsMICRO_RDA in src/db/analytics.ts uses NIH DRI values for an adult male 19–50. Adjust the table for your demographic.

License

MIT — see LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选