Back to Browse

Nutrition MCP Server

by User
Developer ToolsLow Risk10.0LocalRemote
Free

Personal nutrition tracking — log meals, track macros, review history, import from another app.

About

Personal nutrition tracking — log meals, track macros, review history, import from another app.

Remote endpoints: streamable-http: https://nutrition-mcp.com/mcp

Security Report

10.0
Low Risk10.0Low Risk

Valid MCP server (2 strong, 1 medium validity signals). No known CVEs in dependencies. Imported from the Official MCP Registry. Trust signals: trusted author (5/5 approved).

Endpoint verified · Requires authentication · 1 issue found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

file_system

Check that this permission is expected for this type of plugin.

HTTP Network Access

Connects to external APIs or services over the internet.

How to Install & Connect

Available as Local & Remote

This plugin can run on your machine or connect to a hosted endpoint. during install.

Documentation

View on GitHub

From the project's GitHub README.

Nutrition MCP

A remote MCP server for personal nutrition tracking — log meals with calories, macros, fiber and total sugar, log water and body weight, review nutrition history, and import an existing food diary from another app, all through conversation. Alcohol tracking is opt-in and off by default.

Help me pay for the servers on Patreon

Quick Start

Already hosted and ready to use — just connect it to your MCP client:

https://nutrition-mcp.com/mcp

On Claude.ai: Customize → Connectors → + → Add custom connector → paste the URL → Connect

On first connect you'll be asked to register with an email and password. Your data persists across reconnections.

Switching from another tracker? See the nutrition-app alternatives — how it compares to MyFitnessPal, Cronometer, Lose It!, MacroFactor, Yazio, and Lifesum. Bring your history with you: say "import my meals" and an importer opens in the chat, where you pick the CSV you exported from your old app, map its columns, and check what will be added before anything is saved. Exports from MyFitnessPal, Cronometer, Lose It! and MacroFactor are recognised automatically; any other CSV works by mapping its columns yourself. In clients that can't show in-chat panels, paste the export instead and the AI imports it for you. If your export has an alcohol column and you want it kept, turn alcohol tracking on before importing — the importer skips that column while tracking is off, and re-importing the same file later won't backfill it.

Demo

Demo

Read the story behind it: How I Replaced MyFitnessPal and Other Apps with a Single MCP Server

Tech Stack

  • Bun — runtime and package manager
  • Hono — HTTP framework
  • MCP SDK — Model Context Protocol over Streamable HTTP
  • Supabase — PostgreSQL database + user authentication
  • OAuth 2.0 — authentication for Claude.ai connectors

MCP Tools

ToolDescription
log_mealLog a meal with description, type, calories, macros, fiber, total sugar, alcohol, notes — from text or a photo of your plate
start_meal_importOpen the in-chat CSV importer: pick an export from another app, map its columns, preview, confirm
bulk_import_mealsWrite up to 50 imported rows per call — each row validated, duplicates skipped so a re-send is safe
lookup_barcodeLook up a packaged product's label nutrition by barcode via Open Food Facts (read from a photo or typed)
get_meals_todayGet all meals logged today
get_meals_by_dateGet meals for a specific date (YYYY-MM-DD)
get_meals_by_date_rangeGet meals between two dates (inclusive)
search_mealsSearch past meals by keyword, grouped into recurring variations (counts, last logged, typical macros)
get_nutrition_summaryDaily nutrition totals + goal progress for a date range
update_mealUpdate any fields of an existing meal
delete_mealDelete a meal by ID
set_nutrition_goalsSet daily calorie, macro, fiber and water targets to reach, sugar and alcohol limits to stay under, plus an optional target weight
get_nutrition_goalsGet the current daily targets and limits
get_goal_progressGet intake vs. targets and limits for a given day (default: today), plus latest weight vs. target
log_waterLog a hydration entry in milliliters
get_water_todayGet today's water intake total and entries
get_water_by_dateGet water intake for a specific date
delete_waterDelete a water log entry by ID
log_weightLog a body-weight measurement in kg or lb (converted and stored server-side)
get_weight_todayGet today's weight entries
get_weight_by_dateGet weight entries for a specific date
get_weight_by_date_rangeGet weight entries between two dates (inclusive), grouped by day
get_weight_trendsWeight trend: latest, overall change, 7/14/30-day moving averages, min/max, and goal progress
update_weightUpdate an existing weight entry
delete_weightDelete a weight entry by ID
set_weight_unitSet the preferred weight unit (kg or lb; null to clear)
get_weight_unitGet the preferred weight unit
get_trends7/14/30-day averages, std dev, streaks, day-of-week, best/worst day
get_meal_patternsPre-aggregated behavioural patterns (breakfast effect, late dinner, weekend vs weekday, outliers)
export_mealsExport all meals as a CSV and return a 60-minute download link
set_timezoneSet the user's IANA timezone (e.g. America/Los_Angeles)
get_timezoneGet the user's configured timezone
set_widget_displayEnable or disable the in-chat visual widgets (dashboards, rings, charts); enabled by default
get_widget_displayGet whether the in-chat visual widgets are enabled
set_alcohol_trackingTurn alcohol tracking on or off (off by default) and choose US standard drinks or UK units; turning it off hides alcohol rather than deleting it
get_alcohol_trackingGet whether alcohol tracking is on and which standard drink it's displayed in
delete_accountPermanently delete account and all associated data

MCP Resources

URIDescription
nutrition://weekly-summaryRolling 7-day digest (averages vs targets, best/roughest day) for proactive pulls

Self-hosting

1. Supabase setup

  1. Create a Supabase project.

  2. Enable Email Auth (Authentication → Providers → Email) and disable email confirmation.

  3. Apply the schema. The full schema lives in supabase/migrations/. With the Supabase CLI:

    supabase link --project-ref <your-project-ref>
    supabase db push
    

    This creates every table, index, RLS policy, and foreign key the app needs. No local Postgres is involved — migrations run against your hosted project.

  4. Copy the service role key from Project Settings → API and use it as SUPABASE_SECRET_KEY.

2. Environment variables

VariableDescription
SUPABASE_URLYour Supabase project URL
SUPABASE_SECRET_KEYSupabase service role key (bypasses RLS)
OAUTH_CLIENT_IDRandom string for OAuth client identification
OAUTH_CLIENT_SECRETRandom string for OAuth client authentication
GOOGLE_CLIENT_ID(optional) Google OAuth client ID for "Sign in with Google"
GOOGLE_CLIENT_SECRET(optional) Google OAuth client secret
OFF_USER_AGENTOpen Food Facts User-Agent for barcode lookups, in the form AppName (email)
PORTServer port (default: 8080)

Making it yours: The public site includes the maintainer's personal bits — Google Analytics, Patreon/GitHub/contact links, and the nutrition-mcp.com domain. Run bun run depersonalize to strip them all in one pass (analytics + CSP, the Support/Contact sections, social links, and the domain → a your-domain.com placeholder). Use bun run depersonalize --dry to preview without writing. Afterwards, swap in your own public/og.png, favicon.ico, and apple-touch-icon.png, and replace the domain placeholder with your real domain.

Generate OAuth credentials:

openssl rand -hex 16   # use as OAUTH_CLIENT_ID
openssl rand -hex 32   # use as OAUTH_CLIENT_SECRET

3. Google sign-in (optional)

Email/password works out of the box. To also offer "Continue with Google", follow docs/google-auth-setup.md to create a Google OAuth client, enable the Google provider in Supabase, and set GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET.

Development

bun install
cp .env.example .env   # fill in your credentials
bun run dev             # starts with hot reload on http://localhost:8080

Connect to Claude.ai

  1. Open Claude.ai and click Customize
  2. Click Connectors, then the + button
  3. Click Add custom connector
  4. Fill in:
    • Name: Nutrition Tracker
    • Remote MCP Server URL: https://nutrition-mcp.com/mcp
  5. Click Connect — sign in or register when prompted
  6. After signing in, Claude can use your nutrition tools. If you reconnect later, sign in with the same email and password to keep your data.

API Endpoints

EndpointDescription
GET /healthHealth check
GET /.well-known/oauth-authorization-serverOAuth metadata discovery
POST /registerDynamic client registration
GET /authorizeOAuth authorization (shows login page)
POST /approveLogin/register handler
POST /tokenToken exchange
GET /favicon.icoServer icon
ALL /mcpMCP endpoint (authenticated)

Deploy

The project includes a Dockerfile for container-based deployment.

  1. Push your repo to a hosting provider (e.g. DigitalOcean App Platform)
  2. Set the environment variables listed above
  3. The app auto-detects the Dockerfile and deploys on port 8080
  4. Point your domain to the deployed URL

License

MIT

Reviews

No reviews yet

Be the first to review this server!