Skip to main content
Glama

mcp-mealie

MCP server for Mealie — exposes a Mealie instance's REST API to MCP clients (Claude Desktop, Claude Code, etc.) so an LLM can read, search, scrape, edit, and delete recipes (and meal plans, shopping lists, cookbooks, taxonomy) on your behalf.

Prerequisites

  • Python 3.14+

  • uv

  • A reachable Mealie instance (self-hosted or otherwise)

  • A Mealie API token: in Mealie, click your avatar → Profile → API Tokens → Generate. The token inherits the issuing user's permissions, so for automation prefer a dedicated non-admin user.

Related MCP server: mealie-mcp-server

Setup

uv sync

Configuration

Two environment variables are required:

Variable

Purpose

MEALIE_BASE_URL

Root URL of your Mealie instance, no trailing path

MEALIE_API_TOKEN

Long-lived bearer token from Profile → API Tokens

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "mealie": {
      "command": "uvx",
      "args": ["mcp-mealie"],
      "env": {
        "MEALIE_BASE_URL": "https://mealie.example.com",
        "MEALIE_API_TOKEN": "eyJhbGc..."
      }
    }
  }
}

Claude Code

claude mcp add mealie \
  -e MEALIE_BASE_URL=https://mealie.example.com \
  -e MEALIE_API_TOKEN=eyJhbGc... \
  -- uvx mcp-mealie

Tools

Diagnostics

Tool

Description

get_about

Server version / health (no auth path)

whoami

Confirm the token works

Recipes (full CRUD + scrape + rating + content)

Tool

Description

list_recipes

Paginated list with search and ordering

get_recipe

Full recipe by slug

create_recipe

Empty recipe by name

create_recipe_from_url

Scrape from a URL

update_recipe

Patch common metadata fields

set_recipe_ingredients

Replace ingredient list (raw text, no food/unit binding)

set_recipe_ingredients_parsed

Replace ingredient list, parsing each line and binding food/unit IDs

parse_recipe_ingredients

Re-parse the recipe's existing free-text ingredients in place

set_recipe_instructions

Replace step list (JSON array of lines)

set_recipe_notes

Replace notes (JSON array of {title,text})

set_recipe_rating

Per-user rating / favorite

delete_recipe

Delete by slug

Cookbooks (full CRUD)

Tool

Description

list_cookbooks

Saved recipe filters

get_cookbook

By UUID

create_cookbook

name, description, query_filter_string, public

update_cookbook

Patch

delete_cookbook

Delete

Meal plans (full CRUD)

Tool

Description

list_mealplans

Range-filtered list

get_mealplan

By id

create_mealplan

date + entry_type, plus recipe_id or title/text

update_mealplan

Patch

delete_mealplan

Delete

Meal-plan rules (full CRUD)

Used by Mealie's random-meal generator.

Tool

Description

list_mealplan_rules

List rules

get_mealplan_rule

By UUID

create_mealplan_rule

day, entry_type, query_filter_string

update_mealplan_rule

Patch

delete_mealplan_rule

Delete

Shopping lists (CRUD + recipe attach)

Tool

Description

list_shopping_lists

get_shopping_list

Includes items

create_shopping_list

update_shopping_list

Rename

delete_shopping_list

add_recipe_to_shopping_list

Add a recipe's ingredients (with scale)

remove_recipe_from_shopping_list

Reverse the above

Shopping items (full CRUD)

Tool

Description

list_shopping_items

Optionally filter by list_id

get_shopping_item

create_shopping_item

Free-form note or structured (food/unit)

create_shopping_items_bulk

JSON-array bulk create

update_shopping_item

Includes check/uncheck

delete_shopping_item

Parser

Tool

Description

parse_ingredient

One string → quantity/unit/food

parse_ingredients

JSON array of strings → list of parsed results

Taxonomy (full CRUD per resource)

Categories, tags, and kitchen tools share a uniform {name} create surface.

Resource

Tools

Categories

list_categories, get_category, create_category, update_category, delete_category

Tags

list_tags, get_tag, create_tag, update_tag, delete_tag

Kitchen tools

list_tools, get_tool, create_tool, update_tool, delete_tool

Foods

list_foods, get_food, create_food, update_food, delete_food

Units

list_units, get_unit, create_unit, update_unit, delete_unit

Labels

list_labels, get_label, create_label, update_label, delete_label

Development

uv sync
uv run pytest tests/ -x -q
uv run ruff check src/ tests/
uv run pyright src/

Available Tools

75 tools
add_recipe_to_shopping_listC

Add a recipe's ingredients to a shopping list. scale multiplies amounts.

Inputs: list_id (required), recipe_id (required), scale.

create_categoryC

Create a category.

Inputs: name (required).

create_cookbookC

Create a cookbook. query_filter_string is the Mealie filter DSL.

Inputs: name (required), description, query_filter_string, public.

create_foodC

Create a food (ingredient).

Inputs: name (required), plural_name, description, label_id.

create_labelB

Create a label. color is a CSS hex string like '#3f51b5'.

Inputs: name (required), color.

create_mealplanA

Create a meal-plan entry.

Supply either recipe_id (UUID) for a recipe entry, or title/text for a freeform entry. entry_type is one of: breakfast, lunch, dinner, side.

Inputs: date (required), entry_type, title, text, +1 more.

create_mealplan_ruleA

Create a meal-plan rule.

day is monday..sunday or "unset" (any day). entry_type is breakfast/lunch/dinner/side. query_filter_string is the Mealie filter DSL (e.g. tags.name = "quick").

Inputs: day, entry_type, query_filter_string.

create_recipeB

Create an empty recipe by name. Returns the new slug.

Inputs: name (required).

create_recipe_from_urlB

Scrape a recipe from a URL using Mealie's scraper. Returns the new slug.

Inputs: url (required), include_tags.

create_shopping_itemA

Create a single shopping item on a list.

Free-form items: pass note (e.g. "carrots, 2 lb"). Structured items: set is_food=true and pass food_id, optional unit_id.

Inputs: list_id (required), note, quantity, is_food, +3 more. Returns: result

create_shopping_items_bulkA

Bulk-create shopping items from a JSON array.

items_json is a JSON array of item objects. Each item must include shoppingListId (UUID); note and quantity are typical optional fields.

Inputs: items_json (required). Returns: result

create_shopping_listC

Create a shopping list with the given name.

Inputs: name (required).

create_tagD

Create a tag.

Inputs: name (required).

create_toolC

Create a kitchen tool.

Inputs: name (required).

create_unitB

Create a unit of measure. fraction/use_abbreviation: 0=false, 1=true.

Inputs: name (required), plural_name, abbreviation, plural_abbreviation, +3 more.

delete_categoryC

Delete a category by UUID.

Inputs: category_id (required).

delete_cookbookB

Delete a cookbook by UUID.

Inputs: cookbook_id (required).

delete_foodC

Delete a food by UUID.

Inputs: food_id (required).

delete_labelC

Delete a label by UUID.

Inputs: label_id (required).

delete_mealplanB

Delete a meal-plan entry by id.

Inputs: mealplan_id (required).

delete_mealplan_ruleC

Delete a meal-plan rule by UUID.

Inputs: rule_id (required).

delete_recipeB

Delete a recipe by slug. This is permanent.

Inputs: slug (required).

delete_shopping_itemB

Delete a shopping item by UUID.

Inputs: item_id (required).

delete_shopping_listC

Delete a shopping list by UUID.

Inputs: list_id (required).

delete_tagB

Delete a tag by UUID.

Inputs: tag_id (required).

delete_toolC

Delete a kitchen tool by UUID.

Inputs: tool_id (required).

delete_unitB

Delete a unit by UUID.

Inputs: unit_id (required).

get_aboutA

Return Mealie server version and basic info. Confirms connectivity.

Inputs: no named parameters.

get_categoryA

Fetch a category by UUID.

Inputs: category_id (required).

get_cookbookB

Fetch a cookbook by UUID.

Inputs: cookbook_id (required).

get_foodC

Fetch a food by UUID.

Inputs: food_id (required).

get_labelA

Fetch a label by UUID.

Inputs: label_id (required).

get_mealplanA

Fetch a meal-plan entry by numeric id.

Inputs: mealplan_id (required).

get_mealplan_ruleB

Fetch a meal-plan rule by UUID.

Inputs: rule_id (required).

get_recipeB

Fetch a full recipe by slug, including ingredients and instructions.

Inputs: slug (required).

get_server_versionA

Return the installed version of the mcp-mealie server.

Inputs: no named parameters. Returns: result

get_shopping_itemB

Fetch a shopping item by UUID.

Inputs: item_id (required).

get_shopping_listA

Fetch a shopping list by UUID, including its items.

Inputs: list_id (required).

get_tagC

Fetch a tag by UUID.

Inputs: tag_id (required).

get_toolA

Fetch a kitchen tool by UUID.

Inputs: tool_id (required).

get_unitA

Fetch a unit by UUID.

Inputs: unit_id (required).

list_categoriesC

List recipe categories.

Inputs: page, per_page.

list_cookbooksC

List cookbooks (saved recipe filters) for the current household.

Inputs: page, per_page.

list_foodsC

List ingredient foods.

Inputs: page, per_page.

list_labelsB

List multi-purpose labels (used by foods, shopping items, etc.).

Inputs: page, per_page.

list_mealplan_rulesC

List meal-plan rules used by the random-meal generator.

Inputs: page, per_page.

list_mealplansC

List meal-plan entries, optionally bounded by start_date/end_date.

Inputs: start_date, end_date, page, per_page.

list_recipesC

List recipes with optional search, sorting, and pagination.

Inputs: search, page, per_page, order_by, +1 more.

list_shopping_itemsC

List shopping items, optionally filtered to one shopping list.

Inputs: list_id, page, per_page.

list_shopping_listsB

List shopping lists for the current household.

Inputs: page, per_page.

list_tagsC

List recipe tags.

Inputs: page, per_page.

list_toolsC

List kitchen tools.

Inputs: page, per_page.

list_unitsD

List units of measure.

Inputs: page, per_page.

parse_ingredientA

Parse a single ingredient string into structured quantity/unit/food.

parser is "nlp" (default, CRF model) or "brute" (regex fallback).

Inputs: text (required), parser.

parse_ingredientsC

Parse many ingredient strings. ingredients_json is a JSON string array.

Inputs: ingredients_json (required), parser. Returns: result

parse_recipe_ingredientsA

Re-parse a recipe's free-text ingredients and bind to food/unit IDs.

Reads the recipe's current ingredients, runs each line through Mealie's NLP parser, looks up matching food / unit records (matching on name, plural, abbreviations, and aliases — case-insensitive), creates new food / unit records when no match exists, and writes the bound result back to the recipe. After this runs, ingredients are eligible for shopping-list aggregation.

Lines whose parsed average confidence falls below min_confidence are stored as free text (no binding) so quirky lines like "splash of sake for deglazing" don't pollute the food catalogue.

Returns a per-line summary of what was bound vs. left as free text.

Inputs: slug (required), min_confidence.

remove_recipe_from_shopping_listB

Remove a recipe's ingredients from a shopping list.

Inputs: list_id (required), recipe_id (required).

set_recipe_ingredientsB

Replace a recipe's ingredient list with the given lines.

ingredients_json is a JSON array of strings, one per ingredient (e.g. ["1 cup flour", "2 eggs"]). Each string is stored verbatim; the user can re-parse to structured quantity/unit/food in the Mealie UI afterward to enable shopping-list integration.

Inputs: slug (required), ingredients_json (required).

set_recipe_ingredients_parsedA

Like set_recipe_ingredients, but parses each line and binds food/unit IDs.

ingredients_json is a JSON array of strings. Each is run through Mealie's NLP parser; recognized food / unit names are matched against the existing taxonomy (or created if not present), so the resulting recipe is shopping-list-aggregation-ready.

Lines whose parsed average confidence falls below min_confidence are stored as free text.

Returns a per-line summary of what was bound vs. left as free text.

Inputs: slug (required), ingredients_json (required), min_confidence.

set_recipe_instructionsA

Replace a recipe's instruction steps with the given lines.

instructions_json is a JSON array. Each element is either:

  • a string ("Boil water: bring 4 quarts to a rolling boil"), or

  • an object ({"title": "Prep", "summary": "Boil water", "text": "..."})

Strings starting with a short "Header: rest" prefix are auto-split: the header goes into the step's summary (rendered as a per-step header in Mealie's UI), and the rest goes into text. The title field is reserved for section dividers between groups of steps and is only set when the dict form provides one.

Inputs: slug (required), instructions_json (required).

set_recipe_notesA

Replace a recipe's notes with the given JSON array.

notes_json is a JSON array of {title, text} objects. title is optional; text is required. Example: [{"title": "Tip", "text": "Toast the spices first."}].

Inputs: slug (required), notes_json (required).

set_recipe_ratingA

Set the calling user's rating and/or favorite flag for a recipe.

rating: 0-5 (decimals allowed). Pass -1 to leave unchanged. is_favorite: 0=remove, 1=add. Pass -1 to leave unchanged.

Inputs: slug (required), rating, is_favorite.

update_categoryC

Rename a category by UUID.

Inputs: category_id (required), name (required).

update_cookbookC

Patch a cookbook. Use public=1 to make public, public=0 to unpublish.

Inputs: cookbook_id (required), name, description, query_filter_string, +1 more.

update_foodC

Patch a food.

Inputs: food_id (required), name, plural_name, description, +1 more.

update_labelD

Patch a label.

Inputs: label_id (required), name, color.

update_mealplanB

Patch a meal-plan entry. Only non-empty fields are sent.

Inputs: mealplan_id (required), date, entry_type, title, +2 more.

update_mealplan_ruleC

Patch a meal-plan rule.

Inputs: rule_id (required), day, entry_type, query_filter_string.

update_recipeA

Patch a recipe. Only non-empty fields are sent.

Note: rating is per-user in Mealie 2.x+ and is not exposed here. Set it via the Mealie UI (or a future dedicated tool) against POST /api/users/{user_id}/ratings/{slug}.

Inputs: slug (required), name, description, recipe_yield, +4 more.

update_shopping_itemC

Patch a shopping item. checked: 0=unchecked, 1=checked, -1=leave.

Inputs: item_id (required), note, quantity, checked, +4 more.

update_shopping_listC

Patch a shopping list. Currently supports renaming.

Inputs: list_id (required), name.

update_tagB

Rename a tag by UUID.

Inputs: tag_id (required), name (required).

update_toolC

Rename a kitchen tool by UUID.

Inputs: tool_id (required), name (required).

update_unitC

Patch a unit.

Inputs: unit_id (required), name, plural_name, abbreviation, +4 more.

whoamiA

Return the user owning the configured API token. Confirms auth works.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 75 tools

    Disambiguation5/5

    Every tool has a distinct purpose, clearly differentiated by entity (category, food, recipe, etc.) and action. Even similar tools like parse_ingredient and parse_ingredients are distinguished by singular vs. bulk input. No two tools could be confused.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_category, list_recipes, delete_food). Minor exceptions like whoami and parse_recipe_ingredients still fit the pattern well, with no mixing of conventions.

    Tool Count4/5

    75 tools is high, but the scope of Mealie (recipe management, meal planning, shopping lists, ingredients, tools, units, etc.) justifies the count. Each tool serves a specific need within the domain, though some consolidation could be possible. Still reasonable.

    Completeness5/5

    The tool set covers full CRUD for all major entities (categories, cookbooks, foods, labels, mealplans, recipes, shopping lists/items, tags, tools, units). Additionally includes recipe scraping, ingredient parsing, rating, and authentication checks, leaving no obvious gaps for core workflows.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      A
      maintenance
      A MCP server for Mealie recipe management. Exposes 43 tools and 1 prompt for AI assistants to search, create, and manage recipes, meal plans, shopping lists, categories, and tags.
      216 npm
      16
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      A read-only MCP server for Mealie that enables searching recipes, managing shopping lists, meal plans, and retrieving household/instance info via tools. Supports secure per-user authentication and multiple Mealie instances.
      MIT