# Gutlog for agents

Gutlog logs what you eat from a photo in ChatGPT or Claude: calories, macros, nutrients and ingredients with a confidence score you can fix in one tap. Clean-ingredient verdicts, organic advice, a barcode index, tummy scores, trigger analysis and elimination diets, from the web app, MCP, the CLI or the API.

## Setup

A person sets Gutlog up by pasting one sentence into their assistant: "Set up Gutlog for me: read https://getgutlog.com/setup.md and follow it."

- [setup.md](https://getgutlog.com/setup.md): instructions for the assistant: which client it runs in, the command or the exact clicks, then verify with `get_onboarding` and log a first meal.
- [Setup page](https://getgutlog.com/setup?ref=llms): every client with copy buttons and one-click links (ChatGPT, Claude, Claude Code, Codex, Cursor, VS Code, Gemini CLI, other MCP clients).

## Connect and authenticate

- MCP (streamable HTTP): `https://getgutlog.com/api/mcp`. One tool per op. OAuth sign-in through the browser (see https://getgutlog.com/.well-known/oauth-protected-resource), or an API key. Setup for every client: https://getgutlog.com/setup.md.
- REST: `POST https://getgutlog.com/api/v1/{op}` with the op's input as JSON; read-only ops also accept GET with `?input=<url-encoded JSON>`. `GET https://getgutlog.com/api/v1` lists every op with its JSON Schema.
- CLI: `npx @meterapp/gutlog <op> [--field value] [--json '<json>']`; `npx @meterapp/gutlog login` signs in with the browser and saves a key. In scripts set `GUTLOG_API_KEY`.
- TypeScript SDK: `npm install @meterapp/gutlog-sdk`, then `new Gutlog().call("log_meal", {...})`: typed methods per op, retries with idempotency keys. Guide: https://getgutlog.com/docs/sdk?ref=llms.
- API keys: `Authorization: Bearer gutlog_…`. Create one in the web app, with `npx @meterapp/gutlog login` or `create_api_key`. A key can be narrowed to scopes: `<group>:read`, `<group>:write`, `<group>:*`, `*:read`, and `billing:purchase` (implied by nothing).
- Errors are RFC 9457 problem+json with a `code` and `request_id`; a 402 carries a checkout_url. See https://getgutlog.com/docs/errors?ref=llms.

Claude Code:

```bash
claude mcp add --transport http gutlog https://getgutlog.com/api/mcp
```

## Workflows

1. Orient: `get_onboarding` (the setup checklist and the next step), `get_account` (plan and today's analyses).
2. Log: the person shares a photo or describes a meal → `log_meal` with your draft → one line back plus the returned questions. A barcode you can read goes in the item's `barcode`.
3. Review: `get_day` (a day's meals, totals and how many need review). Edit ops (portions, confirming or rejecting ingredients, nutrient overrides) are listed under Meals as they ship.
4. Gut, clean and programs: symptom logging, triggers, clean verdicts and elimination programs are listed below as they ship; always run a program's safety screen first.
5. Billing: `get_pricing` → `create_checkout_link` for a human to pay; `get_billing_link` for invoices and cancellation.

## Rules

- Start with `get_onboarding`: it says what is set up, what is next and which op does it.
- Log first, fix later: when the person shares a meal photo or describes a meal, call `log_meal` with your own draft right away (it is free and unlimited), reply with one line of what was logged, then ask the `questions` it returns (at most three). Ingredient confidence: ≥0.85 seen or told; 0.6–0.85 very likely; 0.3–0.6 plausible but hidden (cooking fat, butter, sugar, garlic, onion); leave out anything below 0.3.
- Gutlog is not medical advice and never diagnoses. Describe gut patterns as hypotheses to test, with how much data backs them. Elimination programs start with a safety screen and recommend a registered dietitian; never help someone skip the screen. Send red-flag symptoms (blood in stool, unintended weight loss, fever, night-time symptoms) to a doctor.
- Food, symptom and program data are health data. Do not copy them anywhere outside the conversation and the tools.
- Clean-ingredient verdicts come from our own published rubric with an evidence level per flag; say when a flag is a preference rather than settled science.
- Never buy, change or cancel a plan on your own initiative. Quote the plan and price from get_pricing, and only call subscribe or cancel_subscription with confirm: true after a human approved it; otherwise give them the create_checkout_link URL.
- Use read-only ops freely; every write is recorded in the activity log with your surface.
- When a call fails in a way that looks like a Gutlog bug, report_issue with the error's request_id, the op and context; when the human wishes Gutlog did something it cannot, request_feature. If they come back filed: false with `similar`, upvote_feedback the match instead. Never invent a review: submit_review only with the human's rating and words.

## Meals, confidence and units

The host model does the vision: it looks at the photo and sends `log_meal` a draft (items with grams or a household portion, an optional barcode, cooking method, and ingredients with a confidence each). Gutlog matches each item against the person's own foods, the barcode index and the food database, then portions, scores and stores it. The meal is always stored; `needs_review` is set when the meal confidence is under the person's threshold (default 0.80) or a possible ingredient is a known trigger. Ingredient tiers: confirmed ≥0.85 (or from a label, counted), likely 0.6–0.85 (counted), possible 0.3–0.6 (suggested, not counted), dropped below 0.3. Guide: https://getgutlog.com/docs/meal-drafts?ref=llms.

Nutrients are integers in a base unit, never floats: energy (mkcal), protein (mg), carbs (mg), fat (mg), saturated_fat (mg), trans_fat (mg), fiber (mg), sugar (mg), added_sugar (mg), sodium (mg), cholesterol (mg), potassium (mg), calcium (mg), iron (mg), magnesium (mg), zinc (mg), vitamin_c (mg), vitamin_a (ug), vitamin_d (ug), vitamin_b12 (ug), folate (ug), caffeine (mg). mkcal is millikilocalories (1 kcal = 1000 mkcal); ug is micrograms. `totals_display` carries kcal and grams for people. Guide: https://getgutlog.com/docs/nutrients?ref=llms.

## Pricing

Unit: analyses: one photo or text analysis on our model (a photo sent through the web app, CLI, API or email; free text; a label photo), counted per UTC day. Logging a meal your assistant already analyzed (ChatGPT, Claude over MCP), barcode scans of indexed products and edits are free and unlimited. Yearly is $60 instead of $96.

The full pricing document (JSON, no credential, the same shape on every Meter product): `GET https://getgutlog.com/api/v1/pricing`; MCP `get_pricing` (also on the no-auth catalog server https://getgutlog.com/api/mcp/catalog); CLI `npx @meterapp/gutlog pricing --json`; human page: https://getgutlog.com/pricing?ref=agent.

- Free (`free`): free. 0 photo or text analyses a day on our model, unlimited history; logging from your assistant is unlimited. Your food database, from your own AI assistant.
- Plus (`plus`): $8/month or $60/year. 50 photo or text analyses a day on our model, unlimited history; logging from your assistant is unlimited. Gutlog does the work: the app, reminders, plans and gut analysis. Buy: https://getgutlog.com/checkout?plan=plus&ref=agent

Limits: No overage: analyses past the 0 a day are refused until the next UTC day or an upgrade. Logging a meal the assistant already analyzed, barcode scans and edits never count.

Buying a plan (never collect card details; the human pays on Stripe):

- MCP `create_checkout_link`, CLI `gutlog upgrade --plan plus [--yearly]`, REST `POST /api/v1/billing/checkout` return a Stripe Checkout URL for a human. Nothing is charged until they complete it.
- Before signup: create_checkout_link needs no account: without a credential it returns a Stripe Checkout URL for a human. After paying they sign in to Gutlog with the same email; the subscription attaches to their organization on return (or claim_checkout {session_id}).
- With a saved card: subscribe {plan, interval, confirm: true} changes the plan on the organization's saved card, only after a human approved the price.
- Account and invoices: get_billing_link (invoices, card, cancel); get_account (plan, usage, what the next plan adds).

## Feedback and reviews

Feature requests are public on https://getgutlog.com/feedback?ref=llms; issue reports are private to the reporter and the Gutlog team. Reviews are public on https://getgutlog.com/reviews?ref=llms, one per account. Guide: https://getgutlog.com/docs/feedback?ref=llms.

| action | MCP tool | CLI | REST |
| --- | --- | --- | --- |
| list / search the board | `list_feedback` | `npx @meterapp/gutlog feedback list` | `GET https://getgutlog.com/api/v1/feedback` (public) |
| request a feature | `request_feature` | `npx @meterapp/gutlog feedback request "<title>"` | `POST https://getgutlog.com/api/v1/feedback/features` |
| report an issue | `report_issue` | `npx @meterapp/gutlog feedback report "<title>" [--last]` | `POST https://getgutlog.com/api/v1/feedback/issues` |
| upvote | `upvote_feedback` | `npx @meterapp/gutlog feedback upvote <id>` | `POST https://getgutlog.com/api/v1/feedback/{id}/votes` |
| post / edit a review | `submit_review` | `npx @meterapp/gutlog review --rating 5 --body "…"` | `PUT https://getgutlog.com/api/v1/reviews/me` |

## Ops

### Meals and diary

- `log_meal` (write): Log what the person ate.
- `get_day`: One day of the food diary in the person's timezone: every meal with its items (match, grams, nutrients, confidence) and ingredients (id, tier, confidence, status), the day's nutrient totals, the person's daily goals and how many meals need review.
- `get_meal`: One logged meal with everything an edit needs: item ids, ingredient ids, tiers, statuses and the open questions.
- `list_review_queue`: Meals flagged needs_review (low confidence, a possible trigger or allergen, an implausible portion), newest first, each as a full meal with its questions.
- `update_meal` (write): Change a logged meal: its title, type, time or note; per item (meal_item_id from the meal) its grams or household portion ("the chicken was more like 200 g"), its match (food_id from search_foods: "it was oat milk"), its name, or remove it; add_items with the same item shape as log_meal.
- `confirm_ingredients` (write): The person says these ingredients were in the meal ("yes, butter"): ids from the meal's ingredients or questions, or all_likely: true with meal_id to confirm every likely one at once ("yes, that's right").
- `reject_ingredients` (write): The person says these ingredients were not in the meal ("no cheese", "no garlic"): ids from the meal's ingredients or questions.
- `add_ingredients` (write): Add ingredients we missed to one item ("it had onions", "cooked in butter"), confirmed.
- `set_nutrients` (write): Override nutrient values of one item directly ("the protein was more like 45 g", "it said 320 kcal").
- `mark_reviewed` (write): The person looked at the meal and it is right as it is: it leaves the review queue and stays out.
- `delete_meal` (write): Remove a meal from the diary (logged twice, or never eaten).
- `copy_meal` (write): Log a meal again ("same as yesterday's breakfast"): meal_id, or date + meal_type for the latest meal of that type that day.
- `save_personal_food` (write): Save a corrected item (meal_item_id) or a whole meal (meal_id, with a name) as one of the person's own foods: "save this as my usual latte".
- `list_personal_foods`: The person's own foods (saved as usual or learned from corrections), most used first, with nutrients per 100 g, default grams and ingredients.
- `archive_personal_food` (write): Stop matching a personal food (it was wrong, or the person no longer eats it).
- `rate_analysis` (write): Thumbs up or down on how well a meal was analyzed, with an optional reason in the person's words.
- `get_calibration`: How well ingredient confidences match what the person confirmed and rejected: per 0.1 bucket and source (photo, text, database), how many were answered, the confirm rate and the gap from the bucket's midpoint.
- `get_calibration_all`: Calibration across every organization (counts only), for tuning thresholds and the analysis prompt.
- `refresh_global_aliases` (write): Promote correction patterns seen from at least 20 different people to shared aliases (and drop ones that fell under).
- `get_logging_settings`: The person's review threshold (meals under it are flagged) and daily nutrient goals (integers; goals_display in kcal and grams).
- `update_logging_settings` (write): Set the review threshold (0–1; lower flags fewer meals) and daily goals in display units: {"energy": 1800, "protein": 120, "sodium": 2000} (kcal, grams, mg).

### Foods

- `search_foods`: Find canonical foods by name in USDA FoodData Central (Foundation, SR Legacy and FNDDS mixed dishes) plus packaged products in the barcode index.
- `get_food`: One canonical food by id (from search_foods, e.g.

### Products

- `lookup_barcode`: Find a packaged food by its barcode: our product index first (instant), then Open Food Facts, then USDA Branded Foods; a product found outside the index is added to it.
- `get_product`: A product already in our index by GTIN or id: brand, name, serving, nutrients per serving and per 100 g, ingredient text and parsed ingredient ids, allergens, verification status, the source of every field and the attribution to show, and its public page URL.
- `scan_label` (write): Read a food package from photos on our model: the nutrition facts panel, serving size, ingredient statement and the barcode digits if visible.
- `submit_product` (write): Add or correct a packaged food in the product index from its label: the barcode plus what the label says (brand, name, serving size and grams, the nutrition panel per serving as integers in stored units, the ingredient statement verbatim).
- `list_submissions`: Gutlog staff: product label submissions waiting for review (pending and conflicting by default, oldest first) with the label, the diff against the product and the revision it proposes.
- `review_submission` (write): Gutlog staff: accept a label submission (its label becomes the product's, recorded as a revision with a diff, and the product is verified) or reject it (a pending revision it proposed is dropped).

### Clean and organic

- `check_clean`: Judge ingredients against Gutlog's published clean-ingredient rubric: pass exactly one of ingredients_text (a label as printed), ingredients (names), barcode (a product in the index) or meal_id (a logged meal).
- `get_clean_rubric`: The clean-ingredient rubric as data: version, scoring rules, profiles (strict, balanced, custom) with their thresholds, evidence levels, categories, every rule (ingredient, aliases, category, evidence, penalty, why, citation), additives the EU bans or restricts, and this year's EWG Dirty Dozen and Clean Fifteen with the citation.
- `get_clean_profile`: The person's clean profile: strict, balanced (the default) or custom, and for custom the level per category (off, balanced or strict).
- `set_clean_profile` (write): Choose how strictly food is judged: strict (every rule, including gums, starches and all added sugars), balanced (the default) or custom.
- `clean_summary`: How clean the person ate from `from` to `to` (diary days, inclusive, at most 92 days), or over the last `days` days up to today in their timezone (default 7): the overall verdict and mean score, one entry per day with its meals' verdicts and scores, verdict counts, the worst offenders (flagged ingredients by how often and how heavily they appeared, with evidence and why) and Dirty Dozen or Clean Fifteen produce eaten.
- `suggest_swaps`: Cleaner products of the same kind from the product index: for one product (barcode) or each indexed product in a logged meal (meal_id).

### Gut

- `log_symptoms` (write): Record how the person's gut feels: severity 0–10 for bloating, abdominal_pain, gas, nausea, reflux and urgency (only the ones they mention), an overall severity, Bristol stool type 1–7, bowel movements today, energy 0–10, and the time.
- `list_symptom_logs`: Symptom logs in a date range (default the last 14 days), newest first: severities per symptom, overall, Bristol type, stool count, energy, fine, and each log's burden (0–10).
- `delete_symptom_log` (write): Delete one symptom log the person logged by mistake, and recompute that day's tummy score.
- `get_tummy_scores`: Daily tummy scores 0–100 (100 = no gut symptoms) for a date range, default the last 30 days: per day the score, number of logs, fine logs, worst symptom and Bristol types, plus the average and the trend (second half minus first half).
- `get_pending_checkins`: Check-ins due now: one 2–4 hours after each logged meal, an evening check-in, today's reintroduction challenge dose and the weekly adequate-relief question when a program is running.
- `set_checkin_preferences` (write): Turn check-in emails on or off (off, evening only, or also 2–4 h after each meal and program reminders) and set the local hour of the evening check-in (17–23).
- `get_exposures`: What the person was exposed to, per meal and per day, for a date range (default the last 7 days, at most 92): FODMAP subgroups (fructans, GOS, lactose, excess fructose, sorbitol, mannitol), gluten, dairy protein, caffeine, alcohol, fat load, capsaicin, carbonation, sugar alcohols, emulsifiers, insoluble fiber and high-histamine foods, each with the level a typical serving carries and the ingredients that brought it, plus a summary per exposure.
- `get_triggers`: Which foods look safe for this person and which don't, from their own log: for each exposure, the estimated extra symptom severity (0–10 points) in that exposure's time window after eating, the probability it is a real effect, and how many meals it rests on; or "not_enough_data" (fewer than 5 exposure meals followed by a check-in), "inconclusive", "unlikely", or "confirmed"/"ruled_out" from a reintroduction challenge.
- `food_tummy_score`: Predicted gut-friendliness 0–100 of a food, a barcode product or a list of taxonomy ingredients for this person (100 = nothing we expect to bother them), with the exposures behind it and their citations.
- `check_ingredients`: Which of these ingredients (taxonomy ids or names) are the person's known or suspected triggers or allergens, with the exposures involved and low-FODMAP swaps.
- `get_low_fodmap_swaps`: Lower-FODMAP alternatives for an ingredient or a food (its ingredients), with the FODMAP subgroups each one avoids and the published sources.

### Programs

- `screen_for_program`: The safety screen every elimination program starts with.
- `start_program` (write): Start an elimination program after the safety screen (pass the same answers as safety_screen).
- `get_program`: The running elimination program (or one by id): phase, day, next action in words to relay, the schedule of challenges with doses and results, the tummy-score comparison before and during elimination, low-FODMAP swaps for foods the person actually ate recently, and the dietitian recommendation.
- `record_relief_check` (write): The weekly question during elimination: "Over the past 7 days, have you had adequate relief of your gut symptoms?" Record yes or no.
- `record_challenge` (write): During reintroduction: record that the person ate today's challenge dose and how they reacted (none, mild, moderate, severe, or unsure).
- `advance_program` (write): Move the running program to its next phase when it is ready: elimination → reintroduction (after 2+ weeks with adequate relief), removal → reintroduce (after 2+ weeks), reintroduction → personalization (every challenge done, or skip_remaining), then finish.
- `stop_program` (write): Stop the running program (no relief at 6 weeks, too hard to follow, or a doctor's advice).

### Insights

- `get_diary`: The food and symptom diary over a range of days (default the last 7, at most 31 per call), for reading or auditing: every day (empty ones too, so gaps show) with its meals, items (match, grams, nutrients, confidence, source), ingredients (tier, confidence, status) and symptom logs, each with who logged it and from where.
- `get_nutrition_summary`: Calories, macros or any nutrient over any range (default the last 7 days, up to a year): totals, the average per logged day, a breakdown by day, week, month or meal type, and each goal (set_goals) with the average as a percent and how many days met it.
- `query_foods`: What the person has eaten, grouped by food (default the last 90 days): how many times, on how many days, when last, grams and nutrients contributed.
- `audit_diary`: Checks the diary before you trust it (default the last 14 days, at most 92): days with missing meals, meals flagged for review and possible ingredients nobody confirmed, low-confidence matches, implausible portions, days with meals but no symptom log, and likely duplicate meals.
- `export_data` (write): Exports the diary (default everything) as files: export.json (meals → items → ingredients, symptom logs, corrections and the data dictionary), meals.csv, items.csv, ingredients.csv, symptoms.csv, corrections.csv, daily.csv and README.md (the data dictionary: every file, column and unit).
- `get_goals`: The person's daily nutrition goals (calories, protein, carbs, fat, fiber, sugars, saturated fat, sodium) as stored integers and in kcal and grams.
- `set_goals` (write): Sets daily goals in the units people use: calories (kcal), protein_g, carbs_g, fat_g, fiber_g, sugar_g, added_sugar_g, saturated_fat_g, sodium_mg.
- `get_survey`: The one-question survey due for this person, if any (at most one a week, never one they answered): {survey: {id, question, kind, scale | choices, how}} or {survey: null}.
- `answer_survey` (write): Records the person's answer to a survey (logging_ease, accuracy, pmf, next_improvement, nps, cancel): a number on the survey's scale or one of its choice ids, plus anything else they said as comment.
- `get_query_privacy`: Whether Gutlog keeps the words of free-text requests (keep_raw_queries, off by default) and what it keeps either way.
- `update_query_privacy` (write): Whether Gutlog may keep the words of free-text requests (a search, a meal description) to improve how it understands them.
- `get_query_report`: Gutlog team only.

### Events

- `list_events`: The organization's event log, newest first: every platform event (meal.logged, meal.updated, meal.reviewed, meal.deleted, product.submitted…) with its payload (ids and flags, never food or symptom text), subject, source and time.
- `get_event`: One event from the organization's event log by id, with its payload and how each internal consumer handled it (done, failed with the error, dead after its retries).

### Account

- `get_organization`: The organization this credential acts in (a person's own diary is their personal organization): id, slug, name, timezone (the diary day boundary) and language, and the caller's role.
- `update_organization` (write) (admin): Change the organization's name, default timezone (IANA, e.g.
- `list_activity`: Every change made through the platform, newest first: who (a person, an API key, an AI agent, a worker), from which surface (dashboard, api, mcp, cli, worker, ai) and what.
- `get_onboarding`: The person's setup checklist, in order: connect their AI assistant (MCP), log a first meal, scan a barcode, log symptoms, start an elimination program.
- `get_referral_stats`: Gutlog team only.
- `get_profile`: Your own settings, the same in every organization: `locale`, the language the dashboard and every email to you are written in (one of en), or null when you never chose one (the dashboard then follows the browser, emails are English).
- `update_profile` (write): Changes your own settings: `locale` (en) is the language of the dashboard and of every email Gutlog sends you; null forgets it.

### Members and sharing

- `list_members`: Everyone in this organization with their email, role (owner, admin, member, viewer) and teams.
- `list_invites` (admin): Pending invitations to this organization (email, role, teams, who invited, when it expires).
- `list_teams`: Teams in this organization with their members (maintainer or member) and the resources (programs) shared with each team.
- `create_team` (write): Create a team (a group of members to share programs with).
- `update_team` (write): Rename a team or change its description.
- `delete_team` (write): Delete a team.
- `set_team_member` (write): Add an organization member to a team, or change their team role (maintainer manages the team; member is in it).
- `remove_team_member` (write): Take someone out of a team (they stay in the organization).
- `list_resource_access`: Who can see a shareable resource (an elimination program): its visibility (org or restricted), its creator, and every grant to a team or person with its access (read, write, admin).
- `set_resource_visibility` (write): org: every organization member sees the resource (viewers read, members write).
- `share_resource` (write): Give a team or a person read, write or admin access to a program (replacing what that team or person had).
- `unshare_resource` (write): Remove a team's or person's grant on a program.
- `list_audit_log` (admin): Membership, role, team, invite, API key, billing, settings and sharing changes in this organization, newest first: who (a person, an API key, an OAuth client or the system), what, to what, and when.

### API keys

- `list_api_keys`: API keys of this organization (prefix only; the full key is shown once at creation), each with the role it acts with, its scopes and who created it.
- `create_api_key` (write): Create an organization API key for your backend, the CLI, an MCP host or CI.
- `revoke_api_key` (write): Revoke an API key immediately; every backend, CLI, CI job or MCP host using it stops working.

### Billing

- `get_pricing`: The plans (Free, Plus): price {monthly, yearly} in USD, photo/text analyses on our model included per day (logging a meal you analyzed yourself, barcode scans and edits are free and unlimited), limits (members, history days; null is unlimited), features, a checkout_url per paid plan, and how_to_buy.
- `get_account`: Who this credential acts for and what it may use: the organization, your role in it (viewer, member, admin, owner) and whether you are a person, an OAuth client or an API key (acting_as, with the key's scopes), the plan in force (status, interval, renewal or end date), today's usage against the daily allowance (analyses) with what remains and when it resets, and next_tier: what the next plan adds, its price and a checkout_url.
- `get_billing`: This organization's plan, subscription status, renewal or end date, whether a card is saved (so subscribe can charge it), and today's usage against the plan (analyses, members).
- `create_checkout_link` (write) (admin): A Stripe Checkout URL where a human pays for a plan; hand it to them (or open it in their browser).
- `subscribe` (write) (admin): Start or change this organization's paid plan in one call, charging the card already saved for the organization.
- `cancel_subscription` (write) (admin): Cancel the paid plan at the end of the current period (no refund; the plan stays until then, then the organization is on Free).
- `resume_subscription` (write) (admin): Undo a cancellation that has not taken effect yet, so the plan renews as before.
- `claim_checkout` (write) (admin): Attach a checkout paid before signup (create_checkout_link without a credential) to this organization, by its session_id (cs_…).
- `create_billing_portal_link` (write) (admin): A private Stripe page where a human downloads invoices, updates the card or billing details, or cancels.
- `get_billing_link` (write) (admin): The Stripe customer portal for a human: invoices, card and billing details, plan change and cancellation.

### Feedback

- `list_feedback`: The Gutlog feedback board: feature requests every customer can see, plus your own issue reports (and ones the team published), with status and upvotes, most upvoted first.
- `get_feedback`: One feedback item with its status, upvotes, comments (oldest first; official answers from the Gutlog team are marked `official`) and its timeline of status changes with the team's notes.
- `list_my_feedback`: What your organization filed (every status), the items you get email about (filed, upvoted, commented, followed) with whether you muted them, your organization's review, and whether feedback email reaches you.
- `request_feature` (write): Files a feature request on the Gutlog board and upvotes it for your organization.
- `report_issue` (write): Reports a problem with Gutlog itself: a failing or wrong call (pass the request_id from the error or the X-Request-Id header, and the op), a meal that matched the wrong food or got the wrong nutrients, a barcode that was not found, a docs error.
- `upvote_feedback` (write): Adds your organization's upvote to a feature request or issue ("me too"); votes decide what gets built and fixed first, and you get an email when its status changes.
- `remove_feedback_vote` (write): Takes back your organization's upvote on a feature request or issue, and stops its emails unless you filed or commented on it.
- `comment_on_feedback` (write): Adds context to an existing feature request or issue: your use case, another failing request, a workaround.
- `set_feedback_subscription` (write): With id: start or stop emails about one feature request or issue.
- `submit_review` (write): Posts your organization's public review of Gutlog (1–5 stars, what you like, what you don't, what you use it for), or edits it (once an hour; earlier versions are kept).
- `list_reviews`: Published reviews of Gutlog with the aggregate (average rating, count and distribution) and the team's responses.
- `update_feedback` (write): Gutlog team only.
- `respond_to_feedback` (write): Gutlog team only.
- `respond_to_review` (write): Gutlog team only.

### Pantry

- `list_locations`: The household's storage locations as a tree (e.g.
- `save_location` (write): Create, rename, retype, nest or archive storage locations.
- `add_pantry_items` (write): Record food the household has: from a receipt, barcode scans, or a fridge, freezer or pantry photo you read yourself (you list what you see; nothing is analyzed here).
- `list_pantry`: What is on hand, soonest expiry first.
- `get_pantry_item`: One item with its FoodKeeper shelf-life entry (days per storage, opened, thawed, freezer, tips) and its full history (added, used, moved, frozen, thawed, recounted, discarded: who, when, from which surface).
- `update_pantry_items` (write): Change items: resolve what it is (ingredient_id, barcode, foodkeeper_id), recount (quantity: how much is there now), change state (opened, cooked; freezing and thawing is move_pantry_items), dates, the printed date, an expiry you set yourself (expires_on; null returns to the estimate), price, store, notes.
- `move_pantry_items` (write): Move items to another location (location_id, a path, or a type).
- `consume_pantry_items` (write): Record food used: by item_id, or by ingredient_id or name (the soonest-expiring matching items are used first).
- `discard_pantry_items` (write): Record food thrown out, all or part, with a reason (expired, spoiled, freezer_burn, didnt_like, too_much, other) for waste tracking; pantry_summary totals it with its cost when the price is known.
- `list_expiring`: Items expiring within `days` (default 7) and, by default, already past their date, soonest first, each with days_left and a suggested action: use, freeze (freezable, not frozen, 2 days or less left) or toss (past a use-by or the safe time for perishable food), with a one-line why.
- `freeze_suggestions`: Items not frozen that FoodKeeper says freeze well and that expire within `days` (default 3), with how long each would keep if frozen today.
- `get_raw_ingredients`: The canonical ingredients on hand, deduplicated across items and locations: total amount (mass in g/kg, volume in ml/l, counts per unit), item ids, states, locations, soonest expiry and days left, soonest first; plus `unresolved` items with no ingredient.
- `set_par_levels` (write): Staples the household always wants on hand ("12 eggs", "1 gal milk", "2 cans tomatoes"), with an optional usual location and store.
- `get_shopping_list`: What to buy: items added to the list, staples below their par level (with the amount missing), and items used up in the last `used_up_days` (default 14) that are not on hand.
- `add_shopping_items` (write): Put items on the shopping list (name, optional ingredient_id, quantity and unit, store, notes).
- `check_off_shopping_items` (write): Mark list lines bought (or removed).
- `pantry_summary`: Counts on hand by location and state, how many are expired and expiring this week, unresolved items, and this month's use and waste: items thrown out, their cost when known, reasons and the foods most often thrown out.
- `get_shelf_life`: How long a food keeps in the pantry, fridge and freezer, sealed, opened and after thawing, from USDA FoodKeeper (public domain), by name, ingredient_id or foodkeeper_id.

Full schemas: https://getgutlog.com/llms-full.txt or https://getgutlog.com/openapi.json.
