MCP server that logs food items to Google Health API with nutrition data lookup from USDA and Open Food Facts
Claude Fit Logger has clear, verb-based tool names and reasonable descriptions (avg 180 chars), but parameter documentation is inconsistent and output schemas are not formally documented. All four tools have input schemas with types, but descriptions lack actionable constraints (e.g., timezone format, calorie range). The log_food tool's multi-step fallback pattern is well-explained but adds cognitive load. Error responses are generic (status codes without recovery guidance). No tool annotations (readOnlyHint, destructiveHint) despite clear risk profiles.
Returns today's running nutrition totals and the individual entries.
Log a food item. Call with just item_name/quantity_g/tz first — this tool will look the item up automatically. If it returns status="not_found", compute the nutrition yourself and call this tool again for the SAME item, this time also passing calories (required) and any of protein_g/carbs_g/fat_g/fiber_g/sugar_g you can estimate. tz must be an IANA timezone name, e.g. "America/Toronto".
Removes a specific item logged today (matched by name), from both Google Health and the log.
Removes the most recently logged item today, from both Google Health and the log.
No tool annotations (destructiveHint, readOnlyHint) despite clear risk profiles. undo_entry and remove_entry are DESTRUCTIVE; get_totals is READ_ONLY. Annotations guide agent caution and enable safety policies.
Output schemas not formally documented. Callers cannot predict response structure (e.g., does log_food always return 'today_totals'? What fields are in 'entries'?). LLMs must infer structure from examples.
Parameter descriptions lack actionable constraints. 'tz' is described as 'IANA timezone name, e.g. America/Toronto' but no validation guidance. 'quantity_g' and 'calories' have no min/max bounds. LLMs may pass invalid values (negative grams, zero calories).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | <=2025-11-25 | v2 |
Error responses lack recovery guidance. 'status=not_found' in log_food tells the LLM to estimate, but other errors (e.g., database failure, Google Health API error) return generic dicts with no 'try this next' hint.
log_food's two-step fallback (lookup → estimate if not found) is well-explained but adds complexity. No idempotency guarantee: calling twice with same item_name/quantity_g/tz may create duplicate entries if the second call is retried.