MCP server for MyFitnessPal: log, search, and analyze your food diary from any MCP client
Strong naming conventions (all tools start with action verbs: fitness_get, fitness_search, fitness_log, fitness_delete, fitness_modify). Descriptions are present and substantive (avg ~150 chars), explaining WHAT each tool does and WHEN to use it. Input schemas are well-defined with types and descriptions for all parameters. However, output schemas are not explicitly documented in the code, responses are inferred from implementation. Parameter descriptions are clear but could be more prescriptive about constraints (e.g., meal enum values, date format validation). Error handling is mentioned in descriptions (e.g., fitness_delete_food lists candidates on ambiguity) but recovery guidance is sparse. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels documented in the spec.
Export a whole date range at once for analysis: per-day nutrition totals, food entries with macros, the MyFitnessPal daily note, and local feel notes. Read-only.
Remove a food from the MyFitnessPal diary by name match. If this matches nothing, the error lists what's actually logged that day/meal. If it matches more than one entry (and none is an exact name match), the error lists the candidates.
Nutrition summary, diary entries, the MyFitnessPal daily note, and the local feel note for a day.
Read the MyFitnessPal exercise diary (cardio + strength) for a day.
Read the MyFitnessPal daily diary note (the free-text 'Notes' box at the bottom of the day) straight from your account.
Output schemas not documented. Tools return dicts but no explicit schema definition visible in code. LLMs cannot plan downstream calls or extract fields reliably without knowing response structure.
Missing tool annotations. Tools have clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE, REVERSIBLE) documented in spec but not exposed via readOnlyHint/destructiveHint/idempotentHint in schema. Agents cannot distinguish safe from dangerous operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
A single metric over a date range, for charts/analysis. Returns {metric, points: [{day, value}, ...]} with nulls omitted.
Save a 'how I feel today' note. Stored locally only — never sent to MyFitnessPal.
Log a food to the real MyFitnessPal diary. Searches for `query` and logs the top match. To log an exact item, pass the food_id + weight_id of a fitness_search_food candidate (query is then used as the display name).
Write the MyFitnessPal daily diary note (the free-text 'Notes' box at the bottom of the day). This is your real MFP note, synced to your account — distinct from the local-only fitness_log_feel.
Log a weight measurement to MyFitnessPal. Logging twice for the same date updates that day's measurement.
Replace a MyFitnessPal diary entry: deletes the match, then adds a food. If this matches nothing, the error lists what's actually logged that day/meal.
Search MyFitnessPal's food database and return candidate matches. Each candidate has name, brand, calories, macros, serving, and the food_id + weight_id to pass to fitness_log_food to log exactly that item.
Enum constraints not enforced in schema. 'meal' parameter accepts breakfast|lunch|dinner|snacks but is typed as plain string. LLMs may hallucinate invalid values like 'brunch' or 'lunch_break'.
Error recovery guidance incomplete. fitness_delete_food and fitness_modify_food mention listing candidates on ambiguity, but no explicit error response schema or recovery instructions in code.
Parameter descriptions lack format/constraint details. Date parameters documented as 'YYYY-MM-DD (default: today)' but no validation rules or error messages visible. Numeric parameters (quantity, weight, limit) lack min/max bounds.