Skip to main content
Glama
rwestergren

io.github.rwestergren/cronometer-api-mcp

by rwestergren

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
CRONOMETER_PASSWORDYesYour Cronometer password
CRONOMETER_USERNAMEYesYour Cronometer email address

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_food_logA

Get diary entries for one day or the last N calendar days.

Prefer relative inputs for relative questions, rather than dates calculated from conversation history. For calorie/nutrient totals without individual entries, prefer get_daily_nutrition(days=N).

Returns every food entry logged for the day. Each "Serving" entry is enriched (best-effort) with the food's name, source, the serving measure (unit name and grams per unit), the number of servings, and that food's own nutrient profile scaled to the amount eaten. Non-food entries (exercise, biometrics) carry their own name.

Note: the per-entry "nutrients" are each food's individual contribution, which is distinct from the day-level nutrition_summary aggregate below.

Also returns a top-level energy_summary field with pre-computed values most relevant to the user:

  • total_target_kcal: daily calorie target dynamically adjusted for expenditure and weight goal (equivalent to Cronometer's "Total Target" in the Energy Summary screen)

  • consumed_kcal: total calories consumed

  • remaining_kcal: calories remaining to stay on target (total_target_kcal - consumed_kcal). Always report this when summarizing the user's day. Prefer this over manually deriving values from the burn breakdown fields.

Also returns a nutrition_summary field with consumed totals for every nutrient the user tracks in Cronometer (macros plus any tracked micronutrients such as saturated fat, cholesterol, or omega-3/6):

  • macros: flat macro totals (energy, protein, carbs, net_carbs, fat, fiber, alcohol)

  • nutrients: the full list of tracked nutrients with amounts and units

Args: date: Inclusive end date: YYYY-MM-DD, today, yesterday, or N days ago. Defaults to today in the account timezone, resolved at call time. days: Number of calendar days, 1–31 (default 1). Includes the end date; days=3 includes today, date='yesterday', days=3 excludes today.

One day returns the usual date/diary/summaries. Multiple days return start_date, end_date, and a days list of those objects, oldest first.

add_food_entryA

Add a food entry to the Cronometer diary.

Use search_foods to find food_id and measure_id, then get_food_details to confirm serving sizes and gram weights.

Args: food_id: Numeric food ID from search_foods results. measure_id: Measure/unit ID from get_food_details. grams: Weight of the serving in grams. date: Date to log as YYYY-MM-DD (defaults to today). translation_id: Translation ID from search results (usually 0). diary_group: Meal slot -- one of "auto", "breakfast", "lunch", "dinner", "snacks" (case-insensitive, default "auto").

remove_food_entryA

Remove one or more food entries from the Cronometer diary.

Use get_food_log to find entry IDs.

Args: entry_ids: List of serving/entry IDs to remove. date: Date the entries belong to as YYYY-MM-DD (defaults to today).

mark_day_completeA

Mark a diary day as complete or incomplete.

Args: date: Date to mark as YYYY-MM-DD. complete: True to mark complete, False for incomplete.

copy_dayA

Copy all diary entries from the previous day to the given date.

Additive -- does not remove existing entries on the destination date.

Args: date: Destination date as YYYY-MM-DD (defaults to today).

get_daily_nutritionA

Get consumed macro and micronutrient totals for one or more days.

Use days=N for calories/nutrients over the last N calendar days. Prefer relative inputs over dates calculated from conversation history.

Returns the amounts actually consumed for the day, covering every nutrient the user tracks in Cronometer (i.e. has a target set for). The response has:

  • summary: flat macro totals (energy, protein, carbs, net_carbs, fat, fiber, alcohol). A value is null if that macro isn't tracked.

  • nutrients: the full list of tracked nutrients, each with id, name, amount, unit, category, and confidence.

A nutrient only appears if it's tracked in Cronometer. To surface e.g. saturated fat, cholesterol, or trans fat, set a target for it in Cronometer and it will flow through automatically.

Args: date: Inclusive end date: YYYY-MM-DD, today, yesterday, or N days ago. Defaults to today in the account timezone, resolved at call time. days: Number of calendar days, 1–31 (default 1). Includes the end date; days=3 includes today, date='yesterday', days=3 excludes today.

One day returns date, summary, and nutrients. Multiple days return start_date, end_date, and a days list of those objects, oldest first.

get_nutrition_scoresA

Get nutrition scores with per-nutrient consumed amounts and category grades.

Returns category scores (All Targets, Vitamins, Minerals, Electrolytes, Antioxidants, Immune Support, Metabolism, Bone Health) with the actual consumed amount and confidence level for each tracked nutrient.

This is the richest nutrition endpoint -- use it when you need to know both how much of each nutrient was consumed AND how close each is to the target.

Args: date: YYYY-MM-DD, today, yesterday, or N days ago. Defaults to today in the account timezone, resolved at call time. Prefer relative inputs for relative questions over dates from conversation history.

search_foodsA

Search Cronometer's food database by name.

Returns matching foods with their IDs and source information. Use the food_id and measure_id from results with add_food_entry, or pass food_id to get_food_details for full nutrition info.

Args: query: Food name or keyword (e.g. "eggs", "chicken breast").

get_food_detailsA

Get detailed food information including nutrition and serving sizes.

Use this after search_foods to get the full nutrient profile and available measure_ids needed for add_food_entry.

Args: food_id: Food ID from search_foods results.

add_custom_foodA

Create a custom food in Cronometer with specified nutrition.

Nutrient amounts should be for the full serving size specified. After creation, use the returned food_id with add_food_entry to log it.

Args: name: Food name. calories: Calories per serving (kcal). protein_g: Protein per serving (g). fat_g: Fat per serving (g). carbs_g: Carbs per serving (g). fiber_g: Fiber per serving (g, default 0). sugar_g: Sugar per serving (g, default 0). sodium_mg: Sodium per serving (mg, default 0). saturated_fat_g: Saturated fat per serving (g, default 0). extra_nutrients: Additional nutrients beyond the core macros above (vitamins, minerals, amino acids, etc.), keyed by Cronometer nutrient ID (from get_daily_nutrition, which pairs each id with its name) and valued per the full serving. IDs aren't validated, so a wrong one writes the wrong nutrient; must not reuse an ID the named macro args already cover. serving_name: Name for the serving size (default "1 serving"). serving_grams: Weight of one serving in grams (default 100).

update_custom_foodA

Edit an existing custom food (one you created) in place.

Only the arguments you pass change; everything else keeps its current value. Find the food_id with search_foods (source "Custom") or get_food_details. Diary entries that already use the food pick up the new values. Recipes cannot be edited with this tool, even though they also show as source "Custom".

Nutrient amounts are per serving: the food's default serving, or serving_grams when you pass it. To change the serving weight without re-entering nutrition, pass serving_grams alone; the stored per-100g values stay put, so the per-serving numbers scale with the new weight.

Args: food_id: ID of the custom food to edit. name: New food name. calories: Calories per serving (kcal). protein_g: Protein per serving (g). fat_g: Fat per serving (g). carbs_g: Carbs per serving (g). fiber_g: Fiber per serving (g). sugar_g: Sugar per serving (g). sodium_mg: Sodium per serving (mg). saturated_fat_g: Saturated fat per serving (g). extra_nutrients: Additional nutrients keyed by Cronometer nutrient ID (from get_daily_nutrition) and valued per serving; must not reuse an ID the named args already cover. serving_name: New name for the default serving. serving_grams: New weight of the default serving in grams.

delete_custom_foodA

Delete a custom food (one you created) by retiring it.

The food disappears from search and from the Custom Foods list. Diary entries that already use it are kept, and get_food_details can still read it by ID. Database foods (USDA, NCCDB, CRDB, ...) and recipes cannot be deleted with this tool.

Args: food_id: ID of the custom food to delete.

add_recipeA

Create a recipe in Cronometer from other foods in the database.

Unlike add_custom_food, which takes hand-entered nutrition, a recipe references existing foods by ID and Cronometer derives the full nutrient profile (including micronutrients) from those ingredients.

Use search_foods to find each ingredient's food_id. After creation, use the returned food_id with add_food_entry to log it.

Args: name: Recipe name. ingredients: List of {"food_id": int, "grams": float} objects, one per ingredient. An optional "measure_id" overrides the unit shown in Cronometer's UI; "grams" always drives the nutrition math. serving_name: Name of the default serving measure (default "Serving"). serving_grams: Grams in one serving. Defaults to the full batch weight (one serving = the whole recipe). comments: Free-text recipe notes.

import_recipeA

Create a recipe from a free-text ingredient list.

Cronometer's "Import Recipe" feature: pass ingredients as plain text, one per line, and the server matches each to a food and converts the amount to grams. No need to call search_foods first.

Prefer this when the user describes ingredients in their own words. Use add_recipe instead when you have exact food_ids and gram weights -- e.g. the user confirmed specific foods from search_foods results.

Matching is fuzzy, so report the returned matches back to the user for confirmation. Unresolved lines are listed under "unmatched" and excluded from the recipe. This saves to My Foods; use add_food_entry to log it.

Args: ingredients: Ingredient lines separated by newlines, e.g. "2 tbsp olive oil\n200g chicken". Include quantities where known, since bare names can match surprising amounts. name: Recipe name. Defaults to a server-generated one.

get_macro_targetsA

Get current macro targets including weekly schedule and templates.

Returns the weekly macro schedule (which template applies to each day) and all saved macro target templates with their values.

get_fasting_historyA

Get fasting history from Cronometer.

Returns fasts within the date range including status, timestamps, and duration.

Args: start_date: Start date as YYYY-MM-DD (defaults to 30 days ago). end_date: End date as YYYY-MM-DD (defaults to today).

get_fasting_statsA

Get aggregate fasting statistics.

Returns total fasting hours, longest fast, average fast duration, and completed fast count.

list_biometricsA

List the biometric metrics tracked in Cronometer.

Returns every metric type the account can record (Weight, Body Fat, Heart Rate, Blood Glucose, Waist Size, Sleep, blood panels, body measurements, etc.). Use the metric_id and a unit_id from the results with get_biometrics.

get_biometricsA

Get a biometric time series such as weight or body fat from Cronometer.

Returns the recorded values over the date range as a list of {day, value} points.

Use list_biometrics to find metric_id and unit_id (e.g. Weight is metric_id 1, with unit_id 1 for kg or 2 for lbs).

Args: metric_id: Numeric metric ID from list_biometrics. unit_id: Numeric unit ID from the metric's units in list_biometrics. start_date: Start date as YYYY-MM-DD (defaults to 30 days ago). end_date: End date as YYYY-MM-DD (defaults to today).

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.4/5.0

Scored across 19 tools

Disambiguation5/5

Each tool targets a distinct action and resource. Similar nutrition query tools (get_food_log, get_daily_nutrition, get_nutrition_scores) have clear differentiators: diary entries with per-food details, daily totals, and category scores respectively. Recipe creation tools are separated by input type (free text vs. food IDs).

Naming Consistency5/5

All tools follow a consistent snake_case verb_noun pattern (e.g., get_food_log, add_food_entry, update_custom_food, list_biometrics). Verbs like get/add/remove/update/delete/search/copy/mark are used predictably across resource types.

Tool Count4/5

At 19 tools, the set is slightly larger than the ideal 3-15 range but each tool addresses a distinct capability (diary, food database, custom foods, recipes, biometrics, fasting, targets). The count is justified by the breadth of Cronometer's feature set without becoming unwieldy.

Completeness4/5

The tool surface covers core workflows: food logging, diary management, custom food CRUD, recipe creation, nutrition analysis, biometrics, and fasting. Minor gaps exist (e.g., no direct diary entry editing, no exercise logging tool), but agents can work around these via remove/add or by using existing tools.

Maintenance

ActivityActive
ResponsivenessWithin a week