mealie-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MEALIE_URL | Yes | Base URL, e.g. https://mealie.example.com | |
| MEALIE_API_TOKEN | Yes | Token from Settings → API Tokens. It acts as the user who created it. | |
| MEALIE_READ_ONLY | No | Exactly `true` registers the 17 read tools only | |
| MEALIE_DENY_TOOLS | No | Same syntax; removed from whatever `MEALIE_ALLOW_TOOLS` left | |
| MEALIE_ALLOW_TOOLS | No | Comma-separated tool names, `list_*` prefixes, or `essential` for a curated preset | |
| MEALIE_INSECURE_TLS | No | Exactly `true` accepts a self-signed certificate, scoped to this connection | |
| MEALIE_ACCEPT_LANGUAGE | No | e.g. `de-DE`; localises unit and label names |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_aboutA | 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. |
| search_recipesA | 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. |
| get_recipeA | Fetches one recipe with everything needed to cook it: ingredients, steps, times, yield, notes and nutrition. Accepts the slug or the UUID. |
| suggest_recipesA | 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. |
| list_recipe_commentsA | Lists the comments other users of the instance left on a recipe. |
| list_recipe_timelineA | Lists the timeline of a recipe: when it was created, updated and each time it was cooked, with the notes attached to those events. |
| list_organizersA | Lists the tags, categories or tools defined in the group, with their ids and slugs. These are the values search_recipes filters on. |
| list_foodsA | 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. |
| list_unitsA | Lists the measurement units of the group, with their abbreviations. Like foods, this is empty on an instance that never seeded them. |
| parse_ingredientsA | 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. |
| list_mealplansA | Lists the meal plan of the household in a date range. Each entry is either a recipe reference or a free-text note. |
| get_todays_mealsA | Returns the recipes planned for today, as Mealie computes "today" for the household. Answers with a bare list, not a paginated envelope. |
| list_shopping_listsA | Lists the shopping lists of the household, without their items. |
| get_shopping_listA | Fetches one shopping list with all of its items, checked and unchecked. |
| list_cookbooksA | Lists the cookbooks of the household. A cookbook is a saved filter over the recipe collection, not a fixed set of recipes. |
| get_cookbookA | Fetches a cookbook and the recipes it currently matches. Accepts the slug or the UUID. |
| list_share_tokensA | Lists the public share links that currently exist, with the recipe each one exposes and when it expires. Anyone holding such a link can read the recipe without an account. |
| preview_recipe_urlA | 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. |
| create_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. |
| update_recipeA | 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. |
| parse_recipe_ingredientsA | 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. |
| duplicate_recipeA | Creates a copy of a recipe under a new name, leaving the original untouched. Useful as a starting point for a variation. |
| set_recipe_imageA | Replaces a recipe's cover image. |
| set_recipe_last_madeA | Records when a recipe was last cooked. Mealie shows this on the recipe and sorts by it. |
| delete_recipeA | Deletes a recipe permanently, together with its comments, timeline and images. Requires confirmation: call once to receive a token, then again with that token. |
| import_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. |
| import_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. |
| import_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. |
| create_organizerA | 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. |
| update_organizerA | 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. |
| delete_organizerA | 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. |
| create_foodB | Adds a food to the group vocabulary so ingredient lines can be matched against it. |
| create_unitB | Adds a measurement unit to the group vocabulary. |
| merge_foodsA | 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. |
| merge_unitsA | 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. |
| create_mealplan_entryA | 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. |
| create_random_mealA | Lets Mealie pick a recipe for a day and slot, honouring the meal plan rules configured in the household. |
| update_mealplan_entryA | 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. |
| delete_mealplan_entryA | 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. |
| create_shopping_listA | Creates an empty shopping list in the household. |
| delete_shopping_listA | Deletes a shopping list and everything on it. Requires confirmation: call once to receive a token, then again with that token. |
| add_shopping_list_itemsA | 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. |
| update_shopping_list_itemsA | 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. |
| delete_shopping_list_itemsA | 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. |
| add_recipe_to_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. |
| remove_recipe_from_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. |
| create_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. |
| delete_cookbookA | 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. |
| create_share_tokenA | Creates a link that lets anyone read one recipe without logging in. Requires confirmation: call once to receive a token, then again with that token. |
| delete_share_tokenA | Revokes a share link, so the recipe is no longer readable through it. Asks a person first; where the client cannot show a dialog, call once to receive a token and again with it. |
| set_recipe_ratingA | Sets the personal rating of a recipe and/or marks it as a favourite. Ratings in Mealie are per user, not per recipe. |
| add_recipe_commentA | 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. |
| delete_recipe_commentA | Deletes a comment. Requires confirmation: call once to receive a token, then again with that token. |
| create_timeline_eventA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.