mcp-mealie
Provides tools for managing recipes, cookbooks, meal plans, shopping lists, and taxonomy (categories, tags, kitchen tools, foods, units, labels) in a Mealie instance.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-mealie search my recipes for chicken dinner"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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+
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 syncConfiguration
Two environment variables are required:
Variable | Purpose |
| Root URL of your Mealie instance, no trailing path |
| 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-mealieTools
Diagnostics
Tool | Description |
| Server version / health (no auth path) |
| Confirm the token works |
Recipes (full CRUD + scrape + rating + content)
Tool | Description |
| Paginated list with search and ordering |
| Full recipe by slug |
| Empty recipe by name |
| Scrape from a URL |
| Patch common metadata fields |
| Replace ingredient list (raw text, no food/unit binding) |
| Replace ingredient list, parsing each line and binding food/unit IDs |
| Re-parse the recipe's existing free-text ingredients in place |
| Replace step list (JSON array of lines) |
| Replace notes (JSON array of {title,text}) |
| Per-user rating / favorite |
| Delete by slug |
Cookbooks (full CRUD)
Tool | Description |
| Saved recipe filters |
| By UUID |
| name, description, query_filter_string, public |
| Patch |
| Delete |
Meal plans (full CRUD)
Tool | Description |
| Range-filtered list |
| By id |
| date + entry_type, plus recipe_id or title/text |
| Patch |
| Delete |
Meal-plan rules (full CRUD)
Used by Mealie's random-meal generator.
Tool | Description |
| List rules |
| By UUID |
| day, entry_type, query_filter_string |
| Patch |
| Delete |
Shopping lists (CRUD + recipe attach)
Tool | Description |
| |
| Includes items |
| |
| Rename |
| |
| Add a recipe's ingredients (with scale) |
| Reverse the above |
Shopping items (full CRUD)
Tool | Description |
| Optionally filter by |
| |
| Free-form note or structured (food/unit) |
| JSON-array bulk create |
| Includes check/uncheck |
|
Parser
Tool | Description |
| One string → quantity/unit/food |
| 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 |
|
Tags |
|
Kitchen tools |
|
Foods |
|
Units |
|
Labels |
|
Development
uv sync
uv run pytest tests/ -x -q
uv run ruff check src/ tests/
uv run pyright src/Available Tools
75 toolsadd_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
Scored across 75 tools
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.
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.
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.
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
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for generating rough-draft project plans from natural-language prompts.
Official Todoist MCP server. Manage tasks and projects. Hosted, no API key needed.
MCP server for OpenAI API (chat completions, image generation, embeddings) via AceDataCloud
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server that integrates with AnyList for managing shopping lists, recipes, and meal planning via natural language.35ISC
- AlicenseNot gradedqualityAmaintenanceA 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 npm16MIT
- AlicenseNot gradedqualityDmaintenanceConnects MCP clients like Claude to your Mealie recipe manager, enabling natural language search, creation, import, and updates of recipes.216 npmMIT
- AlicenseNot gradedqualityCmaintenanceA 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