mealie-mcp
mealie-mcp is an MCP server that lets AI clients read and manage a Mealie recipe collection and household meal-planning data through curated, safety-scoped tools.
Search and fetch recipes, including ingredients, steps, nutrition, comments, timeline, and raw details; suggest recipes from on-hand foods/tools.
Preview and import recipes from URLs, HTML/schema.org JSON, or images via Mealie's AI provider.
Create, patch-update, duplicate, and delete recipes; set cover images, last-made dates, ratings/favorites, comments, and timeline events.
Organize recipes with tags, categories, and tools; list, create, rename, and delete organizers.
Manage structured ingredient vocabulary: list/create foods and units, parse ingredient lines, merge duplicates, and parse recipe ingredients in place.
Plan meals: list date ranges, get today's meals, add random/recipe/text entries, update or delete entries.
Manage shopping lists: create/delete lists, add/tick/update/remove items, and add/remove recipe ingredients with serving scaling.
Manage cookbooks and public recipe share links.
Get Mealie version and token permission details to diagnose access failures.
Support read-only mode, tool allow/deny filtering, and confirmation tokens or elicitation for destructive/public actions.
Provides tools for searching, reading, importing, organizing, meal planning, and shopping list management within a self-hosted Mealie recipe manager 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., "@mealie-mcp import this lasagna recipe from https://example.com/lasagna"
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.
mealie-mcp
A Model Context Protocol (MCP) server for Mealie, the self-hosted recipe manager and meal planner.
Lets MCP clients like Claude Code, Claude Desktop or Codex work with your recipe collection: search and read recipes with their ingredients and steps, import new ones from a website, keep tags and categories tidy, plan meals, build shopping lists from those plans, and record what was actually cooked.
Fifty-three tools is the ceiling, not the floor: MEALIE_ALLOW_TOOLS=essential
registers a curated eight instead, and a model picks the right tool far more
reliably from eight than from fifty-four — see
choosing which tools load.

Mealie's REST API has 259 operations across 175 paths. This server exposes 54
tools, chosen so that the common tasks are one call and the dangerous surface is
not reachable at all. Verified against Mealie v3.28.0; the source of truth for
every request shape is the GET /openapi.json of a running instance, not the
published documentation, which is out of date in several places.
What makes it different
Fifty-three curated tools out of 259 API operations. Mealie's REST API is far larger than a model should reach into; what is here covers the common tasks in one call — search, read and import recipes, keep tags and categories tidy, plan meals, build shopping lists, manage cookbooks and ratings.
update_recipe uses PATCH, not PUT. Mealie's replace route silently drops
recipe fields that were not sent; only the fields you name change here.
The dangerous surface is unreachable. No admin routes, no token minting, no webhooks and no outbound-HTTP triggers, whatever the token would allow.
Related MCP server: Blender Open MCP
Requirements
Node.js 24 or newer
A Mealie instance and an API token from Settings → API Tokens
Configuration
Variable | Required | Description |
| yes | Base URL, e.g. |
| yes | Token from Settings → API Tokens. It acts as the user who created it. |
| no | Exactly |
| no | e.g. |
| no | Exactly |
| no | Comma-separated tool names, |
| no | Same syntax; removed from whatever |
| no |
|
The two booleans are compared against the literal string true, so a typo leaves
them off — check the startup line on stderr, which reports the mode in effect.
The token is removed from the process environment once it has been read, so child
processes cannot pick it up out of /proc/<pid>/environ.
Choosing which tools load
MEALIE_ALLOW_TOOLS and MEALIE_DENY_TOOLS take comma-separated tool names;
a trailing * matches a whole family. essential is a curated preset of
eight: search_recipes, get_recipe, import_recipe_from_url, create_recipe, get_todays_meals, create_mealplan_entry, list_shopping_lists, add_recipe_to_shopping_list.
MEALIE_ALLOW_TOOLS=essential
MEALIE_ALLOW_TOOLS=search_recipes,get_recipe,import_recipe_from_url
MEALIE_DENY_TOOLS=delete_*An entry that matches no tool aborts startup and names it, so a typo cannot
silently hide a tool — an absent tool is not something anyone traces back to an
environment variable. A filtered tool is never registered, so it is absent from
tools/list and unknown to tools/call alike, exactly like a write tool under
MEALIE_READ_ONLY.
If you run several of these servers at once, mcp-hub
is the other answer — its /hub endpoint replaces every server's tools with six
meta-tools.
Installation
Claude Code
claude mcp add mealie \
-e MEALIE_URL=https://mealie.example.com \
-e MEALIE_API_TOKEN=… \
-- npx -y @ni-c/mealie-mcpClaude Desktop
The same entry works in any MCP client that takes a JSON config:
{
"mcpServers": {
"mealie": {
"command": "npx",
"args": ["-y", "@ni-c/mealie-mcp"],
"env": {
"MEALIE_URL": "https://mealie.example.com",
"MEALIE_API_TOKEN": "…"
}
}
}
}Codex
~/.codex/config.toml:
[mcp_servers.mealie]
command = "npx"
args = ["-y", "@ni-c/mealie-mcp"]
[mcp_servers.mealie.env]
MEALIE_URL = "https://mealie.example.com"
MEALIE_API_TOKEN = "…"MCP Inspector
To poke at the tools interactively:
npx @modelcontextprotocol/inspector npx -y @ni-c/mealie-mcpDocker
docker run --rm -i \
-e MEALIE_URL=https://mealie.example.com \
-e MEALIE_API_TOKEN=… \
ghcr.io/ni-c/mealie-mcpThrough mcp-hub
A client that cannot spawn a local process — ChatGPT connectors, Claude on the web,
Cursor, LibreChat — reaches mealie-mcp through mcp-hub: one
container serves many stdio MCP servers over Streamable HTTP, with an OAuth 2.1 login
behind a single password and long-lived tokens for the clients that cannot do OAuth. Its
/hub endpoint puts every server behind six meta-tools, so one connector reaches all of
them without N×tool schemas in the model's context, and it speaks both protocol revisions
— a question this server asks travels through it to the person at the far end.
Its /config/mcp.json uses Claude Code's format, so the entry is the one you already
have:
{
"mcpServers": {
"mealie": {
"command": "npx",
"args": ["-y", "@ni-c/mealie-mcp"],
"env": { "MEALIE_ALLOW_TOOLS": "essential" },
"denyTools": ["delete_*"]
}
}
}allowTools and denyTools there are the hub's own per-server filter, which is not
the same thing as *_ALLOW_TOOLS in env — the difference, and the mistake it invites,
are in the client guide.
Tools
Every tool declares an outputSchema and answers with structuredContent
alongside the text block, so a client can use the result without parsing prose.
Nine tools that answered with a sentence — "Deleted the recipe with id …" —
now answer with the fields as well.
Most tools carry untrusted: true and source: "mealie" as fields: recipes are
routinely scraped from arbitrary websites and comments come from other users of
the instance. The eleven without it answer with an id this server was given — or,
for get_about, a version string and the permission flags of the account it
authenticates as, which are facts the model should act on.
Mealie's records are described as open objects with the top-level keys this server builds. A self-hosted Mealie is any release, and the SDK validates each result against its schema before it goes out — a strict shape would turn a field a release adds into a tool that fails outright.
Recipes — search_recipes, get_recipe, suggest_recipes, create_recipe,
update_recipe, parse_recipe_ingredients, duplicate_recipe, set_recipe_image, set_recipe_last_made,
delete_recipe 🔒
Import — preview_recipe_url (dry run, saves nothing), import_recipe_from_url,
import_recipe_from_html_or_json, import_recipe_from_image
Organizing — list_organizers, create_organizer, update_organizer,
delete_organizer 🔒 — each takes kind: tag | category | tool
Ingredients — list_foods, create_food, merge_foods 🔒, list_units,
create_unit, merge_units 🔒, parse_ingredients
Meal plans — list_mealplans, get_todays_meals, create_mealplan_entry,
create_random_meal, update_mealplan_entry, delete_mealplan_entry 🔒
Shopping — list_shopping_lists, get_shopping_list, create_shopping_list,
delete_shopping_list 🔒, add_shopping_list_items, update_shopping_list_items,
delete_shopping_list_items 🔒, add_recipe_to_shopping_list,
remove_recipe_from_shopping_list
Cookbooks — list_cookbooks, get_cookbook, create_cookbook,
delete_cookbook 🔒
Notes and sharing — set_recipe_rating, add_recipe_comment,
delete_recipe_comment 🔒, list_recipe_comments, list_recipe_timeline,
create_timeline_event, list_share_tokens, create_share_token 🔒,
delete_share_token 🔒
Instance — get_about
🔒 asks a person through MCP elicitation — a dialog the model cannot answer on its
behalf. Where the client cannot show one it falls back to a two-call
confirm_token. See
Asking a person.
Recipes can be addressed by slug or by UUID everywhere — Mealie splits its identifier space between the two, and the tools resolve whichever they are given.
Not exposed, on purpose
Everything under /api/admin (backups, restore, maintenance, user, group and
household management, email, AI provider settings), /api/users/api-tokens (a tool
that mints API credentials is privilege-escalation surface), the authentication
routes, user CRUD and passwords, webhooks, event notifications and recipe actions
(all three trigger outbound HTTP from the instance), meal plan rules, migrations,
seeders, invitations, bulk export and ZIP download, and asset uploads. The one
upload route that is exposed is a recipe's cover image, through
set_recipe_image.
PUT /api/recipes/{slug} is not exposed either: it replaces the entire 33-field
recipe object, so a partial update through it silently drops ingredients, steps and
tags. update_recipe uses PATCH.
Safety
Instance content is untrusted input. Recipes are routinely scraped from arbitrary websites and comments come from other users, so every tool result that can contain instance content is prefixed with an explicit marker telling the model to treat it as data. This matters after the import too: the text stays in the database and comes back through
get_recipe.The import tools make Mealie fetch, not this server. URLs are restricted to
http/https, and loopback and link-local hosts are refused — including the cloud metadata endpoints and the hostnames that resolve to them. Addresses are compared numerically, so an IPv4-mapped literal such as[::ffff:169.254.169.254]is caught too, and a hostname is resolved as well — best effort, since a name that does not resolve here is passed on. Private LAN addresses are passed on as of 0.1.2, but Mealie refuses them itself, so such an import fails there rather than here. See SECURITY.md for what the check does not cover, includingimport_recipe_from_html_or_json.Confirmation prompts quote no upstream text — ids, counts and flags only.
Responses are bounded: oversized results drop whole items rather than cutting the JSON mid-string, and a response body is never read past 8 MB.
Redirects are refused so the token cannot be resent to another host.
See SECURITY.md for the trust model and how to report a vulnerability.
Documentation
The full guide, tool reference and security notes live at
mealie-mcp.ni-c.de (source in docs/).
Development
npm install && npm test && npm run buildnpm run test:integration exercises every tool in the catalogue against a
throwaway Mealie instance in Docker; the recipe for bringing one up is in
CONTRIBUTING.md.
The architecture diagram and the social card are rendered from
docs/assets/architecture.source.svg and docs/assets/og.json by
npm run assets; CI fails if a rendered copy was edited by hand.
Releasing
Everything is driven by a tag; there is no manual publish step.
Move the
[Unreleased]section of CHANGELOG.md to the new version and date it. The release workflow extracts that section withawk, so the## [x.y.z]heading shape matters.Bump
versioninpackage.json.npm run lint && npm run build && npm run test:coverage.Commit, then a signed annotated tag:
git tag -s v0.1.1 -m "v0.1.1" git push origin main v0.1.1
release.yml then verifies the tag matches package.json, publishes to npm over
Trusted Publishing (OIDC — no npm token exists to leak) with provenance, syncs the
version into both server.json package entries, publishes to the MCP registry, and
cuts the GitHub release from the changelog section. ci.yml pushes the multi-arch
container image to GHCR in parallel.
Contributing
Issues, discussions and pull requests are welcome — see CONTRIBUTING.md. For vulnerabilities please use private reporting rather than a public issue; the policy is in SECURITY.md.
License
MIT © Willi Thiel
Available Tools
54 toolsadd_recipe_commentComment on a recipeA
Adds a comment to a recipe. Comments are visible to everyone in the group and are attributed to the user the API token belongs to.
Inputs: text (required), recipe (required). Returns: source, truncated, untrusted
add_recipe_to_shopping_listAdd a recipe to a shopping listA
Adds a recipe's ingredients to a shopping list, merging them with what is already there. Mealie remembers the recipe on the list, so remove_recipe_from_shopping_list can take exactly these ingredients back off again.
Inputs: recipe (required), list_id (required), servings_multiplier. Returns: source, truncated, untrusted
add_shopping_list_itemsAdd items to a shopping listA
Adds items to a shopping list as free text ("2 tbsp olive oil"). Mealie does not split these into food and unit automatically — run parse_ingredients first if that matters.
Inputs: items (required), list_id (required). Returns: source, truncated, untrusted
create_cookbookCreate cookbookA
Creates a cookbook — a named, saved view of the recipe collection. Without a filter it matches every recipe; the filter itself is written in Mealie's own query language and is easiest to build in the web UI. A private cookbook is created straight away; is_public requires confirmation, because it is a publishing step.
Inputs: name (required), is_public, description, query_filter, +1 more. Returns: source, truncated, untrusted
create_foodCreate foodB
Adds a food to the group vocabulary so ingredient lines can be matched against it.
Inputs: name (required), label_id, description, plural_name. Returns: source, truncated, untrusted
create_mealplan_entryAdd to the meal planA
Puts a recipe or a free-text note on the meal plan for one day. Give either a recipe or a title, not both — Mealie stores a plan entry as one or the other.
Inputs: date (required), entry_type (required), text, title, +1 more. Returns: source, truncated, untrusted
create_organizerCreate a tag, category or toolA
Creates a tag, category or recipe tool. Assigning one to a recipe with update_recipe already creates it on the fly — this tool is for defining one up front.
Inputs: kind (required), name (required). Returns: source, truncated, untrusted
create_random_mealAdd a random mealA
Lets Mealie pick a recipe for a day and slot, honouring the meal plan rules configured in the household.
Inputs: date (required), entry_type (required). Returns: source, truncated, untrusted
create_recipeCreate recipeB
Creates a recipe from the given fields. To add one from a website use import_recipe_from_url instead — it fills in far more.
Inputs: name (required), tags, notes, servings, +9 more. Returns: source, truncated, untrusted
create_shopping_listCreate shopping listA
Creates an empty shopping list in the household.
Inputs: name (required). Returns: source, truncated, untrusted
create_timeline_eventAdd a timeline entryA
Adds an entry to a recipe's timeline — typically a note about having cooked it and how it turned out. Pair it with set_recipe_last_made, which is what the recipe view sorts on.
Inputs: recipe (required), subject (required), message, timestamp. Returns: source, truncated, untrusted
create_unitCreate unitB
Adds a measurement unit to the group vocabulary.
Inputs: name (required), fraction, description, plural_name, +2 more. Returns: source, truncated, untrusted
delete_cookbookDelete cookbookADestructiveIdempotent
Deletes a cookbook. The recipes it matched are not touched — a cookbook is only a saved filter. Requires confirmation: call once to receive a token, then again with that token.
Inputs: cookbook_id (required), confirm_token. Returns: truncated, deleted_cookbook_id
delete_mealplan_entryRemove a meal plan entryADestructiveIdempotent
Removes one entry from the meal plan. The recipe itself is not touched. Requires confirmation: call once to receive a token, then again with that token.
Inputs: entry_id (required), confirm_token. Returns: truncated, removed_entry_id
delete_organizerDelete a tag, category or toolADestructiveIdempotent
Deletes a tag, category or tool. The recipes themselves are kept, but they lose the assignment. Requires confirmation: call once to receive a token, then again with that token.
Inputs: id (required), kind (required), confirm_token. Returns: deleted, truncated, deleted_id
delete_recipeDelete recipeADestructiveIdempotent
Deletes a recipe permanently, together with its comments, timeline and images. Requires confirmation: call once to receive a token, then again with that token.
Inputs: recipe (required), confirm_token. Returns: truncated, deleted_recipe_id
delete_recipe_commentDelete a recipe commentADestructiveIdempotent
Deletes a comment. Requires confirmation: call once to receive a token, then again with that token.
Inputs: comment_id (required), confirm_token. Returns: truncated, deleted_comment_id
delete_shopping_listDelete shopping listADestructiveIdempotent
Deletes a shopping list and everything on it. Requires confirmation: call once to receive a token, then again with that token.
Inputs: list_id (required), confirm_token. Returns: truncated, deleted_list_id
delete_shopping_list_itemsRemove shopping list itemsADestructiveIdempotent
Removes items from a shopping list for good. To merely tick something off, use update_shopping_list_items with checked=true. Requires confirmation: call once to receive a token, then again with that token.
Inputs: item_ids (required), confirm_token. Returns: truncated, removed_count, removed_item_ids
duplicate_recipeDuplicate recipeA
Creates a copy of a recipe under a new name, leaving the original untouched. Useful as a starting point for a variation.
Inputs: recipe (required), name. Returns: source, truncated, untrusted
get_aboutAbout this Mealie instanceARead-onlyIdempotent
Reports the Mealie version and the identity the API token acts as: user, group, household and the permission flags that decide which write tools will actually succeed. Start here when a call fails with a 403.
Inputs: no named parameters. Returns: truncated
get_cookbookGet cookbookARead-onlyIdempotent
Fetches a cookbook and the recipes it currently matches. Accepts the slug or the UUID.
Inputs: cookbook (required), per_page. Returns: source, truncated, untrusted
get_recipeGet recipeARead-onlyIdempotent
Fetches one recipe with everything needed to cook it: ingredients, steps, times, yield, notes and nutrition. Accepts the slug or the UUID.
Inputs: recipe (required), detail. Returns: source, truncated, untrusted
get_shopping_listGet shopping listARead-onlyIdempotent
Fetches one shopping list with all of its items, checked and unchecked.
Inputs: list_id (required), include_checked. Returns: source, truncated, untrusted
get_todays_mealsGet today's mealsARead-onlyIdempotent
Returns the recipes planned for today, as Mealie computes "today" for the household. Answers with a bare list, not a paginated envelope.
Inputs: no named parameters. Returns: source, truncated, untrusted
import_recipe_from_html_or_jsonImport recipe from HTML or JSONA
Creates a recipe from HTML or schema.org recipe JSON supplied directly, so Mealie does not fetch the page. Useful for a page that needs a login, or one that import_recipe_from_url could not parse.
It does not fetch the page, but it is not fetch-free: Mealie reads the image address out of the document and retrieves that. Every such address this server can find is checked before the document is handed over, and an internal one is refused — but a document can hide an address in ways a scan does not see, so do not paste one from a source you would not let Mealie make a request for.
Inputs: data (required). Returns: source, truncated, untrusted
import_recipe_from_imageImport recipe from imageA
Creates a recipe from a photo of one — a cookbook page, a handwritten card — by having Mealie run it through its configured AI provider. Requires an AI provider set up in Mealie; without one the call fails, and the setting itself is only visible to a group manager or admin.
Inputs: format (required), image_base64 (required), translate_language. Returns: source, truncated, untrusted
import_recipe_from_urlImport recipe from URLA
Has Mealie fetch a recipe page and save it as a new recipe. The fetch happens on the Mealie server, not here. Everything the page contains — name, description, ingredients, steps — ends up in the collection as written by whoever controls that site.
Inputs: url (required), include_tags, include_categories. Returns: source, truncated, untrusted
list_cookbooksList cookbooksARead-onlyIdempotent
Lists the cookbooks of the household. A cookbook is a saved filter over the recipe collection, not a fixed set of recipes.
Inputs: page, per_page. Returns: source, truncated, untrusted
list_foodsList foodsARead-onlyIdempotent
Lists the structured foods of the group — the ingredient vocabulary Mealie matches ingredient lines against. Many instances leave this empty and keep ingredients as plain text; an empty result means exactly that, not a failure.
Inputs: page, search, per_page, order_direction. Returns: source, truncated, untrusted
list_mealplansList meal plan entriesARead-onlyIdempotent
Lists the meal plan of the household in a date range. Each entry is either a recipe reference or a free-text note.
Inputs: page, end_date, per_page, start_date. Returns: source, truncated, untrusted
list_organizersList tags, categories or toolsARead-onlyIdempotent
Lists the tags, categories or tools defined in the group, with their ids and slugs. These are the values search_recipes filters on.
Inputs: kind (required), page, search, per_page, +1 more. Returns: source, truncated, untrusted
list_recipe_commentsList recipe commentsARead-onlyIdempotent
Lists the comments other users of the instance left on a recipe.
Inputs: recipe (required). Returns: source, truncated, untrusted
list_recipe_timelineList recipe timelineARead-onlyIdempotent
Lists the timeline of a recipe: when it was created, updated and each time it was cooked, with the notes attached to those events.
Inputs: recipe (required), page, per_page. Returns: source, truncated, untrusted
list_shopping_listsList shopping listsARead-onlyIdempotent
Lists the shopping lists of the household, without their items.
Inputs: page, per_page. Returns: source, truncated, untrusted
list_unitsList unitsARead-onlyIdempotent
Lists the measurement units of the group, with their abbreviations. Like foods, this is empty on an instance that never seeded them.
Inputs: page, search, per_page, order_direction. Returns: source, truncated, untrusted
merge_foodsMerge foodsADestructiveIdempotent
Points every ingredient that uses one food at another one and deletes the source food. Requires confirmation: call once to receive a token, then again with that token.
Inputs: to_id (required), from_id (required), confirm_token. Returns: source, truncated, untrusted
merge_unitsMerge unitsADestructiveIdempotent
Points every ingredient that uses one unit at another one and deletes the source unit. Requires confirmation: call once to receive a token, then again with that token.
Inputs: to_id (required), from_id (required), confirm_token. Returns: source, truncated, untrusted
parse_ingredientsParse ingredient linesARead-onlyIdempotent
Splits free-text ingredient lines into quantity, unit, food and note, and reports how confident Mealie is about each part. Nothing is saved. Use it to check how a line will be understood before writing it to a recipe or a shopping list.
Inputs: ingredients (required), parser. Returns: source, truncated, untrusted
parse_recipe_ingredientsParse recipe ingredientsADestructiveIdempotent
Structures a recipe's unparsed ingredient lines in place: Mealie's parser splits each line into quantity, unit, food and note, and the lines whose food and unit exist in Mealie and whose confidence is high enough are written back. Lines that already have a food are left alone. Everything else comes back under needs_decision with the reason — ask the user there, then create the food with create_food and run this again, or pass the existing food they chose in overrides. Runs as a dry run unless dry_run is false; writing requires confirmation: call once to receive a token, then again with that token. Find recipes to work through with search_recipes unparsed_only.
Inputs: recipe (required), parser, dry_run, overrides, +2 more. Returns: source, truncated, untrusted
preview_recipe_urlPreview a recipe URLARead-onlyIdempotent
Fetches a URL and reports what Mealie would extract from it, WITHOUT saving anything. Use this to check a page before importing it, or to find out why an import came out empty.
Inputs: url (required). Returns: source, truncated, untrusted
remove_recipe_from_shopping_listRemove a recipe from a shopping listA
Takes a recipe's ingredients back off a shopping list. Items that were also needed by another recipe on the list stay, with their quantity reduced.
Inputs: recipe (required), list_id (required), servings_multiplier. Returns: source, truncated, untrusted
search_recipesSearch recipesARead-onlyIdempotent
Searches the recipe collection. Returns summaries — name, slug, id, times, rating, tags and categories — without ingredients or steps; use get_recipe for those. search, the organizer filters and the date range combine with AND; within one filter the entries are OR unless the matching require_all_* flag is set. cookbook is the exception: Mealie applies a cookbook instead of the tag, category, tool and food filters, so combining them is rejected here rather than silently ignored.
Inputs: page, tags, foods, tools, +11 more. Returns: source, truncated, untrusted
set_recipe_imageSet recipe imageA
Replaces a recipe's cover image.
Inputs: format (required), recipe (required), image_base64 (required). Returns: recipe, truncated, image_version
set_recipe_last_madeSet last madeA
Records when a recipe was last cooked. Mealie shows this on the recipe and sorts by it.
Inputs: recipe (required), timestamp (required). Returns: recipe, last_made, truncated
set_recipe_ratingRate a recipeA
Sets the personal rating of a recipe and/or marks it as a favourite. Ratings in Mealie are per user, not per recipe.
Inputs: recipe (required), rating, is_favorite. Returns: source, truncated, untrusted
suggest_recipesSuggest recipesARead-onlyIdempotent
Suggests recipes that can be cooked from the foods and tools marked as "on hand" in Mealie, ranked by how little is missing. This only produces anything on an instance that actually maintains structured foods, units and an on-hand pantry — on a collection of plain text ingredients it returns nothing. Use search_recipes there.
Inputs: foods, limit, tools, max_missing_foods, +1 more. Returns: source, truncated, untrusted
update_mealplan_entryChange a meal plan entryADestructiveIdempotent
Moves an entry to another day or slot, or replaces the recipe behind it. Replacing the written title or note of an entry requires confirmation: call once to receive a token, then again with that token. Moving the entry or swapping the recipe does not.
Inputs: entry_id (required), date, text, title, +3 more. Returns: source, truncated, untrusted
update_organizerRename a tag, category or toolADestructiveIdempotent
Renames a tag, category or tool. Mealie regenerates the slug from the new name, so anything referring to the old slug stops matching. Requires confirmation: call once to receive a token, then again with that token.
Inputs: id (required), kind (required), name (required), confirm_token. Returns: source, truncated, untrusted
update_recipeUpdate recipeADestructiveIdempotent
Changes individual fields of a recipe. Only the fields given are touched; everything else keeps its value. Passing an empty array for ingredients, instructions, tags or categories clears that list. Replacing written content — name, description, ingredients, instructions, tags, categories or notes — requires confirmation: call once to receive a token, then again with that token. Changing only times, servings, yield or the source link does not.
Inputs: recipe (required), name, tags, notes, +11 more. Returns: source, truncated, untrusted
update_shopping_list_itemsTick off or change shopping list itemsADestructiveIdempotent
Changes items on a shopping list — most often ticking them off. Only the given fields are changed; the rest of each item is preserved. Ticking off and changing quantities is immediate; replacing the text of the items with note requires confirmation, because that text is overwritten on every item named and Mealie keeps no copy.
Inputs: list_id (required), item_ids (required), note, checked, +2 more. Returns: source, truncated, untrusted
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 54 tools
Most tools target a distinct resource+action and the descriptions carefully delimit overlaps, e.g. search_recipes vs get_recipe, and the three import_recipe_from_* variants. The main ambiguity is parse_recipe_ingredients (writes back to a recipe) vs parse_ingredients (dry-run only), plus mild overlap between set_recipe_last_made and create_timeline_event, but the descriptions disambiguate these adequately.
Nearly every tool follows a clean verb_noun snake_case pattern (get_recipe, create_mealplan_entry, delete_shopping_list_items, merge_foods). The few oddities like get_about or get_todays_meals still fit the same convention. No mixing of camelCase or vague verbs.
54 tools is well above the 25+ threshold for 'too many'. While the domain (recipes, organizers, foods, units, meal plans, shopping lists, cookbooks, share tokens, comments, timeline, imports) is genuinely broad, the surface is heavy enough to strain selection and could be consolidated.
Coverage is strong: full lifecycle for recipes, meal plan entries, shopping lists, cookbooks, share tokens, comments and organizers, plus imports, images, ratings and parsing. Minor gaps exist around foods/units, which have create and merge but no update or delete, though merge largely covers consolidation.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA versatile Model Context Protocol server that enables AI assistants to manage calendars, track tasks, handle emails, search the web, and control smart home devices.23MIT
- AlicenseNot gradedqualityCmaintenanceA server that integrates Blender with local AI models via the Model Context Protocol, allowing users to control Blender using natural language prompts for 3D modeling tasks.122MIT
- AlicenseNot gradedqualityDmaintenanceA server that implements the Model Context Protocol, providing a standardized way to connect AI models to different data sources and tools.10 npm12MIT
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol (MCP) server implementation that enables AI assistants to interact with Anytype's API through natural language, allowing users to manage their knowledge base through conversation.2,277 npm538MIT