mealie-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MEALIE_URL | Yes | The URL of your Mealie instance | |
| MEALIE_API_KEY | Yes | Your Mealie API token |
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
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_recipesA | Search recipes by keyword with optional category/tag filters. Args: query: Search text (name, description, ingredients) page: Page number (default 1) per_page: Results per page (default 10) categories: Filter by category slugs tags: Filter by tag slugs |
| get_recipeA | Get full recipe details including ingredients, instructions, and nutrition. Args: slug: Recipe slug identifier (from search results) |
| get_recipe_ingredientsA | Get just the ingredient list for a recipe. Args: slug: Recipe slug identifier |
| create_recipe_from_urlA | Import a recipe by scraping a URL. Mealie will extract the recipe data automatically. Args: url: URL of the recipe page to import |
| create_recipeA | Create a new recipe manually. Args: name: Recipe name description: Short description recipe_yield: Yield description (e.g. "15–18 rolls", "1 loaf") servings: Numeric serving count that enables scaling (e.g. 6, 8, 15) total_time: Total time (e.g. "45 minutes") prep_time: Prep time perform_time: Cook time ingredients: List of ingredient dicts, each with optional keys: - section (str): creates a visual section header (no other fields used) - quantity (float): numeric amount (e.g. 300, 2.5) - unit (str): unit name or abbreviation (e.g. "g", "cup", "tbsp") - food (str): ingredient name (e.g. "bread flour", "butter") - comment (str): extra info shown alongside (e.g. "softened", "about 1¾ tsp") instructions: List of instruction steps — each may be a plain string or a dict with: - text (str): step body - title (str, optional): step heading shown in UI - summary (str, optional): one-line takeaway for cook mode - ingredient_refs (list[str], optional): UUIDs of linked ingredients categories: Category names to assign tags: Tag names to assign notes: List of note dicts, each with: - title (str): section label (e.g. "Non-Negotiables") - text (str): note body extras: Arbitrary JSON metadata (e.g. {"isFoundation": true}) |
| update_recipeA | Update fields on an existing recipe. Only provided fields are changed. Args: slug: Recipe slug to update name: New recipe name description: New description recipe_yield: Yield description (e.g. "15–18 rolls", "1 loaf") servings: Numeric serving count that enables scaling (e.g. 6, 8, 15) total_time: New total time prep_time: New prep time perform_time: New cook time ingredients: Replace ingredient list. Each dict has optional keys: - section (str): creates a visual section header (no other fields used) - quantity (float): numeric amount (e.g. 300, 2.5) - unit (str): unit name or abbreviation (e.g. "g", "cup", "tbsp") - food (str): ingredient name (e.g. "bread flour", "butter") - comment (str): extra info shown alongside (e.g. "softened", "about 1¾ tsp") instructions: Replace instruction steps — each may be a plain string or a dict with: - text (str): step body - title (str, optional): step heading shown in UI - summary (str, optional): one-line takeaway for cook mode - ingredient_refs (list[str], optional): UUIDs of linked ingredients categories: Replace categories tags: Replace tags notes: Replace note blocks. Each dict has: - title (str): section label (e.g. "Non-Negotiables") - text (str): note body extras: Replace arbitrary JSON metadata (e.g. {"isFoundation": true}) |
| delete_recipeA | Delete a recipe permanently. Args: slug: Recipe slug to delete |
| get_shopping_listsA | List all shopping lists. |
| get_shopping_listA | Get a shopping list with all its items. Args: list_id: Shopping list ID (from get_shopping_lists) |
| create_shopping_listB | Create a new empty shopping list. Args: name: Name for the new list |
| delete_shopping_listC | Delete a shopping list. Args: list_id: Shopping list ID to delete |
| add_shopping_list_itemB | Add an item to a shopping list. Args: list_id: Shopping list ID note: Item description (e.g. "2 lbs chicken breast") quantity: Numeric quantity (optional, for structured items) unit_id: Unit ID from get_units (optional) food_id: Food ID from search_foods (optional) |
| remove_shopping_list_itemB | Remove an item from a shopping list. Args: list_id: Shopping list ID (for context) item_id: Item ID to remove (from get_shopping_list) |
| check_shopping_list_itemA | Check or uncheck a shopping list item. Args: list_id: Shopping list ID item_id: Item ID to check/uncheck checked: True to check, False to uncheck (default True) |
| add_recipe_to_shopping_listB | Add all ingredients from a recipe to a shopping list. Args: list_id: Shopping list ID recipe_slug: Recipe slug to add ingredients from |
| get_meal_plansB | Get meal plan entries for a date range. Args: start_date: Start date (YYYY-MM-DD) end_date: End date (YYYY-MM-DD) |
| create_meal_plan_entryA | Add a meal plan entry for a specific date. Args: date: Date for the entry (YYYY-MM-DD) entry_type: Meal type — "breakfast", "lunch", "dinner", or "side" recipe_slug: Recipe slug to plan (use this OR title/note) title: Free-text title (for non-recipe entries) note: Additional note text |
| delete_meal_plan_entryA | Remove a meal plan entry. Args: entry_id: Meal plan entry ID (from get_meal_plans) |
| generate_random_meal_planA | Auto-fill a date range with random recipes from your collection. Args: start_date: Start date (YYYY-MM-DD) end_date: End date (YYYY-MM-DD) entry_type: Meal type — "breakfast", "lunch", "dinner", or "side" (default "dinner") |
| get_categoriesA | List all recipe categories. |
| get_tagsA | List all recipe tags. |
| get_cookbooksA | List all cookbooks. |
| get_cookbook_recipesB | Get recipes in a cookbook. Args: cookbook_slug: Cookbook slug identifier page: Page number (default 1) per_page: Results per page (default 10) |
| create_categoryA | Create a new recipe category. Args: name: Category name |
| create_tagA | Create a new recipe tag. Args: name: Tag name |
| search_foodsC | Search the foods database. Args: query: Search text page: Page number (default 1) per_page: Results per page (default 10) |
| get_unitsA | List all measurement units available in Mealie. |
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 27 tools
Each tool targets a distinct resource/action pair, and the descriptions clarify boundaries. Minor overlap exists between get_recipe/get_recipe_ingredients and add_recipe_to_shopping_list/add_shopping_list_item, but an agent should be able to disambiguate.
All tools follow a consistent verb_noun pattern in snake_case (get_, create_, delete_, search_, update_, add_, remove_, check_, generate_). Even compound tools like create_recipe_from_url stay within the convention.
27 tools is on the heavy side and above the typical 3-15 range, but the server covers several coherent subdomains: recipes, meal planning, shopping lists, and taxonomy. The count is manageable because almost every tool maps to a distinct operation, though a few convenience tools could be consolidated.
Recipe CRUD, import, search, meal-plan management, and shopping-list item workflows are well covered. Minor gaps remain for updating/deleting categories, tags, and cookbooks, and for updating meal-plan entries or shopping-list items.