mfp-mcp
Connect an MCP client to your MyFitnessPal account to read and update food, exercise, weight, water, notes, and nutrition history.
Search MyFitnessPal foods and draft options with calories, macros, and serving sizes before logging.
Log, replace, or delete real diary food entries by meal/date, with remembered food choices/pins.
Log weight and water, including correcting the day’s water total.
Read exercise diary entries and delete exercise entries by name match.
Read/write the MyFitnessPal daily note and save local-only feel notes.
Get day summaries, metric trends, and bulk-export nutrition history for analysis.
Store remembered foods and feel notes locally; use session-cookie authentication with optional auto-refresh.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mfp-mcplog a banana as a snack"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Log MyFitnessPal by talking to your AI.
Quickstart · Tools · Authentication · Changelog
MyFitnessPal MCP is a free, open-source MCP server that connects MyFitnessPal to Claude, Cursor, VS Code, or any MCP client. Log meals by talking, search the food database with macros, track trends, and export your nutrition history, all against your real MyFitnessPal diary.
Published on PyPI as mfp-mcp and in the
official MCP Registry
as io.github.Mason-Levyy/mfp-mcp.
Unofficial. MyFitnessPal has no public API; this reverse-engineers the web app's own endpoints. It can break whenever MFP changes their site. Use at your own risk, with your own account.
Why this one?
MyFitnessPal moved behind Cloudflare + NextAuth, which broke the username/password login that most existing integrations rely on. This server:
Authenticates with your browser session cookie over a real Chrome TLS fingerprint (curl_cffi), which passes Cloudflare
Auto-refreshes the session (optional): a headless browser profile rotates the token when it expires, and failed calls retry automatically
Writes, not just reads: log, modify, and delete real diary entries
Search-then-log: get candidates with macros, then log the exact item
Related MCP server: MyFitnessPal MCP Server
Quickstart
Connect your account (one-time; prompts you to paste a cookie — see Authentication):
uvx mfp-mcp authAdd the server to your client. The install buttons at the top do this in one click for Cursor and VS Code.
Claude Code
claude mcp add myfitnesspal -- uvx mfp-mcpOr install it as a plugin:
/plugin install myfitnesspal-mcp --marketplace Mason-Levyy/myfitnesspal-mcpClaude Desktop (
claude_desktop_config.json), Cursor (~/.cursor/mcp.json), Windsurf (~/.codeium/windsurf/mcp_config.json), and Cline (cline_mcp_settings.json) all take the same entry:{ "mcpServers": { "myfitnesspal": { "command": "uvx", "args": ["mfp-mcp"] } } }VS Code (or use the button above):
code --add-mcp '{"name":"myfitnesspal","command":"uvx","args":["mfp-mcp"]}'Codex CLI:
codex mcp add myfitnesspal -- uvx mfp-mcpGemini CLI:
gemini mcp add myfitnesspal uvx mfp-mcpTalk to it: "log a banana as a snack", "what did I eat yesterday?", "chart my weight this month".
Requires uv. Any MCP client that speaks stdio or streamable HTTP works, not just Claude.
Finding this useful? A ⭐ on GitHub helps other MyFitnessPal users find it.
Authentication
This server signs in with your browser's MyFitnessPal session cookie:
Log in at myfitnesspal.com
Open DevTools (F12) → Application (Chrome) or Storage (Firefox) → Cookies →
https://www.myfitnesspal.comCopy the value of
__Secure-next-auth.session-tokenPaste it into the
mfp-mcp authprompt, or on macOS runmfp-mcp auth --clipboardand copy the cookie: it connects as soon as the token reaches the clipboard
Sessions last 30 days from their last renewal. The server renews the session
whenever it builds a client and saves the cookies MyFitnessPal re-issues, so
the saved session stays current as long as it's used at least once a month.
mfp-mcp auth --check reports whether the saved session still works and
whether auto-refresh is set up; it renews and saves the session as it checks
and exits 1 when the session needs attention, so running it on a schedule
(cron, launchd) keeps an idle session alive and warns before it lapses.
Auto-refresh (recommended)
With the autorefresh extra, auth also seeds a persistent headless browser
profile. When MyFitnessPal rejects the session mid-call, the server tells your
client it is retrying, boots the profile headlessly, lets MyFitnessPal rotate
the session token, saves the fresh cookie, and retries the call.
uvx --from 'mfp-mcp[autorefresh]' playwright install chromium
uvx --from 'mfp-mcp[autorefresh]' mfp-mcp authThen use the same --from 'mfp-mcp[autorefresh]' form in your client config
(e.g. uvx --from 'mfp-mcp[autorefresh]' mfp-mcp).
Tools
Tool | What it does |
| Nutrition totals, diary entries, the MFP daily note, and feel note for a day |
| Candidate matches with brand, calories, macros, serving, and ids |
| Numbered options with every serving size, filtered/ranked by optional calorie and macro targets |
| Log a draft option (and serving), a remembered food, or exact ids to the real diary |
| Remembered query → food/serving choices (local) |
| Forget one remembered choice, or all of them |
| Remove a diary entry by name match |
| Replace an entry (or change its quantity), choosing the replacement like |
| Log a weight measurement (updates the same day on re-log) |
| Add water (cups, fl oz, mL, L) or set the day's total with |
| Read the exercise diary (cardio + strength) |
| List cardio and strength entries with each section's columns |
| Remove an exercise entry by name match ( |
| Read the MyFitnessPal daily diary note (the "Notes" box) for a day |
| Write that daily note to MFP (replace, or |
| Save a subjective "how I feel" note (stored locally, never sent to MFP) |
| One metric over a date range: weight, calories_in, protein, carbs, fat |
| Whole date range in one call, for analysis |
Logging flow
Food logging is draft-then-confirm, so what lands in your diary never depends on MyFitnessPal's search order:
fitness_draft_food("greek yogurt", min_protein=15, max_calories=150)returns numbered options. Each lists every serving size with calories and macros for the whole entry (serving × quantity) plus a suggested serving; options that meet the targets come first, near misses follow. Call it again with different targets to refine.fitness_log_food(draft_id=..., option=2, serving=1)logs exactly that food and serving, and remembers the choice for that query.Next time,
fitness_log_food(query="greek yogurt")logs the remembered food and serving without searching.
A bare fitness_log_food(query=...) with nothing remembered logs only when
exactly one result matches the name exactly; otherwise it logs nothing and
returns a draft to choose from. Remembered choices live in the local cache
(fitness_list_food_pins, fitness_clear_food_pin). Drafts expire after 24
hours.
fitness_modify_food picks the replacement the same way, before deleting
anything: a remembered food or a single exact-name match is used directly;
otherwise the entry is left alone and a draft comes back — call
fitness_modify_food again with the same query plus draft_id and
option.
fitness_log_food, fitness_delete_food, and fitness_modify_food all take
a meal argument the same way: breakfast/lunch/dinner/snacks, or the
literal name of any meal section currently on your diary — including a
renamed default meal or one of the up to two extra meals MyFitnessPal lets
you add in Diary Settings. Matching is case-insensitive against your
account's current meal labels. If you renamed a default meal, the keywords
still work: breakfast/lunch/dinner/snacks fall back to your first
through fourth meal, unless that slot now carries a different default name
(e.g. lunch won't land in a second meal you renamed to "Dinner"). Any other unrecognized meal raises an error instead
of silently logging into the wrong section.
Day summaries and trends read from a local SQLite cache that gap-fills from MyFitnessPal (first call on a fresh install fetches up to 30 days, one request per day).
Water logging reads the day's current total from /food/water, adds the requested
quantity, and posts the new total back to the same endpoint. Pass
replace=True to set the day's total outright (e.g. to fix a mislogged amount);
every call returns previous_ml, so a mistake can be reverted by passing it
back as amount with unit="ml" and replace=True. The separate
/stats request with a water_logged event is analytics telemetry; it does not
persist the water total.
Remote / HTTP mode
The default transport is stdio. For network clients:
mfp-mcp --http --host 127.0.0.1 --port 8484This serves streamable HTTP at /mcp. There is no built-in authentication —
never expose it to the internet. Bind to localhost and front it with
something that authenticates for you: a VPN/tailnet (e.g. tailscale serve),
an authenticating reverse proxy, or an OAuth-aware MCP gateway.
Configuration
Variable | Purpose | Default |
| Session cookie (full header or bare token); overrides the saved file | – |
| Your MFP username (not email); only needed if profile lookup fails | auto-detected |
| curl_cffi browser fingerprint (try |
|
| Gap-fill lookback window in days |
|
| Where the SQLite cache + browser profile live | platform data dir |
Troubleshooting
403 / Cloudflare blocked: try
MFP_IMPERSONATE=chrome124(or another curl_cffi target). Datacenter IPs get challenged far more than residential ones."Session expired": confirm with
mfp-mcp auth --check, then re-runmfp-mcp auth, or set up auto-refresh."couldn't read your MyFitnessPal profile": MFP's profile endpoint 500s for some accounts. Set
MFP_USERNAMEto your username (not your email).curl_cffi install issues: prebuilt wheels cover Linux/macOS/Windows; musl (Alpine) builds from source.
FAQ
How do I connect MyFitnessPal to Claude? Run uvx mfp-mcp auth once to
save your MyFitnessPal session, then add the server: claude mcp add myfitnesspal -- uvx mfp-mcp in Claude Code, or the JSON entry from the
Quickstart in Claude Desktop. Then ask Claude to log a meal or
show yesterday's diary.
Is it free? Yes. It's open source under the MIT license, and it doesn't sell or collect anything.
Is there an official MyFitnessPal API? Not one you can use. MyFitnessPal's API is limited to approved partners and isn't open to new applications, so there's no API key to get. This server signs in with your own browser session cookie and makes the same requests the MyFitnessPal website makes (see How it works).
Which MCP clients does it work with? Any client that runs a stdio or
streamable HTTP server, including Claude Desktop, Claude Code, Cursor, Windsurf,
Cline, and VS Code. Use the uvx mfp-mcp command from the
Quickstart. AI coding agents can follow
llms-install.md.
Can it log meals as well as read them? Yes. It logs, replaces, and deletes diary entries, logs weight and water, and writes the daily note. See Tools.
Where does my data go? The server talks only to MyFitnessPal. The session cookie stays in your local config directory, and day summaries, feel notes, and remembered foods stay in a local SQLite file. Tool results go to whichever MCP client and model you connect it to.
How it works
python-myfitnesspal parses the diary, measurements, and exercise pages — run over a
curl_cffisession that impersonates Chrome's TLS fingerprint so Cloudflare lets it through with just the NextAuth session cookie.Writes replicate the web app's own XHR calls: the legacy food-search page supplies the
food_id/weight_idthat/food/addaccepts, deletes go through/food/remove, water reads/writes via/food/water, and the daily note reads/writes via/food/note— each with the page CSRF token.Day summaries, trends, and exports read a local SQLite cache that gap-fills missing days. The MyFitnessPal daily note syncs both ways; feel notes are local-only.
Development
git clone https://github.com/Mason-Levyy/myfitnesspal-mcp
cd myfitnesspal-mcp
uv sync --extra autorefresh
uv run pytestTests run against synthetic MyFitnessPal HTML/JSON fixtures — no account
needed. Lint and formatting are enforced with ruff (uv run ruff check .,
uv run ruff format .).
Contributing
Issues and pull requests are welcome, especially endpoint captures when MyFitnessPal changes something. See CONTRIBUTING.md for setup, style, and the PR checklist, and SECURITY.md for how to report vulnerabilities privately. Release history is in CHANGELOG.md.
Support the project
If this server saves you time, please star the repo. Stars are how other MyFitnessPal users find it in GitHub search and MCP directories. Bug reports and endpoint captures are just as welcome in issues.
License
Available Tools
18 toolsfitness_bulk_exportExport date rangeARead-only
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.
start/end: YYYY-MM-DD (default: last 30 days ending today). sync_first: gap-fill from MyFitnessPal before exporting. Off by default so large historical exports stay fast on cached data.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| start | No | ||
| sync_first | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The read-only claim just restates readOnlyHint=true, but the description adds real behavioral context beyond the annotations: sync_first is off by default and trades freshness for speed on cached data, and an unset range defaults to the last 30 days. It does not mention any rate limits or size caps on very large exports.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the payoff (what gets exported) in the first sentence, then handles the range and sync parameters compactly. Every sentence adds a fact the agent needs; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still names the returned content, and with no parameter descriptions in the schema it supplies formats, defaults, and sync semantics. Nothing required for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema supplies no descriptions, titles beyond the key names, or formats, so the description carries the full burden. It documents all three parameters: start/end as YYYY-MM-DD with a last-30-days default, and sync_first as an opt-in MyFitnessPal gap-fill.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Export) plus scope (a whole date range at once) and enumerates exactly what is returned: per-day nutrition totals, food entries with macros, daily note, and feel notes. That scope language distinguishes it from single-day siblings like fitness_get_day and from fitness_get_trends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Frames the use case ('for analysis') and gives a clear conditional for sync_first ('gap-fill from MyFitnessPal before exporting', off by default to keep large historical exports fast). It never explicitly contrasts itself with fitness_get_day, so the agent must infer when a single-day call is preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_clear_food_pinForget remembered foodADestructiveIdempotent
Forget a remembered food choice for query, or every choice with
clear_all=True, so the next log of that query drafts options again.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| clear_all | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it destructive, non-read-only, and idempotent. The description adds behavioral context by stating what is forgotten and that future logs will re-draft options, which is valuable beyond the structured hints. It does not cover permissions or scope subtleties, but with annotations the bar is lower.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It packs purpose, parameters, and outcome into one efficient statement. Appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given annotations cover safety and idempotency, and no output schema exists, the description supplies the core purpose and effect. It leaves minor gaps around omitted-parameter behavior and relationship to the list sibling, but remains adequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for two parameters, so the description carries the burden. It explains query as the food choice and clear_all=True as clearing every choice, but omits that query is optional, default null, and what happens when no query is given with clear_all=False. Partial compensation yields a middle score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (forget) and resource (remembered food choice), and states the effect on future logs. It distinguishes itself from listing siblings implicitly as the removal action, though it does not explicitly name an alternative. Clear enough for an agent to identify the tool's core job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage by explaining the outcome: after forgetting, the next log drafts options again. However, it offers no explicit when-to-use/when-not guidance, prerequisites, or mention of siblings like fitness_list_food_pins. The context hint is useful but not a full usage guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_delete_exerciseDelete exercise entryADestructive
Remove exercise-diary entries by name match (case-insensitive).
query: text matched against logged exercise names. By default deletes
exactly one entry, like fitness_delete_food: an exact name match wins;
otherwise several matches raise an error listing the candidates, and no
match raises an error listing what's actually logged. Of several identical
rows (same name and columns), one is removed.
all_matches: delete every entry whose name contains query — for
cleaning up syncs that log one workout as several same-named rows
(e.g. Garmin's "Aerobics, general"). Check fitness_get_exercise_entries
first; a short query can match many entries.
date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| query | Yes | ||
| all_matches | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotency, and the description goes well beyond them: default single-row deletion, exact-match precedence, error behavior when several or zero matches occur, which identical row is removed, and the warning that a short query can wipe many entries. That is exactly the blast-radius context an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every subsequent sentence (error cases, all_matches semantics, date format) adds operational value. It is longer than average, but the density is justified; only the 'like fitness_delete_food' aside could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers default vs. bulk behavior, ambiguity/zero-match error outcomes, and per-parameter formats. An agent has everything required to call it correctly and anticipate the consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the load entirely — and it does: query is a case-insensitive substring/exact match against logged names, all_matches switches from one-entry to all-contains deletion, and date is documented with its YYYY-MM-DD format and today-default. All three parameters gain meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource ('Remove exercise-diary entries') and adds the matching mechanism (case-insensitive name match). It is clearly distinguishable from the sibling food-deletion tools and from the read-only fitness_get_exercise_entries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete context for the all_matches flag ('for cleaning up syncs that log one workout as several same-named rows') and directs the agent to check fitness_get_exercise_entries first. It stops short of an explicit exclusion statement (e.g. use fitness_delete_food for food entries), so it is strong context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_delete_foodDelete food entryADestructive
Remove a food from the MyFitnessPal diary by name match.
query: text matched against logged entry names (e.g. "banana"). If this
matches nothing, the error lists what's actually logged that day/meal — use
that to retry with a better query. If it matches more than one entry (and
none is an exact name match), the error lists the candidates; narrow query
to pick one. Identical duplicates (same name, including its quantity, in
the same meal) are interchangeable, so one of them is removed; call again
to remove another.
meal: optional breakfast|lunch|dinner|snacks or any meal name on the
account, to disambiguate duplicates. date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| meal | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the exact duplicate-removal semantics (identical name+quantity+meal entries are interchangeable, one removed per call), what the error payload contains, and the date/meal defaults. It does not mention permissions or whether the removed entry can be restored, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then grouped per-parameter with clear labels. Every sentence carries actionable information about retry behavior, but it is denser than strictly necessary and slightly verbose in the error-recovery clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema, the description covers the essentials: what is removed, how ambiguous matches and duplicates are handled, error-recovery path, and argument defaults. The only missing element is any statement about authorization or reversibility of the deletion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully carries the load: `query` is defined as a name match with an example ('banana'), `meal` is constrained to breakfast|lunch|dinner|snacks or any account meal name, and `date` is specified as YYYY-MM-DD defaulting to today. Every parameter gets semantics the bare schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource in the very first clause — 'Remove a food from the MyFitnessPal diary by name match' — including the matching mechanism. This cleanly separates it from siblings like fitness_log_food, fitness_modify_food, and fitness_delete_exercise without the agent needing to open a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong contextual guidance: use `meal`/`date` to disambiguate duplicates, retry with the error's listed candidates when the query matches nothing or multiple entries, and call again to remove further duplicates. It does not explicitly say when to prefer this over modify_food or other alternatives, so it stops short of a full when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_draft_foodDraft food entryARead-only
Draft a food entry: numbered options to choose from before logging.
Each option lists every serving size with its calories/protein/carbs/fat for the whole entry (serving × quantity) and a suggested_serving. The min_/max_ targets (grams; calories in kcal) also apply to the whole entry: options that fit come first, near misses follow, flagged fits_targets=false. A food you've confirmed before for this query is pinned to the top. The order is fixed once drafted.
Log a choice with fitness_log_food(draft_id=..., option=N, serving=M); call this again with different targets to refine. Drafts last 24 hours. date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| meal | No | breakfast | |
| limit | No | ||
| query | Yes | ||
| max_fat | No | ||
| min_fat | No | ||
| quantity | No | ||
| max_carbs | No | ||
| min_carbs | No | ||
| max_protein | No | ||
| min_protein | No | ||
| max_calories | No | ||
| min_calories | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the bar is lower, yet the description adds real behavioral traits: options are ordered with fits_targets=false near-misses after fits, a previously confirmed food is pinned to the top, the order is immutable once drafted, and drafts expire in 24 hours. It does not discuss error conditions or what happens if no option fits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then moves to output shape, ordering rules, the follow-up call, and finally the date parameter. Dense but every block earns its place; the trailing 'date: YYYY-MM-DD (default: today).' is slightly orphaned from the rest of the flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing the returned option structure (every serving size with calories/protein/carbs/fat, a suggested_serving, and the fits_targets flag). Combined with the draft TTL and the logging handoff, an agent has everything needed to draft, interpret, and act.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 13 parameters, so the description carries the load and largely does: it fixes units ('grams; calories in kcal'), explains that min_/max_ targets apply to the whole entry (serving × quantity), gives the date format and default, and defines quantity semantics. However, 'meal' and 'limit' are never explained, leaving two parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Draft a food entry: numbered options to choose from before logging'), and immediately frames it as a pre-logging step, which cleanly separates it from fitness_log_food and fitness_search_food in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent onward: 'Log a choice with fitness_log_food(draft_id=..., option=N, serving=M)' and 'call this again with different targets to refine.' The draft lifecycle ('Drafts last 24 hours') tells the agent the time window for acting on a draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_get_dayGet day summaryARead-only
Nutrition summary, diary entries, the MyFitnessPal daily note, and the local feel note for a day.
date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds that this is a multi-source aggregate (nutrition summary, diary entries, MFP daily note, local feel note), which is genuinely useful context, but it says nothing about return shape, size, or behavior when a day has no data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short lines, front-loaded with what is returned and followed by the parameter format. Every sentence earns its place; the only minor weakness is that the opening is a comma-list rather than a single crisp verb+resource statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must convey return content — and it does, listing the four sections returned. Combined with the date format/default note and the read-only annotation, an agent has enough to call this correctly; only the empty-day behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single 'date' parameter has no schema-level description, so the description carries the full burden. It supplies both the required format (YYYY-MM-DD) and the default behavior (today), which is exactly the missing semantics an agent needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Get day summary' via the title, and 'Nutrition summary, diary entries...') and enumerates exactly what the day aggregate contains, which differentiates it from siblings like fitness_get_note or fitness_get_trends. It is clear, though the retrieval action itself is implied rather than stated in the description body.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the enumerated contents: this is the one-call aggregate for a single day, as opposed to fitness_get_note or fitness_get_trends for narrower/longer scopes. However, no explicit when-to-use or when-not-to-use guidance, and no sibling is named as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_get_exerciseGet exercise diaryARead-only
Read the MyFitnessPal exercise diary (cardio + strength) for a day.
date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-data profile is covered. The description adds which data categories are returned (cardio + strength), but says nothing about pagination, result volume, or auth requirements; adequate but not rich given the lowered bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short lines, purpose first, parameter format second, zero filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema read tool with annotations carrying the safety profile, the description supplies what is needed: what is read, the scope, and the date format/default. Only the lack of sibling disambiguation keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the sole 'date' property carries no description in the schema, so the description's 'YYYY-MM-DD (default: today)' is genuinely additive meaning that the agent cannot get elsewhere. It could go further (timezone, date range limits) but it compensates for the coverage gap well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (MyFitnessPal exercise diary) and even scopes the content to cardio + strength for a single day. It does not distinguish itself from the nearby sibling fitness_get_exercise_entries, which an agent would need to disambiguate against, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Only usage hint is the default date behavior; there is no statement of when to prefer this over fitness_get_day or fitness_get_exercise_entries, and no prerequisites or exclusions. The agent must infer the use case from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_get_exercise_entriesList exercise entriesARead-only
List a day's cardio and strength exercise-diary entries.
Each entry has its section, name, and that section's columns (cardio: minutes, calories_burned; strength: sets, reps_set, weight_set). entry_id is informational only — fitness_delete_exercise deletes by name match. date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuinely new behavioral detail beyond the annotations: the shape of what comes back (section, name, and per-section columns) and the caveat that entry_id cannot be used for deletion, which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, then return shape, then the delete caveat, then the parameter format. Every sentence earns its place, though the column enumeration is slightly dense and the entry_id caveat leans toward the delete tool's concern.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the entry structure and its cardio/strength columns, and it documents the sole parameter's format and default. Combined with annotations that cover the read-only profile, an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter. It does: 'date: YYYY-MM-DD (default: today)' supplies both the format and the default behavior that the bare schema property lacks. Only the null-vs-today default nuance is left implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('List a day's cardio and strength exercise-diary entries') and scopes it to a single day, which separates it from the broader fitness_get_day and the single-item fitness_get_exercise. It also names the sibling fitness_delete_exercise so the agent understands this tool is a read path, not the delete path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'list a day's entries' framing, and the note that entry_id is informational while deletion is by name match gives useful cross-tool context. However, it never states explicitly when to call this versus fitness_get_day or fitness_get_exercise, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_get_noteGet daily noteARead-only
Read the MyFitnessPal daily diary note (the free-text 'Notes' box at the bottom of the day) straight from your account.
date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The phrase 'straight from your account' adds a live-fetch nuance consistent with openWorldHint, but the description says nothing about behavior when the note box is empty, whether it errors or returns blank, or any freshness/rate-limit characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core identity front-loaded and the parameter format folded into a single parenthetical. Nothing is padded or repeated from the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-optional-param tool with no output schema, the description covers the resource location and the date default/format, which is enough to invoke it correctly. Only edge-case return behavior (empty note) is unaddressed, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single date parameter, so the description must compensate and largely does: it gives the format 'YYYY-MM-DD' and the default 'today'. It stops short of stating the accepted range or timezone behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and a precise resource: the free-text 'Notes' box at the bottom of the day, which implicitly separates it from fitness_get_day. It never explicitly names a sibling or scope boundary, so an agent must infer the distinction rather than being told it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: reading the note versus fitness_log_note for writing is obvious from the verb, but there is no explicit when-to-use, when-not, or named alternative. Adequate but leaves the routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_get_trendsGet metric trendARead-only
A single metric over a date range, for charts/analysis.
metric: weight | calories_in | protein | carbs | fat. start/end: YYYY-MM-DD (default: last 30 days). Returns {metric, points: [{day, value}, ...]} with nulls omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| start | No | ||
| metric | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes further by disclosing the default range (last 30 days), the accepted date format, and that null data points are omitted from the series. That null-omission detail is genuinely useful behavior an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded lines: purpose first, then parameter semantics, then return shape. Every line earns its place and nothing is repeated from the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly specifies the return envelope {metric, points:[{day, value}...]}, and all three parameters are documented. Only minor gaps remain (units, range inclusivity, behavior on an empty range).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema defines no enum, so the description carries the burden — it supplies the full allowed value list for metric (weight | calories_in | protein | carbs | fat), the YYYY-MM-DD format for start/end, and the 30-day default. It is strong compensation, though it omits units for weight and whether the range is inclusive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('a single metric over a date range') and enumerates exactly which metrics, so the agent knows this returns time series, not snapshots. It does not explicitly contrast itself with the closest sibling fitness_get_day (single-day view), so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for charts/analysis' implies the use case (series over time rather than a daily log lookup), but there is no explicit when-to-use/when-not and no named alternative such as fitness_get_day. Usage must be inferred from the metric enumeration and date-range framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_list_food_pinsList remembered foodsARead-only
List remembered food choices (query → food and serving) that fitness_log_food reuses. Stored locally only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds meaningful context beyond that: 'Stored locally only' corroborates the closed-world nature, and the '(query → food and serving)' mapping describes what each listed item contains in the absence of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler; the resource and its item structure are front-loaded, followed by the reuse relation and storage scope. Nothing is wasted and nothing needed is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, read-only list with no output schema, the description supplies the essential missing context: what the entries contain and that storage is local. It omits only secondary details like ordering or result limits, which are minor for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, and the schema is fully described (coverage 100%), so there is nothing for the description to compensate for. Baseline 4 applies for a parameterless listing tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List remembered food choices') and clarifies the shape of each item (query → food and serving). It explicitly ties the tool to the sibling fitness_log_food, which reuses these pins, making it distinguishable from fitness_search_food, fitness_draft_food, and fitness_clear_food_pin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by noting the pins are what fitness_log_food reuses, so an agent can infer this is the way to inspect saved shortcuts before logging. However, it never states when to use this instead of siblings like fitness_search_food or fitness_clear_food_pin, and gives no explicit exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_log_feelSave feel noteBDestructiveIdempotent
Save a 'how I feel today' note. Stored locally only — never sent to MyFitnessPal.
rating: optional 1-5. date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| note | No | ||
| rating | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true, and openWorldHint=false. The description usefully adds that data is stored locally and never sent to MyFitnessPal, which is real context beyond the annotations. It does not, however, disclose the overwrite/destructive semantics implied by idempotent+destructive (re-logging a date replaces the prior note), which is the most important behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the local-storage caveat, then parameter hints in three tight lines with no filler. Efficient, though the trailing parameter lines are slightly clipped.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-param logging tool with no output schema, the description covers storage scope, rating, and date, which is adequate. It is incomplete on the note parameter and on the overwrite behavior a caller would need to know given the destructive+idempotent annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the parameter burden. It documents two of three parameters with useful format detail (rating 1-5 optional, date YYYY-MM-DD defaulting to today) but completely omits the 'note' parameter, which is the core payload of the tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (save) and resource (a 'how I feel today' note), and adds the notable constraint that it is stored locally only. However, it never distinguishes itself from the closely named sibling fitness_log_note, so an agent cannot tell the two apart from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no condition that selects this tool over fitness_log_note, and no prerequisites or exclusions stated. The only implicit cue is the 'how I feel' framing, which is weak given a near-identical sibling name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_log_foodLog foodA
Log a food to the real MyFitnessPal diary.
Preferred: pick from a fitness_draft_food draft with draft_id + option (+ serving, default the option's suggested_serving). meal, quantity, and date default to the draft's. pin=True remembers the choice so logging the same query later reuses this food and serving.
With only query: logs a pinned food, or the single exact-name match;
otherwise nothing is logged and a draft is returned (needs_choice=true)
to pick from. With food_id + weight_id (from fitness_search_food): logs
exactly that item, query being its display name.
meal: breakfast|lunch|dinner|snacks (default breakfast) or any meal name on the account. quantity: number of servings (default 1). date: YYYY-MM-DD (default today).
| Name | Required | Description | Default |
|---|---|---|---|
| pin | No | ||
| date | No | ||
| meal | No | ||
| query | No | ||
| option | No | ||
| food_id | No | ||
| serving | No | ||
| draft_id | No | ||
| quantity | No | ||
| weight_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety triplet (readOnly=false, destructive=false, idempotent=false, openWorld=true). The description adds substantial behavioral context beyond that: it writes to the real (not simulated) diary, the pin flag persists a food/serving choice for future reuse, and ambiguous queries produce a needs_choice=true draft instead of logging anything.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the preferred path, then conditional branches, then a compact parameter glossary. Dense but every clause carries routing or default information; the only minor cost is that the three modes are stated in prose rather than as an obvious list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a ten-parameter mutation tool with no output schema and zero schema coverage, the description is close to sufficient: it covers all input modes, defaults and the needs_choice return branch. It stops short of describing failure/error behavior or duplicate-logging consequences, which an agent might want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the entire burden, and it does: it explains draft_id, option, serving, meal (allowed values), quantity (default 1), date (YYYY-MM-DD, default today), pin, query, food_id and weight_id. Nearly all ten parameters gain meaning the bare schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Log a food to the real MyFitnessPal diary') and distinguishes itself from the many other log_* siblings in the set. An agent can tell it apart from fitness_log_note, fitness_log_weight and fitness_modify_food without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between three invocation modes: prefer draft_id+option from fitness_draft_food, fall back to query, or use food_id+weight_id from fitness_search_food. It names the sibling tools to obtain those IDs and states exactly what happens in each case, including the 'nothing is logged, a draft is returned' path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_log_noteWrite daily noteADestructive
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.
text: the note body. append: add to the existing note on a new line instead of replacing it. date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| text | Yes | ||
| append | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description earns credit by going beyond them: it discloses that writes go to the live MFP account ('synced to your account') and that the default behavior replaces the existing note unless append is set, which is precisely the destructive consequence an agent needs spelled out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The scope and sibling distinction come first, then a compact three-line parameter block. Every clause carries information — no restatement of the tool name, no filler — and the ragged trailing whitespace is cosmetic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description need not explain return values, and annotations already cover the safety profile. It covers what is written, where it lands, and all three parameters, leaving only minor gaps such as whether the call errors when the day does not yet exist or what confirmation is returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and largely meets it: text as the note body, append as 'add to the existing note on a new line instead of replacing it', and date as YYYY-MM-DD defaulting to today. The format and default details for date are genuine additions the schema does not provide; only the exact type expectations for text are left thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Write the MyFitnessPal daily diary note') and pins down exactly which artifact is touched (the free-text 'Notes' box at the bottom of the day). It also names the sibling it must not be confused with (fitness_log_feel, local-only), so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It distinguishes this tool from fitness_log_feel and explains the replace-vs-append decision point, which is the main usage choice an agent faces. It stops short of naming fitness_get_note as the read counterpart or stating when not to write at all, so it is clear context rather than a full when/when-not/alternatives map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_log_waterLog waterADestructive
Log water to the real MyFitnessPal water tracker.
amount: quantity to add to the day's total. unit: cup | fl_oz | ml | l
(common spellings like "cups", "oz", "fl oz", "milliliters", "litres" are
accepted). replace: set the day's total to amount instead of adding —
use it to correct a mislogged total (amount=0 clears the day).
Returns previous_ml; to undo a mistake, call again with
amount=previous_ml, unit="ml", replace=True.
date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| unit | No | cup | |
| amount | Yes | ||
| replace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false; the description goes further by explaining that amount=0 clears the day (matching the destructive profile), that the call returns previous_ml, and exactly how to reverse a mistake. It also confirms the operation targets the real remote tracker, consistent with openWorldHint=true. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then one compact block per parameter, with the highest-value caveat (replace and undo) surfaced rather than buried. Dense but every sentence carries information an agent needs; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by stating the return value (previous_ml) and how to use it for undo. Combined with the unit/date format details, an agent has everything needed to call this correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so: amount is additive to the day's total, unit lists cup/fl_oz/ml/l plus accepted spellings, replace is defined with the amount=0 edge case, and date specifies the YYYY-MM-DD format and today's default. All four parameters gain meaning beyond their bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource — logging water to the MyFitnessPal water tracker — which is unambiguous and immediately distinguishable from siblings like fitness_log_food or fitness_log_weight. No inference required to know what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit conditional for the non-obvious path: use replace=True to correct a mislogged total, and call again with amount=previous_ml to undo. That is genuine usage guidance. It stops short of naming alternatives or stating when not to use the tool, so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_log_weightLog weightADestructiveIdempotent
Log a weight measurement to MyFitnessPal.
weight: in your MyFitnessPal account's display unit (kg or lbs). Logging twice for the same date updates that day's measurement. date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| weight | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, destructive, open-world behavior; the description adds the meaningful detail that re-logging the same date overwrites that day's value, which explains why idempotent/destructive hints are set and what gets replaced. It does not mention auth/permission requirements, a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the action, then per-parameter semantics. Every sentence earns its place with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter mutation tool with annotations and no output schema, the description covers action, both parameters, units, date format, and overwrite behavior. Only the return/confirmation behavior is unstated, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full burden and does: weight is in the account's display unit (kg or lbs) and date is YYYY-MM-DD defaulting to today. Both parameters are given format and semantics the bare schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (log) and resource (weight measurement) plus the destination (MyFitnessPal). The resource is unambiguous against siblings like fitness_log_water and fitness_log_food, so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides useful context (repeat logs for the same date update that day; date defaults to today) but gives no explicit when-to-use or when-not-to-use guidance versus alternatives such as fitness_modify_food or fitness_get_trends. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_modify_foodReplace food entryADestructive
Replace a MyFitnessPal diary entry: deletes the match, then adds a food.
query: the existing entry to replace (name match) within meal. If this
matches nothing, the error lists what's actually logged that day/meal — use
that to retry with a better query. If it matches more than one entry (and
none is an exact name match), the error lists the candidates; narrow query
to pick one. Of several identical duplicates, one is replaced.
new_query: the food to add instead; omit to re-add query (e.g. to change
quantity). The replacement is chosen like fitness_log_food's: a pinned
food or a single exact-name match is used directly; otherwise nothing is
changed and a draft comes back (needs_choice=true) — call again with the
same query plus draft_id + option (and optionally serving).
meal: breakfast|lunch|dinner|snacks or any meal name on the account,
used for both the delete and the add. quantity: servings (default 1, or
the draft's). date: YYYY-MM-DD (default: today).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| meal | No | breakfast | |
| query | Yes | ||
| option | No | ||
| serving | No | ||
| draft_id | No | ||
| quantity | No | ||
| new_query | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial context beyond them: the two-phase delete-then-add behavior, the exact-match/duplicate resolution rules, and the draft flow (needs_choice=true) with the required follow-up call. It discloses what is destroyed and how failures are recovered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operation is front-loaded, then each parameter gets a compact, purposeful line with no filler. It is long but every sentence carries behavioral or parameter information; the density is justified by the workflow complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with no output schema and no annotation-documented return behavior, the description covers the full workflow including error responses and the draft-confirmation round trip. An agent has everything needed to invoke and recover correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all parameter meaning, and it largely does: query, new_query, meal (with allowed values and dual use for delete and add), quantity, and date all get explicit semantics. draft_id, option, and serving are only touched in the retry flow, leaving their exact meaning (e.g., option as a draft index) somewhat implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace a MyFitnessPal diary entry') and immediately clarifies the compound operation: 'deletes the match, then adds a food.' This distinguishes it from siblings like fitness_delete_food and fitness_log_food, which an agent can tell apart without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the replace-in-place use case and elaborates the retry/error paths (no match, multiple matches, duplicates). It references fitness_log_food for selection semantics, which helps route the agent. It stops short of an explicit 'use this instead of delete_food + log_food' statement, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fitness_search_foodSearch foodsARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| with_macros | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real behavioral value by enumerating the candidate fields returned, which matters since no output schema exists and an agent must know what the results carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and resource, then the return contract. No filler, though the second sentence could be slightly more compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Good coverage of return shape compensates for the absent output schema, but with three parameters at 0% schema description coverage the input side is left entirely unexplained, which is a meaningful gap for a search tool whose filters drive result quality.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description explains none of the three parameters. It never clarifies the meaning of query, the purpose of limit (default 5), or what with_macros toggles, so an agent gets no help on inputs beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (MyFitnessPal food database) and gives the complementary handoff to fitness_log_food via food_id/weight_id, which cleanly differentiates it from the logging sibling. An agent can tell exactly what this tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names fitness_log_food and explains the workflow (search candidates, then log exactly that item), giving clear context for when this precedes logging. It stops short of explicit when-not guidance or naming alternatives like fitness_draft_food or fitness_list_food_pins.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
18 tool updates
v0.4.3- First observed
fitness_bulk_export - First observed
fitness_clear_food_pin - First observed
fitness_delete_exercise - First observed
fitness_delete_food - First observed
fitness_draft_food - First observed
fitness_get_day - First observed
fitness_get_exercise - First observed
fitness_get_exercise_entries - First observed
fitness_get_note - First observed
fitness_get_trends - First observed
fitness_list_food_pins - First observed
fitness_log_feel - First observed
fitness_log_food - First observed
fitness_log_note - First observed
fitness_log_water - First observed
fitness_log_weight - First observed
fitness_modify_food - First observed
fitness_search_food
TDQS
Scored across 18 tools
Most tools target a clearly distinct resource+action, and the food workflow (search -> draft -> log) is well delineated. However, fitness_get_exercise and fitness_get_exercise_entries both appear to read the same exercise diary and could easily be confused.
Every tool uses the same fitness_verb_noun snake_case pattern (get_day, log_food, delete_food, list_food_pins). No mixing of conventions.
18 tools is on the heavier side but each covers a genuine slice of the domain (food, exercise, notes, weight, water, trends, export, pins). Slightly over but defensible.
Strong coverage: full food CRUD plus search/draft/pins, water, weight, notes, trends, and bulk export. The only notable gap is adding exercise entries (read/delete exist, but logging appears handled by external sync), which agents can work around.
Maintenance
Related MCP Connectors
Calorie tracker app for ChatGPT and Claude: read meals, macros, weight and log meals from chat.
Calorie, workout and body-weight log inside ChatGPT and Claude. Log meals by text, photo or voice.
Log meals, water, and weight to Garmin Connect from Claude or ChatGPT.
Talk to your own gym log. Reps is a free workout tracker for iPhone and Android; connect it to Claude, ChatGPT or any MCP client and ask about your workout history, personal records, exercise progression, weekly summaries, routines and training plan. The assistant can also save a new routine, edit one, save a whole plan, add custom exercises and exercise notes, always after you confirm in the chat. It cannot log a workout or delete your history. Requires a free Reps account created in the app; you sign in with a one-time email code.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to read and write MyFitnessPal data, including food diary, exercises, body measurements, nutrition goals, and water intake.MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to read and log MyFitnessPal nutrition data, including tracking calories, macros, searching foods, and adding meals through natural conversation.75 npmMIT
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with MyFitnessPal data including food diary, exercises, body measurements, nutrition goals, and water intake through natural language.2070MIT
- AlicenseAqualityCmaintenanceEnables Claude to manage MyFitnessPal food diaries, nutrition goals, exercises, body measurements, and water intake via a remote MCP server using session cookie authentication.184MIT