Skip to main content
Glama

Mealie MCP

License

An MCP server that exposes a self-hosted Mealie instance to MCP clients like Claude — recipes, meal plans, shopping lists, and organizers (categories/tags).

What it does

  • Recipes — list/search, get details, create, import from a URL, update, delete

  • Meal Plans — get today's meals, list a date range, create/delete entries, add a random recipe

  • Shopping Lists — list, get, create, delete, add a recipe's ingredients, add a single item, check off items

  • Organizers — list categories and tags

  • Utilities — get a recipe's nutrition info

Related MCP server: Mealie MCP Server

Project layout

src/mealiemcp/
├── app.py            # FastMCP instance + auth setup
├── config.py         # environment variable loading
├── client.py         # Mealie HTTP client factory
├── security.py       # input validation (slug/id allowlists, SSRF guard)
├── audit.py          # logs which tool was called, by whom, and when
├── recipes.py         ┐
├── meal_plans.py       ├─ tool modules, one per Mealie domain
├── shopping_lists.py   │
├── organizers.py      ┘
└── server.py          # registers tool modules, entry point (main())
tests/                  # unit tests (pytest)

Setup

Requires uv.

uv sync
cp .env.example .env  # fill in your Mealie URL and API token
uv run mealiemcp

Run the tests with:

uv run pytest

Environment variables (see src/mealiemcp/config.py for details):

Variable

Purpose

MEALIE_BASE_URL

URL of your Mealie instance

MEALIE_API_TOKEN

Mealie API token this server uses to call Mealie

MCP_TRANSPORT

stdio (default, for local clients like Claude Desktop/Code) or streamable-http (to expose over a network)

MCP_HOST / MCP_PORT

Bind address/port when using streamable-http

MCP_AUTH_TOKEN

Bearer token remote clients must present — required when MCP_TRANSPORT isn't stdio

MCP_AUTH_TOKEN_EXPIRES_AT

YYYY-MM-DD (UTC) — MCP_AUTH_TOKEN stops being accepted after this date, forcing periodic rotation. Required alongside MCP_AUTH_TOKEN

A Dockerfile is included for running in streamable-http mode behind a reverse proxy.

Auth model

This is designed for a single user running their own instance, not a multi-tenant service. Remote access is a single shared bearer token (MCP_AUTH_TOKEN) rather than full OAuth — proportionate for one person's personal Mealie server. To limit the blast radius of a leaked token:

  • It has a hard expiry (MCP_AUTH_TOKEN_EXPIRES_AT) and must be rotated periodically

  • Every tool call is logged (tool name, authenticated client, success/failure, duration) via audit.py, so a misused token leaves a trace

License and disclaimer

This project is free to use, for any purpose, with no warranty of any kind. The author assumes no liability for any use of this software or any consequences arising from it — you use it entirely at your own risk. See the LICENSE file for the full terms.

This entire codebase was generated by AI. It has only been tested through the author's personal use against their own Mealie instance and has not been independently audited or reviewed. Review the code yourself before relying on it, especially before exposing it to a network.

Available Tools

21 tools
add_random_meal_planC

Add a random recipe to the meal plan for a given date.

Inputs: date (required), entry_type. Returns: object

add_recipe_to_shopping_listC

Add all ingredients of a recipe to a shopping list.

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

add_shopping_itemC

Add a single item to a shopping list.

Inputs: note (required), list_id (required), food, unit, +1 more. Returns: object

check_shopping_itemC

Mark a shopping list item as checked or unchecked.

Inputs: item_id (required), checked. Returns: object

create_meal_planB

Create a meal plan entry. date is YYYY-MM-DD. entry_type is breakfast/lunch/dinner/side.

Inputs: date (required), text, title, recipe_id, +1 more. Returns: object

create_recipeB

Create a new blank recipe with the given name.

Inputs: name (required). Returns: object

create_shopping_listC

Create a new shopping list.

Inputs: name (required). Returns: object

delete_meal_planC

Delete a meal plan entry by ID.

Inputs: item_id (required). Returns: object

delete_recipeC

Delete a recipe by slug.

Inputs: slug (required). Returns: object

delete_shopping_listB

Delete a shopping list by ID.

Inputs: list_id (required). Returns: object

get_recipeA

Get full details of a recipe by its slug.

Inputs: slug (required). Returns: object

get_recipe_nutritionC

Get the nutrition info for a recipe.

Inputs: slug (required). Returns: object

get_shopping_listC

Get a shopping list and its items by ID.

Inputs: list_id (required). Returns: object

get_todays_mealsB

Get today's meal plan.

Inputs: no named parameters. Returns: object

import_recipe_from_urlC

Scrape and import a recipe from a URL.

Inputs: url (required). Returns: object

list_categoriesA

List all recipe categories.

Inputs: no named parameters. Returns: object

list_meal_plansB

List meal plans. Optionally filter by start/end date (YYYY-MM-DD).

Inputs: end_date, start_date. Returns: object

list_recipesC

List recipes, optionally filtering by search term, category, or tag.

Inputs: tag, page, search, category, +1 more. Returns: object

list_shopping_listsA

List all shopping lists.

Inputs: no named parameters. Returns: object

list_tagsA

List all recipe tags.

Inputs: no named parameters. Returns: object

update_recipeC

Update a recipe. Pass a dict with the fields to update (e.g. description, recipeYield, recipeIngredient, recipeInstructions).

Inputs: data (required), slug (required). Returns: object

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 21 tools

    Disambiguation4/5

    Tools are mostly distinct, with slight overlap between add_random_meal_plan and create_meal_plan, and between add_shopping_item and add_recipe_to_shopping_list. Descriptions are clear enough for an agent to choose correctly.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_recipe, list_recipes, delete_meal_plan). The naming is predictable and easy to understand.

    Tool Count4/5

    With 21 tools, the set is slightly above the ideal range but still well-scoped for a meal planning and recipe management server. Each tool serves a clear purpose without excessive overlap.

    Completeness4/5

    The tool set covers most CRUD operations for recipes, meal plans, and shopping lists. Missing updates for meal plans and shopping lists, and deletion of individual shopping items, but core workflows are supported.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers