Skip to main content
Glama
AdamWalt

MyFitnessPal MCP Server

by AdamWalt

MyFitnessPal MCP Server

A Model Context Protocol (MCP) server that enables AI assistants like Claude to interact with your MyFitnessPal data, including food diary, exercises, body measurements, nutrition goals, and water intake.

Features

Tool

Type

Description

mfp_get_diary

Read

Get food diary entries for any date

mfp_search_food

Read

Search the MyFitnessPal food database

mfp_get_food_details

Read

Get detailed nutrition info for a food item

mfp_add_food_to_diary

Write

Add a food item to your diary for a specific meal and date

mfp_remove_food_from_diary

Write

Remove a logged entry from your diary

mfp_create_custom_food

Write

Create a private custom food with a full nutrition panel

mfp_list_own_foods

Read

List your own custom foods (private ones do not appear in search)

mfp_delete_custom_food

Write

Delete one of your custom foods

mfp_get_measurements

Read

Get weight/body measurement history

mfp_set_measurement

Write

Log a new weight or body measurement

mfp_get_exercises

Read

Get logged exercises (cardio & strength)

mfp_get_goals

Read

Get daily nutrition goals

mfp_set_goals

Write

Update daily nutrition goals

mfp_get_water

Read

Get water intake for a date

mfp_set_water

Write

Log water intake for a date

mfp_log_fast

Write

Log a completed intermittent fasting window (start + end)

mfp_update_fast

Write

Update the start/end times of an existing fasting entry

mfp_delete_fast

Write

Delete a fasting entry by id

mfp_get_report

Read

Get nutrition reports over a date range

refresh_browser_cookies

Utility

Extract and save session cookies from browser

Related MCP server: MyFitnessPal MCP Server

How diary writes work

MyFitnessPal has no public API. Reads here are scraped from the website via python-myfitnesspal, and diary writes go through MFP's internal v2 JSON API — the same one their web client uses, authenticated with your existing session token.

Custom-food writes (mfp_create_custom_food, mfp_list_own_foods, mfp_delete_custom_food) use a different endpoint family: MFP's v2 API exposes no custom-food create, so these call the same cookie-authenticated web endpoints their website uses (/api/auth/csrf, /api/services/users/foods/mine, /api/services/foods). No browser needs to be running — the stored session cookies are sufficient.

That interface is undocumented and was determined by observing the web client. It works today, but MyFitnessPal can change it without notice. They have already done so once: this server originally posted to /food/diary/{user}/add, which now returns 404, leaving food logging broken. If logging starts failing, that is the most likely cause.

How fasting works (write-only)

Fasting tools (mfp_log_fast, mfp_update_fast, mfp_delete_fast) POST / PATCH / DELETE against /v2/diary/fasting_entry on the same v2 JSON API. Payloads match the shape captured from the iOS app:

{"items": [{
  "type": "fasting_entry",
  "id": "UPPERCASE-UUID",
  "fast_started": "2026-08-06T13:00:00Z",
  "fast_ended":   "2026-08-07T05:00:00Z"
}]}

Ids are client-generated UUIDv4s in uppercase (the iOS convention). The MCP auto-generates one when you omit id from mfp_log_fast; save the returned id if you plan to update or delete the entry.

There is no read endpoint. MFP exposes no GET for fasting entries — GET /v2/diary/fasting_entry returns 405 Method Not Allowed. The mobile app populates its Fasting History screen via a delta-sync channel (mobile-sync-api.myfitnesspal.com/v2.1/sync) that requires a pre-issued sync token, is scoped to the mobile OAuth client, and rejects the web-session bearer this server authenticates with. You'll continue to read fasting history in the MFP app itself until Under Armour publishes something.

The write tools are still useful for automating log-entry (e.g. inferring fasts from your Garmin sleep window + first-meal timestamp) or correcting entries programmatically.

Prerequisites

  • Python 3.10–3.12 (check with python3 --version)

    Not 3.13+: lxml, pulled in by myfitnesspal, has no wheels for it and fails to build against the 3.14 C API. On macOS, brew install python@3.12.

  • pip 21.3+ (for pyproject.toml support; upgrade with pip install --upgrade pip)

  • MyFitnessPal account

  • One of the following for authentication:

    • Recommended (macOS): any Chromium-based browser (Arc, Chrome, Edge, Brave, Vivaldi, Opera, ...) with an active MyFitnessPal login session — the MCP auto-discovers the session on next call

    • Firefox with an active MyFitnessPal login session (via the browser_cookie3 fallback)

    • Legacy: your MFP username/email and password (see caveats below — MFP's NextAuth backend rejects the form-POST flow, so credential auth only works while cached cookies remain valid)

Authentication Options

This MCP supports multiple authentication methods:

Method

Setup

Persistence

Chromium browser auto-discovery (macOS, recommended)

Log into myfitnesspal.com in any Chromium-based browser (Arc, Chrome, Edge, Brave, Vivaldi, Opera, ...). The MCP auto-detects installed browsers via the macOS keychain and uses whichever one is logged in.

Until browser session expires (cached for 30 days in ~/.mfp_mcp/cookies.json)

Encrypted credentials (legacy)

Add encrypted MFP_USERNAME and MFP_PASSWORD to Claude Desktop config; set MFP_SECRET_KEY outside the config (for example via shell env or OS keychain)

Form login no longer works against MFP's NextAuth backend — only useful if cached cookies are still valid

Plain credentials (legacy)

Add MFP_USERNAME and MFP_PASSWORD to Claude Desktop config

Same as above — form login flow is deprecated

Browser cookies (browser_cookie3 fallback)

Log into myfitnesspal.com in Chrome or Firefox via the default profile paths

Until browser session expires

Note: MyFitnessPal migrated their authentication to NextAuth, so the legacy form-POST authenticate_with_credentials path almost always fails for fresh logins. The Chromium auto-discovery path is the reliable way to get a session on macOS — just log in via any modern browser and the MCP picks it up automatically on the next call.

Installation

# Clone the repository
git clone https://github.com/YOUR_USERNAME/myfitnesspal-mcp-python.git
cd myfitnesspal-mcp-python

# Create virtual environment (use python3.10+ on macOS/Linux)
python3 -m venv venv
# On macOS, you may need to specify version: python3.12 -m venv venv

# Activate virtual environment
source venv/bin/activate  # macOS/Linux
# On Windows: .\venv\Scripts\activate

# Upgrade pip (required for pyproject.toml support)
pip install --upgrade pip

# Install the package in editable mode
pip install -e .

Option 2: Install with pip (when published)

pip install mfp-mcp

Note: Option 2 requires the package to be published to PyPI. For now, use Option 1.

Verify Installation

After installation, verify the server can start:

# With venv activated
python -m mfp_mcp.server

You should see the server waiting for input (it communicates via stdio). Press Ctrl+C to stop.

To test authentication (optional):

MFP_USERNAME="your_email" MFP_PASSWORD="your_password" python -c "
from mfp_mcp.server import get_mfp_client
client = get_mfp_client()
print('Authentication successful!')
"

Configuration for Claude Desktop

Step 1: Locate Your Config File

OS

Config File Location

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Step 2: Add the MCP Server Configuration

If the file doesn't exist, create it. Add or merge the following configuration:

Option A: With Encrypted Credentials (Enhanced Security)

Encrypt your credentials before storing them in the config file. See Encrypted Credentials for setup instructions.

⚠️ Security note: Encryption only provides meaningful protection if MFP_SECRET_KEY is stored separately from the config file (e.g., set in your shell profile or OS keychain). Storing the key alongside the encrypted values in the same config file means anyone who obtains the config can still decrypt your credentials.

macOS Example (with key set separately in your shell environment):

{
  "mcpServers": {
    "myfitnesspal": {
      "command": "/Users/yourname/myfitnesspal-mcp-python/venv/bin/python",
      "args": ["-m", "mfp_mcp.server"],
      "env": {
        "MFP_USERNAME": "gAAAAAB...<encrypted_email>",
        "MFP_PASSWORD": "gAAAAAB...<encrypted_password>"
      }
    }
  }
}

Option B: With Plain Credentials (No Browser Required)

macOS Example:

{
  "mcpServers": {
    "myfitnesspal": {
      "command": "/Users/yourname/myfitnesspal-mcp-python/venv/bin/python",
      "args": ["-m", "mfp_mcp.server"],
      "env": {
        "MFP_USERNAME": "your_email@example.com",
        "MFP_PASSWORD": "your_password"
      }
    }
  }
}

Windows Example:

{
  "mcpServers": {
    "myfitnesspal": {
      "command": "C:\\Users\\YourName\\myfitnesspal-mcp-python\\venv\\Scripts\\python.exe",
      "args": ["-m", "mfp_mcp.server"],
      "env": {
        "MFP_USERNAME": "your_email@example.com",
        "MFP_PASSWORD": "your_password"
      }
    }
  }
}

macOS Example:

{
  "mcpServers": {
    "myfitnesspal": {
      "command": "/Users/yourname/myfitnesspal-mcp-python/venv/bin/python",
      "args": ["-m", "mfp_mcp.server"]
    }
  }
}

⚠️ Important: Use full absolute paths to the Python executable in your virtual environment. Replace yourname/YourName with your actual username.

Step 3: Restart Claude Desktop

After saving the config file, completely quit and restart Claude Desktop for the changes to take effect.

Step 4: Verify Connection

In Claude Desktop, you should see a hammer icon (🔨) indicating MCP tools are available. Try asking:

"Show my MyFitnessPal diary for today"

Authentication Methods

The MCP server supports four authentication methods, tried in this order:

1. Environment Variables (Legacy)

Set MFP_USERNAME and MFP_PASSWORD in your Claude Desktop config's env section. You can store them as plain text or encrypted (see below).

⚠️ Note: MyFitnessPal migrated to a NextAuth backend, so the form-POST flow this method uses no longer produces a session cookie. Credential auth only succeeds while ~/.mfp_mcp/cookies.json still holds a valid session from a previous browser login — after that, this method silently falls through to the browser cookie paths below. Prefer the Chromium auto-discovery method on macOS.

"env": {
  "MFP_USERNAME": "your_email@example.com",
  "MFP_PASSWORD": "your_password"
}

Encrypted Credentials (Enhanced Security)

Instead of storing plain-text credentials, you can encrypt them using Fernet symmetric encryption from the cryptography library. The server decrypts them at runtime using MFP_SECRET_KEY.

⚠️ Important: For encryption to be meaningful, MFP_SECRET_KEY must be kept outside the Claude Desktop config file. The server resolves it in this order:

  1. MFP_SECRET_KEY environment variable (shell profile, not the Claude config)

  2. OS keychain — service mfp-mcp, account MFP_SECRET_KEY (recommended)

Step 1 — Generate and store the key in one command:

npm install
npm run store-key

store-key generates a Fernet-compatible key, stores it in the OS keychain (mfp-mcp / MFP_SECRET_KEY), and prints the key so you can use it in Step 2. See Key Management CLI for all available flags.

Step 2 — Encrypt your credentials:

from cryptography.fernet import Fernet

key = b"abc123XYZ...=="  # your key from Step 1
f = Fernet(key)

encrypted_user = f.encrypt(b"your_email@example.com").decode()
encrypted_pass = f.encrypt(b"your_password").decode()

print("MFP_USERNAME:", encrypted_user)
print("MFP_PASSWORD:", encrypted_pass)

Step 3 — Add only the encrypted values to your Claude Desktop config:

"env": {
  "MFP_USERNAME": "gAAAAAB...<encrypted>",
  "MFP_PASSWORD": "gAAAAAB...<encrypted>"
}

The key stays in the keychain — it never touches the config file.

Alternative: shell profile (simpler, still outside the Claude config):

# Add to ~/.zshrc or ~/.bashrc — do NOT put this in claude_desktop_config.json
export MFP_SECRET_KEY="abc123XYZ...=="

If MFP_SECRET_KEY is not found in the environment or keychain, the server treats MFP_USERNAME and MFP_PASSWORD as plain text (backward compatible).

2. Stored Session Cookies

After successful authentication, session cookies are saved to ~/.mfp_mcp/cookies.json. These persist for 30 days, so you won't need to re-authenticate frequently.

3. Chromium Browser Auto-Discovery (macOS)

If no credentials are provided and stored cookies are absent or expired, the server scans the macOS keychain for <Browser> Safe Storage entries to find every installed Chromium-based browser, then tries each one's cookies database until it finds a valid MyFitnessPal session token.

This works out of the box with Arc, Chrome, Edge, Brave, Vivaldi, Opera, Chromium, and any other Chromium-derived browser. You only need to be logged into myfitnesspal.com in one of them.

The first successful extraction is persisted to ~/.mfp_mcp/cookies.json, so subsequent calls skip the discovery step until the session expires.

You can also force a specific browser via the refresh_browser_cookies MCP tool:

refresh_browser_cookies(browser="arc")     # or "chrome", "edge", "brave", ...
refresh_browser_cookies(browser="auto")    # scan everything (default)
refresh_browser_cookies(browser="firefox") # via browser_cookie3

4. browser_cookie3 Fallback (Legacy)

A final fallback uses browser_cookie3 to read Chrome or Firefox cookies from the default profile paths. Useful on Linux/Windows or if the macOS auto-discovery path can't access your keychain.

Security Note on Credentials

Your MyFitnessPal credentials in the Claude Desktop config are stored locally on your machine. The config file is only readable by your user account. Options to harden this further:

1. Encrypt credentials + store the key in the OS keychain

The strongest option. The ciphertext lives in the config; the key never does. See Encrypted Credentials.

2. Encrypt credentials + export the key in your shell profile

Still separates key from ciphertext, though the key is on disk.

3. Storing MFP_PASSWORD in your MCP client

Storing MFP_PASSWORD in your MCP client config puts your MyFitnessPal password in plaintext on disk, readable by anything running as your user. It is convenient — the server can re-authenticate indefinitely — but it is a real tradeoff, not a formality.

4. Use browser cookies instead (no credentials stored in config at all)

Prefer browser-cookie auth if you would rather not store the password: log into myfitnesspal.com and the server reads the session from your browser. The cost is that MFP sessions expire, so you will occasionally need to log in again.

Files this server writes to ~/.mfp_mcp/ (directory mode 0700):

File

Contents

Mode

cookies.json

Session cookies — full account access, treat as a password

0600

Note that this server can modify your diary — adding food entries and updating goals, measurements, and water.

Usage Examples

Once configured, you can interact with your MyFitnessPal data through Claude:

Food Diary

"Show me what I ate today"
"Get my food diary for 2026-01-05"
"What meals did I log yesterday?"

Logging and Correcting Food

"Log a grilled chicken breast, 6 oz, for lunch"
"Add 2 cups of oatmeal to breakfast"

Track Weight Progress

"Show my weight history for the past 30 days"
"Log my weight as 232.5 pounds"
"What's my weight trend this month?"

Search Foods

"Search MyFitnessPal for chicken breast"
"Find nutrition info for Greek yogurt"
"Look up calories in a banana"

Check Goals vs Actual

"Compare my nutrition goals to what I actually ate today"
"Am I on track with my protein intake?"
"How many calories do I have left today?"

Exercise Log

"What exercises did I log today?"
"Show my workout from yesterday"

Nutrition Reports

"Show my calorie intake over the past week"
"What's my average protein intake this week?"
"Generate a nutrition report for January"

Key Management CLI

scripts/store-key.ts is a one-time setup tool that generates and stores MFP_SECRET_KEY in your OS keychain (macOS Keychain, Windows Credential Vault, Linux Secret Service). Node.js 18+ is required.

Prerequisites

npm install

Commands

Command

What it does

npm run store-key

Generate a new Fernet key and store it in the keychain

npm run store-key -- --key <val>

Store an existing key instead of generating one

npm run store-key -- --overwrite

Replace a key that is already stored

npm run store-key -- --show

Print the currently stored key

npm run store-key -- --delete

Remove the stored key from the keychain

Example output

✅ MFP_SECRET_KEY stored in OS keychain
   service : mfp-mcp
   account : MFP_SECRET_KEY
   source  : generated

Your key (use this to encrypt MFP_USERNAME / MFP_PASSWORD):

  abc123XYZ...==

Next — encrypt your credentials with Python:

  from cryptography.fernet import Fernet
  f = Fernet(b"abc123XYZ...==")
  print("MFP_USERNAME:", f.encrypt(b"your_email@example.com").decode())
  print("MFP_PASSWORD:", f.encrypt(b"your_password").decode())

Project Structure

myfitnesspal-mcp-python/
├── Dockerfile              # Container deployment
├── package.json            # Node tooling (store-key CLI)
├── tsconfig.json           # TypeScript config for scripts/
├── pyproject.toml          # Python package configuration
├── README.md               # This file
├── scripts/
│   └── store-key.ts        # One-time key management CLI
└── src/
    └── mfp_mcp/
        ├── __init__.py     # Package initialization
        └── server.py       # MCP server implementation

Development

Setup Development Environment

# Clone and enter directory
git clone https://github.com/YOUR_USERNAME/myfitnesspal-mcp-python.git
cd myfitnesspal-mcp-python

# Create virtual environment (Python 3.10+ required)
python3 -m venv venv
source venv/bin/activate

# Upgrade pip and install with dev dependencies
pip install --upgrade pip
pip install -e ".[dev]"

Run Tests

pytest

Code Formatting

black src/
isort src/
ruff check src/

Type Checking

mypy src/

Docker Deployment

⚠️ Note: Docker deployment requires mounting your browser's cookie database for authentication.

# Build the image
docker build -t mfp-mcp .

# Run with Chrome cookies mounted (Linux example)
docker run -it --rm \
  -v ~/.config/google-chrome:/root/.config/google-chrome:ro \
  mfp-mcp

Troubleshooting

"python: command not found" or wrong Python version

Problem: Python is not in PATH or you need to specify version.

Solutions:

  1. On macOS/Linux, use python3 instead of python

  2. Check your version: python3 --version (must be 3.10+)

  3. If needed, install Python 3.12 via Homebrew: brew install python@3.12

  4. Then create venv with: python3.12 -m venv venv

"pip install -e ." fails with "setup.py not found"

Problem: Your pip version is too old to support pyproject.toml builds.

Solution: Upgrade pip first:

pip install --upgrade pip
pip install -e .

"Failed to authenticate with MyFitnessPal"

Problem: The server can't authenticate with your credentials or read browser cookies.

Solutions:

  1. Easiest (macOS): Log into myfitnesspal.com in any Chromium-based browser (Arc, Chrome, Edge, Brave, ...). The MCP will auto-discover the session on the next call.

  2. Force a refresh: Call the refresh_browser_cookies tool — auto scans every browser, or pass a specific name (arc, chrome, edge, brave, vivaldi, opera, firefox).

  3. If using credentials: Double-check your MFP_USERNAME and MFP_PASSWORD in the config. Note that the legacy form-login flow no longer works against MFP's NextAuth backend — credentials are only useful while ~/.mfp_mcp/cookies.json still holds a valid session.

  4. Try logging out and back in to MyFitnessPal in your browser.

  5. Clear ~/.mfp_mcp/cookies.json and let the auto-discovery rebuild it.

  6. On macOS, the auto-discovery path reads each browser's Safe Storage password from your login keychain. On the very first run, macOS shows a dialog: " wants to use information stored in your keychain" — click Always Allow. If Claude Desktop is spawning the MCP headlessly in the background, this dialog can be easy to miss; if auto-discovery returns "no browser had a session", bring Claude Desktop to the foreground and retry so the prompt is visible. Once approved, the key is cached and the prompt won't repeat.

"No module named 'mfp_mcp'"

Problem: Package not installed or wrong Python environment.

Solutions:

  1. Ensure you're using the correct Python from your virtual environment

  2. Reinstall the package: pip install -e .

  3. Verify the path in your Claude Desktop config points to the venv Python:

    /path/to/project/venv/bin/python  # macOS/Linux
    C:\path\to\project\venv\Scripts\python.exe  # Windows

Tools not appearing in Claude Desktop

Problem: MCP server not connecting.

Solutions:

  1. Check the config file syntax (must be valid JSON - use a JSON validator)

  2. Use absolute paths in the configuration (no ~ or relative paths)

  3. Restart Claude Desktop completely (Cmd+Q on macOS, then relaunch)

  4. Check Claude Desktop logs:

    • macOS: ~/Library/Logs/Claude/

    • Windows: %APPDATA%\Claude\logs\

Empty responses or no data

Problem: Authentication works but no data returned.

Solutions:

  1. Verify you have data logged in MyFitnessPal for the requested date

  2. Check the date format (YYYY-MM-DD)

  3. Try a recent date where you know you have entries

Double parentheses in terminal prompt like "((venv) )"

Problem: VS Code/Cursor Python extension bug with venv prompt.

Solutions:

  1. Update the Python extension in VS Code/Cursor

  2. Or manually fix the venv activate script - change line ~70 in venv/bin/activate:

    # Change from:
    PS1="("'(venv) '") ${PS1:-}"
    # To:
    PS1="(venv) ${PS1:-}"

API Reference

mfp_get_diary

Get food diary for a specific date.

  • date (optional): YYYY-MM-DD format, defaults to today

  • response_format: "markdown" or "json"

mfp_search_food

Search the MyFitnessPal food database.

  • query (required): Search term

  • limit (optional): Max results (default 10, max 50)

  • response_format: "markdown" or "json"

mfp_get_food_details

Get detailed nutrition for a food item.

  • mfp_id (required): MyFitnessPal food ID from search results

  • response_format: "markdown" or "json"

mfp_add_food_to_diary

Add a food item to your diary for a specific meal and date.

  • mfp_id (required): MyFitnessPal food ID from search results (use mfp_search_food first)

  • meal (optional): Meal name - "Breakfast", "Lunch", "Dinner", or "Snacks" (default: "Breakfast")

  • date (optional): YYYY-MM-DD format (default: today)

  • quantity (optional): Number of servings (default: 1.0)

  • unit (optional): Unit/serving size description (e.g., "1 cup", "100g")

Example workflow:

  1. Use mfp_search_food to find a food item and get its mfp_id

  2. Use mfp_add_food_to_diary with the mfp_id to add it to your diary

mfp_create_custom_food

Create a private custom food in your account. Returns the new food's id, which mfp_add_food_to_diary accepts.

  • description (required): Food name as it appears in MFP

  • calories (required): Calories per serving

  • brand_name (optional): Brand; packaged = label brand, restaurant = venue, homemade = "Generic" (default: "Generic")

  • serving_amount (optional): Serving size number (default: 100)

  • serving_unit (optional): Serving unit, e.g. "g", "ml", "piece" (default: "g")

  • Nutrients (all optional): carbs, fiber, sugar, protein, fat, saturated_fat, polyunsaturated_fat, monounsaturated_fat, trans_fat, cholesterol (mg), sodium (mg), potassium (mg), vitamin_a, vitamin_c, calcium, iron (last four are %DV)

  • country_code (optional): Label convention (default: "NL") — see the carbs note below

  • public (optional): Share publicly (default: false)

  • response_format: "markdown" or "json"

carbs is NET carbs, and country_code is what makes it so. The field selects which label convention your number follows, so it changes the meaning of carbs:

country_code

carbs is read as

MFP stores

"NL" and other EU codes (labels exclude fibre)

NET

net_carbs = carbs, carbohydrates = carbs + fiber

omitted / US (labels include fibre)

TOTAL

carbohydrates = carbs, net_carbs = carbs − fiber

Sending carbs=42, fiber=8 stores 50/42 under "NL" but 42/34 without it. Pass the number straight off the label and leave country_code matching that label's origin — do not pre-subtract fibre.

MyFitnessPal has no custom-food update endpoint. To correct a food, create the corrected version and then mfp_delete_custom_food the old one.

mfp_list_own_foods

List your own custom foods, newest first. Private custom foods do not reliably appear in mfp_search_food, so this is how to find the id of something you created earlier.

  • search (optional): Substring filter on the food name

  • limit (optional): Max foods to return (default: 25)

  • response_format: "markdown" or "json"

mfp_delete_custom_food

Delete one of your custom foods. Destructive and not recoverable; MyFitnessPal may refuse if the food is referenced by a logged diary entry.

  • food_id (required): Food id from mfp_create_custom_food or mfp_list_own_foods

mfp_remove_food_from_diary

Remove a logged entry from your diary.

  • entry_id (required): Diary entry id (from mfp_get_diary)

mfp_get_measurements

Get body measurement history.

  • measurement (optional): "Weight", "Body Fat", "Waist", etc.

  • start_date (optional): YYYY-MM-DD (default 30 days ago)

  • end_date (optional): YYYY-MM-DD (default today)

  • response_format: "markdown" or "json"

mfp_set_measurement

Log a body measurement for today.

  • measurement (optional): Type (default "Weight")

  • value (required): Numeric value

mfp_get_exercises

Get exercise log for a date.

  • date (optional): YYYY-MM-DD (default today)

  • response_format: "markdown" or "json"

mfp_get_goals

Get daily nutrition goals.

  • date (optional): YYYY-MM-DD (default today)

  • response_format: "markdown" or "json"

mfp_set_goals

Update nutrition goals.

  • calories (optional): Daily calorie goal

  • protein (optional): Daily protein in grams

  • carbohydrates (optional): Daily carbs in grams

  • fat (optional): Daily fat in grams

mfp_get_water

Get water intake for a date.

  • date (optional): YYYY-MM-DD (default today)

mfp_set_water

Log water intake for a date.

  • cups (required): Number of cups of water (e.g., 2.5 for 2.5 cups). Note: MyFitnessPal uses cups as the unit (1 cup = ~237ml)

  • date (optional): YYYY-MM-DD format (default: today)

mfp_get_report

Get nutrition report over a date range.

  • report_name (optional): "Net Calories", "Protein", "Fat", "Carbs"

  • start_date (optional): YYYY-MM-DD (default 7 days ago)

  • end_date (optional): YYYY-MM-DD (default today)

  • response_format: "markdown" or "json"

Security & Privacy

  • Encrypted Credentials: Credentials can be stored as Fernet-encrypted ciphertext in your config. MFP_SECRET_KEY is resolved at runtime from the environment variable first, then the OS keychain (mfp-mcp / MFP_SECRET_KEY). See Encrypted Credentials for setup.

  • OS Keychain: Storing MFP_SECRET_KEY in the native keychain (macOS Keychain, Windows Credential Vault, Linux Secret Service) means the decryption key never touches the config file or any backup.

  • Plain Credentials: If MFP_SECRET_KEY is absent from both environment and keychain, MFP_USERNAME and MFP_PASSWORD are used as-is (backward compatible).

  • Session Cookies: After successful authentication, session cookies are cached in ~/.mfp_mcp/cookies.json (restricted permissions) for 30 days.

  • Browser Cookies: As a fallback, the server can read your browser cookies to authenticate with MyFitnessPal.

  • Local Only: The server runs locally on your machine via stdio transport. No data is sent to any third-party servers.

  • No External Transmission: Your MyFitnessPal data is only transmitted between your computer and MyFitnessPal's servers (myfitnesspal.com).

License

MIT License - See LICENSE file for details.

Acknowledgments

Available Tools

20 tools
mfp_add_food_to_diaryA
Add a food item to your MyFitnessPal food diary for a specific date and meal.

This tool adds a food entry to your diary. You can search for foods using
mfp_search_food to find the food ID (mfp_id) needed for this tool.

Args:
    params: AddFoodToDiaryInput containing:
        - mfp_id (str): MyFitnessPal food item ID (from mfp_search_food)
        - meal (str): Meal name - 'Breakfast', 'Lunch', 'Dinner', or 'Snacks' (default: 'Breakfast')
        - date (str, optional): Date in YYYY-MM-DD format, defaults to today
        - quantity (float): Number of servings (default: 1.0)
        - unit (str, optional): Unit/serving size (e.g., '1 cup', '100g')

Returns:
    str: Confirmation message with details of the added food entry
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a write operation (readOnlyHint=false) and non-destructive behavior. Description adds that it returns a confirmation string and depends on a prior search, but does not disclose side effects like potential duplicates or required authentication. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with Args and Returns sections, front-loaded with the main purpose. The first two sentences are slightly redundant ('Add a food item...' and 'This tool adds a food entry...'), but the overall length is appropriate and easily scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers how to obtain the required food ID, lists all parameters, and describes the return format. Combined with annotations and the output schema, the description gives enough context for correct invocation, though it could mention edge cases like duplicate entries or date handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool description goes beyond the schema by enumerating meal options ('Breakfast', 'Lunch', 'Dinner', or 'Snacks'), providing date format examples, unit examples, and explaining that mfp_id comes from mfp_search_food. This helps the agent select correct values even if schema descriptions are minimal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Add a food item to your MyFitnessPal food diary for a specific date and meal,' using a specific verb and resource. It distinguishes from siblings like mfp_get_diary (read) and mfp_remove_food_from_diary (delete), making the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly points to prerequisite workflow: 'You can search for foods using mfp_search_food to find the food ID (mfp_id) needed for this tool.' This provides clear context for when to use the tool, though it does not mention alternatives or exclusions beyond this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_create_custom_foodA
Create a private custom food in the user's MyFitnessPal account.

Fills the full nutrition panel MFP supports (macros, fats breakdown,
cholesterol, sodium, potassium, fiber, sugars, and the four %DV micros).
Uses the cookie-authenticated web endpoint, so no browser needs to be
running. Returns the new food's id, which mfp_add_food_to_diary accepts.

CARBS ARE NET (with the default country_code="NL"): pass net carbs in
`carbs`; MFP stores net_carbs as given and reports total = carbs + fiber.
Never pre-add fiber. Verified: carbs=42/fiber=8 stores 50/42 under "NL" but
42/34 with country_code omitted, so the field is load-bearing, not cosmetic.

MFP has no update endpoint. To correct a food, create the corrected version
then mfp_delete_custom_food the old one.

Args:
    params: CreateCustomFoodInput (description, brand_name, serving_amount,
        serving_unit, calories + optional nutrients, public, response_format)

Returns:
    str: The created food's id, description and HTTP status
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial context beyond annotations: it discloses the cookie-authenticated web endpoint (no browser needed), the nuanced net-carbs behavior tied to country_code, the fact that MFP has no update endpoint, and that it returns the food id. This is exactly the kind of behavioral detail that helps an agent avoid errors. No contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every paragraph adds critical information: purpose, nutrition coverage, carb semantics, and update limitation. It is structured with clear paragraphs and an Args/Returns section. Slightly verbose, but each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the nutrition model and the critical country_code behavior, the description covers all essential context: what it creates, how it authenticates, what it returns, and how it relates to other tools. The output schema is present, so return-value details are not needed, and the description still clarifies the return format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema has rich per-parameter descriptions, the tool description adds concrete behavioral detail not in the schema: the verified example of how carbs/fiber store under different country_code values, and the warning 'Never pre-add fiber.' This goes beyond merely listing parameter names, earning an above-baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence clearly states the action ('Create a private custom food') with a specific resource ('MyFitnessPal account'). It distinguishes from sibling tools like mfp_search_food (searching existing foods) and mfp_delete_custom_food (deleting). The mention of 'private' and 'custom' further differentiates it from diary-logging tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains a key usage pattern: the returned id is accepted by mfp_add_food_to_diary, and because MFP has no update endpoint, corrections require creating a new food and deleting the old one. It does not explicitly state when to avoid using this tool (e.g., if a food already exists), but the context is reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_delete_custom_foodA
DestructiveIdempotent
Delete one of the user's custom foods by id.

Destructive and not recoverable. A food actively referenced by a logged
diary entry may be refused by MyFitnessPal.

Args:
    params: DeleteCustomFoodInput (food_id)

Returns:
    str: Confirmation with the HTTP status
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description explicitly states 'Destructive and not recoverable' and discloses the failure mode if a food is actively referenced. It also specifies the return type (confirmation with HTTP status). This adds meaningful behavioral context without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main purpose, followed by a concise warning and a structured Args/Returns section. Every sentence adds value, and it avoids unnecessary repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with a simple input model, the description covers the essential risks (irreversibility, potential refusal), the input (food_id), and the output format (confirmation with HTTP status). The annotations and schema fill in the remaining details, so no important context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description mentions 'by id' and lists food_id in the Args section, but adds little beyond the input schema, which already provides detailed descriptions for food_id (source) and response_format. The response_format parameter is not mentioned in the tool description, but the schema covers it adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Delete one of the user's custom foods by id.' It names the specific resource (custom foods) and the method (by id), which distinguishes it from sibling tools like mfp_remove_food_from_diary or mfp_list_own_foods.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys the use case (permanently deleting a custom food) and includes a caveat that foods referenced by diary entries may be refused. However, it does not explicitly mention alternatives, when not to use it, or suggest a workflow to check diary references first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_delete_fastA
DestructiveIdempotent
Delete a fasting entry by id.

Destructive and not recoverable. The `id` must come from a prior
`mfp_log_fast` call or be captured from the MFP app — the MCP cannot
list existing fasts because MFP exposes no read endpoint.

Args:
    params: DeleteFastInput (id, response_format)

Returns:
    str: Confirmation with the deleted id and HTTP status
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as destructive, and the description reinforces this with 'Destructive and not recoverable.' It adds useful context about irreversibility and the inability to list existing fasts, which goes beyond the basic destructiveHint flag.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded. It has a clear purpose sentence, a key warning, id provenance, and a structured Args/Returns block. Every sentence adds necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, destructive nature, id provenance, no-list limitation, and return type. It lacks details about error handling or response_format options, but given the simple one-parameter API and output schema (response_format enum), the description is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The Args line only repeats parameter names (id, response_format) without explaining response_format's behavior. The id source constraint is valuable and goes beyond the schema, but given 0% schema description coverage, the description does not fully compensate for the undocumented response_format parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Delete a fasting entry by id.' This clearly distinguishes it from sibling tools like mfp_delete_custom_food and mfp_update_fast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit context on when this tool can be used: it requires an id from mfp_log_fast or the MFP app because no read endpoint exists to list fasts. It does not explicitly name alternative tools, but the no-list constraint is clear usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_get_diaryA
Read-onlyIdempotent
Get the food diary for a specific date including all meals and their nutritional information.

Returns meals (Breakfast, Lunch, Dinner, Snacks) with each food entry's name,
quantity, and complete nutrition breakdown (calories, protein, carbs, fat, etc.).
Also includes daily totals and goals.

Args:
    params: GetDiaryInput containing:
        - date (str, optional): Date in YYYY-MM-DD format, defaults to today
        - response_format (str): 'markdown' or 'json'

Returns:
    str: Formatted diary data with meals, entries, nutrition, and goals
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and non-destructive. The description goes further by detailing the return structure (Breakfast, Lunch, Dinner, Snacks with nutrition breakdown), inclusion of daily totals/goals, and support for 'markdown' or 'json' output. It also notes the default date behavior, adding value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with Args and Returns sections and front-loads the main purpose. However, there is some redundancy: the first paragraph already lists meals/nutrition and daily totals, and the Returns section repeats a summary. It remains reasonably concise, but a tighter wording would earn a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only report tool, the description covers the essential return content, parameters, and output options. It does not discuss edge cases like empty diaries or errors, but given the simple nature and rich annotations, the provided information is sufficient for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema's measured coverage is 0% at the top level (the 'params' wrapper lacks a description), but the tool description explicitly documents both parameters: date (with format and default) and response_format (with allowed values). This fully compensates for the schema gap and gives agents actionable meaning for invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get the food diary for a specific date including all meals and their nutritional information.' This clearly identifies the verb (get), the resource (food diary), and the scope (date, meals, nutrition). It also distinguishes itself from sibling tools like mfp_get_measurements or mfp_get_water by focusing specifically on diary contents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context by stating the tool retrieves a diary for a given date and defaults to today if no date is given. It does not explicitly mention alternatives or exclusions, but the purpose is unambiguous. This qualifies as clear context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_get_exercisesA
Read-onlyIdempotent
Get logged exercises for a specific date.

Returns both cardiovascular and strength training exercises with their
details (duration, calories burned, sets, reps, weight, etc.).

Args:
    params: GetExercisesInput containing:
        - date (str, optional): Date in YYYY-MM-DD format, defaults to today
        - response_format (str): 'markdown' or 'json'

Returns:
    str: List of exercises with details and calories burned
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds valuable context about the return content (both cardiovascular and strength exercises with details like sets, reps, weight) and notes that response_format controls output style. This goes beyond safety profile and clarifies what the tool actually returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is succinct and well-organized: a one-sentence purpose, a one-sentence summary of return contents, then Args and Returns sections. Every sentence adds information; there is no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup tool, the description covers the purpose, parameters, and return type. It doesn't mention error behavior or pagination, but the presence of an output schema may cover those aspects. Overall, it is complete enough for a tool of this simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains that date is optional and defaults to today, and that response_format accepts 'markdown' or 'json'. Given the schema has 0% coverage (per context signals), the description fully compensates by providing meaning and defaults for both parameters. It doesn't mention format constraints like date pattern, but the essential semantics are clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description directly states the action: 'Get logged exercises for a specific date.' It clearly specifies the resource (exercises) and scope (specific date). It also distinguishes itself from sibling tools like mfp_get_diary or mfp_get_measurements by focusing on exercise logs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied by the description: use this when you need logged exercises for a date. However, there is no explicit guidance on when to use this over alternatives, nor any exclusions. Since it is a simple read tool, the implied context is sufficient for a basic score but not outstanding.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_get_food_detailsA
Read-onlyIdempotent
Get detailed nutritional information for a specific food item by its MFP ID.

Returns complete nutrition breakdown including calories, macros (protein, carbs, fat),
fiber, sugar, sodium, cholesterol, vitamins, minerals, and available serving sizes.

Args:
    params: GetFoodDetailsInput containing:
        - mfp_id (str): MyFitnessPal food item ID from search results
        - response_format (str): 'markdown' or 'json'

Returns:
    str: Complete nutritional information for the food item
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds meaningful context beyond annotations by detailing the specific contents of the response (calories, macros, fiber, sugar, vitamins, serving sizes) and the return type. This gives the agent an accurate picture of what to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, then expands to output details, arguments, and return value. Every sentence earns its place, and the formatting with sections makes it easy to scan. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup tool with strong annotations and thorough schema documentation, the description is nearly complete. It explains what data is returned and how to identify the food item. It lacks error handling or edge-case behavior (e.g., invalid MFP ID), but this is minor given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides complete descriptions for both parameters, including the enum for response_format and the meaning of mfp_id. The description's Args section essentially repeats this information without adding new semantics. Since schema coverage is strong, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get detailed nutritional information for a specific food item by its MFP ID.' It specifies the exact resource (food item details), the verb (Get), and the identifying input (MFP ID), distinguishing it from sibling tools like mfp_search_food or mfp_get_diary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool, noting the MFP ID comes 'from search results' and that the output is a full nutrition breakdown. It doesn't explicitly mention alternatives or exclusions, but the workflow implication (search first, then get details) is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_get_goalsA
Read-onlyIdempotent
Get the user's daily nutrition goals (calories, protein, carbs, fat, etc.).

Returns the configured daily targets for all tracked nutrients.

Args:
    params: GetGoalsInput containing:
        - date (str, optional): Date in YYYY-MM-DD format, defaults to today
        - response_format (str): 'markdown' or 'json'

Returns:
    str: Daily nutrition goals and targets
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description adds that it returns 'configured daily targets for all tracked nutrients,' which clarifies scope. However, no additional behavioral details like error handling, rate limits, or warning about missing goals are provided. With annotations covering safety, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured but includes an Args section that duplicates schema information, making it slightly redundant. It is not excessively long but has unnecessary repetition, so it doesn't earn a higher score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with good annotations and schema coverage, the description is mostly complete. It specifies the return type (str), the default date behavior, and the scope (all tracked nutrients). It doesn't detail edge cases, but those are not critical for a simple getter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides descriptions for both date and response_format, so the description's Args section adds no new meaning. The description mentions date defaults to today, but that is also in the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and resource ('daily nutrition goals'), listing nutrient types and stating it returns configured targets for all tracked nutrients. This clearly distinguishes it from sibling tools like mfp_set_goals and other getters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'get' vs 'set' contrast with sibling tools makes the usage context clear, although no explicit alternatives are named. The description implies this is the read-only tool for retrieving daily goals, but does not mention when not to use it or exceptions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_get_measurementsA
Read-onlyIdempotent
Get body measurements (weight, body fat, etc.) over a date range.

Returns historical measurement data with dates and values. Useful for
tracking weight loss progress and body composition changes.

Args:
    params: GetMeasurementsInput containing:
        - measurement (str): Type of measurement (default 'Weight')
        - start_date (str, optional): Start date, defaults to 30 days ago
        - end_date (str, optional): End date, defaults to today
        - response_format (str): 'markdown' or 'json'

Returns:
    str: Measurement history with dates and values
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable context by stating it returns historical data with dates and values, and it clarifies output format options ('markdown'/'json'). This exceeds the minimum but doesn't fully describe pagination or rate limits, though they are likely not relevant.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with purpose, then organized into an Args section and Returns statement. Every sentence provides useful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (one nested input object), the description covers all necessary aspects: what it does, what parameters to pass, defaults, and the return type. With output schema present and strong annotations, nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description must fully compensate. It does, listing each parameter with its type, default values, and allowed values (e.g., response_format as 'markdown' or 'json'). This is complete and actionable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get'), resource ('body measurements'), and scope ('over a date range'), with examples like weight and body fat. This clearly distinguishes it from sibling tools such as mfp_get_diary or mfp_get_water.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case ('Useful for tracking weight loss progress and body composition changes') but does not explicitly compare with alternatives or state when not to use. It is implied rather than explicit, so it falls short of a 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_get_reportA
Read-onlyIdempotent
Get a nutrition report over a date range.

Returns daily values for the specified nutrient/metric over the date range.
Useful for analyzing trends and patterns in nutrition intake.

Args:
    params: GetReportInput containing:
        - report_name (str): Report type (e.g., 'Net Calories', 'Protein')
        - start_date (str, optional): Start date, defaults to 7 days ago
        - end_date (str, optional): End date, defaults to today
        - response_format (str): 'markdown' or 'json'

Returns:
    str: Daily values and summary statistics for the report period
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds return-value details ('daily values and summary statistics') and date-range scoping, but no additional behavioral caveats. There is 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the primary action and is generally efficient. It is slightly redundant, stating 'Returns daily values' in the opening and again in the 'Returns' section, but overall it is concise and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only report tool with rich schema and annotations, the description adequately covers purpose, usage, and return nature. It does not enumerate all possible report names or error scenarios, but the openWorldHint and existing schema reduce the need for more detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The nested schema already provides descriptions for all parameters, including defaults and examples (e.g., report_name examples, date formats, response_format). The description restates these without adding new semantic meaning, so it adds little beyond the existing structured metadata.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get a nutrition report over a date range' and specifies it returns daily values for a selected nutrient/metric. However, it does not explicitly differentiate from sibling tools like mfp_get_diary or mfp_get_measurements, though the emphasis on 'analyzing trends' hints at its distinct role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a usage context: 'Useful for analyzing trends and patterns in nutrition intake,' which tells the agent when to choose this tool. It does not mention alternatives or exclusion criteria, so it stops short of full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_get_waterA
Read-onlyIdempotent
Get water intake for a specific date, in millilitres.

MyFitnessPal's `/food/water` endpoint returns the amount in a field
literally named `milliliters` (see python-myfitnesspal's `_get_water`),
so this value is always ml regardless of what unit the account's UI is
configured to display.

Args:
    params: GetWaterInput containing:
        - date (str, optional): Date in YYYY-MM-DD format, defaults to today

Returns:
    str: JSON with `date` and `water_ml`
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and non-destructive. The description adds valuable context: it clarifies the return is always in millilitres regardless of account unit settings, citing the underlying endpoint and library, which is a helpful behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four focused sentences: purpose, unit clarification, args, returns. No redundant filler, and the unit note is essential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one optional param, output schema exists). The description covers purpose, parameter, return format, and a key unit gotcha. No significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one nested parameter, but description coverage is marked 0%. The description compensates by explicitly documenting the date parameter with format YYYY-MM-DD and default behavior, matching the schema's own description but reinforcing it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get water intake for a specific date, in millilitres,' using a specific verb and resource that clearly distinguishes it from mfp_set_water and other getter tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit comparison to alternatives or exclusion criteria is provided. The phrase 'for a specific date' implies usage context, but it doesn't mention when to prefer this over mfp_get_diary or other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_list_own_foodsA
Read-onlyIdempotent
List the user's own custom foods, newest first.

Private custom foods do not reliably surface in mfp_search_food, so this is
the way to find the id of something previously created.

Args:
    params: ListOwnFoodsInput (search, limit, response_format)

Returns:
    str: Matching custom foods with id, description, brand and calories
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is covered. The description adds useful behavioral context beyond annotations: the 'newest first' ordering, the unreliability of private foods in search_food, and the return fields (id, description, brand, calories). This enhances transparency without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear purpose statement, a brief contextual note, and a compact Args/Returns format. Every sentence contributes essential information, and the structure makes it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, ordering, use case, and return format, which is adequate for a relatively simple read-only list operation with strong annotations. It lacks details on pagination or exact output formatting, but the limit parameter and return description cover the essentials. Overall, it is complete enough for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description carries the burden of explaining parameters. It merely lists 'search, limit, response_format' without elaborating on their meaning or constraints. Though the schema itself contains descriptions, the description does not add semantic value beyond the parameter names, failing to compensate for the low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'List' and clearly identifies the resource: 'the user's own custom foods,' with an explicit ordering constraint ('newest first'). It distinguishes itself from the sibling tool mfp_search_food by noting that private custom foods do not reliably surface there, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: 'Private custom foods do not reliably surface in mfp_search_food, so this is the way to find the id of something previously created.' It names the alternative (mfp_search_food) and the specific use case (finding IDs of previously created custom foods), effectively communicating when and why this tool should be chosen.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_log_fastA
Log a completed intermittent fasting window in MyFitnessPal.

Creates a new entry with the given start and end times. If `id` is
omitted, a fresh uppercase UUIDv4 is generated (matches how the iOS
app self-assigns ids). The returned `id` is what `mfp_update_fast` and
`mfp_delete_fast` accept — save it if you plan to modify the entry
later.

Args:
    params: LogFastInput (fast_started, fast_ended, id?, response_format)

Returns:
    str: The created entry with id, timestamps, created_at, and status
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare it's not read-only, not destructive, not idempotent. The description adds useful context: auto-generated uppercase UUIDv4 matching iOS behavior, and the relationship between created id and subsequent update/delete operations. It doesn't contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the main purpose, and uses clean Args/Returns sections. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential workflow, return value structure, and id handling. Given the rich nested input schema and annotations, it's sufficiently complete for a create tool. It doesn't address error scenarios, but not necessary for this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The top-level schema only has 'params' with no description (0% coverage). The description compensates by listing the nested fields (fast_started, fast_ended, id?, response_format). The nested schema provides detailed semantics for each field, so the description doesn't need to repeat them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource: 'Log a completed intermittent fasting window in MyFitnessPal.' and further clarifies it 'Creates a new entry'. It clearly distinguishes from siblings like mfp_update_fast and mfp_delete_fast by focusing on creation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains that the returned id is accepted by mfp_update_fast and mfp_delete_fast, telling the agent when to use those alternatives for modification. It also implies 'use this to create new entries' clearly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_remove_food_from_diaryA
Destructive
Remove (delete) one or more food entries from your diary.

Two modes:

1. By entry_id (precise): delete exactly the entry whose id matches -
   this is the UUID `mfp_add_food_to_diary` returned when you logged it.
   Use this when you already know the ID.

2. By name_contains (fuzzy): list the day's entries, find ones whose
   name contains the given substring (case-insensitive), optionally
   restricted to a meal, and delete up to max_matches of them.

Args:
    params: RemoveFoodFromDiaryInput with one of:
        - entry_id: the entry's UUID, as returned by
          mfp_add_food_to_diary (NOT a food_entry_id from the diary page)
        - name_contains: substring match against entry names
        - meal: restrict matching to one meal
        - max_matches: safety cap for fuzzy matches (default 1)
        - date: date to operate on (default today)

Returns:
    JSON describing each entry that was removed.
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true, and the description adds critical context: the distinction between the UUID returned by mfp_add_food_to_diary and the food_entry_id from the diary page, the default max_matches=1 for safety, and the return format. This goes well beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear headings (Two modes, Args, Returns). It is appropriately sized for the tool's complexity, with every sentence contributing either to mode explanation, parameter guidance, or return behavior. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the destructive nature and two-mode design, the description fully covers usage, parameters, exceptions (NOT a food_entry_id), and return values. The output schema exists, so the brief 'JSON describing each entry that was removed' suffices. No significant gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the schema already has descriptions for each parameter, the tool description adds crucial semantic nuance: it clarifies that entry_id is specifically the UUID from mfp_add_food_to_diary (not the diary page ID), explains the relationship between name_contains and meal, and emphasizes max_matches as a safety cap. This enriches the schema's meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Remove (delete) one or more food entries from your diary.' This is a specific verb and resource, and it distinguishes the two modes (by entry_id vs by name_contains), making it unambiguous among sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use each mode: 'Use this when you already know the ID' for entry_id, and describes the fuzzy matching process with optional meal restriction and max_matches safety cap. This gives clear context for selecting the appropriate approach.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_search_foodA
Read-onlyIdempotent
Search the MyFitnessPal food database for food items.

Returns a list of matching foods with their name, brand, serving size,
calories, and MFP ID (which can be used with mfp_get_food_details).

Args:
    params: SearchFoodInput containing:
        - query (str): Search query (e.g., 'chicken breast')
        - limit (int): Maximum results to return (default 10)
        - response_format (str): 'markdown' or 'json'

Returns:
    str: List of matching food items with basic nutrition info
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds return field details and format options but does not disclose additional behavioral aspects like search matching logic or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, returns, args, returns) and front-loaded with the main purpose. However, it redundantly repeats parameter information already available in the schema, adding slight waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool, the description covers purpose, return content, format options, and links to the related details tool. It lacks error-condition notes but is otherwise sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description's Args section fully compensates by listing query, limit, and response_format with types, defaults, and examples, providing clear meaning beyond parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states 'Search the MyFitnessPal food database for food items' with a specific verb and resource, and clarifies it returns matching items with basic nutrition info. This distinguishes it from sibling tools like mfp_get_food_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies it is used for searching foods and mentions the MFP ID can be used with mfp_get_food_details, but it does not explicitly state when to use this tool over alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_set_goalsA
Idempotent
Update daily nutrition goals (calories, protein, carbs, fat).

Sets new daily targets for the specified nutrients. Only updates the
values that are provided; others remain unchanged.

Args:
    params: SetGoalsInput containing:
        - calories (int, optional): Daily calorie goal
        - protein (int, optional): Daily protein goal in grams
        - carbohydrates (int, optional): Daily carb goal in grams
        - fat (int, optional): Daily fat goal in grams

Returns:
    str: Confirmation message with updated goals
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation is a non-readonly, idempotent, non-destructive write. The description adds the key behavior that unspecified values remain unchanged (merge semantics), which is not captured in annotations. This is valuable context for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose, behavioral note, args list, and return type. The args list somewhat duplicates the schema but remains concise and readable, with no unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the partial update behavior, parameter meanings, and return type. It does not mention authentication requirements, but this is likely implied for all mfp tools. It is complete enough for a straightforward setter, though it could note the no-op behavior when all params are null.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description lists each parameter with type and meaning, but the schema already provides detailed descriptions and constraints (e.g., min/max). The description adds no new information beyond the schema and omits the value ranges, making it adequate but not additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates daily nutrition goals (calories, protein, carbs, fat) with the verb 'Update' and specifies the resource. It distinguishes itself from siblings like mfp_get_goals (read) and other mfp setters by focusing specifically on nutrition goals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides useful partial update semantics ('Only updates the values that are provided; others remain unchanged'), which guides usage. However, it does not explicitly mention when to use this tool versus alternatives like mfp_get_goals or other mfp setters; the context 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.

mfp_set_measurementA
Log a new body measurement (weight, body fat, etc.) for today.

Records the measurement value in MyFitnessPal for tracking progress.

Args:
    params: SetMeasurementInput containing:
        - measurement (str): Type of measurement (default 'Weight')
        - value (float): Measurement value (e.g., 185.5)

Returns:
    str: Confirmation message with the logged value
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate mutation (readOnlyHint=false) and non-idempotency (idempotentHint=false). The description adds valuable context: it logs a 'new' measurement (implying each call appends), specifically 'for today', and returns a confirmation message. It does not disclose potential duplicate behavior or unit nuances, but the key behavioral traits are conveyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the primary purpose in the first sentence. It includes a structured Args and Returns section, but the Args block largely duplicates schema information. It wastes no words and is appropriately sized for a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with only two parameters and good annotations, the description is complete: it states the action, scope ('for today'), parameters, and return type. It lacks explicit accepted measurement types or units, but the schema covers those examples. No critical information appears missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explicitly breaks down the nested 'params' object, listing both 'measurement' (with type and default) and 'value' (with type and example). While the schema already provides descriptions for these sub-parameters, the top-level schema coverage is 0% and the description compensates by clarifying the nested structure, default, and example values, adding meaning for agents unfamiliar with the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource ('Log a new body measurement') and clearly differentiates from siblings like mfp_get_measurements (read) and mfp_set_goals (set goals). The scope 'for today' adds precision, making the tool's purpose immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: if you need to log a measurement for today, use this tool. However, it does not explicitly mention alternatives (e.g., mfp_get_measurements for retrieving measurements) or provide when-not-to-use guidance. The phrase 'for today' hints at a constraint but no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_set_waterA
Log water intake for a specific date.

Sets the number of cups of water consumed for the day. MyFitnessPal uses
cups as the unit (1 cup = ~237ml).

Args:
    params: SetWaterInput containing:
        - cups (float): Number of cups of water (e.g., 2.5 for 2.5 cups)
        - date (str, optional): Date in YYYY-MM-DD format, defaults to today

Returns:
    str: Confirmation message with the logged water amount
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description adds useful context: the cups-to-milliliters conversion, the optional date defaulting to today, and the return confirmation. It does not explicitly state whether setting overwrites existing values, but 'set' strongly implies replacement, and there is 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-organized with a short intro, an Args block, and a Returns line. Every sentence adds value—unit conversion, default behavior, and return type—with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple setter tool, the description covers all essential aspects: what it does, parameter semantics, unit conversion, date default, and the confirmation return. An output schema exists, so the return description is a helpful addition rather than a necessity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The Args section fully documents both parameters: cups as a float with an example, and date as an optional YYYY-MM-DD string with a default. This compensates for the opaque top-level params schema and adds practical usage detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs 'Log' and 'Sets' with a clear resource ('water intake') for a specific date. It also includes the unit and distinguishes itself from sibling read tools like mfp_get_water.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the action ('Log water intake') and the date default behavior, implying when to use it. However, it does not explicitly name alternatives or exclusions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mfp_update_fastA
Idempotent
Update an existing fasting entry's start and end times.

MFP's PATCH is a full replacement of the two time fields — both must be
supplied even if only one is changing.

The MCP cannot list fasts (MFP exposes no read endpoint); the `id` must
come from a prior `mfp_log_fast` call or be captured from the MFP app.

Args:
    params: UpdateFastInput (id, fast_started, fast_ended, response_format)

Returns:
    str: The updated entry (id, timestamps, status)
ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals the PATCH full-replacement behavior, the limitation that fasts cannot be listed, and the id sourcing constraint, all of which go beyond the annotations' idempotentHint and destructiveHint. This adds valuable context about the underlying API.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into concise paragraphs with an Args/Returns block. It front-loads the main purpose and uses bullets-like structure. The Args line mildly duplicates schema but is not excessive. Overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the small parameter count, rich schema, and annotations, the description covers purpose, usage constraints, id sourcing, and return value. It is complete enough for an agent to invoke correctly without needing additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides descriptions for id, fast_started, fast_ended, and response_format. The description adds critical cross-parameter semantics: both time fields must be supplied even if only one changes, and id must come from a prior log call. While it doesn't repeat schema details, the PATCH behavior is essential for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Update an existing fasting entry's start and end times', a specific verb+resource statement. It clearly distinguishes from siblings like mfp_log_fast (create) and mfp_delete_fast (delete) by focusing on updating times.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states that both time fields must be supplied due to PATCH full replacement, and explains that the id cannot be discovered via the MCP since no read endpoint exists; it must come from a prior mfp_log_fast call or the app. This is clear contextual guidance, though it doesn't explicitly name alternatives for creation/deletion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refresh_browser_cookiesA
Extract and save session cookies from your web browser.

Use this tool when authentication fails and you need to refresh your
MyFitnessPal session. You must be logged into myfitnesspal.com in the
target browser.

Args:
    browser: Source to extract cookies from. Options:
             - 'auto' (default): scan every installed Chromium-based
               browser on macOS (Arc, Chrome, Edge, Brave, Vivaldi,
               Opera, ...) and use the first one with a valid session.
             - 'arc', 'chrome', 'chromium', 'edge', 'brave', 'vivaldi',
               'opera': force a specific Chromium browser (macOS).
             - 'firefox': use browser_cookie3 (Firefox is not Chromium).

Returns:
    Success message or error description.
ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoauto

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explains browser scanning behavior, the 'auto' mode, and the Firefox exception, but does not disclose where cookies are saved, whether existing cookies are overwritten, or any side effects. These gaps are noticeable for a tool that 'saves' cookies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary, usage condition, and detailed args. It is slightly longer than strictly necessary but every sentence adds value, including the 'Firefox is not Chromium' note. Front-loaded with the main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no required parameters and an output schema, the description covers the use case, prerequisites, parameter options, and return behavior. The 'Returns: Success message or error description' line provides adequate output context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only a default value with no description, while the tool description fully documents every browser option: 'auto' scans all Chromium browsers, specific names force a browser, and 'firefox' uses browser_cookie3. This completely compensates for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Extract and save session cookies from your web browser.' It clearly distinguishes itself from sibling tools, which are all MFP data operations, by focusing on browser cookie extraction and session refresh.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'Use this tool when authentication fails and you need to refresh your MyFitnessPal session.' It also provides a prerequisite: 'You must be logged into myfitnesspal.com in the target browser.' This is clear and actionable.

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. Dates show when Glama detected each change.

  1. 20 tool updatesv1.0.0
    • First observedmfp_add_food_to_diary
    • First observedmfp_create_custom_food
    • First observedmfp_delete_custom_food
    • First observedmfp_delete_fast
    • First observedmfp_get_diary
    • First observedmfp_get_exercises
    • First observedmfp_get_food_details
    • First observedmfp_get_goals
    • First observedmfp_get_measurements
    • First observedmfp_get_report
    • First observedmfp_get_water
    • First observedmfp_list_own_foods
    • First observedmfp_log_fast
    • First observedmfp_remove_food_from_diary
    • First observedmfp_search_food
    • First observedmfp_set_goals
    • First observedmfp_set_measurement
    • First observedmfp_set_water
    • First observedmfp_update_fast
    • First observedrefresh_browser_cookies

TDQS

A4/5.0
Disambiguation5/5

Each tool targets a distinct resource and action: diary retrieval, food search, food details, measurement get/set, exercise get, goals get/set, water get/set, report, custom food CRUD, and fast CRUD. The closest pair is mfp_get_diary and mfp_get_report, but they serve clearly different purposes (daily meals vs. trend over a range).

Naming Consistency4/5

The vast majority use the consistent mfp_<verb>_<object> pattern with clear verbs (get, set, add, remove, create, list, delete, log, update). The only exception is refresh_browser_cookies, which lacks the mfp_ prefix but is clearly an auth utility, so it is a minor deviation.

Tool Count4/5

20 tools is on the high end, but the domain is broad: diary, food database, measurements, exercises, goals, water, custom foods, and fasting. Each tool has a clear purpose, though some get/set pairs (e.g., water, measurements) could theoretically be combined. Overall it feels reasonably scoped for a comprehensive MFP client.

Completeness3/5

Core workflows are covered, but there are notable gaps: no way to update or edit diary entries (only add/remove), no tool for logging exercises (only reading them), and no read endpoint for fasting entries (though MFP itself lacks this). Custom food CRUD lacks update due to platform limitations. Agents will need workarounds for these missing operations.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/AdamWalt/myfitnesspal-mcp-python'

If you have feedback or need assistance with the MCP directory API, please join our Discord server